阿里巴巴基于 Nacos 实现环境隔离的实践

随着Nacos 0.9版本的发布,Nacos 离正式生产版本(GA)又近了一步,其实已经有不少企业已经上了生产,例如虎牙直播。

本周三(今天),晚上 19:00~21:00 将会在 Nacos 钉钉群直播 Nacos 1.0.0 所有发布特性的预览以及升级和使用上的指导。

Nacos环境隔离

通常,企业研发的流程是这样的:先在测试环境开发和测试功能,然后灰度,最后发布到生产环境。并且,为了生产环境的稳定,需要将测试环境和生产环境进行隔离,此时,必然会遇到问题是多环境问题,即:

  • 多个环境的数据如何隔离?
  • 如何优雅的隔离?(不需要用户做任何改动)
  • 什么是环境?

    说到环境隔离,首先应该定义好什么是环境。

    举个例子,很多 站都会有用户 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 列表。这里,我们利用第二种方式进行初始化。
  • 一个环境隔离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列表,实现环境隔离。这种方法的好处是用户不需要配置任何参数,各个环境的代码和配置是一样的,但需要提供底层服务的同学做好 络规划和相关配置。

    总结

    声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

    (0)
    上一篇 2019年3月8日
    下一篇 2019年3月8日

    相关推荐