当前位置:   article > 正文

【SpringBoot整合Dubbo和Zookeeper】_springboot整合dubbo和zk

springboot整合dubbo和zk

本笔记内容为狂神说SpringBoot集成Dubbo和Zookeeper部分

目录

一、Dubbo

dubbo基本概念

调用关系说明

二、Dubbo环境搭建 

三、Window下安装zookeeper

1、下载zookeeper 

2、运行

3、测试

四、window下安装dubbo-admin

1、下载dubbo-admin

2、解压进入目录

3、在项目目录下打包dubbo-admin

4、执行

五、SpringBoot整合Dubbo + zookeeper

1、框架搭建

编写接口 

编写实现类

编写service 

2、服务提供者

1.导入Dubbo和zookeeper依赖

2.在springboot配置文件中配置dubbo相关属性

3.配置service的实现类中的服务注解并发布服务

3、服务消费者

1.导入依赖,和之前的依赖一样

2.配置参数

3.拿到服务提供者的接口

4. 完善消费者的服务类

5. 测试类编写

4、启动测试


【分布式系统理论和RPC】

一、Dubbo


Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

了解Dubbo:Dubbo 简介 | Apache Dubbo

dubbo基本概念

在分布式系统中,尤其是随着微服务架构的发展,应用的部署、发布、扩缩容变得极为频繁,作为 RPC 消费方,如何动态的发现服务提供方地址成为 RPC 通信的前置条件。Dubbo 提供了自动的地址发现机制,用于应对分布式场景下机器实例动态迁移的问题。如下图所示,通过引入注册中心来协调提供方与消费方的地址,提供者启动之后向注册中心注册自身地址,消费方通过拉取或订阅注册中心特定节点,动态的感知提供方地址列表的变化。

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

调用关系说明

  • 服务容器负责启动,加载,运行服务提供者。
  • 服务提供者在启动时,向注册中心注册自己提供的服务。
  • 服务消费者在启动时,向注册中心订阅自己所需的服务。
  • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

二、Dubbo环境搭建 


Doubbo官方推荐使用 注册中心参考手册 | Apache DubboZookeeper 注册中心

 注册中心参考手册 | Apache Dubbo

Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。 

流程说明:

  • 服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
  • 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

支持以下功能:

  • 当提供者出现断电等异常停机时,注册中心能自动删除提供者信息
  • 当注册中心重启时,能自动恢复注册数据,以及订阅请求
  • 当会话过期时,能自动恢复注册数据,以及订阅请求
  • 当设置 <dubbo:registry check="false" /> 时,记录失败注册和订阅请求,后台定时重试
  • 可通过 <dubbo:registry username="admin" password="1234" /> 设置 zookeeper 登录信息
  • 可通过 <dubbo:registry group="dubbo" /> 设置 zookeeper 的根节点,不配置将使用默认的根节点。
  • 支持 * 号通配符 <dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者

三、Window下安装zookeeper


1、下载zookeeper 

官网:Apache ZooKeeper

我的是3.5.6版本,官方建议使用 2.3.3 以上版本的 zookeeper 注册中心客户端

 然后解压zookeeper

2、运行

管理员身份运行 /bin/zkServer.cmd

可能会出现闪退(不会的忽略以下步骤,我没遇到这个情况)

解决方案:编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出,会提示错误信息,方便找到原因。

 

再运行zkServer.cmd可看到错误信息 conf下没zoo.cfg文件

修改zoo.cfg配置文件

将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。

注意几个重要位置:

dataDir=./   临时数据存储的目录(可写相对路径)

clientPort=2181   zookeeper的端口号

修改完成后再次启动zookeeper

​ 启动成功!

3、测试

启动zkCli.cmd测试,记得把服务zkServer.cmd也开了。

#列出zookeeper根下保存的所有节点

ls /

#创建一个kuangshen节点,值为123

create –e /kuangshen 123

#获取/kuangshen节点的值

get /kuangshen

四、window下安装dubbo-admin


dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。

但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。(不想用也可以不安装)

1、下载dubbo-admin

地址 :https://github.com/apache/dubbo-admin/tree/master

2、解压进入目录

修改 dubbo-admin\src\main\resources \application.properties 指定zookeeper地址(没改过就不用)

3、在项目目录下打包dubbo-admin

没有maven的要去先下载和配置环境变量

mvn clean package -Dmaven.test.skip=true

等待打包完成 

4、执行

执行dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar (管理员身份运行)

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

注意:要打开zookeeper的服务

执行完毕,我们去访问一下 http://localhost:7001/ , 这时候我们需要输入登录账户和密码,我们都是默认的root-root;

登录成功后,查看界面

安装完成!

五、SpringBoot整合Dubbo + zookeeper


1、框架搭建

        1. 启动zookeeper !

        2. IDEA创建一个空项目。

        3.创建一个模块,实现服务提供者:provider-server , 选择web依赖即可。

        4.项目创建完毕,我们写一个服务,比如卖票的服务。

编写接口 

  1. package com.kuang.provider.service;
  2. public interface TicketService {
  3. public String getTicket();
  4. }

编写实现类

  1. package com.kuang.provider.service;
  2. public class TicketServiceImpl implements TicketService {
  3. @Override
  4. public String getTicket() {
  5. return "《狂神说Java》";
  6. }
  7. }

        5.创建一个模块,实现服务消费者:consumer-server , 选择web依赖即可。

        6.项目创建完毕,我们写一个服务,比如用户的服务。

