服务化改造实践(一)| Dubbo + ZooKeeper

摘要: “没有最好的技术,只有最合适的技术。”我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造。在 Dubbo 的未来规划中,除了保持自身技术上的领先性,关注性能、大流量、大规模集群领域的挑战外,围绕 Dubbo 核心来发展生态,将 Dubbo 打造成一个服务化改造的整体方案也是重点之一。

“没有最好的技术,只有最合适的技术。”我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造。在 Dubbo 的未来规划中,除了保持自身技术上的领先性,关注性能、大流量、大规模集群领域的挑战外,围绕 Dubbo 核心来发展生态,将 Dubbo 打造成一个服务化改造的整体方案也是重点之一。从本期开始,我们将推出“服务化改造”系列文章,通过在一些外围系统和服务化基础组件上的开发实践,分享Dubbo 生态下的服务化改造收获和总结。

? 8月26日,Aliware Open Source 将首次在成都举办 Apache Dubbo 的meetup活动,Dubbo 、Sentinel和 Nacos 的小哥哥和×××姐都会在现场进行技术分享,欢迎成都的朋友报名参加我们的活动喔,搜索“阿里巴巴中间件”公众号,后台发送“成都meetup”,获取报名链接。

一、改造背景
在现代的分布式应用中,往往会出现节点和节点之间的协调问题,其中就包括了:选主,集群管理,分布式锁,分布式配置管理,统一命名服务,状态同步等诉求。Apache ZooKeeper,正如它的名字所暗示的那样,动物园管理员,就是为了解决这些诉求的一个分布式协调服务框架。

为了保证系统的高可用,ZooKeeper本身也可以部署成集群模式,称之为ZooKeeper Ensemble。ZooKeeper集群中始终确保其中的一台为leader的角色,并通过ZAB(Zookeeper Atomic Broadcast Protocol)[1] 协议确保所有节点上的信息的一致。客户端可以访问集群中的任何一台进行读写操作,而不用担心数据出现不一致的现象。

O‘Reilly的ebook-Zookeeper-Distributed Process Coordination

ZooKeeper中的数据存储方式与传统的UNIX文件系统相似,节点按照树状结构来组织,其中,节点被称之为znodes(ZooKeeper数据节点)

O‘Reilly的ebook-Zookeeper-Distributed Process Coordination

二、基本用法
可以通过直接下载的方式[2] 安装并运行ZooKeeper,在Mac上也可以通过Homebrew [3] brew install zookeeper 来安装,考虑到通用性,本文采用docker的方式来运行ZooKeeper。如果没有安装docker,请先准备好docker环境 [4]。

1、启动 ZooKeeper
执行命令将 ZooKeeper,运行在docker容器中。

docker run --rm --name zookeeper -p 2181:2181 zookeeper
2、进入 Zookeeper 容器

docker exec -it zookeeper bash
在bin 目录下有启动 ZooKeeper 的命令 zkServer 以及管理控制台 zkCli


3、通过zkCli进入Zookeeper管理界面

由于是通过Docker启动,ZooKeeper 进程已经启动,并通过2181端口对外提供服务。

bash-4.4# psPID USER TIME COMMAND
1 zookeepe 0:02 /usr/lib/jvm/java-1.8-openjdk/jre/bin/java -Dzookeeper.log.dir=. -Dzookeeper.root
32 root 0:00 bash
42 root 0:00 ps
因此可以直接通过zkCli来访问 ZooKeeper 的控制台来进行管理。

4.zkCli上的一些基本操作

创建 /hello-zone 节点:

[zk: 127.0.0.1:2181(CONNECTED) 19] create /hello-zone ‘world‘Created /hello-zone
列出 / 下的子节点,确认 hello-zone 被创建:

[zk: 127.0.0.1:2181(CONNECTED) 19] create /hello-zone ‘world‘Created /hello-zone

列出 /hello-zone的子节点,确认为空:

[zk: 127.0.0.1:2181(CONNECTED) 21] ls /hello-zone[]
获取存储在 /hello-zone节点上的数据:

