详解springcloud 基于feign的服务接口的统一hystrix降级处理
程序员文章站
2024-02-02 16:08:58
springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个feign服务接口都得写一些重复问的服务降级处理...
springcloud开发微服务时,基于feign来做声明式服务接口,当启用hystrix服务熔断降级时,项目服务众多,每个feign服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味:
feign服务接口:
@feignclient(name="springcloud-nacos-producer", qualifier="productapiservice", contextid="productapiservice", fallback=productfallbackapiservice.class) public interface productapiservice { /** * 创建商品 * @param product */ @postmapping(value="/api/product/add", produces=application_json, consumes=application_json) public result<long> createproduct(@requestbody product product); /** * 修改商品 * @param product */ @putmapping(value="/api/product/update", produces=application_json, consumes=application_json) public result<object> updateproduct(@requestbody product product); /** * 删除商品 * @param productid */ @deletemapping(value="/api/product/delete/{productid}", produces=application_json) public result<object> deleteproductbyid(@pathvariable("productid") long productid); /** * 根据productid获取商品信息 * @param productid * @return */ @getmapping(value="/api/product/{productid}", produces=application_json) public result<product> getproductbyid(@pathvariable("productid") long productid); /** * 根据条件查询商品列表(分页、排序) * @param condition * @param page * @param sort * @return */ @getmapping(value="/api/product/list1", produces=application_json) public pageresult<list<product>> getproductlistbypage(@requestparam product condition, @requestparam page page, @requestparam sort sort); }
对应的熔断降级处理类:
@component public class productfallbackapiservice implements productapiservice { private static final httpstatus service_unavailable = httpstatus.service_unavailable; protected <t> result<t> defaultfallbackresult() { return result.failure().code(string.valueof(service_unavailable.value())).message(string.format("请求失败:%s, %s", service_unavailable.value(), service_unavailable.getreasonphrase())).build(); } protected <t> pageresult<t> defaultfallbackpageresult() { return pageresult.failure().code(string.valueof(service_unavailable.value())).message(string.format("请求失败:%s, %s", service_unavailable.value(), service_unavailable.getreasonphrase())).build(); } @override public result<long> createproduct(product product) { return defaultfallbackresult(); } @override public result<object> updateproduct(product product) { return defaultfallbackresult(); } @override public result<object> deleteproductbyid(long productid) { return defaultfallbackresult(); } @override public result<product> getproductbyid(long productid) { return defaultfallbackresult(); } @override public pageresult<list<product>> getproductlistbypage(product condition, page page, sort sort) { return defaultfallbackpageresult(); } }
当服务较多时写这样重复的统一熔断降级处理显得十分枯燥无味!
前提场景是你的服务接口具有统一的报文格式,例如我的是result<t>或者pageresult<t>,这样才有统一全局处理的可能,否则每个服务的fallback你是省不了的
本文将采用cglib动态代理来统一处理这些fallback,说来容易做起来却十分棘手,完成这一功能,费了相当大的力气:
代码说明:
1、包org.springframework.cloud.openfeign中的都是为实现这一功能自定义的东西,至于包名为什么取org.springframework.cloud.openfeign,那是因为org.springframework.cloud.openfeign.targeter这个接口声明是protected的
2、上面4个类:defaultfeignclientsconfiguration.java、defaulthystrixfallbackhandler.java、defaulthystrixfallbackhandlerfactory.java、hystrixfallbackresults.java是在项目中具体使用的具体配置
代码位置:
1、
2、
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
下一篇: 最正宗的广式腊肠煲仔饭做法(独家秘制)