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

基本用法
可以通过直接下载的方式[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

bash-4.4# ls -l bintotal 36
-rwxr-xr-x 1 zookeepe zookeepe 232 Mar 27 04:32
README.txt
-rwxr-xr-x 1 zookeepe zookeepe 1937 Mar 27 04:32
zkCleanup.sh
-rwxr-xr-x 1 zookeepe zookeepe 1056 Mar 27 04:32
zkCli.cmd
-rwxr-xr-x 1 zookeepe zookeepe 1534 Mar 27 04:32
zkCli.sh
-rwxr-xr-x 1 zookeepe zookeepe 1759 Mar 27 04:32
zkEnv.cmd
-rwxr-xr-x 1 zookeepe zookeepe 2696 Mar 27 04:32
zkEnv.sh
-rwxr-xr-x 1 zookeepe zookeepe 1089 Mar 27 04:32
zkServer.cmd
-rwxr-xr-x 1 zookeepe zookeepe 6773 Mar 27 04:32
zkServer.sh“
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 的控制台来进行管理。

bash-4.4# bin/zkCli.sh -server 127.0.0.1:2181Connecting to 127.0.0.1:2181…
WATCHER::

WatchedEvent state:SyncConnected type:None path:null[zk: 127.0.0.1:2181(CONNECTED) 0] helpZooKeeper -server host:port cmd args stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
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_ZooKeeper_10_jpeg

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

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

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

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

阿里云代金券1000元免费领取!领取地址:http://aliyun.jinre.com
新老阿里云账户均可领取!可用于购买阿里云服务器ECS、云数据库RDS、虚拟主机、安骑士、DDoS高防IP等100多云计算产品。
代金券自领取之日起,有效期是30天,请及时使用,过30天后还可以重新领取。

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

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服务。

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

dubbo.application.name=demo-provider
dubbo.registry.address=zookeeper://$DOCKER_HOST:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
由于ZooKeeper运行在Docker容器中,需要注意的是:

本文假定Dubbo应用运行在宿主机上,也就是Docker容器外,需要将ZooKeeper的地址替换成环境变量 DOCKERHOSTIPDockerDubboDockerZooKeeperZooKeeperZooKeeper D O C K E R H O S T 所 指 定 的 I P 地 址 , 相 关 信 息 请 查 阅 D o c k e r 官 方 文 档 ; 如 果 D u b b o 应 用 也 是 D o c k e r 化 的 应 用 , 只 需 要 用 Z o o K e e p e r 的 容 器 名 , 在 本 文 中 容 器 名 是 Z o o K e e p e r ; 当 然 , 如 果 不 用 容 器 方 式 启 动 Z o o K e e p e r , 只 需 要 简 单 的 将 这 里 的 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管理终端观察服务提供方的注册信息:

$ docker exec -it zookeeper bash
bash-4.4# bin/zkCli.sh -server localhost:218
Connecting to localhost:2181

Welcome to ZooKeeper!
JLine support is enabled

[zk: localhost:2181(CONNECTED) 0] ls
[dubbo%3A%2F%2F192.168.99.1%3A20880%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fanyhost%3Dtrue%26application%3Ddemo-provider%26dubbo%3D2.6.2%26generic%3Dfalse%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D12938%26side%3Dprovider%26timestamp%3D1533264631849]
可以看到刚刚启动的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 节点下查询。

@Component(“annotatedConsumer”)public class GreetingServiceConsumer {
@Reference
private GreetingService greetingService;

public String doSayHello(String name) {
return greetingService.sayHello(name);
}}
6、客户端:组装

定义ConsumerConfiguration来组装Dubbo服务。

@Configuration@EnableDubbo(scanBasePackages = “com.alibaba.dubbo.samples.action”)@PropertySource(“classpath:/spring/dubbo-consumer.properties”)@ComponentScan(value = {“com.alibaba.dubbo.samples.action”})static class ConsumerConfiguration {}
dubbo-consumer.properties是在Spring应用中外置配置的方式,内容如下:

dubbo.application.name=demo-consumer
dubbo.registry.address=zookeeper:// DOCKERHOST:2181dubbo.consumer.timeout=3000dubbo.registry.address D O C K E R H O S T : 2181 d u b b o . c o n s u m e r . t i m e o u t = 3000 与 服 务 端 : 组 装 相 同 , 需 要 根 据 自 己 的 运 行 环 境 来 修 改 d u b b o . r e g i s t r y . a d d r e s s 中 定 义 的 DOCKER_HOST。请参阅步骤3的说明部分。

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

public class ConsumerBootstrap {
public static void main(String[] args) {public class ConsumerBootstrap {

public static void main(String[] args) throws IOException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
GreetingServiceConsumer greetingServiceConsumer = context.getBean(GreetingServiceConsumer.class);
String hello = greetingServiceConsumer.doSayHello(“zookeeper”);
System.out.println(“result: ” + hello);
System.in.read();
}

}
运行结果如下:

[03/08/18 01:42:31:031 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Register: consumer://192.168.99.1/com.alibaba.dubbo.samples.api.GreetingService?application=demo-consumer&category=consumers&check=false&default.timeout=3000&dubbo=2.6.2&interface=com.alibaba.dubbo.samples.api.GreetingService&methods=sayHello&pid=82406&side=consumer&timestamp=1533274951195, dubbo version: 2.6.2, current host: 192.168.99.1 #1[03/08/18 01:42:31:031 CST] main INFO zookeeper.ZookeeperRegistry: [DUBBO] Subscribe: 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 version: 2.6.2, current host: 192.168.99.1 #2…
result: hello, zookeeper

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

$ docker exec -it zookeeper bash
bash-4.4# bin/zkCli.sh -server localhost:218
Connecting to localhost:2181

Welcome to ZooKeeper!
JLine support is enabled

[zk: localhost:2181(CONNECTED) 4] ls /dubbo/com.alibaba.dubbo.samples.api.GreetingService/consumers[consumer%3A%2F%2F192.168.99.1%2Fcom.alibaba.dubbo.samples.api.GreetingService%3Fapplication%3Ddemo-consumer%26category%3Dconsumers%26check%3Dfalse%26default.timeout%3D3000%26dubbo%3D2.6.2%26interface%3Dcom.alibaba.dubbo.samples.api.GreetingService%26methods%3DsayHello%26pid%3D82406%26side%3Dconsumer%26timestamp%3D1533274951195]
可以看到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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开源的Java框架,用于快速构建独立的、基于Spring的应用程序。它简了Spring应用程序的配置和部署过程,并提供了许多嵌入式服务器,如Tomcat、Jetty等。Spring Boot还提供了自动配置的特性,可以根据类路径中的依赖自动配置Spring应用程序。 Dubbo是一款高性能的分布式服务框架,也是阿里巴巴开源的项目。它提供了服务治理、远程通讯和分布式调用等功能,帮助开发人员轻松构建分布式服务的应用。 Zookeeper是一个开源的分布式协调服务,可以用于实现分布式应用程序的一致性和可靠性。它提供了一个类似于文件系统的层次的命名空间,并允许开发人员注册、协调和共享各种资源,如配置信息、服务注册和发现等。 当使用Spring Boot结合DubboZookeeper时,可以构建一个高性能、可扩展和可靠的微服务架构。Spring Boot提供了便利的开发和部署方式,Dubbo提供了分布式服务框架的支持,而Zookeeper则提供了分布式协调服务。开发人员可以使用Spring Boot快速构建独立的微服务应用程序,使用Dubbo进行服务间的通信和管理,同时通过Zookeeper进行服务的注册和发现。这样的架构可以方便地实现微服务架构中的资源共享和服务治理等功能,大大简了开发人员的负担。 综上所述,Spring Boot结合DubboZookeeper可以构建高效、可靠的微服务架构,并提供了便利的开发和部署方式,帮助开发人员构建高性能的分布式应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值