文章目录
- 1. 分布式
- 2. Dubbo
- 3. Zookeeper 注册中心
- 4. Dubbo-admin
- 5. Springboot整合Dubbo和Zookeeper
1. 分布式
分布式是建立在网络之上的
RPC两个核心:通信,序列化
序列化:数据传输需要转换,为了对象的传输
2. Dubbo
高可用的RPC框架
三大核心能力:
- 面向接口的远程方法调用
- 智能容错和负载均衡
- 服务自动注册与发现
Dubbo默认端口:20880
3. Zookeeper 注册中心
zookeeper默认端口为:2181
下载解压zookeeper
双击bin下的zkServer.cmd,可能会闪退
解决方案:
可以编辑该zkServer.cmd文件,在倒数第二行,添加pause来暂停,这样我们就可以看到错误信息了
我们看到问题是:conf文件夹下,不存在zoo.cfg文件
我们将zoo_sample.cfg文件复制一份并改名为zoo.cfg
这样,我们就可以正常启动zkServer.cml了
命令:
- ls / 查看所有
- create -e /键名 值 创建
- get / 键名 获取
4. Dubbo-admin
一个监控管理后台
访问端口:7001
默认账号密码:root root
可以查看我们注册了哪些服务,哪些服务被注册了
在Dubbo-admin下载后,先要对dubbo-admin进行打包
在项目目录下
mvn clean package -Dmaven.test.skip=true
在打包后,双击target下的jar包就可以启动了,先启动zookeeper,然后直接访问localhost:7001
5. Springboot整合Dubbo和Zookeeper
1. 新建一个空项目
2. 新建一个模块
作为提供者,下一个Service及其实现类,如TicketService
使用了Dubbo后,最好不用Service注解,用Component,因为在Dubbo包下有同名的Service注解
在提供者哪个模块中,导入依赖
<!--导入依赖 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-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<!--日志会冲突,需要排除slf4j-log4j12-->
<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-service # 服务应用名字 自定义
dubbo.registry.address=zookeeper://127.0.0.1:2181 # 注册中心 zookeeper 地址
dubbo.scan.base-packages=cn.codewei.service # 哪些服务要被注册,指定扫描包下的
在被扫描包下的service实现类上添加注解
@Service // 注意:!!不是Spring下的,是Dubbo包下的
加上注解后,该服务就可以被扫描到了,在项目一启动就会自动注册到注册中心zookeeper中
这样启动zookeeper,dubbo-admin后,启动提供者模块,就可以在注册监控管理后台看到注册了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mWOLLhlq-1620888239362)(upload\image-20200613075422131.png)]
3. 新建一个模块,作为消费者
导入相关依赖
<!--导入依赖 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-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<!--日志会冲突,需要排除slf4j-log4j12-->
<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=8002
dubbo.registry.address=zookeeper://127.0.0.1:2181 // 去哪里拿服务,注册中心地址
dubbo.application.name=consumer # 拿服务需要消费者暴露自己的名字,自定义
在消费者模块中,写一个类UserService
同个@Reference
注解(dubbo包下的!!),来获取远程的服务
在消费者中,要定义一个和提供者路径相同的服务接口,接口名要相同,方法也要相同,这样就可以远程获取到实现类了
public interface TicketService {
public String getTicket();
}
@Service
public class UserService {
// 想拿到 provider-service 提供的票
@Reference
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket(); // 调用的远程的方法
System.out.println("再注册中心--->"+ticket);
}
}