摘要:开发微服务时,基于来做声明式服务接口,当启用服务熔断降级时,项目服务众多,每个服务接口都得写一些重复问的服务降级处理代码,势必显得枯燥无味服务接口创建商品修改商品删除商品根据获取商品信息根据条件查询商品列表分页排序对应的熔断降级处理类请
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 ResultcreateProduct(@RequestBody Product product); /** * 修改商品 * @param product */ @PutMapping(value="/api/product/update", produces=APPLICATION_JSON, consumes=APPLICATION_JSON) public Result
对应的熔断降级处理类:
@Component public class ProductFallbackApiService implements ProductApiService { private static final HttpStatus SERVICE_UNAVAILABLE = HttpStatus.SERVICE_UNAVAILABLE; protectedResult defaultFallbackResult() { return Result.failure().code(String.valueOf(SERVICE_UNAVAILABLE.value())).message(String.format("请求失败:%s, %s", SERVICE_UNAVAILABLE.value(), SERVICE_UNAVAILABLE.getReasonPhrase())).build(); } protected PageResult 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 createProduct(Product product) { return defaultFallbackResult(); } @Override public Result updateProduct(Product product) { return defaultFallbackResult(); } @Override public Result deleteProductById(Long productId) { return defaultFallbackResult(); } @Override public Result getProductById(Long productId) { return defaultFallbackResult(); } @Override public PageResult > getProductListByPage(Product condition, Page page, Sort sort) { return defaultFallbackPageResult(); } }
当服务较多时写这样重复的统一熔断降级处理显得十分枯燥无味!
前提场景是你的服务接口具有统一的报文格式,例如我的是Result本文将采用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、https://github.com/penggle/xm...
2、https://github.com/penggle/xm...
快速上手入口:
https://github.com/penggle/xm...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74789.html
摘要:本文重点介绍一下基于实现服务发现。使用方式下面我们开始的使用添加和的依赖添加注解开启服务发现,注解支持客户端。同样子,他可以使用默认的也可以使用或者修改配置文件服务名字服务无端口会随机选择一个服务集群名字注册中心地址,完成。 springcloud-feign实现服务发现 上一篇介绍了nacos实现配置和注册中心,在微服务中只有配置和注册中心远远不够,还需要有服务发现。本文重点介绍一...
摘要:在舱壁模式中可以隔离每个远程资源,并分配各自的线程池,使之互不影响。 springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代码见文章最下方。 一、为什么要有客户端弹性模式 所有的系统都会遇到故障,分布式系统单点故障概率更高。如何构建应用程序来应对故障,是每个软件开发人员工作的关键部分。但是通...
摘要:集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。这样就高兴了,可以专心写自己的,前端就专门交由小周负责了。于是,小周和就变成了协作开发。都是为了项目正常运行以及迭代。 一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringClou...
摘要:集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。这样就高兴了,可以专心写自己的,前端就专门交由小周负责了。于是,小周和就变成了协作开发。都是为了项目正常运行以及迭代。 一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringClou...
阅读 3456·2021-10-08 10:04
阅读 826·2019-08-30 15:54
阅读 2136·2019-08-29 16:09
阅读 1322·2019-08-29 15:41
阅读 2241·2019-08-29 11:01
阅读 1697·2019-08-26 13:51
阅读 999·2019-08-26 13:25
阅读 1774·2019-08-26 13:24