掌握SpringBoot整合Dubbo+zookeper[详细版]
- 发布时间:2023-10-22 16:11:22 (有修改)
- 本文热度:浏览 1,045 赞 2 评论 0
- 文章标签: Spring Boot Spring
- 全文共1字,阅读约需1分钟
一、简介
什么是Dubbo
Dubbo官网地址:http://dubbo.apache.org
Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。
1、什么是RPC?
RPC全称为remote procedure call,即远程过程调用。比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务器上的应用想调用B服务器上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所以需要通过网络来表达调用的语义和传达调用的数据。
需要注意的是RPC并不是一个具体的技术,而是指整个网络远程调用过程。
RPC是一个泛化的概念,严格来说一切远程过程调用手段都属于RPC范畴。各种开发语言都有自己的RPC框架。Java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等。
2、 Dubbo干什么?
Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
节点角色说明:
节点 | 角色名称 |
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Registry服务注册中心Zookeeper
通过前面的Dubbo架构图可以看到,Registry(服务注册中心)在其中起着至关重要的作用。Dubbo官方推荐使用Zookeeper作为服务注册中心。
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用 。
3、总结
总的来说,dubbo就是一个远程调用服务,而zookeeper则是注册中心,就是将服务通过通过dubbo放入到zookeeper中,还能从dubbo中取出zookpper中的数据
虚拟机搭建zookeeper
链接:https://pan.baidu.com/s/1jD7P6qQEM4kSIbZS8B-YvQ?pwd=1234
提取码:1234
1、安装解压
1、安装jdk(自己提前配好JDK)
2、解压zookeeper
一般安装包在 opt目录下,解压后将解压目录放在usr/local下
2、修改配置
(1)将/usr/local/zookeeper/conf这个路径下的zoo_sample.cfg改为zoo.cfg
mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件,修改dataDir路径
也就是数据存放的位置,一般在zookeeper下创建一个zkData目录
cd /usr/local/zookeeper/
mkdir zkData
ll
cd zkData
pwd #获取全路径
cd conf
vim zoo.cfg
将文件里边的dataDir路径修改为制定路径
dataDir=上面的路径
3、操作zookeeper
(1)启动Zookeeper的服务端
cd /usr/local/zookeeper/bin
#启动当先zookeeper
./zkServer.sh start
#查看进程是否启动
jps
#查看状态
./zkServer.sh status
(2)启动zookeeper的客户端
#还是进入zookeeper的ben目录
#启动客户端
./zkCli.sh
#查询当前的树结构
ls /
#quit退出
(3)停止zookeeper的服务端
#进入zookeeper的bin
./zkServer.sh stop
4、配置参数
dataDir
dataDir=/usr/local/zookeeper/zkData :保存zookeeper中的数据
注意:默认的tmp目录,是一个临时目录,一段时间里边的数据会被清空,所以不会用在tmp目录下
好了以上就是一个zookeeper的,调试通过之后就可以启动你的zookeeper啦
二、SpringBoot整合Dubbo+zookeeper的demo
1、架构需求
使用SpringBoot+dubbo+zookeeper
一台zookeeper,一个服务端9001,一个消费端8080
2、搭建父类model
点击创建maven项目
2.1、配置pom文件
<properties>
<dubbo.version>2.7.4.1</dubbo.version>
<spring-boot.version>2.3.4.RELEASE</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
搭建生产者与消费者链接的接口
编写一个接口
public interface ZkService {
public String ZkTest();
}
3、搭建生产者producer9001
3.1、配置pom文件
<dependencies>
<!--引入自己创建的interface-->
<dependency>
<groupId>com.atdession</groupId>
<artifactId>dubbo-zookeeper-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.4.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo 2.7.x引入-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!-- spring boot starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
3.2 配置yaml
dubbo:
registry:
address: zookeeper://自己虚拟机上IP:2181 #自己的zookeeper服务器的IP:默认端口号
application:
name: dubbo-zookeeper-producer9001 #注册进去的名字
protocol:
name: dubbo #设置类型
port: -1 #因为dubbo的服务器端口号是不能唯一的,所以,设置为-1会帮我们自动改变端口号
config-center:
timeout: 120000 #超时时间 (毫秒)
server:
port: 9001
3.3、编写代码
3.3.1、主启动类
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.atdession.service")
public class Main9001 {
public static void main(String[] args) {
SpringApplication.run(Main9001.class,args);
}
}
3.3.2、service生产者
ZkServiceImpl实现类
import com.atdession.service.ZkService;
import org.apache.dubbo.config.annotation.Service;
//注意这个是dubbo下的Service
@Service(version = "1.0.0")
public class ZkServiceImpl implements ZkService {
@Override
public String ZkTest() {
return "我是生产者";
}
}
4、搭建消费者Consumer8080
4.1、配置pom文件
<dependencies>
<!-- 自己创建的接口-->
<dependency>
<groupId>com.atdession</groupId>
<artifactId>dubbo-zookeeper-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- dubbo-zookeeper-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.4.1</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo 2.7.x引入-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!--测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
4.2、配置yaml
dubbo:
application:
name: dubbo-zookeeper-consumer8080
protocol:
name: dubbo
port: -1
registry:
address: zookeeper://自己的虚拟机上的IP:2181 #默认端口号为2181
config-center:
timeout: 12000 #超时时间
server:
port: 8080
4.3、编写代码
4.3.1、主启动类
@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.atdession.controller")
public class Main8080 {
public static void main(String[] args) {
SpringApplication.run(Main8080.class,args);
}
}
4.3.2、消费者
@RestController
public class SumerController {
//注意:是dubbo中的Reference
@Reference(version = "1.0.0")
ZkService zkService;
@RequestMapping("/zkTest")
public String zkTest(){
String s = zkService.ZkTest();
System.out.println(s);
return "是生产者吗?"+s;
}
}
开启9001和8080进行测试
注意:先开启生产者,在开启消费者,否则会报错:在zookeeper找不到该接口的错误
好啦,详细的整已经实现啦,快去努力研究专研你的项目去吧,加油!