左璞凡的博客

日出之美便在于它脱胎于最深的黑暗

0%

Dubbo

[Dubbo]

相关概念

分布式系统中的相关概念

image-20231020183115359

集群和分布式

集群:多台机器做一个工作

分布式:多台机器共同完成

image-20231020185524193

架构演进

image-20231020185608308

单体架构

  • image-20231020192738602

垂直架构

  • image-20231020192757726

分布式架构

主要是使用RPC技术

image-20231020192904055

SOA架构

加入中间服务者

image-20231020192957881

微服务架构

image-20231020193059978

Dubbo 是 SOA时代的产物,SpringCloud 是微服务时代的产物

Dubbo概述

概念

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
  • 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
  • 官网:http://dubbo.apache.org

节点角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心

image-20231020193558485

入门

环境准备

Dubbo官方推荐使用Zookeeper作为注册中心

ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。

创建dubbo-pro项目

  • 创建dubbo-service模块,作为方法提供者
  • 创建dubbo-web模块,作为方法调用者
  • 创建dubbo-interface模块,作为接口提供者

dubbo-service模块对dubbo-interface模块的类进行实现

dubbo-web模块和dubbo-service模块都需要依赖dubbo-interface模块

dubbo-web模块和dubbo-service模块的依赖差别不大

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima</groupId>
<artifactId>dubbo-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>


<properties>
<spring.version>5.1.9.RELEASE</spring.version>
<dubbo.version>2.7.4.1</dubbo.version>
<zookeeper.version>4.0.0</zookeeper.version>

</properties>

<dependencies>
<!-- servlet3.0规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>

<!--日志-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>



<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${zookeeper.version}</version>
</dependency>

<!-- <dependency>-->
<!-- <groupId>com.itheima</groupId>-->
<!-- <artifactId>dubbo-service</artifactId>-->
<!-- <version>1.0-SNAPSHOT</version>-->
<!-- </dependency>-->

<dependency>
<groupId>com.itheima</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

</dependencies>


<build>
<plugins>
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8000</port>
<!--另一个用9000-->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>


</project>

dubbo-web和dubbo-service使用两个不同的tomcat运行,端口分别设置为8000和9000

三个模块的代码的关系:

image-20231020194554810

在dubbo-web和dubbo-service中,需要配置resource中的配置文件

配置dubbo和zookeeper,然后才能使用

实现类前要用dubbo的@Service注解

控制类中要使用@Reference注入类(代替@Autowired)

dubbo-web和dubbo-service都tomcat:run后,可以访问

http://localhost:8000/user/sayHello.do

得到实现类中的字符串

Dubbo高级特性

dubbo-admin

概述

  • dubbo-admin 管理平台,是图形化的服务管理页面
  • 从注册中心中获取到所有的提供者 / 消费者进行配置管理
  • 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
  • dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot
  • 安装 dubbo-admin 其实就是部署该项目

dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,node.js

建议安装16版本以下的node.js,17版本的更新使得前端的部分运行会出错,需要配置来解决

因为前端工程是用vue开发的,所以需要安装node.js,node.js中自带了npm,后面我们会通过npm启动

序列化

  • dubbo内部已经将序列化和反序列化的过程内部封装了
  • 只需要在定义pojo类时实现serializable接口即可

image-20231020195318779

注册缓存

注册中心挂了,服务是否可以正常访问?

  • 可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
  • 当服务提供者地址发生变化时,注册中心会通知服务消费者。

超时与重试

  • 服务消费者在调用服务提供者时发生了阻塞、等待,这个时候会一直等待

  • 在某个峰值,线程大量堆积,势必造成雪崩

  • dubbo利用超时机制,一段时间内无法访问自动断开连接

  • 使用timeout属性配置超时时间,默认值1000,单位毫秒。

  • 使用retries属性配置重试次数,默认值为2

使用方法:

在@Service注解中加入参数

1
2
@Service(timeout=3000,retries=2
//表示3秒未反应即超时,重试次数为2次

也可以在@Reference注解中加入参数

1
2
@Reference(timeout=3000,retries=2
//表示3秒未反应即超时,重试次数为2次

其中@Reference的优先级更高

多版本

image-20231020200013469

对于同一个接口不同的实现类标识为不同的版本,即可做出区别

  1. 在@Service注解中加入版本信息
1
@Service(version="v1.0")
  1. 在@Reference注解中加入所注入的版本即可
1
@Reference(version="v1.0")

负载均衡

策略

  • Random:按权重随机
  • RoundRobin:按权重轮询
  • LeastActive:最少活跃调用数,相同活跃数的随机
  • ConsistentHash:一致性hash,相同参数的请求总是发送到同一使用者

集群容错

image-20231020200328590

服务降级

image-20231020200347573