分布式 dubbo + Zookeeper
分布式系统就是若干独立计算机的集合(并且这些计算机之间相互有关联,就像是一台计算机中的C盘F盘等),这些计算对于用户来说就是一个独立的系统。
zookeeper安装
下载地址:Index of /dist/zookeeper/zookeeper-3.4.14 (apache.org)
这里选择3.4.14版本安装
下载完成得到一个压缩包,解压到我们安装的位置,打开解压之后的文件夹中的conf目录,把zoo_sample.cfg
这个文件复制一份副本,将副本改名为zoo.cfg任何返回上一级目录,打开bin运行服务端zkServer.cmd
,等待服务端运行成功之后运行客户端zkCli.cmd
,服务端运行成功可以看见这一段信息 - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181,客户端运行成功看到WATCHER::WatchedEvent state:SyncConnected type:None path:null之后回车会显示[zk: localhost:2181(CONNECTED) 0]表示安装成功
安装dubbo-admin
dubbo-admin是一个监控管理后台,可以查看我们注册了哪些服务和查看哪些服务被消费了
github下载地址:apache/dubbo-admin at master (github.com)
下载之后是源码,这是一个maven项目,我们可以打包之后使用。进入文件夹dubbo-admin-master,执行打包命令
mvn clean package -Dmaven.test.skip=true
等待cmd显示build success。打包成功之后开启zookeeper服务端后,进入dubbo-admin-master中的dubbo-admin-service目录,进入target文件夹cmd执行jar包。执行成功之后浏览器输入localhost:8080可以进入dubbo-admin的ui界面。初始密码和初始账号是root
测试分布式架构
新建两个springboot项目模块,一个服务提供商,一个使用者都导入dubbo和zookeeper依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!--zookeeper和springboot会有日志冲突需要排除一个日志的jar包;并且zookeeper需要依赖其他的jar包才能够正常运行-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--这里写排除包-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
服务提供商配置
server:
port: 8001
# 当前服务应用的名字
dubbo:
application:
name: provider-server
# 注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
# 配置需要被注册的服务的包地址
scan:
base-packages: com.zhong.service
这里可能会存在一个问题就是20880端口被占用了,于是项目于启动失败。如果出现这个问题就修改dubbo端口
# 修改端口为20881
dubbo:
protocol:
name: dubbo
port: 20881
服务端测试
package com.zhong.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service //因为dubbo的@service注解和springboot的注解名字一样,不容易区分,特别要注意导入的包名
@Component //或者使用组件注解@Component
//使用了注解以后,会自动的注册服务到服务中心(zookeeper)
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "hello";
}
}
测试服务注册,首先开启zookeeper,然后开启dubbo-admin,再开启项目。正常启动应该能够看到这两个服务被注册
用户配置
server:
port: 8002
dubbo:
# 暴露消费者名字
application:
name: consumer-server
# 配置注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
用户端这里有两种方式调用远程的接口,一是使用POM坐标(实际开发常用),二是使用新建一个相同的路径名的接口。
package com.zhong.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service//注意用户端这里的服务需要注入到容器中调用,所以这里是springboot的注解
public class UserService {
@Reference//这里是指注入远程的接口,必须新建一个与远程接口包路径相同的接口来接收
private TicketService ticketService;
public void getTicket() {
String ticket = ticketService.getTicket();
System.out.println(ticket);
}
}
之后从容器中拿到注入的本地对象直接调用就可以了