談起 Spring Cloud 生態你們必定對 Feign 不陌生,以下圖所示,Feign 能夠把底層(okhttp、httpclient)Rest 的請求進行隱藏,假裝成相似 SpringMVC 的 Controller 同樣。你不用再本身拼接 url,拼接參數等等操做,一切都交給 Feign 去作。使用 Feign 調用 API 就像調用本地方法同樣,從避免了調用目標微服務時,須要不斷的解析/封裝 json 數據的繁瑣。java
Spring Cloud Square 項目旨在替代原有的 Spring Cloud Feign , 藉助 Retrofit 對底層通訊類庫的封裝實現跨服務調用,目前已在 spring-cloud-incubator 孵化器進行孵化 (上一個在孵化器孵化 spring-cloud-loadbalancer 已經正式接替 Ribbon 成爲正式推薦組件)。git
在瞭解 Spring Cloud Square 以前,須要先了解如下組件:github
那麼基於 Spring Cloud Square 的服務調用能夠抽象成以下圖所示:spring
<repositories> <repository> <id>spring-milestones</id> <url>https://repo.spring.io/milestone</url> </repository> </repositories>
<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(); }
@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(); }