写于:2018-12-28 00:02:37
code.zip
一、Feign
Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign Feign 是一个声明式服务客户端。它简化了服务客户端的书写。而使用 feign 只需要 定义一个接口,并使用注解标注就可以了。这个注解可以使用 fiegn 提供的注解 也可以是 JAX_R5 的注解。Feign 也支持可插拔式的加密解密。Spring Cloud 在 Feign 的基础上增加了 Spring MVC 注解的支持。 Spring Cloud 在 使用feign 时 整合了Ribbon 和eureka 提供 http client 负载均衡请求。
二、Feign 与 Ribbon
Feign 对 Ribbon 进行了封装,提供了更好的编程体验。 在 《Ribbon概述》 和 《Ribbon深入》 中 提到 Ribbon 原理就是通过维护一组服务列表列表数据:
服务名-URL+IP端口的映射
,在使用 服务名拼接 url 访问的时候,帮我们将 服务映射成ip +port
的方式。
以下是一段使用 服务名访问远程API的简短代码:
@GetMapping("/user/query/{userId}")
public String demo4(@PathVariable("userId")Long userId){
String serverName = "provider";
ResponseEntity<String> forEntity = restTemplate.
getForEntity("http://" + serverName + "/user/query/" + userId, String.class);
return forEntity.getBody();
}
整合了 Ribbon ,由 Ribbon 进行映射拼接,有效的解决了 Http 访问,拼接 url 的窘境,但是代码编写中,仍然避免不了主动进行 url 的拼接。
而 Feign 整合 Ribbon 解决的问题之一就是,通过简单的编码方式实现 url 的自动拼接。
下面通过一个简单案例, Feign 怎么提升了编码体验。
2.1、Feign 整合 RIbbon 案例
项目结构如下:
feign-ribbon-server
单纯的 web 服务,提供测试 API
/server/api
feign-ribbon-client
Feign 结合 Ribbon 的调用案例 关键操作: 依赖-
spring-cloud-starter-netflix-ribbon
和spring-cloud-starter-openfeign
Application.class 启动追加注解:@EnableFeignClients
boostrap.properties 配置serverName.ribbon.listOfServers
使用 Ribbon 自己拼接 URL案例
使用 Feign 自动拼接 URL 案例
三、Feign + Ribbon + Eureka
Feign + Ribbon 简化了开发手动拼接的繁琐,不过直接使 Ribbon 需要手动维护服务实例列表 。 针对该问题,Spring Cloud 同样提供了解决方案,如:Eureka 服务注册中心。根据注册中心的服务实例列表自动更新,解决手动维护服务列表的问题。
3.1、整合案例
在上面 feign + ribbon
的基础上,增加 eureka
相关代码。
项目结构如下
feign-ribbon-eureka
参考 《Eureka-概述》
feign-ribbon-server
追加依赖
spring-cloud-starter-netflix-eureka-client
Application.class 追加@EnableDiscoveryClient
application.properties 追加eureka.client.service-url.defaultZone = [http://zhixing:zhixing@127.0.0.1:1111/eureka/](http://zhixing:zhixing@127.0.0.1:1111/eureka/)
feign-ribbon-client
追加依赖
spring-cloud-starter-netflix-eureka-client
Application.class 追加@EnableDiscoveryClient
bootstrap.properties 追加eureka.client.service-url.defaultZone = [http://zhixing:zhixing@127.0.0.1:1111/eureka/](http://zhixing:zhixing@127.0.0.1:1111/eureka/)
bootstrap.properties 注释feign-ribbon-server.ribbon.listOfServers
配置
四、Feign + Ribbon + Hystrix
Feign 除了对 Ribbon进行封装,还封装了 Hystrix 的支持
4.1、整合案例
项目结构如下
在上述 Feign + Ribbon + Eureka
的代码基础上进行修改
feign-ribbon-eureka
不动
feign-ribbon-client
spring-cloud-starter-openfeign
中已经有hystrix
相关依赖,所以无需引用依赖 bootstrap.properties 追加配置 feign 开启 hystirx 功能:feign.hystrix.enabled = true
hystrix 超时时间改小便与测试 :hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=500
feign-ribbon-server
测试 API 增加睡眠时间模拟超时