一、Feign简介
Feign是简化Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于Retrofit、JAXRS-2.0和WebSocket。Feign的初衷是降低统一绑定Denominator到HTTP API的复杂度,不区分是否为restful。
Feign是一个声明式WebService客户端。使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。
Feign集成了Ribbon,而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模板化的调用方法.但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义.在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
二、搭建工程
(1)右键点击父工程>new>module创建demo_feign模块
(2)pom.xml添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--feign依赖 自带熔断器hystrix 默认使用Ribbon作为客户端负载均衡器 无需引入额外的包-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--spring-cloud-starter-feign 已经不赞成使用-->
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
(3) 添加application.yml配置文件
server:
port: 9002
spring:
application:
name: demo-feign
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8888/eureka
instance:
prefer-ip-address: true #以IP地址注册到服务中心
(4)编写启动类 添加注解 @EnableDiscoveryClient @EnableFeignClients
(5) feign包下新建一个service包,创建接口TestInterface
(6) 编写测试类,调用TestInterface里面的方法
(7)启动demo_eureka,启动服务提供者demo_ribbon_service,启动demo_feign,Eureka上面注册的服务如下:
(8)浏览器输入 http://localhost:9002/feigntest/test?param=123,服务调用成功,返回结果如下:
三、 熔断器hystrix 实现
(1)service包下新建impl包,编写类 TestInterfaceImpl 实现 TestInterface 接口
(2) 修改 TestInterface,修改注解,增加fallback
(3)修改application.yml 开启hystrix
server:
port: 9002
spring:
application:
name: demo-feign
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8888/eureka
instance:
prefer-ip-address: true #以IP地址注册到服务中心
feign:
hystrix:
enabled: true #开启hystrix
(4)重新启动demo_eureka,启动demo_feign,但是不要启动服务提供者 demo_ribbon_service,目的就是测试在服务挂掉的
情况下,熔断器是否能够触发。目前Eureka上面只有demo_feign一个服务
(5)浏览器重新访问 http://localhost:9002/feigntest/test?param=123,可以观察到熔断器成功触发:
Hystrix简单介绍:在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。