[Dubbo]
相关概念
分布式系统中的相关概念

集群和分布式
集群:多台机器做一个工作
分布式:多台机器共同完成

架构演进

单体架构
垂直架构
分布式架构
主要是使用RPC技术

SOA架构
加入中间服务者

微服务架构

Dubbo 是 SOA时代的产物,SpringCloud 是微服务时代的产物
Dubbo概述
概念
节点角色说明:
- Provider:暴露服务的服务提供方
- Container:服务运行容器
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心

入门
环境准备
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> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <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>
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>${zookeeper.version}</version> </dependency>
<dependency> <groupId>com.itheima</groupId> <artifactId>dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
</dependencies>
<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>8000</port> <path>/</path> </configuration> </plugin> </plugins> </build>
</project>
|
dubbo-web和dubbo-service使用两个不同的tomcat运行,端口分别设置为8000和9000
三个模块的代码的关系:

在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接口即可

注册缓存
注册中心挂了,服务是否可以正常访问?
- 可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
- 当服务提供者地址发生变化时,注册中心会通知服务消费者。
超时与重试
服务消费者在调用服务提供者时发生了阻塞、等待,这个时候会一直等待
在某个峰值,线程大量堆积,势必造成雪崩
dubbo利用超时机制,一段时间内无法访问自动断开连接
使用timeout属性配置超时时间,默认值1000,单位毫秒。
使用retries属性配置重试次数,默认值为2
使用方法:
在@Service注解中加入参数
1 2
| @Service(timeout=3000,retries=2)
|
也可以在@Reference注解中加入参数
1 2
| @Reference(timeout=3000,retries=2)
|
其中@Reference的优先级更高
多版本

对于同一个接口不同的实现类标识为不同的版本,即可做出区别
- 在@Service注解中加入版本信息
1
| @Service(version="v1.0")
|
- 在@Reference注解中加入所注入的版本即可
1
| @Reference(version="v1.0")
|
负载均衡
策略
- Random:按权重随机
- RoundRobin:按权重轮询
- LeastActive:最少活跃调用数,相同活跃数的随机
- ConsistentHash:一致性hash,相同参数的请求总是发送到同一使用者
集群容错

服务降级
