一、Feign定义
Spring Cloud Feign是基于Netflix Feign实现的,它整合了Spring Cloud Ribbon(负载均衡)与Spring Cloud Hystrix(熔断机制) ,还提供了一种声明式的Web服务客户端定义方式。开发时只需要创建一个接口,并要注解的方式来配置它,即可完成对服务提供方的接口绑定。
二、Feign实现
之前的文章创建了potian-system用于后期存放用户权限系统相关代码,这里我们创建一个新的项目potian-authority用于权限验证,并且使用Feign实现微服务调用
1、创建potian-authority服务(创建成功后,修改父项目、potian-authority配置文件)
- 父项目引入子项目
<?xml version="1.0" encoding="UTF-8"?>
- 子项目继承父项目,并添加Eureka jar
<?xml version="1.0" encoding="UTF-8"?>
2、修改application.xml,设置端口号和项目名称
server
3、potian-system、potian-authority引入Feign(即在各自的pom.xml添加)
<dependency>
4、启用Feign客户端:在项目启动类添加注解@EnableFeignClients,如下(SystemApplication也需要添加该注解)
@EnableFeignClients
5、在potian-authority项目里创建package目录(com.potian.authority.feign),并在目录下创建接口UserFeignClient,现实如下
package
注:
- @FeignClien中value表示调用哪个微服务,fallback表示调用失败后,降级处理的类
- @RequestMapping表示请求路径
- @PathVariable表示请求参数的变量
6、在com.potian.authority.feign.fallback包下,创建UserFeignClientFallback类,用于调用的降级处理,实现如下
package
7、在potian-authority中添加包com.potian.authority.controller,并创建类AuthorityController调用getUserInfo方法实现Feign
@RestController
8、在potian-system项目里添加一个UserController类,作为被调用方
@RestController
9、启动注册中心和上面两个微服务,并在浏览器中输入http://localhost:2222/authority/getUserInfo?userCode=chensr,即可得到potian-system项目返回的“userCode + 小红”
三、Feign超时设置
Feign的超时时间主要由Ribbon和Hystrix两部分超时设置决定的,上面我们用potian-authority调用potian-system,所以只需要在potian-authority项目application.yml进行相应的配置即可。
1、设置Ribbon超时时间
ribbon
由于ConnectTimeOut是连接超时,一般是由于网络原因或者是服务不存在造成的,所以一般只需设置1、2秒时间即可。
2、开启Hystrix超时时间
feign:
hystrix:
enabled: true
如果没开启,ribbon超时会直接报TimeOut异常,并不会触发相应的熔断处理机制
3、设置Hystrix超时时间
hystrix:
command:
default: #default全局有效,service id指定应用有效
execution:
timeout:
#如果enabled设置为false,则请求超时交给ribbon控制,为true,则超时作为熔断根据
enabled: true
isolation:
thread:
timeoutInMilliseconds: 3000 #断路器超时时间,默认1000ms
4、修改potian-system项目中UserController的方法getUserInfo,设置随机睡眠1.5至2.5秒
@RequestMapping
5、测试(http://localhost:2222/authority/getUserInfo?userCode=chensr)
- l 当超时时间小于2000时,返回“chensr 小红”(成功)
- l 当超时时间大于2000时,返回“调用失败”,并且在potian-system控制台看到如下打印
可以看到,第一次超时了,进行了重试机制,第二次请求小于2000,没有超时,但是还是返回了“调用失败”。这时因为两次时间加起来超过了Hystrix设置的超时时间3000。虽然robbin进行了重试,但是对于Hystrix来说,这只是一次请求而已。
- l 重新设置Hystrix超时时间为6000:(1+MaxAutoRetriesNextServer+MaxAutoRetriesNextServer)*(ReadTimeout+ConnectTimeout)
再次访问,计算第一次超时,只要时第二次不超时,还是可以返回“chensr 小红”
6、超时设置说明
- 时间设置:ConnectTimeout<ReadTimeout<timeoutInMilliseconds(Hystrix熔断时间)
- Hystrix超时时间设置:(1+MaxAutoRetriesNextServer+MaxAutoRetriesNextServer)*(ReadTimeout+ConnectTimeout)
- Ribbion默认重试一次,但重试次数的总时间如果大于Hystrix熔断时间就会触发熔断机制
四、Robbin本地负载均衡
1、在idea重新配置一个端口号为1112的potian-system
2、修改potian-system方法
@RequestMapping
3、重启potian-system两个实例,登录注册中心可以看到
4、访问:http://localhost:2222/authority/getUserInfo?userCode=chensr 循环返回:chensr:1111、chensr:1112