Springboot整合dubbo
重要:dubbo主要是用于远程过程调用 为二进制传输
编写实体类bean的时候必须实现Serializable接口
实例:
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable { //实现Serializable接口用于网络传输
private static final long serialVersionUID = 7228970962337272620L;
private Integer id;
private String username;
private Date updateTime;
private Date createTime;
}
1-提供者.引入依赖
<!--引入springboot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
</parent>
<dependencies>
<!--引入dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<!--这个两个是心跳包 用于zookeeper注册中心 查找提供者的心跳-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
2-提供者.编写service实现类 用于展示
@Service
@org.apache.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
@Override
public User queryUserById(Integer id) {
return new User(id,"zhangsan",new Date(),new Date());
}
}
@Service 这个能够将业务UserServiceImpl 放入ioc容器中
@org.apache.dubbo.config.annotation.Service 将该UserServiceImpl 存放到zookeeper节点当中 用于给消费者使用
3-提供者.编写application.properties
server.port=8081 #端口号可以自己改
dubbo.application.name=DUBBOCONSUMER #大写小写都可以 集群名称必须相同
dubbo.registry.address=192.168.216.128:2181 #zookeeper的地址 改成自己的即可 我的是linux的
dubbo.registry.protocol=zookeeper # 注册中心的名称 zookeeper(写死)
dubbo.monitor.protocol=registry # 确认注册(写死)
dubbo.protocol.name=dubbo # dubbo (写死)
dubbo.protocol.port=20880 # 集群的话需要改(随意)
4-提供者.编写启动dubbo
@SpringBootApplication
@EnableDubbo
public class DubboSpringBootApplication20880 {
public static void main(String[] args) {
SpringApplication.run(DubboSpringBootApplication20880.class,args);
}
}
@EnableDubbo 必须写 启动dubbo的功能
5-创建新的maven项目-消费者.引入依赖
<!--引入springboot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
</parent>
<dependencies>
<!--引入dubbo依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<!--这个两个是心跳包 用于zookeeper注册中心 查找提供者的心跳-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
6-消费者.编写controller层
@RestController
public class UserController {
@Reference
private UserService userService;
@GetMapping("/get/{id}")
public CommonResult<User> getUser(@PathVariable("id") Integer id) {
User user = userService.queryUserById(id);
return new CommonResult<User>(200,"查询成功",user);
}
}
由于UserService需要从提供者方里面提供所以需要使用@Reference这个注解
@Reference 这个注册能够从注册中心当中寻找合适UserService实现类
@Reference必须写 不然无法体现dubbo 的功能
7-消费者.application.properties编写
dubbo.application.name=DUBBOCONSUMER #可以改 改成自己喜欢的即可
dubbo.registry.address=192.168.216.128:2181 #改写成自己的即可
dubbo.registry.protocol=zookeeper #默认写死
dubbo.monitor.protocol=registry
server.port=8080 #一般消费者都是8080
消费者可以不用注册到zookeeper注册中心
启动自己的zookeeper,然后启动项目即可
我的zookeeper是3.7.0-linux版本
8-下载dubbo-admin(可选)可视化注册中心
下载地址 : https://github.com/apache/dubbo-admin
下载解压:
解压好进入这个
目录中找到application.properties 打开
把zookeeper的地址改成自己的即可
我的已经修改完成
记得修改tomcat的端口
我的修改成了9999 避免与8080端口冲突
记住user.name和user.password 这个是进入注册中心的用户和密码
9-打包dubbo-admin
修改完成之后回到这个页面
路径打开cmd
输入mvn clean package -Dmaven.test.skip=true 回车
等待成功
这个是成功页面
全部成功之后进入这个目录
这个就是可视化注册中心的jar
cmd 运行jar包
打开cmd 输入命令java -jar dubbo-admin-0.3.0-SNAPSHOT.jar
回车运行jar
运行jar之前 必须先启动zookeeper 不然会报错的!!
运行jar完成后
打开网页输入 http://localhost:9999/
输入账号密码进入注册中心
此时启动提供者和消费者
消费者的tomcat端口为8080 消费者访问即可
我的url地址写的是:http://localhost:8080/get/55
可以自己去修改自己的url
此时查看注册中心
我们的提供者UserService已经被注册中心检查到 会被注册中心检测到
完成dubbo的使用
10-dubbo集群
使用集群必须多建几个springboot项目并且只需要修改application.properties即可业务代码不需要修改
第一个集群项目application.properties
server.port=8081 #端口号可以自己改
dubbo.application.name=DUBBOCONSUMER #大写小写都可以 集群名称必须相同
dubbo.registry.address=192.168.216.128:2181 #zookeeper的地址 改成自己的即可 我的是linux的
dubbo.registry.protocol=zookeeper # 注册中心的名称 zookeeper(写死)
dubbo.monitor.protocol=registry # 确认注册(写死)
dubbo.protocol.name=dubbo # dubbo (写死)
dubbo.protocol.port=20880 # 集群的话需要改(随意)
dubbo.application.name 集群这个必须相同
dubbo.protocol.port 集群这个不能相同
server.port 集群tomcat端口也不能相同
第二个集群项目application.properties
server.port=8082 #端口号可以自己改
dubbo.application.name=DUBBOCONSUMER #大写小写都可以 集群名称必须相同
dubbo.registry.address=192.168.216.128:2181 #zookeeper的地址 改成自己的即可 我的是linux的
dubbo.registry.protocol=zookeeper # 注册中心的名称 zookeeper(写死)
dubbo.monitor.protocol=registry # 确认注册(写死)
dubbo.protocol.name=dubbo # dubbo (写死)
dubbo.protocol.port=20881 # 集群的话需要改(随意)
第三个集群项目application.properties
server.port=8082 #端口号可以自己改
dubbo.application.name=DUBBOCONSUMER #大写小写都可以 集群名称必须相同
dubbo.registry.address=192.168.216.128:2181 #zookeeper的地址 改成自己的即可 我的是linux的
dubbo.registry.protocol=zookeeper # 注册中心的名称 zookeeper(写死)
dubbo.monitor.protocol=registry # 确认注册(写死)
dubbo.protocol.name=dubbo # dubbo (写死)
dubbo.protocol.port=20882 # 集群的话需要改(随意)
集群了三个UserService 并且dubbo端口分别为20880,20881,20882
然后分别启动这三个项目即可
dubbo注册三个UserService 的集群,
消费者中远程过程调用UserService 默认使用的是轮循调用UserService
调用效果为
20880—>20881---->20882---->20880----->20881…一直轮循下去
注意:消费者可以不用注册到注册中心当中