SpringCloudAlibaba - Feign 整合 Sentinel

前言

记录下Feign整合Sentinel的方式 Feign的整合与Sentinel的整合查看系列文章


环境

Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE + Sentinel 1.8.1


简单示例

    实现内容中心使用feign调用用户中心接口限流

content-center

    application.yml
feign:
  sentinel:
    # 为 Feign 整合 Sentinel
    enabled: true
    TestController.java
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {

	 private final TestFeignClient testFeignClient;

    @GetMapping("test6")
    public String test6() {
        return testFeignClient.test("Coisini");
    }
    
}
    TestFeignClient.java
@FeignClient(name = "user-center")
public interface TestFeignClient {

    /**
     * test接口被调用时,feign会构造出 url
     * http://user-center/test/{name} 完成请求
     * @param name
     * @return
     */
    @GetMapping("/test/{name}")
    String test(@PathVariable String name);

}

user-center

TestController.java

@RestController
@Slf4j
public class TestController {

    @GetMapping("/test/{name}")
    public String test(@PathVariable String name) {
        log.info("请求...");
        return "hello " + name;
    }

}

测试

    调用接口

    通过簇点链路配置一条QPS为1的流控规则
    频繁访问接口触发流控


定制自己的逻辑处理

    可以通过@FeignClient的fallback属性定制自己的逻辑处理,也就是远程调用被流控了时的业务处理逻辑 TestFeignClient.java
@FeignClient(name = "user-center", fallback = TestFeignClientFallback.class)
    TestFeignClientFallback.java
/**
 * TestFeignClient 被流控时的处理逻辑
 */
@Component
public class TestFeignClientFallback implements TestFeignClient {
    @Override
    public String test(String name) {
        // 业务逻辑
        return "流控/降级";
    }
}
    重新启动应用配置流控规则频繁访问接口触发流控


限流/降级的异常捕捉

    可以通过@FeignClient的fallbackFactory属性捕捉异常 TestFeignClient.java
@FeignClient(name = "user-center", fallbackFactory = TestFeignClientFallbackFactory.class)
    TestFeignClientFallbackFactory.java
@Component
@Slf4j
public class TestFeignClientFallbackFactory implements FallbackFactory<TestFeignClient> {
    @Override
    public TestFeignClient create(Throwable cause) {
        return new TestFeignClient() {
            @Override
            public String test(String name) {
                log.warn("远程调用被限流/降级了", cause);
                return "远程调用被限流/降级了";
            }
        };
    }
}
    重新启动应用配置流控规则频繁访问接口触发流控

    后台异常的打印

注:fallback 与 fallbackFactory 二选一使用


- End -
白嫖有风险
经验分享 程序员 微信小程序 职场和发展