gateway灰度发布

自定义灰度IRule

远程调用的灰度发布

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

/**
* 版本参数
*/
@Slf4j
public class ReqVersionContext {
	/**
	 * metadata 里的应用version
	 */
	public static final String SERVER_VERSION_HEADER_PARAM_NAME = "SERVER_VERSION";
	/**
	 * 当前请求version版本
	 */
	public static ThreadLocal<String> reqVersionThreadLocal = new ThreadLocal<>();


}

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

/**
 * 这里获取进入的http请求的version,放入线程私有变量,以供后面对外进行feign以及 RestTemplate请求时使用(将version放入请求头中),可以在拦截器干,也可在aop干,
 */
public class ReqVersionInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		String version = request.getHeader(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME);
		ReqVersionContext.reqVersionThreadLocal.set(version);
		return true;
	}

}

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

  1. Feign对外调用设置version
public class CoreFeignRequestInterceptor implements RequestInterceptor {

   @Override
   public void apply(RequestTemplate template) {
   	template.header(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME, ReqVersionContext.reqVersionThreadLocal.get());
   }
}

  1. RestTemplate 设置对外请求的拦截器,以设置version
/**
* restTemplate请求拦截器
*/
public class GrayRuleInterceptor implements ClientHttpRequestInterceptor {
 	@Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    	// 这里设置一系列请求前要执行的操作。
        //设置请求版本,
    	request.getHeaders().add(ReqVersionContext.SERVER_VERSION_HEADER_PARAM_NAME, ReqVersionContext.reqVersionThreadLocal.get());

	}
}
    /**
     * RestTemplate 
     * @param weightRuleInterceptor 要注入的拦截器
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplage(@Nullable GrayRuleInterceptor grayRuleInterceptor) {
        RestTemplate restTemplate = new RestTemplate();
        List<ClientHttpRequestInterceptor> list = new ArrayList<>();
        if (null != grayRuleInterceptor) {
            list.add(grayRuleInterceptor);
        }
        restTemplate.setInterceptors(list);
        return restTemplate;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值