随着 Nacos 0.9 版本的发布, Nacos 离正式生产版本 (GA) 又近了一步, 其实已经有不少企业已经上了生产, 例如虎牙直播.
本周三 (今天), 晚上 19:00~21:00 将会在 Nacos 钉钉群(群号: 21708933) 直播 Nacos 1.0.0 所有发布特性的预览以及升级和使用上的指导.
Nacos 环境隔离
通常, 企业研发的流程是这样的: 先在测试环境开发和测试功能, 然后灰度, 最后发布到生产环境. 并且, 为了生产环境的稳定, 需要将测试环境和生产环境进行隔离, 此时, 必然会遇到问题是多环境问题, 即:
多个环境的数据如何隔离?
如何优雅的隔离?(不需要用户做任何改动)
本文将就 Nacos 环境隔离, 向大家介绍阿里在这方面的实践经验.
什么是环境?
说到环境隔离, 首先应该定义好什么是环境.
环境这个词目前还没有一个比较统一的定义, 有些公司叫环境, 在阿里云上叫 region, 在 Kubernetes 架构中叫 namespace. 本文认为, 环境是逻辑上或物理上独立的一整套系统, 这套系统中包含了处理用户请求的全部组件, 例如网关, 服务框架, 微服务注册中心, 配置中心, 消息系统, 缓存, 数据库等, 可以处理指定类别的请求.
举个例子, 很多网站都会有用户 ID 的概念, 可以按照用户 ID 划分, 用户 ID 以偶数结尾的请求全部由一套系统处理, 而奇数结尾的请求由另一套系统处理. 如下图所示. 我们这里说的环境隔离是指物理隔离, 即不同环境是指不同的机器集群.
环境隔离有什么用
上一节定义了环境的概念, 即一套包含了处理用户请求全部必要组件的系统, 用来处理指定类别的请求. 本节跟大家讨论一下环境隔离有哪些好处. 从概念的定义可以看出, 环境隔离至少有三个方面的好处: 故障隔离, 故障恢复, 灰度测试;
故障隔离
首先, 因为环境是能够处理用户请求的独立组件单元, 也就是说用户请求的处理链路有多长, 都不会跳出指定的机器集群. 即使这部分机器故障了, 也只是会影响部分用户, 从而把故障隔离在指定的范围内. 如果我们按照用户 id 把全部机器分为十个环境, 那么一个环境出问题, 对用户的影响会降低为十分之一, 大大提高系统可用性.
故障恢复
环境隔离的另一个重要优势是可以快速恢复故障. 当某个环境的服务出现问题之后, 可以快速通过下发配置, 改变用户请求的路由方向, 把请求路由到另一套环境, 实现秒级故障恢复. 当然, 这需要一个强大的分布式系统支持, 尤其是一个强大的配置中心(如 Nacos), 需要快速把路由规则配置数据推送到全网的应用进程.
灰度测试
灰度测试是研发流程中不可或缺的一个环节. 传统的研发流程中, 测试和灰度环节, 需要测试同学做各种各样的配置, 如绑定 host, 配置 jvm 参数, 环境变量等等, 比较麻烦. 经过多年的实践, 阿里巴巴内部的测试和灰度对开发和测试非常友好, 通过环境隔离功能来保证请求在指定的机器集群处理, 开发和测试不需要做任何做任何配置, 大大提高了研发效率.
Nacos 如何做环境隔离
前两节讲到了环境的概念和环境隔离的作用, 本节介绍如何基于 Nacos, 实现环境的隔离.
Nacos 脱胎于阿里巴巴中间件部门的软负载小组, 在环境隔离的实践过程中, 我们是基于 Nacos 去隔离多个物理集群的, 同时, 在 Nacos 客户端不需要做任何代码改动的情况下, 就可以实现环境的自动路由.
开始前, 我们先做一些约束:
一台机器上部署的应用都在一个环境内;
一个应用进程内默认情况下只连一个环境的 Nacos;
通过某种手段可以拿到客户端所在机器 IP;
用户对机器的网段有规划;
基本原理是:
网络中 32 位的 IPV4 可以划分为很多网段, 如 192.168.1.0/24, 并且一般中大型的企业都会有网段规划, 按照一定的用途划分网段. 我们可以利用这个原理做环境隔离, 即不同网段的 IP 属于不同的环境, 如 192.168.1.0/24 属于环境 A, 192.168.2.0/24 属于环境 B 等.
Nacos 有两种方式初始化客户端实例, 一种是直接告诉客户端 Nacos 服务端的 IP; 另一种是告诉客户端一个 Endpoint, 客户端通过 HTTP 请求到 Endpoint, 查询 Nacos 服务端的 IP 列表. 这里, 我们利用第二种方式进行初始化.
增强 Endpoint 的功能. 在 Endpoint 端配置网段和环境的映射关系, Endpoint 在接收到客户端的请求后, 根据客户端的来源 IP 所属网段, 计算出该客户端的所属环境, 然后找到对应环境的 IP 列表返回给客户端. 如下图
一个环境隔离 server 的示例
上面讲了基于 IP 段做环境隔离的约束和基本原理, 那么如何实现一个地址服务器呢. 最简单的方法是基于 nginx 实现, 利用 nginx 的 geo 模块, 做 IP 端和环境的映射, 然后利用 nginx 返回静态文件内容.
安装 nginx http://nginx.org/en/docs/install.html
在 nginx-proxy.conf 中配置 geo 映射, 参考这里
- geo $env {
- default "";
- 192.168.1.0/24 -env-a;
- 192.168.2.0/24 -env-b;
- }
配置 nginx 根路径及转发规则, 这里只需要简单的返回静态文件的内容;
- # 在 http 模块中配置根路径
- root /tmp/htdocs;
- # 在 server 模块中配置
- location / {
- rewrite ^(.*)$ /$1$env break;
- }
配置 Nacos 服务端 IP 列表配置文件, 在 / tmp/hotdocs/nacos 目录下配置以环境名结尾的文件, 文件内容为 IP, 一行一个
- $ll /tmp/hotdocs/nacos/
- total 0
- -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist
- -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist-env-a
- -rw-r--r-- 1 user1 users 0 Mar 5 08:53 serverlist-env-b
- $cat /tmp/hotdocs/nacos/serverlist
- 192.168.1.2
- 192.168.1.3
验证
- curl 'localhost:8080/nacos/serverlist'
- 192.168.1.2
- 192.168.1.3
至此, 一个简单的根据 IP 网段做环境隔离的示例已经可以工作了, 不同网段的 nacos 客户端会自动获取到不同的 Nacos 服务端 IP 列表, 实现环境隔离. 这种方法的好处是用户不需要配置任何参数, 各个环境的代码和配置是一样的, 但需要提供底层服务的同学做好网络规划和相关配置.
总结
本文简单介绍了环境隔离的概念, 环境隔离的三个好处以及 Nacos 如何基于网段做环境隔离. 最后, 给出了一个基于 Nginx 做 Endpoint 服务端的环境隔离配置示例. 需要注意的是, 本文只是列出了一种可行的方法, 不排除有更优雅的实现方法, 如果大家有更好的方法, 欢迎到 Nacos 社区或官网贡献方案.
来源: https://yq.aliyun.com/articles/693498