一、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 + 小红”




java微服务 domain java微服务之间的调用_Code


三、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控制台看到如下打印


java微服务 domain java微服务之间的调用_xml_02


可以看到,第一次超时了,进行了重试机制,第二次请求小于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


java微服务 domain java微服务之间的调用_java微服务 domain_03


2、修改potian-system方法


@RequestMapping


3、重启potian-system两个实例,登录注册中心可以看到


java微服务 domain java微服务之间的调用_Code_04


4、访问:http://localhost:2222/authority/getUserInfo?userCode=chensr 循环返回:chensr:1111、chensr:1112