幹掉 Feign,Spring Cloud Square 組件發佈

Spring Cloud Square 是什麼

談起 Spring Cloud 生態你們必定對 Feign 不陌生,以下圖所示,Feign 能夠把底層(okhttp、httpclient)Rest 的請求進行隱藏,假裝成相似 SpringMVC 的 Controller 同樣。你不用再本身拼接 url,拼接參數等等操做,一切都交給 Feign 去作。使用 Feign 調用 API 就像調用本地方法同樣,從避免了調用目標微服務時,須要不斷的解析/封裝 json 數據的繁瑣。java

Spring Cloud Feign 調用

Spring Cloud Square 項目旨在替代原有的 Spring Cloud Feign , 藉助 Retrofit 對底層通訊類庫的封裝實現跨服務調用,目前已在 spring-cloud-incubator 孵化器進行孵化 (上一個在孵化器孵化 spring-cloud-loadbalancer 已經正式接替 Ribbon 成爲正式推薦組件)。git

在瞭解 Spring Cloud Square 以前,須要先了解如下組件:github

  • OkHttp 是一個關於網絡請求的第三方類庫,其中封裝了網絡請求的 get、post 等操做的底層實現,是目前最爲火熱的網絡請求框架之一。
  • Retrofit 是一個 RESTful 的 HTTP 網絡請求框架,它是基於 OkHttp 的。它是經過註解配置網絡參數的,支持多種數據的解析和序列化(Gson、Json、Xml 等,而且對 RxJava 也是支持的。

那麼基於 Spring Cloud Square 的服務調用能夠抽象成以下圖所示:spring

Spring Cloud Square 調用

快速上手

1618403200

添加依賴

  • 因爲目前 spring-cloud-square 未正式發佈,須要配置 spring maven 倉庫。
<repositories>
  <repository>
    <id>spring-milestones</id>
    <url>https://repo.spring.io/milestone</url>
  </repository>
</repositories>
  • maven 依賴
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-square-okhttp</artifactId>
  <version>${square.version}</version>
</dependency>
<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>${okhttp.version}</version>
</dependency>

<!--添加負載均衡支持-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

代碼配置

@Bean
@LoadBalanced
public OkHttpClient.Builder okHttpClientBuilder() {
    return new OkHttpClient.Builder();
}

代碼調用

  • 和最先的 ribbon 調用同樣,很是的簡單。
@Autowired
OkHttpClient.Builder builder;

@GetMapping
public String req() {
    Request request = new Request.Builder()
            .url("http://square-provider/req").build();
    Response response = builder.build().newCall(request).execute();
    return response.body().string();
}

進階使用

做爲 Spring Cloud Feign 的替代品,square 也支持聲明式客戶端的形式。注意看如下代碼 和 feign 同樣的味道json

添加依賴

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-square-retrofit</artifactId>
  <version>${square.version}</version>
</dependency>

聲明調用客戶端

@RetrofitClient("square-provider")
public interface DemoService {

    @GET("/")
    Call<String> req();
}

開啓客戶端掃描

@EnableRetrofitClients

代碼調用

@Autowired
DemoService demoService;

@SneakyThrows
@GetMapping("/retrofit")
public String retrofit(){
    return demoService.req().execute().body();
}

總結

相關文章
相關標籤/搜索