本文来自畅销书《从 Paxos 到 Zookeeper》作者倪超,讲述了其对阿里云最新发布的微服务引擎 MSE 产品的使用初体验。
(图片来自《从 Paxos 到 ZooKeeper 》一书的封面)
屏幕前的读者朋友们
如果
正在为运维 ZooKeeper
这份至关重要,但繁琐而枯燥
甚至心里没底的活
而烦恼
如果
正在为自己的应用
找寻一个高可用,且免运维的
ZooKeeper
那么,它来了
阿里云全托管的 ZooKeeper 集群产品
读者可以在任何搜索引擎搜索“微服务引擎 MSE”,即可直达产品官网。
阿里巴巴和 ZooKeeper 的结缘
从微服务引擎 MSE 的官方网站上,了解到,自 2010 年左右第一次引入以来,Apache ZooKeeper 目前在阿里巴巴集团内部已经有了将近 10 年的发展,使用的场景非常广泛,基于 ZooKeeper 强一致性的特点,被用在了分布式锁、分布式队列、Leader 选举、微服务注册发现和配置管理等多个大数据和微服务场景下。
其中,在微服务场景中,注册中心的地位举足轻重,承载着地址路由的核心功能,常见的有 ZooKeeper,Eureka 和 Nacos,在日常的研发中,如果没有接触过这些注册中心的开发同学,需要花不少时间学习这些组件,而如果想要在生产环境中良好的运行它们,还需要有丰富的运维经验。
为此,阿里云推出了全托管的 ZooKeeper 集群产品 —— MSE。
接下来,我将以一个 Dubbo 应用为例,快速体验如何使用 MSE 的 ZooKeeper 集群。
快速创建,开箱即用
MSE 提供了一键创建集群的能力,3 分钟左右,就可以拥有一套属于自己的 ZooKeeper 集群,微服务引擎的接入点,非常简单,就是一个连接串,和自己搭建的 ZooKeeper 是一样的,而且从控制台页面上,我发现这个接入点已经为我们做好了负载均衡和高可用检测 —— 也就是说,自己不用关心集群节点的可用性了。
目前公测阶段,实例是免费使用的,只需要开通一下服务,不收取任何其他费用。
进入微服务引擎控制台之后,点击「创建实例」按钮,这里我们选择创建公网实例,配置选择 1 核 2G 。
题外话,从控制台上可以看到,目前 MSE 仅支持 ZooKeeper,而如果有其他注册中心的需求,请肆无忌惮的告诉他们的产品团队吧,可以在开通页面投票选择你需要的。
点击创建之后,进入列表页,这里会展示你所有的集群。刚刚我创建的那个集群,运行状态会变成「启动/加载中」,整个创建过程大约会花费 3 分钟左右的时间,之后你就拥有一个属于自己的 ZooKeeper 的集群了。
安全高效的网络连通方案
微服务引擎 MSE 支持两种网络连通方案,公网实例和 VPC 专有网络,公网实例模式会给集群申请一个可供公网环境访问的域名,默认是有网络安全策略限制,无法访问的,需要用户自己额外配置白名单策略,这样最大限度的提升了系统的安全等级;VPC 专有网络,是阿里云的私网环境,网络的隔离性更加彻底,只有用户自己的专有网络,才能与微服务引擎实例连通,同时,网络延时,更加低,网络访问质量高效。
两种不同的网络方案 ,覆盖了用户日常的使用场景,在非阿里云网络环境下,可以通过公网模式,进行日常开发与测试,正式生产时,再切换至高效的专有网络模式。
在上文截图中所示的「mse-f3288e50-p.zk.mse.aliyuncs.com」这个链接串,是提供的外网域名,刚生产出来,是访问不了的,因为安全的限制,需要给它加白名单,加白名单的入口如下:
集群列表页 - 管理 - 白名单设置
白名单的设置规则是,需要把你的公网出口 IP 或者 IP 段,添加进来,才能访问到 ZooKeeper 集群,例如,此次我本机的出口公网 IP 为“42.120.74.119”,那么设置的格式为“42.120.74.119/32”,
获取本机出口公网 IP 的方法,可直接访问 https://www.ip.cn/
设置完之后,可通过如下命令验证,与 Zookeeper 的连通是否成功:
echo mntr |nc mse-f3288e50-p.zk.mse.aliyuncs.com 2181
数据管理
微服务引擎提供了节点数据管理的可视化页面,ZooKeeper 的数据结构,在内存中是一颗树,我们将它一比一的在页面上呈现出来,这样就能直观形象的看到整个内存数据的状态,同时支持了可以在页面上对内存数据进行增加、删除、更新和查询的常规操作。
在新增节点的时候,支持自动创建父目录,删除父节点的时候,支持递归删除下面的子节点,所见即所得,非常方便,是 ZooKeeper 原生客户端强功能有力的补充。
参数设置
白屏化的运维,能够最大限度的降低线上安全事故,通过工具自动化,降低人带来的不确定性操作,微服务引擎,提供了注册中心常用的配置项修改功能,可以直接通过页面上进行更改操作,更改完之后,一键重启生效。ZooKeeper 目前支持常用的配置项如下所示,同时还支持超级用户的设置,在你对 ZooKeeper 节点使用了 ACL 策略时,如果忘记了策略密码,可以通过超级用户的方式,访问加密数据。
发布 Dubbo 服务
接下来,通过开发一个日常的 Dubbo 微服务应用,给大家演示下如何集成 MSE(微服务引擎),下面是部署结构图:
申请完 ZooKeeper 实例之后,可以开始写一个 DubboProvider ,代码如下:
public class DubboProvider {
private final static String ZOOKEEPER_URL = "mse-f3288e50-p.zk.mse.aliyuncs.com";
public static void main(String[] args) throws InterruptedException {
ServiceConfig<GreetingService> service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("zookeeper://" + ZOOKEEPER_URL + ":2181"));
service.setInterface(GreetingService.class);
service.setRef(new GreetingsServiceImpl());
service.export();
System.out.println("======dubbo service started");
new CountDownLatch(1).await();
}
}
把 ZOOKEEPER_URL 换成你申请的地址链接串即可,可直接启动,启动之后,我们通过微服务引擎的数据管理页面,可以清晰看到, DubboProvider 将自己的服务元数据,发布在“/dubbo/dubbo.GreetingService/providers/”目录下面,以一个节点(dubbo%3A开头)形式存在, 这是 1 个 ZooKeeper 的临时节点,当把 Provider 的进程关闭后,这个节点会消失,但是父节点不会,可以自己验证一下。
订阅 Dubbo 服务
接下来,我们启动一下 Consumer 节点,需要连接同一个 ZooKeeper 注册中心,订阅刚才发布的接口地址列表,代码如下:
public class DubboConsumer {
private final static String ZOOKEEPER_URL = "mse-f3288e50-p.zk.mse.aliyuncs.com";
public static void main(String[] args) throws InterruptedException {
ReferenceConfig<GreetingService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://" + ZOOKEEPER_URL + ":2181"));
reference.setInterface(GreetingService.class);
GreetingService service = reference.get();
String message = service.sayHello("dubbo");
System.out.println("======"+message);
Thread.sleep(Integer.MAX_VALUE);
}
}
启动之后,我们通过数据管理页面,可以看到,Consumer 在 ZooKeeper 上面也注册了 1 个节点,在路径“/dubbo/dubbo.GreetingService/consumers/”下面:
同时,它也是属于临时节点,节点名字是经过 URL 编码的,解码后可以看到如下:
监控
除了可以看到注册在 ZooKeeper 上面的数据结构及内容,微服务引擎还提供了 ZooKeeper 常见的监控图,例如客户端链接数,访问 ZooKeeper 的 TPS(写操作),QPS(读操作),如下图所示:
高可用
微服务引擎实例,默认使用的是多可用区部署,这意味着,具备了多区域的容灾能力,在某个可用区出现系统性故障时,可以最大限度的保证整体服务的连续可用性。
兼容原生接口
微服务引擎支持的注册中心,原则之一,就是完全兼容原产品的接口和功能,无需修改代码,对用户使用完全透明,如果需要切回原产品,也是无缝切换,不存在使用壁垒,给用户最大的选择。
结束语
通过上面的微服务示例开发,可以看到,不需要太多的的运维学习成本,很快就拥有了自己的 1 个 ZooKeeper 集群,大大提高了研发效率,专注于业务,微服务引擎目前处于公测期间,完全免费,申请地址点击这里,欢迎体验。
如果您在使用微服务引擎 MSE 过程中有任何疑问,官方还提供了用户交流群,扫描下面的二维码就可以加入。