快捷搜索: 王者荣耀 脱发

SpringCloud Finchley基础教程:4,服务间调用feign

1. 引入pom依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

feign已经包含了ribbon和hystrix

2. feign调用其它服务

2.1 主feign调用接口

@FeignClient(name = "i5xforyou-biz-auth", fallback=AuthFeignClientHystrix.class)
public interface AuthFeignClient {
          
   

    /**
     * getMiniProgramInfo <br/>
     * 获取小程序的基本信息 <br/>
     *
     * @author Mobile Web Group-lff
     * @date 2018年3月22日 上午9:14:44
     *
     * @param mpId
     * @return JsonPackage
     */
    @RequestMapping(value = "/auth/miniprogram/info", method = RequestMethod.GET)
    public JsonPackage getMiniProgramInfo(@RequestParam("mpId") String mpId);



}

@FeignClient注解:

    name为其它服务的服务名称 fallback为熔断后的回调

服务间调用方法

    @RequestMapping中要写上其它服务的context-path 比如说i5xforyou-biz-auth的context-path设置如下:
server:
  port: 31000
  http2:
    enabled: true  
  servlet:
    context-path: /auth

请求要加上/auth前缀

    参数要通过@RequestParam,@PathVariable,@RequestHeader来传递

2.2 熔断后的回调类

@Component
public class AuthFeignClientHystrix extends BaseClass implements AuthFeignClient {
          
   

    /**
     * Description: 获取小程序的基本信息
     * @author: Mobile Web Group-lff
     * @date: 2018年3月22日 上午9:17:35
     * 
     * @see com.wuuxiang.i5xforyou.feign.AuthFeignClient#getMiniProgramInfo(java.lang.String)
     */
    @Override
    public JsonPackage getMiniProgramInfo(String mpId) {
        log.error("调用i5xforyou-biz-auth的/miniprogram/info接口触发了断路由,入参mpId=" + mpId);
        return JsonPackage.getHystrixJsonPackage();
    }

}
    实现主feign调用接口 @Override对应的方法

2.3 熔断设置

#默认为false,如果想用断路由,要打开这个设置
feign.hystrix.enabled=true

#断路器线程池超时时间,这个值一定要比ribbon超时时间长,毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=16000

如果服务间调用方法超过设定的16000毫秒,就会触发断路由回调方法。

2.4 ribbon超时重试

当一个服务出现异常的时候,服务间调用可能会出现超时。当出现超时的时候,我们希望其重试几次,以提高系统的健壮性。

#重试机制开关,默认false
spring.cloud.loadbalancer.retry.enabled=true

#http建立socket超时时间,毫秒
ribbon.ConnectTimeout=5000
#http读取响应socket超时时间
ribbon.ReadTimeout=5000

#同一台实例最大重试次数,不包括首次调用
ribbon.MaxAutoRetries=0
#重试负载均衡其他的实例最大重试次数,不包括首次server
ribbon.MaxAutoRetriesNextServer=2

#是否所有操作都重试,POST请求注意多次提交错误。
#默认true,设定为false的话,只有get请求会重试
ribbon.OkToRetryOnAllOperations=false

这样设定的话,服务间调用方法如果超过5s没有返回结果,就会重试其它实例,最多重试2个其它实例。也就是最多耗时5*3=15秒。断路由的超时时间要大于这个值。

ribbon.OkToRetryOnAllOperations要设定为false,不然容易出现超时成功,重复提交的问题,造成数据异常。 比如说有一个库存+2的post请求,服务间调用的时候虽然5s超时了,但是在第6秒的处理成功了,由于有ribbon超时重试设置,其会再重试2个其它实例,导致总共调用了3次服务间方法,最终库存被+6,造成数据异常。

经验分享 程序员 微信小程序 职场和发展