编写service 

  1. package com.kuang.consumer.service;
  2. public class UserService {
  3.    //我们需要去拿去注册中心的服务
  4. }

2、服务提供者

1.导入Dubbo和zookeeper依赖

将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包

我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包

  1. <!-- Dubbo Spring Boot Starter -->
  2. <dependency>
  3. <groupId>org.apache.dubbo</groupId>
  4. <artifactId>dubbo-spring-boot-starter</artifactId>
  5. <version>2.7.3</version>
  6. </dependency>

zookeeper的包我们去maven仓库下载,zkclient

  1. <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
  2. <dependency>
  3. <groupId>com.github.sgroschupf</groupId>
  4. <artifactId>zkclient</artifactId>
  5. <version>0.1</version>
  6. </dependency>

【新版的坑】zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖

  1. <!-- 引入zookeeper -->
  2. <dependency>
  3. <groupId>org.apache.curator</groupId>
  4. <artifactId>curator-framework</artifactId>
  5. <version>2.12.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.curator</groupId>
  9. <artifactId>curator-recipes</artifactId>
  10. <version>2.12.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.zookeeper</groupId>
  14. <artifactId>zookeeper</artifactId>
  15. <version>3.4.14</version>
  16. <!--排除这个slf4j-log4j12-->
  17. <exclusions>
  18. <exclusion>
  19. <groupId>org.slf4j</groupId>
  20. <artifactId>slf4j-log4j12</artifactId>
  21. </exclusion>
  22. </exclusions>
  23. </dependency>

2.在springboot配置文件中配置dubbo相关属性

application.properties

  1. #当前应用名字
  2. dubbo.application.name=provider-server
  3. #注册中心地址
  4. dubbo.registry.address=zookeeper://127.0.0.1:2181
  5. #扫描指定包下服务
  6. dubbo.scan.base-packages=com.kuang.provider.service

3.配置service的实现类中的服务注解并发布服务

在service的实现类中配置服务注解,发布服务!注意导包问题

  1. import org.apache.dubbo.config.annotation.Service;
  2. import org.springframework.stereotype.Component;
  3. @Service //将服务发布出去--这个是dobbo的@Service
  4. @Component //放在容器中--使用了Dubboh后尽量不要用spring的@service
  5. public class TicketServiceImpl implements TicketService {
  6. @Override
  7. public String getTicket() {
  8. return "《狂神说Java》";
  9. }
  10. }

逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!

3、服务消费者

1.导入依赖,和之前的依赖一样

  1. <!--dubbo-->
  2. <!-- Dubbo Spring Boot Starter -->
  3. <dependency>
  4. <groupId>org.apache.dubbo</groupId>
  5. <artifactId>dubbo-spring-boot-starter</artifactId>
  6. <version>2.7.3</version>
  7. </dependency>
  8. <!--zookeeper-->
  9. <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
  10. <dependency>
  11. <groupId>com.github.sgroschupf</groupId>
  12. <artifactId>zkclient</artifactId>
  13. <version>0.1</version>
  14. </dependency>
  15. <!-- 引入zookeeper -->
  16. <dependency>
  17. <groupId>org.apache.curator</groupId>
  18. <artifactId>curator-framework</artifactId>
  19. <version>2.12.0</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.curator</groupId>
  23. <artifactId>curator-recipes</artifactId>
  24. <version>2.12.0</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.apache.zookeeper</groupId>
  28. <artifactId>zookeeper</artifactId>
  29. <version>3.4.14</version>
  30. <!--排除这个slf4j-log4j12-->
  31. <exclusions>
  32. <exclusion>
  33. <groupId>org.slf4j</groupId>
  34. <artifactId>slf4j-log4j12</artifactId>
  35. </exclusion>
  36. </exclusions>
  37. </dependency>

2.配置参数

  1. #当前应用名字
  2. dubbo.application.name=consumer-server
  3. #注册中心地址,可以在任何电脑上
  4. dubbo.registry.address=zookeeper://127.0.0.1:2181

3.拿到服务提供者的接口

本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同;

4. 完善消费者的服务类

  1. package com.kuang.service;
  2. import org.apache.dubbo.config.annotation.Reference;
  3. import org.springframework.stereotype.Service;
  4. @Service //注入到容器中--spring的@Service才能引用TicketService接口
  5. public class UserService {
  6. @Reference //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全类名(接口名:com.kuang.service.TicketService)
  7. TicketService ticketService;//引用, Pom坐标,可以定义路径相同的接口名
  8. public void bugTicket(){
  9. String ticket = ticketService.getTicket();
  10. System.out.println("在注册中心买到"+ticket);
  11. }
  12. }

5. 测试类编写

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class ConsumerServerApplicationTests {
  4. @Autowired
  5. UserService userService;
  6. @Test
  7. public void contextLoads() {
  8. userService.bugTicket();
  9. }
  10. }

4、启动测试

1. 开启zookeeper

2. 打开dubbo-admin实现监控【可以不用做】

3. 开启服务者

4. 消费者消费测试,结果:

 监控中心 :

这就是SpingBoot + dubbo + zookeeper实现分布式开发的应用,用到了服务拆分的思想

结束!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/851659
推荐阅读
相关标签
  

闽ICP备14008679号