Dubbo和Zookeeper
Window下安装zookeeper
注册中心
-
下载zookeeper,官网地址:https://zookeeper.apache.org/
我选择下载的是apache-zookeeper-3.5.9-bin.tar.gz
步骤:
-
打开下载的文件(管理员模式打开),运行/bin/zkServer.cmd,初次运行时可能会报错,因为没有zoo.cfg
也有可能遇到闪退的问题!
闪退的解决方案:右键编辑zkServer.cmd文件,在末尾添加pauser(如果右键不能点击编辑,可以将文件的后缀名改为txt,然后修改完后再改回cmd)
-
修改zoo.cfg配置文件
将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。
注意几个重要位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeper的端口号
修改完成后再次启动zookeeper
-
打开zkCli.cmd进行测试(在打开zkCli.cmd前,要先将zkServer.cmd打开)
ls /:列出zookeeper根下保存的所有节点
create –e /lzj123:创建一个lzj节点,值为123
get /lzj:获取/lzj节点的值
Window下安装Dubbo-admin
注意:dubbo-admin可能会使用20880端口,所以在编写生产者的时候要修改生产者的dubbo的端口号
是一个监控管理后台,查看我们注册了哪些服务,哪些服务被消费了
dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。
安装步骤:
-
下载dubbo-admin
https://github.com/apache/dubbo-admin
左侧选择master后在code中下载zip
-
进入解压后的目录,进入dubbo-admin-serversrcmain esources
该目录下有一个application.properties,双击打开该文件
由于dubbo-admin后台服务端口默认为8080,可能会与tomcat的端口产生冲突,所以我们需要在application.properties中修改默认端口
修改方法:在文件末尾加入server.port=7001,即将其默认端口修改为7001
其它需要修改的可以参考如下:(我的话是只修改了端口号就可以了)
server.port=7001 spring.velocity.cache=false spring.velocity.charset=UTF-8 spring.velocity.layout-url=/templates/default.vm spring.messages.fallback-to-system-locale=false spring.messages.basename=i18n/message spring.root.password=root spring.guest.password=guest dubbo.registry.address=zookeeper://127.0.0.1:2181
-
项目目录下cmd中打包dubbo-admin(第一次打包过程可能有点慢)
mvn clean package -Dmaven.test.skip=true
-
打包完成后,会生成如图的jar包,可能不是这个名字
-
进入dubbo-admin-distribution arget下可以找到这个jar包(应该就在这个位置,如果不在这个位置,可以去其它文件夹的target目录下找一找)
-
执行 dubbo-admin-distribution arget 下的dubbo-admin-0.3.0.jar(前提:zookeeper的服务一定要打开,即运行zkServer.cmd)
打开cmd在该路径下运行:
java -jar dubbo-admin-0.3.0.jar
-
执行完毕,我们去访问一下http://localhost:7001/,这时候我们需要输入登录账户和密码,我们都是默认的root,如果需要修改的话,可以在第二步的properties中修改,然后重新打包
SpringBoot + Dubbo + zookeeper
框架搭建
-
创建一个springboot项目,项目名:provider-server,选择web依赖即可
-
在项目中编写一个服务
创建一个service包
编写接口
public interface TicketService { public String getTicket(); }
编写实现类
@Service//可以被扫描到,在项目启动就自动注册到注册中心,一定要注意,这个是dubbo包里的 @Component//这里不使用@Service是为了方便区分dubbo和spring包下的@Service public class TicketServiceImpl implements TicketService{ @Override public String getTicket() { return "LZJ学习java"; } }
-
再创建一个模块,实现服务消费者,模块名:consumer-server
-
在consumer-server项目下写一个需要获得的服务
public class UserService { //我们需要去拿去注册中心的服务 }
需求:现在我们的用户想使用买票的服务,这要怎么弄呢 ?
服务提供者
编写provider-server项目
-
服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包
<!-- dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!-- zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日志会冲突--> <!-- 引入zookeeper --> <dependency> <!-- curator版本建议先用我这个,全部测试成功后再尝试升版本,否则可能报错 curator的版本会跟dubbo-stater依赖版本有关 --> <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> <!-- 这个zookeeper的版本要跟你本地下载的一致 --> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.9</version> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
-
在application.properties文件中配置属性
dubbo-admin可能会占用dubbo默认的20880端口,所以这里我们将dubbo的端口修改为20881
server.port=8001 #dubbo.protocol.port=20881 # 服务应用名字 dubbo.application.name=provider-server # 注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 # 哪些服务要被注册 dubbo.scan.base-packages=com.lzj.service # 修改dubbo默认端口号 dubbo.protocol.port=20881
-
测试
逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!
**注意:**在idea中启动项目时一定要先启动zookeeper和dubbo-admin生成的jar包,如果没有启动dubbo-admin,则无法在网页上访问7001端口进入可视化界面
显示出来你的服务则配置成功
服务消费者
编写consumer-server项目
-
导入依赖,和之前一样
<!-- dubbo --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!-- zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日志会冲突--> <!-- 引入zookeeper --> <dependency> <!-- curator版本建议先用我这个,全部测试成功后再尝试升版本,否则可能报错 curator的版本会跟dubbo-stater依赖版本有关 --> <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> <!-- 这个zookeeper的版本要跟你本地下载的一致 --> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.9</version> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
-
编写application.properties
server.port=8002 # 消费者去哪里拿服务需要暴露自己的名字 dubbo.application.name=consumer-server # 注册中心的地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
-
本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同
-
完善消费者的服务类
@Service//放到容器中 public class UserService { //想拿到provider-server中的票 @Reference//引用, Pom坐标,可以定义路径相同的接口 TicketService ticketService; public void buyTicket(){ String ticket = ticketService.getTicket(); System.out.println("在注册中心拿到=>"+ticket); } }
-
编写测试类
@SpringBootTest class ConsumerServerApplicationTests { @Autowired UserService userService; @Test void contextLoads() { userService.buyTicket(); } }
-
启动测试
-
开启zookeeper
-
开启dubbo-admin【可以不用做】
-
开启服务者(provider-server)
-
消费者消费测试
-
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
6. 启动测试
1. 开启zookeeper
2. 开启dubbo-admin【可以不用做】
3. 开启服务者(provider-server)
4. 消费者消费测试
[外链图片转存中...(img-ei5TC7zc-1647410955147)]
测试访问成功!