本笔记内容为狂神说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】
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
了解Dubbo:Dubbo 简介 | Apache Dubbo
在分布式系统中,尤其是随着微服务架构的发展,应用的部署、发布、扩缩容变得极为频繁,作为 RPC 消费方,如何动态的发现服务提供方地址成为 RPC 通信的前置条件。Dubbo 提供了自动的地址发现机制,用于应对分布式场景下机器实例动态迁移的问题。如下图所示,通过引入注册中心来协调提供方与消费方的地址,提供者启动之后向注册中心注册自身地址,消费方通过拉取或订阅注册中心特定节点,动态的感知提供方地址列表的变化。
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
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 地址。支持以下功能:
时,记录失败注册和订阅请求,后台定时重试
设置 zookeeper 登录信息
设置 zookeeper 的根节点,不配置将使用默认的根节点。*
号通配符
,可订阅服务的所有分组和所有版本的提供者官网:Apache ZooKeeper
我的是3.5.6版本,官方建议使用 2.3.3
以上版本的 zookeeper 注册中心客户端
然后解压zookeeper
管理员身份运行 /bin/zkServer.cmd
可能会出现闪退(不会的忽略以下步骤,我没遇到这个情况)
解决方案:编辑zkServer.cmd文件末尾添加pause 。这样运行出错就不会退出,会提示错误信息,方便找到原因。
再运行zkServer.cmd可看到错误信息 conf下没zoo.cfg文件
修改zoo.cfg配置文件
将conf文件夹下面的zoo_sample.cfg复制一份改名为zoo.cfg即可。
注意几个重要位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeper的端口号
修改完成后再次启动zookeeper
启动zkCli.cmd测试,记得把服务zkServer.cmd也开了。
#列出zookeeper根下保存的所有节点
ls /
#创建一个kuangshen节点,值为123
create –e /kuangshen 123
#获取/kuangshen节点的值
get /kuangshen
dubbo本身并不是一个服务软件。它其实就是一个jar包,能够帮你的java程序连接到zookeeper,并利用zookeeper消费、提供服务。
但是为了让用户更好的管理监控众多的dubbo服务,官方提供了一个可视化的监控程序dubbo-admin,不过这个监控即使不装也不影响使用。(不想用也可以不安装)
地址 :https://github.com/apache/dubbo-admin/tree/master
修改 dubbo-admin\src\main\resources \application.properties 指定zookeeper地址(没改过就不用)
没有maven的要去先下载和配置环境变量
mvn clean package -Dmaven.test.skip=true
等待打包完成
执行dubbo-admin\target 下的dubbo-admin-0.0.1-SNAPSHOT.jar (管理员身份运行)
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
执行完毕,我们去访问一下 http://localhost:7001/ , 这时候我们需要输入登录账户和密码,我们都是默认的root-root;
登录成功后,查看界面
1. 启动zookeeper !
2. IDEA创建一个空项目。
3.创建一个模块,实现服务提供者:provider-server , 选择web依赖即可。
4.项目创建完毕,我们写一个服务,比如卖票的服务。
package com.kuang.provider.service;
public interface TicketService {
public String getTicket();
}
package com.kuang.provider.service;
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《狂神说Java》";
}
}
5.创建一个模块,实现服务消费者:consumer-server , 选择web依赖即可。
6.项目创建完毕,我们写一个服务,比如用户的服务。
package com.kuang.consumer.service;
public class UserService {
//我们需要去拿去注册中心的服务
}
将服务提供者注册到注册中心,我们需要整合Dubbo和zookeeper,所以需要导包
我们从dubbo官网进入github,看下方的帮助文档,找到dubbo-springboot,找到依赖包
org.apache.dubbo
dubbo-spring-boot-starter
2.7.3
zookeeper的包我们去maven仓库下载,zkclient
com.github.sgroschupf
zkclient
0.1
【新版的坑】zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖
org.apache.curator
curator-framework
2.12.0
org.apache.curator
curator-recipes
2.12.0
org.apache.zookeeper
zookeeper
3.4.14
org.slf4j
slf4j-log4j12
application.properties
#当前应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#扫描指定包下服务
dubbo.scan.base-packages=com.kuang.provider.service
在service的实现类中配置服务注解,发布服务!注意导包问题
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service //将服务发布出去--这个是dobbo的@Service
@Component //放在容器中--使用了Dubboh后尽量不要用spring的@service
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《狂神说Java》";
}
}
逻辑理解 :应用启动起来,dubbo就会扫描指定的包下带有@component注解的服务,将它发布在指定的注册中心中!
org.apache.dubbo
dubbo-spring-boot-starter
2.7.3
com.github.sgroschupf
zkclient
0.1
org.apache.curator
curator-framework
2.12.0
org.apache.curator
curator-recipes
2.12.0
org.apache.zookeeper
zookeeper
3.4.14
org.slf4j
slf4j-log4j12
#当前应用名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同;
package com.kuang.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service //注入到容器中--spring的@Service才能引用TicketService接口
public class UserService {
@Reference //远程引用指定的服务,他会按照全类名进行匹配,看谁给注册中心注册了这个全类名(接口名:com.kuang.service.TicketService)
TicketService ticketService;//引用, Pom坐标,可以定义路径相同的接口名
public void bugTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心买到"+ticket);
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
userService.bugTicket();
}
}
1. 开启zookeeper
2. 打开dubbo-admin实现监控【可以不用做】
3. 开启服务者
4. 消费者消费测试,结果:
监控中心 :
这就是SpingBoot + dubbo + zookeeper实现分布式开发的应用,用到了服务拆分的思想
结束!