当前位置: 移动技术网 > IT编程>开发语言>Java > 详解springcloud 基于feign的服务接口的统一hystrix降级处理

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

2019年07月19日  | 移动技术网IT编程  | 我要评论

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、

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网