[zk: 127.0.0.1:2181(CONNECTED) 22] get /hello-zone
world

三、在 Dubbo 中使用ZooKeeper
Dubbo使用 ZooKeeper 用于服务的注册发现和配置管理,在ZooKeeper中数据的组织由下图所示:

首先,所有Dubbo相关的数据都组织在 /duboo 的根节点下。

二级目录是服务名,如 com.foo.BarService。

三级目录有两个子节点,分别 providers 和 consumers,表示该服务的提供者和消费者。

四级目录记录了与该服务相关的每一个应用实例的URL信息,在 providers 下的表示该服务的所有提供者,而在 consumers 下的表示该服务的所有消费者。举例说明,com.foo.BarService 的服务提供者在启动时将自己的URL信息注册到 /dubbo/com.foo.BarService/providers 下;同样的,服务消费者将自己的信息注册到相应的 consumers 下,同时,服务消费者会订阅其所对应的 providers 节点,以便能够感知到服务提供方地址列表的变化。

四、准备示例代码
本文代码可以在以下链接中找到。

1、接口定义
一个定义简单的 GreetingService 接口,只有里面一个简单的方法 sayHello 向调用者问好。

public interface GreetingService {
String sayHello(String name);}
2、服务端:服务实现

实现 GreetingService接口,并通过 @Service 来标注其为Dubbo的一个服务。

@Servicepublic class AnnotatedGreetingService implements GreetingService {
public String sayHello(String name) {
return "hello, " + name;
}}
3、服务端:组装

定义 ProviderConfiguration 来组装Dubbo服务。

@[email protected](scanBasePackages = "com.alibaba.dubbo.samples.impl")@PropertySource("classpath:/spring/dubbo-provider.properties")static class ProviderConfiguration {}
dubbo-provider.properties是在Spring应用中外置配置的方式,内容如下:

由于ZooKeeper运行在Docker容器中,需要注意的是:

本文假定Dubbo应用运行在宿主机上,也就是Docker容器外,需要将ZooKeeper的地址替换成环境变量${DOCKER_HOST}所指定的IP地址,相关信息请查阅Docker官方文档;
如果Dubbo应用也是Docker化的应用,只需要用ZooKeeper的容器名,在本文中容器名是ZooKeeper;
当然,如果不用容器方式启动ZooKeeper,只需要简单的将这里的$ DOCKER_HOST换成localhost即可。
4、服务端:启动服务
在 main 方法中通过启动一个Spring Context来对外提供Dubbo服务。

public class ProviderBootstrap {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.in.read();
}}
服务启动端的的 main 方法,将会看到下面的输出,代表服务端启动成功,并在注册中心(ZooKeeperRegistry)注册上了 GreetingService 这个服务:

