软件公司发新版本前会做些什么?

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


 文章目录

其他系列文章导航

文章目录

前言

一、灰度系统

1.1 灰度系统含义

1.2 灰度系统实现

1.3 如何设置cookie

二、nginx配置cookie实现分流示例

三、总结 


前言

软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。

新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。

所以,在公司里上线新版本代码一般都是通过灰度系统。


一、灰度系统

1.1 灰度系统含义

灰度系统是用来帮助 API 服务在上线时按照受众从小到大最终至全量的发布,实现功能的灰度上线,用来保证发布的服务的质量的系统。

灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码。

如下图所示:

软件公司发新版本前会做些什么?_第1张图片

而且灰度系统支持设置流量的比例,比如可以把走新版本代码的流量设置为 5%,没啥问题再放到 10%,50%,最后放到 100% 全量。

这样可以把出现问题的影响降到最低。

不然一上来就全量,万一出了线上问题,那就是大事故。

而且灰度系统不止这一个用途,比如产品不确定某些改动是不是有效的,就要做 AB 实验,也就是要把流量分成两份,一份走 A 版本代码,一份走 B 版本代码。

1.2 灰度系统实现

那这样的灰度系统是怎么实现的呢?

其实很多都是用 nginx 实现的。

Nginx是一款高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,在同类型的网页服务器中表现较好。

Nginx能做以下几件事:

  1. 反向代理:请求不会直接到达真正的服务器(比如tomcat),而是先经过nignx服务器,在由nignx服务器转发到正真的tomcat服务器上。
  2. 负载均衡:为减少单个服务器访问压力,往往设置多个服务器,nignx恶意根据一定的策略(轮训、ip_hash、权重)来决定将该请求转发到哪一个服务器。
  3. 动静分离:动态页面(jsp)和静态资源(html/css/jpg)可以分别放在不同的服务器,这样nignx可以根据不同类型的资源请求,将请求转发到不同的服务器。

nginx 是一个反向代理的服务,用户请求发给它,由它转发给具体的应用服务器。

如下图所示:
软件公司发新版本前会做些什么?_第2张图片

 

这一层也叫做网关层。

由它负责转发请求给应用服务器,那自然就可以在这里控制流量的分配,哪些流量走版本 A,哪些流量走版本 B。

1.3 如何设置cookie

但现在还有一个问题:

什么时候设置的这个 cookie 呢?

比如想实现 80% 的流量走版本 1.0,20% 的流量走版本 2.0

其实公司内部一般都有灰度配置系统,可以配置不同的版本的比例,然后流量经过这个系统之后,就会返回 Set-Cookie 的 header,里面按照比例来分别设置不同的 cookie。

比如随机数载 0 到 0.2 之间,就设置 version=2.0 的 cookie,否则,设置 version=1.0 的 cookie。

这也叫做流量染色。

完整的灰度流程是这样的:
软件公司发新版本前会做些什么?_第3张图片

第一次请求的时候,会按照设定的比例随机对流量染色,也就是设置不同 cookie。

再次访问的时候会根据 cookie 来走到不同版本的代码。

这就实现了灰度功能,可以用来做 5% 10% 50% 100% 这样逐步上线的灰度上线机制。

也可以用来做产品的 AB 实验。

公司里都会用这样的灰度系统。 


二、nginx配置cookie实现分流示例

当使用Nginx作为灰度系统时,可以通过配置cookie来实现用户分流和追踪。以下是一个示例的Nginx配置文件,用于设置灰度系统的cookie: 

http {  
    # 定义默认的 cookie 参数  
    cookie_domain example.com;  
    cookie_path /;  
    cookie_expires 60s;  
    cookie_secure off;  
    cookie_httponly on;  
  
    # 定义灰度分组  
    map $http_cookie $gray_group {  
        default "";  
        ~gray1 "group1";  
        ~gray2 "group2";  
        ~gray3 "group3";  
    }  
  
    server {  
        listen 80;  
        server_name example.com;  
  
        location / {  
            # 根据 cookie 分组,将请求转发到不同的后端服务器  
            if ($gray_group) {  
                proxy_pass http://backend_$gray_group;  
            }  
            proxy_pass http://backend;  # 默认转发到所有后端服务器  
        }  
    }  
}

在上述配置中,我们首先定义了默认的cookie参数,包括域名、路径、过期时间等。然后,使用map指令将HTTP请求中的cookie进行映射,将其中的gray1gray2gray3的cookie值映射为不同的灰度分组。

接下来,在location块中,我们使用if指令判断请求中是否存在灰度分组cookie,如果存在则将请求根据不同的分组值转发到相应的后端服务器。如果请求中没有灰度分组cookie,则默认将请求转发到所有的后端服务器。

请注意,上述配置仅是一个示例,实际应用中可能需要根据具体需求进行调整。另外,确保在Nginx配置文件中启用http_cookie模块,否则cookie配置将无法生效。


三、总结

新版本代码的上线基本都会用灰度系统,可以逐步放量的方式来保证上线过程不会出大问题,也可以用来做产品 AB 实验。

我们可以用 nginx 实现这样的功能。

nginx 有反向代理的功能,可以转发请求到应用服务器,也叫做网关层。

我们可以在这一层根据 cookie 里的 version 字段来决定转发请求到哪个服务。

在这之前,还需要按照比例来给流量染色,也就是返回不同的 cookie。

不管灰度系统做的有多复杂,底层也就是流量染色、根据标记转发流量这两部分,我们完全可以自己实现一个。


你可能感兴趣的:(Java基础合集,intellij,idea,电视盒子,inscode,mssql,开发语言,设计模式,大数据)