定义
灰度发布就是已一种平滑过渡的方式来发布,通过切换线上新旧版本之间的路由权重,逐步从旧版本切换到新版本;比如要上线新功能,首先只是更新少量的服务节点,通过路由权重,让少部分用户体验新版本,如果没有什么问题,再更新所有服务节点;这样可以在出现问题把影响面降到最低,保证了系统的稳定性。
灰度发布
一个系统往往有接入层比如nginx(Openresty),网关层比如zuul,以及服务层比如各种rpc框架;在这几层都有路由功能,也就是说这几层都可以做灰度;接入层可以使用nginx+lua来实现灰度,网关层zuul可以结合ribbon来实现灰度,rpc框架如dubbo本身提供了路由功能可以直接做灰度处理;下面看看具体如何去实现;
接入层灰度
接入层我们这里使用功能更强大的Openresty,然后使用lua进行路由转发,相关的路由策略可以配置在分布式缓存redis里面,当然也可以持久化到数据库里面;
- 准备
准备一台Openresty,两台web服务器tomcat(端口分别是8081,8082),以及redis;为了方便模拟在redis里面配置白名单,如果在白名单里面就走8082,不在则走8081;
- Openresty配置
需要在Openresty中配置支持lua,以及相关路由的lua脚本,nginx.conf配置如下:
http {
...
lua_package_path "/lualib/?.lua;;"; #lua 模块
lua_package_cpath "/lualib/?.so;;"; #c模块
upstream tomcat1 {
server 127.0.0.1:8081;
}
upstream tomcat2 {
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
content_by_lua_file lua/gray.lua;
}
location @tomcat1 {
proxy_pass http://tomcat1;
}
location @tomcat2 {
proxy_pass htt