0%

【SpringBoot】Dubbo

关于分布式系统,以及Dubbo的介绍和举例

一、分布式系统

  • 分布式系统是若干个独立计算机的集合,这些计算机对于用户来说就像是单个相关系统
  • 分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的的计算机节点组成的系统
  • 只有单个硬件处理能力无法满足日益增长的计算,存储任务时,才考虑使用分布式系统

二、RPC

2.1 RPC介绍

  • PRC:【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,它是一种技术的思想,而不是规范
  • 它允许程序调用另一个地址空间中的过程或函数,而不用程序员显示编码这个远程调用的细节

2.2 RPC的两个核心

  • 通信:两个主机之间的交流
  • 序列化:数据传输需要转换,方便数据传输

三、Dubbo及Zookeeper安装

3.1 Dubbo介绍

  • Dubbo 是一款高性能,轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现

3.2 搭建Dubbo环境

  • 注册中心:官方推荐MulticastZookeeperRedisSimple,下面主要介绍Zookeeper
  • 下载后解压即可

3.3 环境测试

  • (1)去解压后的bin目录下apache-zookeeper-3.6.2-bin\bin,以管理员身份运行zkServer.cmd,会返现服务器闪退
  • (2)编辑cmd,添加暂停pause,查看错误
  • (3)重新运行zkServer.cmd,查看错误
  • (4)复制conf文件夹下的zoo_sample.cfg,改名为zoo.cfg
  • (5)先启动zkServer.cmd服务器,在打开zkCli.cmd客户端,连接成功则环境配置成功

四、SpringBoot整合Dubbo

4.1 导入依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!--Dubbo启动器依赖-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>

<!--Zookeeper客户端-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>

<!--Zookeeper服务端-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<!--解决日志冲突-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>

4.2 创建服务端

  • (1)创建一个SprigBoot项目,创建Service层接口,以及实现方法
1
2
3
4
5
6
接口
public interface TicketService {

public String getTicket();

}
1
2
3
4
5
6
7
8
9
接口实现类
@DubboService //在项目启动中就自动注册到注册中心,旧注解为@Service,容易与Spring的注解冲突
@Component //使用Dubbo后尽量不要使用Service注解
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《优惠券》";
}
}
  • (2)配置文件中配置服务端的信息
1
2
3
4
5
6
7
server.port=8081
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#服务应用名字
dubbo.application.name=provider
#哪些服务被扫描
dubbo.scan.base-packages=com.letere.service

4.3 创建客户端

  • 再重新创建一个SpringBoot项目

  • 创建Service层方法,为了实现分布式系统,远程调用方法,使用的“定义路径相同的接口名”方法,将服务端的Service接口,赋值到客户端的Service接口,在自己的Service类中注入并调用

1
2
3
4
5
6
7
8
9
10
11
@Service //交给Spring
public class UserService {
//调用provider提供的方法
@DubboReference//引用 和Autowird一样 (1)引用pom坐标 (2)可以定义路径相同的接口名
TicketService ticketService;

public void buyTicket() {
String ticket = ticketService.getTicket();
System.out.println("在注册中心中拿到一张票,为:" + ticket);
}
}
  • 创建一个测试方法,来调用
1
2
3
4
5
6
7
8
9
10
11
12
@SpringBootTest
class DemoApplicationTests {

@Autowired
UserService userService;

@Test
void contextLoads() {
userService.buyTicket();
}

}

4.3 Dubbo测试

  • (1)回到Zookeeper的bin目录下,将注册中心服务器zkServer.cmd开启
  • (2)先启动SpringBoot服务端,在启动SpringBoot的客户端查看方法调用是否成功