Skip to content

Commit 4ebccd7

Browse files
committed
📝 Writing docs.
1 parent 7c84812 commit 4ebccd7

11 files changed

Lines changed: 714 additions & 0 deletions

File tree

docs/framework/dubbo/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# dubbo-notes
2+
3+
## 资料
4+
5+
**Dubbo**
6+
7+
[Github](https://github.com/alibaba/dubbo) | [用户手册](https://dubbo.gitbooks.io/dubbo-user-book/content/) | [开发手册](https://dubbo.gitbooks.io/dubbo-dev-book/content/) | [管理员手册](https://dubbo.gitbooks.io/dubbo-admin-book/content/)
8+
9+
**ZooKeeper**
10+
11+
[官网](http://zookeeper.apache.org/) | [官方文档](http://zookeeper.apache.org/doc/trunk/)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Dubbo 配置
2+
3+
## 简介
4+
5+
### 配置方式
6+
7+
Dubbo 支持四中配置方式:
8+
9+
- XML 配置
10+
- 属性配置
11+
- API 配置
12+
- 注解配置
13+
14+
我认为根据自己实际需要去掌握配置方式即可,没必要全都了解。更多内容可以参考:[Dubbo 官方用户手册](https://dubbo.gitbooks.io/dubbo-user-book/)
15+
16+
在这里,只记录我使用到的 xml 配置方式。
17+
18+
### 配置分类
19+
20+
所有配置项分为三大类
21+
22+
- 服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方。
23+
24+
- 服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
25+
26+
- 性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。
27+
28+
所有配置最终都将转换为 URL 表示,并由服务提供方生成,经注册中心传递给消费方,各属性对应 URL 的参数,参见配置项一览表中的 "对应URL参数" 列。
29+
30+
> **注意**
31+
>
32+
> 只有 group,interface,version 是服务的匹配条件,三者决定是不是同一个服务,其它配置项均为调优和治理参数。
33+
>
34+
> **URL 格式**
35+
>
36+
> `protocol://username:password@host:port/path?key=value&key=value`
37+
38+
## xml 配置
39+
40+
### provider.xml 示例
41+
42+
```xml
43+
<?xml version="1.0" encoding="UTF-8"?>
44+
<beans xmlns="http://www.springframework.org/schema/beans"
45+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
46+
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
47+
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
48+
<dubbo:application name="hello-world-app" />
49+
<dubbo:registry address="multicast://224.5.6.7:1234" />
50+
<dubbo:protocol name="dubbo" port="20880" />
51+
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />
52+
<dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />
53+
</beans>
54+
```
55+
56+
所有标签都支持自定义参数,用于不同扩展点实现的特殊配置,如:
57+
58+
```xml
59+
<dubbo:protocol name="jms">
60+
<dubbo:parameter key="queue" value="your_queue" />
61+
</dubbo:protocol>
62+
```
63+
64+
或:
65+
66+
```xml
67+
<beans xmlns="http://www.springframework.org/schema/beans"
68+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
69+
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
70+
xmlns:p="http://www.springframework.org/schema/p"
71+
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
72+
<dubbo:protocol name="jms" p:queue="your_queue" />
73+
</beans>
74+
```
75+
76+
### 配置之间的关系
77+
78+
![image.png](http://upload-images.jianshu.io/upload_images/3101171-5c7371e9ab5999e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
79+
80+
| 标签 | 用途 | 解释 |
81+
| ---------------------- | ------ | ---------------------------------------- |
82+
| `<dubbo:service/>` | 服务配置 | 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
83+
| `<dubbo:reference/>` | 引用配置 | 用于创建一个远程服务代理,一个引用可以指向多个注册中心 |
84+
| `<dubbo:protocol/>` | 协议配置 | 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
85+
| `<dubbo:application/>` | 应用配置 | 用于配置当前应用信息,不管该应用是提供者还是消费者 |
86+
| `<dubbo:module/>` | 模块配置 | 用于配置当前模块信息,可选 |
87+
| `<dubbo:registry/>` | 注册中心配置 | 用于配置连接注册中心相关信息 |
88+
| `<dubbo:monitor/>` | 监控中心配置 | 用于配置连接监控中心相关信息,可选 |
89+
| `<dubbo:provider/>` | 提供方配置 | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
90+
| `<dubbo:consumer/>` | 消费方配置 | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
91+
| `<dubbo:method/>` | 方法配置 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
92+
| `<dubbo:argument/>` | 参数配置 | 用于指定方法参数配置 |
93+
94+
### 配置覆盖关系
95+
96+
以 timeout 为例,显示了配置的查找顺序,其它 retries, loadbalance, actives 等类似:
97+
98+
- 方法级优先,接口级次之,全局配置再次之。
99+
- 如果级别一样,则消费方优先,提供方次之。
100+
101+
其中,服务提供方配置,通过 URL 经由注册中心传递给消费方。
102+
103+
![image.png](http://upload-images.jianshu.io/upload_images/3101171-0b046a7b9ac95ff1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
104+
105+
建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
106+
107+
理论上 ReferenceConfig 的非服务标识配置,在 ConsumerConfig,ServiceConfig, ProviderConfig 均可以缺省配置。
108+
109+
## 资料
110+
111+
[Dubbo 配置](https://dubbo.gitbooks.io/dubbo-user-book/configuration/)
112+
113+
[Dubbo 官方 schema 配置参考手册](https://dubbo.gitbooks.io/dubbo-user-book/references/xml/introduction.html)
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# Dubbo 特性
2+
3+
## 启动时检查
4+
5+
Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常。
6+
7+
需要关闭检查的场景:
8+
9+
- 有些服务不关心,或者出现了循环依赖,必须有一方先启动。
10+
- Spring 容器是懒加载的,或者通过 API 编程延迟引用服务。
11+
12+
默认 `check="true"`
13+
14+
关闭某个服务的启动时检查 (没有提供者时报错):
15+
16+
```
17+
<dubbo:reference interface="com.foo.BarService" check="false" />
18+
```
19+
20+
关闭所有服务的启动时检查 (没有提供者时报错):
21+
22+
```
23+
<dubbo:consumer check="false" />
24+
```
25+
26+
关闭注册中心启动时检查 (注册订阅失败时报错):
27+
28+
```
29+
<dubbo:registry check="false" />
30+
```
31+
32+
## 负载均衡
33+
34+
### 均衡策略
35+
36+
Dubbo 提供了多种均衡策略:
37+
38+
#### Random
39+
40+
- **随机**,按权重设置随机概率。
41+
- 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
42+
43+
#### RoundRobin
44+
45+
- **轮循**,按公约后的权重设置轮循比率。
46+
- 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
47+
48+
#### LeastActive
49+
50+
- **最少活跃调用数**,相同活跃数的随机,活跃数指调用前后计数差。
51+
- 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
52+
53+
#### ConsistentHash
54+
55+
- **一致性 Hash**,相同参数的请求总是发到同一提供者。
56+
- 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
57+
- 算法参见:<http://en.wikipedia.org/wiki/Consistent_hashing>
58+
- 缺省只对第一个参数 Hash,如果要修改,请配置 `<dubbo:parameter key="hash.arguments"value="0,1" />`
59+
- 缺省用 160 份虚拟节点,如果要修改,请配置 `<dubbo:parameter key="hash.nodes" value="320" />`
60+
61+
### 均衡策略配置
62+
63+
- **服务端服务级别**
64+
65+
```xml
66+
<dubbo:service interface="..." loadbalance="roundrobin" />
67+
```
68+
69+
- **客户端服务级别**
70+
71+
```xml
72+
<dubbo:reference interface="..." loadbalance="roundrobin" />
73+
```
74+
75+
- **服务端方法级别**
76+
77+
```xml
78+
<dubbo:service interface="...">
79+
<dubbo:method name="..." loadbalance="roundrobin"/>
80+
</dubbo:service>
81+
```
82+
83+
- **客户端方法级别**
84+
85+
```xml
86+
<dubbo:reference interface="...">
87+
<dubbo:method name="..." loadbalance="roundrobin"/>
88+
</dubbo:reference>
89+
```
90+
91+
### 负载均衡扩展
92+
93+
Dubbo 支持扩展新的负载均衡策略。
94+
95+
**扩展接口:**`com.alibaba.dubbo.rpc.cluster.LoadBalance`
96+
97+
**扩展配置**
98+
99+
```xml
100+
<dubbo:protocol loadbalance="xxx" />
101+
<!-- 缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配置 -->
102+
<dubbo:provider loadbalance="xxx" />
103+
```
104+
105+
**扩展示例**
106+
107+
Maven 项目结构:
108+
109+
```
110+
src
111+
|-main
112+
|-java
113+
|-com
114+
|-xxx
115+
|-XxxLoadBalance.java (实现LoadBalance接口)
116+
|-resources
117+
|-META-INF
118+
|-dubbo
119+
|-com.alibaba.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)
120+
```
121+
122+
XxxLoadBalance.java:
123+
124+
```java
125+
package com.xxx;
126+
127+
import com.alibaba.dubbo.rpc.cluster.LoadBalance;
128+
import com.alibaba.dubbo.rpc.Invoker;
129+
import com.alibaba.dubbo.rpc.Invocation;
130+
import com.alibaba.dubbo.rpc.RpcException;
131+
132+
public class XxxLoadBalance implements LoadBalance {
133+
public <T> Invoker<T> select(List<Invoker<T>> invokers, Invocation invocation) throws RpcException {
134+
// ...
135+
}
136+
}
137+
```
138+
139+
META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:
140+
141+
```
142+
xxx=com.xxx.XxxLoadBalance
143+
```
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# dubbo 概述
2+
3+
## 背景
4+
5+
发展趋势为:orm > mvc > rpc > soa 。
6+
7+
![image.png](http://upload-images.jianshu.io/upload_images/3101171-51e9492ecc8e13ea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
8+
9+
## 需求
10+
11+
最基本的需求:
12+
13+
- 负载均衡
14+
- 服务治理
15+
16+
## 架构
17+
18+
![image.png](http://upload-images.jianshu.io/upload_images/3101171-09cef50b0dd8c197.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
19+
20+
**节点角色说明**
21+
22+
| 节点 | 角色说明 |
23+
| ----------- | ------------------- |
24+
| `Provider` | 暴露服务的服务提供方 |
25+
| `Consumer` | 调用远程服务的服务消费方 |
26+
| `Registry` | 服务注册与发现的注册中心 |
27+
| `Monitor` | 统计服务的调用次调和调用时间的监控中心 |
28+
| `Container` | 服务运行容器 |
29+
30+
**调用关系说明**
31+
32+
1. 服务容器负责启动,加载,运行服务提供者。
33+
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
34+
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
35+
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
36+
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
37+
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
38+
39+
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
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+
当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:
69+
70+
![image.png](http://upload-images.jianshu.io/upload_images/3101171-e8fc326e375a0c61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
71+
72+
**节点角色说明**
73+
74+
| 节点 | 角色说明 |
75+
| ------------ | ------------------- |
76+
| `Deployer` | 自动部署服务的本地代理 |
77+
| `Repository` | 仓库用于存储服务应用发布包 |
78+
| `Scheduler` | 调度中心基于访问压力自动增减服务提供者 |
79+
| `Admin` | 统一管理控制台 |
80+
| `Registry` | 服务注册与发现的注册中心 |
81+
| `Monitor` | 统计服务的调用次调和调用时间的监控中心 |

0 commit comments

Comments
 (0)