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

网友投稿 504 2023-08-06

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

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

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 createProduct(@RequestBody Product product);

/**

* 修改商品

* @param product

*/

@PutMapping(value="/api/product/update", produces=APPLICATION_JSON, consumes=APPLICATION_JSON)

public Result updateProduct(@RequestBody Product product);

/**

* 删除商品

* @param productILZdOtRvNEId

*/

@DeleteMapping(value="/api/product/delete/{productId}", produces=APPLICATION_JSON)

public Result deleteProductById(@PathVariable("productId") Long productLZdOtRvNEIId);

/**

* 根据productId获取商品信息

* @param productId

* @return

*/

@GetMapping(value="/api/product/{productId}", produces=APPLICATION_JSON)

public Result getProductById(@PathVariable("productId") Long productId);

/**

* 根据条件查询商品列表(分页、排序)

* @param condition

* @param page

* @param sort

* @return

*/

@GetMapping(value="/api/product/list1", produces=APPLICATION_JSON)

public PageResult 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 Result 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或者PageResult,这样才有统一全局处理的可能,否则每个服务的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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mybatis的插件机制示例详解
下一篇:SpringBoot 2.0 整合sharding
相关文章

 发表评论

暂时没有评论,来抢沙发吧~