欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解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,说来容易做起来却十分棘手,完成这一功能,费了相当大的力气:

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

代码说明:

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、

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。