当前位置:

gateway灰度发布

访客 2024-04-23 506 0

自定义灰度IRule

远程调用的灰度发布

当请求过来,如果有服务间的调用,不管是使用Feign还是RestTemplate,都面临版本问题。所以可以将其加在请求头中,提供给下一个服务使用判断

/***版本参数*/@Slf4jpublicclassReqVersionContext{/***metadata里的应用version*/publicstaticfinalStringSERVER_VERSION_HEADER_PARAM_NAME="SERVER_VERSION";/***当前请求version版本*/publicstaticThreadLocal<String>reqVersionThreadLocal=newThreadLocal<>();}

外部请求进入应用,用HandlerInterceptor设置version

/***这里获取进入的http请求的version,放入线程私有变量,以供后面对外进行feign以及RestTemplate请求时使用(将version放入请求头中),可以在拦截器干,也可在aop干,*/publicclassReqVersionInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Stringversion=request.getHeader(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME);ReqVersionContext.reqVersionThreadLocal.set(version);returntrue;}}

对外请求设置拦截器,设置version

  1. Feign对外调用设置version
publicclassCoreFeignRequestInterceptorimplementsRequestInterceptor{@Overridepublicvoidapply(RequestTemplatetemplate){template.header(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME,ReqVersionContext.reqVersionThreadLocal.get());}}
  • RestTemplate设置对外请求的拦截器,以设置version
  • /***restTemplate请求拦截器*/publicclassGrayRuleInterceptorimplementsClientHttpRequestInterceptor{@OverridepublicClientHttpResponseintercept(HttpRequestrequest,byte[]body,ClientHttpRequestExecutionexecution)throwsIOException{//这里设置一系列请求前要执行的操作。//设置请求版本,request.getHeaders().add(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME,ReqVersionContext.reqVersionThreadLocal.get());}}/***RestTemplate*@paramweightRuleInterceptor要注入的拦截器*@return*/@Bean@LoadBalancedpublicRestTemplategetRestTemplage(@NullableGrayRuleInterceptorgrayRuleInterceptor){RestTemplaterestTemplate=newRestTemplate();List<ClientHttpRequestInterceptor>list=newArrayList<>();if(null!=grayRuleInterceptor){list.add(grayRuleInterceptor);}restTemplate.setInterceptors(list);returnrestTemplate;}

    发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~