git灰度发布版本_spring cloud灰度发布
新建三個項(xiàng)目:
demo-server 服務(wù)端
demo-client 客戶端
demo-gateway 網(wǎng)關(guān)層
現(xiàn)在希望可以根據(jù)用戶請求調(diào)用不同版本的代碼,如下所示
gateway->client(v1版本)->server(v1版本)
|
-->client(v2版本)->server(v2版本)
分析
從圖中可知,gateway項(xiàng)目和client項(xiàng)目,需要我們根據(jù)不同參數(shù)來干涉負(fù)載分發(fā)。spring cloud是使用ribbon作為負(fù)載均衡,這里我們引入如下pom依賴:
io.jmnarloch
ribbon-discovery-filter-spring-cloud-starter
2.1.0
他的原理是通過匹配 請求里面的路由參數(shù)與eureka注冊中心上實(shí)例配置的metadata里面的參數(shù)值,如果都匹配上了,才選擇該實(shí)例節(jié)點(diǎn)。
代碼修改
1、gateway項(xiàng)目
在AccessFilter extends ZuulFilter的run方法中增加如下代碼:
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
//灰度示例
RibbonFilterContextHolder.clearCurrentContext();
String version = request.getHeader("dispatch-version");
if (version!=null&&!"".equals(version)) {
RibbonFilterContextHolder.getCurrentContext().add("dispatch-version", version);
}
注意:gateway項(xiàng)目記得配置zuul.routes.client-api.sensitiveHeaders=Cookie,Set-Cookie,Authorization
2、client項(xiàng)目
新增WebMvcConfig類
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
super.addInterceptors(registry);
registry.addInterceptor(new VersionInterceptor());
}
}
新增VersionInterceptor類
import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class VersionInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
RibbonFilterContextHolder.clearCurrentContext();
String version = request.getHeader("dispatch-version");
if (version!=null&&!"".equals(version)) {
RibbonFilterContextHolder.getCurrentContext().add("dispatch-version", version);
}
return true;
}
}
在application.yml里增加:
eureka:
instance:
metadata-map:
dispatch-version: v1
3、server項(xiàng)目
在application.yml里增加:
eureka:
instance:
metadata-map:
dispatch-version: v1
驗(yàn)證
啟動gateway,client,server項(xiàng)目,
模擬請求在header里面設(shè)置dispatch-version=v1,發(fā)現(xiàn)訪問正常,如果把dispatch-version改成v2,發(fā)現(xiàn)訪問不了
這時,修改client和server項(xiàng)目的端口,并且dispatch-version改成v2,再啟動新實(shí)例,這時再模擬請求dispatch-version=v2,發(fā)現(xiàn)訪問正常了。
來回修改dispatch-version的值,發(fā)現(xiàn)v1的請求只會訪問v1版本,v2的請求只會訪問v2版本。至此,灰度發(fā)布的demo已驗(yàn)證成功。
總結(jié)
以上是生活随笔為你收集整理的git灰度发布版本_spring cloud灰度发布的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android studio 设置自动编
- 下一篇: python文件路径过滤器_SUMO入门