1:灰度发布
1:灰度发布
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
2:蓝绿发布
就是在发布新版本时,将新版本服务全部打到其他的物理机上,然后测试没问题再切换,这样太浪费机器,也费钱
3:滚动发布
加入v1服务一共10台机器,再拿出来一台打上v2版本,替换上去,没问题再把这10台机器挨个停;
2:灰度发布开发
灰度发布就是利用eureka有个instance.metadata-map属性,可以自定义数据,然后再zull中设置过滤器来制定路由分发规则,可以制定让某些测试人员来专门走这个新的服务
1:启动某个服务的两个版本
v1版本;8003端口
spring:
profiles: v1
eureka:
instance:
metadata-map:
version: v1
server:
#服务端口
port: 8003
v2版本:8004端口
spring:
profiles: v2
eureka:
instance:
metadata-map:
version: v2
server:
#服务端口
port: 8004
2:zull中导入依赖
<!-- 实现通过 metadata 进行灰度路由 -->
<dependency>
<groupId>io.jmnarloch</groupId>
<artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>
<version>2.1.0</version>
</dependency>
3:开发一个过滤器来实现灰度发布
package com.mashibing.cloudzuul.filter;
import com.mashibing.cloudzuul.dao.CommonGrayRuleDaoCustom;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import io.jmnarloch.spring.cloud.ribbon.support.RibbonFilterContextHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.context.annotation.FilterType;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/** 灰度发布
* @author 马士兵教育:晁鹏飞
* @date 2020/06/29
*/
@Component
public class GrayFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return false;
}
@Autowired
private CommonGrayRuleDaoCustom commonGrayRuleDaoCustom;
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
int userId = Integer.parseInt(request.getHeader("userId"));
// 根据用户id 查 规则 查库 v1,meata
// 金丝雀
if (userId == 1){
RibbonFilterContextHolder.getCurrentContext().add("version","v1");
// 普通用户
}else if (userId == 2){
RibbonFilterContextHolder.getCurrentContext().add("version","v2");
}
return null;
}
}