Spring Cloud Feign接口返回流
- - Blog_龙飞身无彩凤双飞翼,心有灵犀一点通. 关注微信公众号 java干货
不定期分享干货资料.
谈起 Spring Cloud 生态大家一定对 Feign 不陌生,如下图所示,Feign 可以把底层(okhttp、httpclient)Rest 的请求进行隐藏,伪装成类似 SpringMVC 的 Controller 一样。你不用再自己拼接 url,拼接参数等等操作,一切都交给 Feign 去做。使用 Feign 调用 API 就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装 json 数据的繁琐。
Spring Cloud Square 项目旨在替代原有的 Spring Cloud Feign , 借助 Retrofit 对底层通信类库的封装实现跨服务调用,目前已在 spring-cloud-incubator 孵化器进行孵化 (上一个在孵化器孵化 spring-cloud-loadbalancer 已经正式接替 Ribbon 成为正式推荐组件)。
在了解 Spring Cloud Square 之前,需要先了解以下组件:
OkHttp 是一个关于网络请求的第三方类库,其中封装了网络请求的 get、post 等操作的底层实现,是目前最为火热的网络请求框架之一。
Retrofit 是一个 RESTful 的 HTTP 网络请求框架, 它是基于 OkHttp 的。它是通过注解配置网络参数的,支持多种数据的解析和序列化(Gson、Json、Xml 等,并且对 RxJava 也是支持的。
那么基于 Spring Cloud Square 的服务调用可以抽象成如下图所示:
<repositories>
<repository>
<id>spring-milestonesid>
<url>https://repo.spring.io/milestoneurl>
repository>
repositories>
复制代码
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-square-okhttpartifactId>
<version>${square.version}version>
dependency>
<dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>${okhttp.version}version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
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 一样的味道
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-square-retrofitartifactId>
<version>${square.version}version>
dependency>
复制代码
@RetrofitClient("square-provider")
public interface DemoService {
@GET("/")
Call req();
}
复制代码
@EnableRetrofitClients
复制代码
@Autowired
DemoService demoService;
@SneakyThrows
@GetMapping("/retrofit")
public String retrofit(){
return demoService.req().execute().body();
}
复制代码