This is an automated email from the ASF dual-hosted git repository.

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-docs.git


The following commit(s) were added to refs/heads/master by this push:
     new 377efc1  基于动态配置的流量特征治理 (#214)
377efc1 is described below

commit 377efc11be2510358ea264c4e86357eedd674b7b
Author: bao liu <[email protected]>
AuthorDate: Thu Jan 7 16:19:00 2021 +0800

    基于动态配置的流量特征治理 (#214)
---
 .../zh_CN/docs/featured-topics/upgrading.md        |   3 +-
 .../zh_CN/docs/references-handlers/governance.md   | 204 +++++++++++++++++++++
 java-chassis-reference/zh_CN/docs/toc.md           |   1 +
 java-chassis-reference/zh_CN/mkdocs.yml            |   1 +
 4 files changed, 208 insertions(+), 1 deletion(-)

diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md 
b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md
index cda9ae5..5e8e595 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md
@@ -3,4 +3,5 @@
 * [1.3.0 升级 2.0.0指导](upgrading/1_3_0T2_0_0.md)
 * [2.0.0 升级 2.0.1指导](upgrading/2_0_0T2_0_1.md)
 * [2.0.1 升级 2.1.0指导](upgrading/2_0_1T2_1_0.md)
-* [2.1.0 升级 2.1.1指导](upgrading/2_1_0T2_1_1.md)
\ No newline at end of file
+* [2.1.0 升级 2.1.1指导](upgrading/2_1_0T2_1_1.md)
+* [2.1.1 升级 2.1.5指导](upgrading/2_1_1T2_1_5.md)
\ No newline at end of file
diff --git 
a/java-chassis-reference/zh_CN/docs/references-handlers/governance.md 
b/java-chassis-reference/zh_CN/docs/references-handlers/governance.md
new file mode 100644
index 0000000..c533b32
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/references-handlers/governance.md
@@ -0,0 +1,204 @@
+# 基于动态配置的流量特征治理
+
+基于动态配置的流量特征治理旨在提供一种通用的,适合不同语言、不同微服务开发框架的治理规则。治理规则规定了微服务治理的过程、治理的策略,
+可以使用不同的开发框架、技术实现治理规则约定的治理能力。
+
+开发者可以在 [ServiceComb Java Chassis][java-chassis], [Go 
Chassis][go-chassis],[Spring Cloud][spring-cloud],
+[Dubbo][dubbo] 中使用该功能。
+
+[ServiceComb Java Chassis][java-chassis] 提供了实现 SDK,可以将其用于其他开发框架。SDK 默认采用 
[Resilience4j][resilience4j]
+实现治理过程。规范没有约束治理过程的实现框架,可以很方便的使用其他的治理框架实现治理过程。 
+
+## 治理过程
+
+治理过程可以从两个不同的角度进行描述。
+
+从管理流程上,可以分为 `流量标记` 和 `设置治理规则` 两个步骤。系统架构师将请求流量根据特征打上标记,用于区分一个或者一组代表具体
+业务含义的流量,然后对这些流量设置治理规则。
+
+从处理过程上,可以分为 `下发配置` 和 `应用治理规则` 两个步骤。 可以通过配置文件、配置中心、环境变量等常见的配置管理手段下发配置。
+微服务 SDK 负责读取配置,解析治理规则,实现治理效果。
+
+## 治理策略
+
+治理策略分两部分进行描述,一部分描述 `流量标记`, 一部分描述 `治理规则`。 
+
+* `流量标记`
+
+可以根据请求的特征进行流量标记。
+
+```yaml
+servicecomb:
+  matchGroup:
+    userLoginAction: |
+      matches:
+        - apiPath:
+            exact: "/login"
+          method:
+            - POST
+        - headers
+          Authentication: 
+            prefix: Basic
+```
+
+比如上面的示例定义了一个流量特征 `userLoginAction`,如果流量的 apiPath=/login&method=POST, 或者 请求头 
Authentication=Basic*
+那么认为这个流量是一个登陆操作。
+
+* `治理规则`
+
+定义好流量特征后,可以给它们设置治理规则。
+
+```yaml
+servicecomb:
+  rateLimiting:
+    userLoginAction: |
+      rate: 100
+```
+
+比如上面的示例设置流量特征 `userLoginAction` 的限流策略是 100 TPS。 
+
+## 规范参考
+
+### 流量标记
+
+```yaml
+servicecomb:
+  matchGroup:
+    userLoginAction: |
+      matches:
+        - apiPath:
+            exact: "/login"
+          method:
+            - POST
+        - headers
+          Authentication: 
+            prefix: Basic
+```
+
+一个流量对应一个 Key, userLoginAction 为 Key 的名称。 一个流量可以定义多个标记规则,每个标记规则里面可以定义 `apiPath`,
+`method`, `headers` 匹配规则。 不同标记规则是或的关系,匹配规则是与的关系。
+
+* 算子
+
+在match中提供了一系列的算子来对 `apiPath` 或者 `headers` 进行匹配. 
+
+  * exact : 精确匹配
+  * prefix: 前缀匹配
+  * suffix: 后缀匹配
+  * contains: 包含, 目标字符串是否包含模式字符串
+  * compare: 比较: 支持 >,<,>=,<=,=,!= 符号匹配,处理时会把模式字符串和目标字符串转化为 Double 
类型进行比较,支持的数据范围为 Double 的
+     数据范围。在进行 = 和 != 判断时 , 如果二者的差值小于1e-6就视为相等。例如模式串为: >-10 会对大于-10以上的目标串匹配成功。
+
+流量标记可以在不同的应用层实现,比如在提供 REST 接口的服务端,可以通过 `HttpServletRequest` 获取流量信息。在 
RestTemplate 调用的客户端,可以从
+`RestTemplate` 获取流量信息。不同的框架和应用层,提取信息的方式不一样。 实现层通过将特征映射到 `GovHttpRequest` 
来屏蔽这些差异,使得在不同的框架,
+不同的应用层都可以使用治理。
+
+```java
+public class GovHttpRequest {
+  private final String serviceName;
+
+  private final String version;
+
+  private Map<String, String> headers;
+
+  private String uri;
+
+  private String method;
+
+  public GovHttpRequest(String serviceName, String version) {
+    Assert.notNull(serviceName, "serviceName should not be null");
+    Assert.notNull(version, "version should not be null");
+    this.serviceName = serviceName;
+    this.version = version;
+  }
+}
+```
+
+### 限流
+
+```yaml
+servicecomb:
+  rateLimiting:
+    userLoginAction: |
+      timeoutDuration: 0
+      limitRefreshPeriod: 1000
+      rate: 1
+      services: helloService
+```
+
+规则解释:限流规则借鉴了 [Resilience4j][resilience4j] 的思想,其原理为: 
每隔limitRefreshPeriod的时间会加入limitForPeriod个新许可,
+如果获取不到新的许可(已经触发限流),当前线程会park,最多等待timeoutDuration的时间,默认单位为ms。在异步框架中,建议 
timeoutDuration
+设置为0,否则可能阻塞事件派发线程。
+
+services 是治理规则公共属性,指出这个限流规则的生效范围。在应用系统设计的规程中,流量标记、治理规则对于所有微服务都是可见的,一个微服务只会启用
+services 包含自己的规则。这个属性可选,表示这条规则默认生效。
+
+### 重试
+
+```yaml
+servicecomb:
+  retry:
+    userLoginAction: |
+      maxAttempts: 3
+      retryOnResponseStatus: 502
+      waitDuration:0
+      services: helloService
+```
+
+规则解释:重试规则借鉴了 [Resilience4j][resilience4j] 
的思想,其原理为:如果响应的错误码(502)和返回值的计算结果满足重试条件,
+并且异常在重试异常清单里面,则进行重试。下一次重试等待时间为 waitDuration。 
+
+重试等待时间和具体的框架与运行机制有关。在同步框架里面,重试等待时间必须大于等于0。异步框架里面,重试等待时间必须大于0,否则不会重试,
+并且重试是在独立的线程池里面执行的。
+
+重试条件是框架相关的,通过扩展 `RetryExtension`, 不同框架实现机制可能不同,
+```java
+public interface RetryExtension {
+  boolean isRetry(List<Integer> statusList, Object result);
+
+  Class<? extends Throwable>[] retryExceptions();
+}
+```
+
+### 熔断
+
+```yaml
+servicecomb:
+  circuitBreaker:
+    userLoginAction: |
+      failureRateThreshold:50
+      slowCallRateThreshold: 100
+      SlowCallDurationThreshold: 60000
+      minimumNumberOfCalls: 100
+      slidingWindowType: count
+      slidingWindowSize: 100
+      services: helloService
+```
+
+规则解释:熔断规则借鉴了 [Resilience4j][resilience4j] 的思想,其原理为:达到指定 failureRateThreshold 
错误率或者 slowCallRateThreshold 慢请求
+率时进行熔断,慢请求通过 SlowCallDurationThreshold 定义。minimumNumberOfCalls 
是达到熔断要求的最低请求数量门槛。slidingWindowType指定滑动窗口
+类型,默认可选 count / time 分别是基于请求数量窗口和基于时间窗口。slidingWindowSize 
指定窗口大小,根据滑动窗口类型,单位可能是请求数量或者秒。
+
+### 隔离仓
+
+```yaml
+servicecomb:
+  bulkhead:
+    userLoginAction: |
+      maxConcurrentCalls: 1000
+      maxWaitDuration: 0
+      services: helloService
+```
+
+规则解释:隔离仓规则借鉴了 [Resilience4j][resilience4j] 的思想,其原理为:当最大并发数超过 
maxConcurrentCalls,等待 maxWaitDuration
+竞争资源,如果获得资源,则继续处理,如果获取不到,则拒绝执行请求。在异步框架,建议 maxWaitDuration 设置为0,防止阻塞事件派发线程。
+
+### 使用 JAVA SDK
+
+* 待完善
+
+[java-chassis]: https://github.com/apache/servicecomb-java-chassis
+[go-chassis]: https://github.com/go-chassis/go-chassis
+[spring-cloud]: https://github.com/huaweicloud/spring-cloud-huawei
+[dubbo]: https://github.com/huaweicloud/dubbo-servicecomb
+[resilience4j]: https://github.com/resilience4j
\ No newline at end of file
diff --git a/java-chassis-reference/zh_CN/docs/toc.md 
b/java-chassis-reference/zh_CN/docs/toc.md
index d4f1257..65e8c7c 100644
--- a/java-chassis-reference/zh_CN/docs/toc.md
+++ b/java-chassis-reference/zh_CN/docs/toc.md
@@ -81,6 +81,7 @@
     - [限流](references-handlers/ratelimit.md)
     - [路由管理](references-handlers/router.md)
     - [隔离熔断容错](references-handlers/bizkeeper.md)
+    - [基于动态配置的流量特征治理](references-handlers/governance.md)
 - 网关功能参考:
     - [介绍](edge/open-service.md)
     - [使用 Edge Service 做网关](edge/by-servicecomb-sdk.md)
diff --git a/java-chassis-reference/zh_CN/mkdocs.yml 
b/java-chassis-reference/zh_CN/mkdocs.yml
index 5ee4505..14fcf78 100644
--- a/java-chassis-reference/zh_CN/mkdocs.yml
+++ b/java-chassis-reference/zh_CN/mkdocs.yml
@@ -27,6 +27,7 @@ nav:
       - 限流: references-handlers/ratelimit.md
       - 路由管理: references-handlers/router.md
       - 隔离熔断容错: references-handlers/bizkeeper.md
+      - 基于动态配置的流量特征治理: references-handlers/governance.md
 - 网关功能参考:
       - 介绍: edge/open-service.md
       - 使用 Edge Service 做网关: edge/by-servicecomb-sdk.md

Reply via email to