乐趣区

关于spring:干掉-FeignSpring-Cloud-Square-组件发布

Spring Cloud Square 是什么

谈起 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 的服务调用能够形象成如下图所示:

疾速上手

增加依赖

  • 因为目前 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 一样的滋味

增加依赖

<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();
}

总结

    1. 因为 spring-cloud-square 间接基于 retrofit 实现,整体源码十分的简略,举荐大家一读。
    1. 目前版本暂未实现 fallback 相干的实现。
    1. 本文的配套代码 https://github.com/lltx/spring-cloud-square-demo
退出移动版