[03/08/18 10:50:33:033 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Register: dubbo://192.168.99.1:20880/com.alibaba.dubbo.samples.api.GreetingService?anyhost=true&application=demo-provider&dubbo=2.6.2&generic=false&interface=com.alibaba.dubbo.samples.api.GreetingService&methods=sayHello&pid=12938&side=provider&timestamp=1533264631849, dubbo version: 2.6.2, current host: 192.168.99.1
通过ZooKeeper管理终端观察服务提供方的注册信息:


可以看到刚刚启动的Dubbo的服务在providers 节点下注册了自己的URL地址:dubbo://192.168.99.1:20880 /com.alibaba.dubbo.samples.api.GreetingService?anyhost = true&application = demo-provider&dubbo =2.6 0.2&通用=假接口=com.alibaba.dubbo.samples.api.GreetingService&方法= sayHello的&PID = 12938&侧=提供商时间戳=1533264631849

5、客户端:引用服务

通过 @Reference 来在客户端声明服务的引用,运行时将会通过该引用发起全程调用,而服务的目标地址将会从ZooKeeper的provider 节点下查询。


6、客户端:组装

定义ConsumerConfiguration来组装Dubbo服务。


dubbo-consumer.properties是在Spring应用中外置配置的方式,内容如下:


与服务端:组装相同,需要根据自己的运行环境来修改dubbo.registry.address中定义的$ DOCKER_HOST。请参阅步骤3的说明部分。

7、客户端:发起远程调用
运行 main 向已经启动的服务提供方发起一次远程调用。Dubbo会先向ZooKeeper订阅服务地址,然后从返回的地址列表中选取一个,向对端发起调用:

运行结果如下:


result: hello, zookeeper

说明:
注册:消费者://192.168.99.1/...& category= consumers&:消费者向ZooKeeper注册自己的信息,并放在 consumers 节点下
订阅:消费者://192.168.99.1/...& 类别=提供商,配置器,路由器:消费者同时向动物园管理员订阅了providers、configurators、routers 节点,其中 configurations 与多宝配置相关,routers 与路由规则相关,值得注意的英文 providers 节点的订阅,当有新的服务提供方加入后,由于订阅的关系,新的地址列表会推送给订阅方,服务的消费者也因此动态感知到了地址列表的变化。
通过ZooKeeper管理终端观察服务提供方的注册信息:


可以看到Dubbo的服务消费者在 consumers 节点下注册了自己的URL地址:
consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&category=providers,configurators,routers&default.timeout=3000&dubbo=2.6.2&interface=com.alibaba.dubbo.samples.api.GreetingService&methods=sayHello&pid=82406&side=consumer&timestamp=1533274951195

五、总结
本文侧重介绍了如何在Dubbo应用中使用Zookeeper做为注册中心,当然,本文也提到了Zookeeper在Dubbo的应用场景下还承担了配置中心和服务治理的职责。本文中的Zookeeper是单节点,Standalone的模式,在生产环境中为了高可用的诉求,往往会组件Zookeeper集群,也就是Zookeeper ensemble模式。

通过本文的学习,读者可以掌握到:

ZooKeeper的基本概念和基本用法
ZooKeeper在Dubbo应用中的作用
通过实战了解ZooKeeper与Dubbo的交互
Dubbo在ZooKeeper中服务注册,消费信息的存储方式
当然,自从阿里巴巴开源 Nacos 后,Dubbo生态中又多了一项动态服务发现的选项,Nacos + Dubbo的组合正进一步释放 Dubbo 在云原生及ServiceMesh时代中,在大规模微服务治理、流量治理、服务集成与服务共享等服务平台能力建设上的威力。- 链接

参考链接:

[1] https://www.ixiacom.com/company/blog/apache-zab-zookeeper-atomic-broadcast-protocol

[2] https://www.apache.org/dyn/closer.cgi/zookeeper/

[3] https: //brew.sh

[4] https://www.docker.com/community-edition

原文链接

本文为云栖社区原创内容,未经允许不得转载。

原文地址:http://blog.51cto.com/13876536/2165037

时间: 2024-07-30 07:46:37

服务化改造实践(一)| Dubbo + ZooKeeper的相关文章

服务化改造实践(二)| Dubbo + Kubernetes

摘要: "没有最好的技术,只有最合适的技术."我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造.在Dubbo的未来规划中,除了保持自身技术上的领先性,关注性能,大流量,大规模集群领域的挑战外,围绕Dubbo核心来发展生态,将Dubbo打造成一个服务化改造的整体方案也是重点之一. "没有最好的技术,只有最合适的技术."我想这句话也同样适用于微服务领域,没有最好的服务框架,只有最适合自己的服务改造.在Dubbo的未来规划中,除了保持自身技术

服务化改造实践(三) | Dubbo + Zipkin

随着业务的发展,应用的规模不断的扩大,传统的应用架构无法满足诉求,服务化架构改造势在必行,以 Dubbo 为代表的分布式服务框架成为了服务化改造架构中的基石.随着微服务理念逐渐被大众接受,应用进一步向更细粒度拆分,并且,不同的应用由不同的开发团队独立负责,整个分布式系统变得十分复杂.没有人能够清晰及时的知道当前系统整体的依赖关系.当出现问题时,也无法及时知道具体是链路上的哪个环节出了问题. 在这个背景下,Google 发表了 Dapper 的论文,描述了如何通过一个分布式追踪系统解决上述问题.基

服务化改造实践 | 如何在 Dubbo 中支持 REST

什么是 RESTREST 是 Roy Thomas Fielding [1] 在 2000 年他的博士论文 [2] "架构风格以及基于网络的软件架构设计" 中提出来的一个概念.REST 是 RESTransfer 的缩写,翻译过来就是 "表现层状态转化".REST 就是 Roy 在这篇论文中提出的面向互联网的软件所应当具备的架构风格. 按照 REpresentational State Transfer 的字面意思,可以把应用看成是一个虚拟的状态机,软件提供的不是服

dubbo+zookeeper+dubbo管理控制台实践demo 【转】

1,安装并启动zookeeper注册服务,这里使用的是3.4.6版本. 下载解压后,在zookeeper-3.4.6/conf/下,默认是没有zoo.cfg,只有一个zoo_sample.cfg. CMD命令行进入zookeeper-3.4.6/bin/目录,直接运行zkServer.cmd会出错,提示找不到zoo.cfg文件.因此需要将zookeeper-3.4.6/conf/下zoo_sample.cfg拷贝一个zoo.cfg,配置数据存储路径dataDir=E://tmp/zookeepe

EOSPlatform+Dubbo+Zookeeper最佳实践 【转】

随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用EOSPlatform+Dubbo+Zookeeper实现分布式服务的开发与运行. 1     环境准备 1.1  环境选择 EOSPlatform 6.7.1 Zookeeper 3.4.5 Dubbo 2.5.3 Tomcat 5.5.27 1.2  搭建Zookeeper环境 下载zookeeper-3.4.5.tar.gz解压到自定义目录中,如下图: 打开conf目录,将文件zoo_sample.cfg重

dubbo+zookeeper+dubbo管理控制台实践demo

1,安装并启动zookeeper注册服务,这里使用的是3.4.6版本. 下载解压后,在zookeeper-3.4.6/conf/下,默认是没有zoo.cfg,只有一个zoo_sample.cfg. CMD命令行进入zookeeper-3.4.6/bin/目录,直接运行zkServer.cmd会出错,提示找不到zoo.cfg文件.因此需要将zookeeper-3.4.6/conf/下zoo_sample.cfg拷贝一个zoo.cfg,配置数据存储路径dataDir=E://tmp/zookeepe

从头开始搭建一个dubbo+zookeeper平台 【转】

本篇主要是来分享从头开始搭建一个dubbo+zookeeper平台的过程,其中会简要介绍下dubbo服务的作用.   注册中心的选择   dubbo支持多种类型的注册中心: 这里我们选择zookeeper,其实类型的优点缺点可详细查看文档. 1:zookeeper的安装,还是采用docker这一招鲜的run命令来安装zookeeper docker run -dit --name zookeeper --hostname zookeeper-host -v /data:/data -p 2181

jeesz分布式企业框架 javaWeb分布式架构 springmvc+mybatis+shiro dubbo zookeeper redis kafka app服务

平台简介 Jeesz是一个分布式的框架,提供项目模块化.服务化.热插拔的思想,高度封装安全性的Java EE快速开发平台. Jeesz本身集成Dubbo服务管控.Zookeeper注册中心.Redis分布式缓存技术.FastDFS分布式文件系统.ActiveMQ异步消息中间件.Nginx负载均衡等分布式技术 使用Maven做项目管理,项目模块化,提高项目的易开发性.扩展性 以spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apach

[置顶] Java集群优化——dubbo+zookeeper构建高可用分布式集群 【转】

不久前,我们讨论过Nginx+tomcat组成的集群,这已经是非常灵活的集群技术,但是当我们的系统遇到更大的瓶颈,全部应用的单点服务器已经不能满足我们的需求,这时,我们要考虑另外一种,我们熟悉的内容,就是分布式,而当下流行的Dubbo框架,不容我们忽视,这里,咱们一起来探讨一下这个框架的使用. 一,背景 以前我们需要远程调用他人的接口,我们是这么做的: 我们遇到的问题: (1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大.此时需要一个服务注册中心,动