欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

详解springcloud 基于feign的服务接口的统一hystrix降级处理

时间:2021-07-16 10:43:45|栏目:JAVA代码|点击:

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、https://github.com/penggle/xmodule/tree/master/xmodule-common-springcloud
2、https://github.com/penggle/xmodule/tree/master/xmodule-examples-springcloud/xmodule-examples-springcloud-nacos

快速上手入口:https://github.com/penggle/xmodule/blob/master/xmodule-common-springcloud/src/main/java/org/springframework/cloud/openfeign/HystrixFallbackConfiguration.java

上一篇:基于google zxing的Java二维码生成与解码

栏    目:JAVA代码

下一篇:Java检测线程中断状态的方法示例

本文标题:详解springcloud 基于feign的服务接口的统一hystrix降级处理

本文地址:http://www.codeinn.net/misctech/158106.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有