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,造成数据异常。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值