You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/03/19 07:00:50 UTC

[servicecomb-docs] branch master updated: add new features of 2.0.1 and fix upgrading guides

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 a6fd6a6  add new features of 2.0.1 and fix upgrading guides
a6fd6a6 is described below

commit a6fd6a600f710931d07d7a6fb9e0ec359597a1b4
Author: liubao <bi...@qq.com>
AuthorDate: Thu Mar 19 14:29:43 2020 +0800

    add new features of 2.0.1 and fix upgrading guides
---
 .../zh_CN/docs/featured-topics/features.md         |   3 +-
 .../docs/featured-topics/features/trace-id.md      | 130 +++++++++++++++++++++
 .../zh_CN/docs/featured-topics/upgrading.md        |   3 +-
 .../docs/featured-topics/upgrading/1_3_0T2_0_0.md  |  68 ++++++++---
 .../docs/featured-topics/upgrading/2_0_0T2_0_1.md  |  13 +++
 5 files changed, 196 insertions(+), 21 deletions(-)

diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/features.md b/java-chassis-reference/zh_CN/docs/featured-topics/features.md
index 1fcac19..ec5c0f6 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/features.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/features.md
@@ -2,4 +2,5 @@
 
 * [2.0.0 新特性介绍: 弱类型契约](features/weak-type-contrast.md)
 * [2.0.0 新特性介绍: 多配置中心支持](features/configuration-sources.md)
-* [2.0.1 新特性介绍: date和date-time](features/date-time.md)
\ No newline at end of file
+* [2.0.1 新特性介绍: date和date-time](features/date-time.md)
+* [2.0.1 新特性介绍: 在日志中记录trace id](features/trace-id.md)
\ No newline at end of file
diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/features/trace-id.md b/java-chassis-reference/zh_CN/docs/featured-topics/features/trace-id.md
new file mode 100644
index 0000000..feff69e
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/features/trace-id.md
@@ -0,0 +1,130 @@
+# 2.0.1 新特性介绍: 在日志中记录trace id
+
+微服务架构下,需要部署大量的微服务实例,调用情况复杂,给问题定位带来了很大的麻烦。 通过调用链系统能够很好的解决日志追踪的问题,
+但是对于日常的开发调试,部署调用链仍然显得复杂。 java-chassis 提供了一种简单的机制,允许业务在记录日志的时候,包含trace id。 
+
+## 在日志系统中记录 trace id
+
+java-chassis 使用 MDC 的方式记录 trace id, 可以在 log4j2 或者 logback 中打印 trace id。 java-chassis 记录 trace id 增加
+了 Marker , 开发者可以方便的将这类日志进行分类输出。 
+
+log4j2的配置如下:
+
+```xml
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <PatternLayout pattern="[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n"/>
+    </Console>
+  </Appenders>
+```
+
+结合 Marker, 将日志分类显示:
+
+```xml
+  <Appenders>
+    <Console name="Console" target="SYSTEM_OUT">
+      <MarkerFilter marker="SERVICECOMB_MARKER" onMatch="DENY" onMismatch="ACCEPT"/>
+      <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n"/>
+    </Console>
+    <Console name="Console-Tracing" target="SYSTEM_OUT">
+      <MarkerFilter marker="SERVICECOMB_MARKER" onMismatch="DENY" onMatch="ACCEPT"/>
+      <PatternLayout pattern="[%d][%t][%p][%c:%L][%X{SERVICECOMB_TRACE_ID}] %m%n"/>
+    </Console>
+  </Appenders>
+```
+
+logback的配置如下:
+
+```xml
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%d [%level] [%thread][%X{SERVICECOMB_TRACE_ID}] - %msg (%F:%L\)%n</pattern>
+    </encoder>
+  </appender>
+```
+
+结合 Marker, 可以将日志分类显示:
+
+```xml
+  <appender name="STDOUT-TRACING" class="ch.qos.logback.core.ConsoleAppender">
+    <!-- If applicable, can use ch.qos.logback.classic.filter.MarkerFilter -->
+    <filter class="org.apache.servicecomb.foundation.logback.MarkerFilter">
+      <Marker>SERVICECOMB_MARKER</Marker>
+      <OnMismatch>DENY</OnMismatch>
+      <OnMatch>ACCEPT</OnMatch>
+    </filter>
+
+    <encoder>
+      <pattern>%d [%level] [%thread][%X{SERVICECOMB_TRACE_ID}] - %msg (%F:%L\)%n</pattern>
+    </encoder>
+  </appender>
+```
+
+## 业务日志包含 trace id
+
+* 记录 access log
+
+java-chassis 只有少量的日志包含 trace id,业务可以方便的在自己记录的日志中包含 trace id。 下面开发一个简单的 Handler, 记录服务端的
+access log。 
+
+```java
+public class AccessLogHandler implements Handler {
+  private static final Logger LOGGER
+      = LoggerFactory.getLogger(AccessLogHandler.class);
+
+  @Override
+  public void handle(Invocation invocation, AsyncResponse asyncResp) throws Exception {
+    invocation.getTraceIdLogger().info(LOGGER, "request for operation {} begin", invocation.getInvocationQualifiedName());
+     invocation.next((resp) -> {
+       invocation.getTraceIdLogger().info(LOGGER, "request for operation {} end", invocation.getInvocationQualifiedName());
+       asyncResp.complete(resp);
+     });
+  }
+} 
+```
+
+配置 Handler
+
+```xml
+<config>
+  <handler id="custom-access-log"
+    class="org.apache.servicecomb.demo.prefix.AccessLogHandler"/>
+</config>
+
+```
+
+启用 Handler
+
+```yaml
+servicecomb:
+  handler:
+    chain:
+      Provider:
+        default: custom-access-log
+```
+
+* 业务日志
+
+可以在业务实现中记录 trace id
+
+```java
+public class RegisterUrlPrefixEndpoint {
+  private static final Logger LOGGER
+      = LoggerFactory.getLogger(RegisterUrlPrefixEndpoint.class);
+
+  @GetMapping(path = "/getName")
+  public String getName(@RequestParam(name = "name") String name) {
+    ((Invocation) ContextUtils.getInvocationContext()).getTraceIdLogger().info(LOGGER, "get name invoked.");
+    return name;
+  }
+}
+```
+
+增加了 access log 和业务日志后的效果如下:
+
+```text
+[5e72e39e55209533-1] - request for operation PRODUCER rest demo-register-url-prefix-server.RegisterUrlPrefixEndpoint.getName begin
+[5e72e39e55209533-1] - get name invoked. 
+[5e72e39e55209533-1] - request for operation PRODUCER rest demo-register-url-prefix-server.RegisterUrlPrefixEndpoint.getName end
+```
+
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 fbf7b2d..6dd4304 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading.md
@@ -1,3 +1,4 @@
 # 升级指导系列文章
 
-* [1.3.0 升级 2.0.0指导](upgrading/1_3_0T2_0_0.md)
\ No newline at end of file
+* [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)
\ No newline at end of file
diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/1_3_0T2_0_0.md b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/1_3_0T2_0_0.md
index 9dce8f9..eaa3f97 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/1_3_0T2_0_0.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/1_3_0T2_0_0.md
@@ -40,24 +40,36 @@ Highway通信协议是2.0.0最大的变更点。如果业务采用了Highway通
   8. 如果一个属性的名称采用一个小写字母开头,并且只有一个小写字母,即使生成的getter/setter是合法
      的, swagger 生成的属性名称还是会出现错误。应该尽可能避免使用这样的属性名称。必须使用的场景,需要
      显示的使用 @JsonProperty 声明。
+ 
+         ```java
+            public class SpecialNameModel {
+              // names starts with only one lower case , although getter/setter generated by IDE is correct,
+              // will cause jackson generate incorrect swagger names.
+              // @JsonProperty must be used to make json work in a predictable way.
+              @JsonProperty("aIntName")
+              private int aIntName;
+            
+              public int getaIntName() {
+                return aIntName;
+              }
+            
+              public void setaIntName(int aIntName) {
+                this.aIntName = aIntName;
+              }
+            }
+         ```
+
+   9. 返回多种类型或者通过 ContextUtils 设置状态码 HIGHWAY 不再支持。 尽管 1.3.0 之前用户也不会在 HIGHWAY 模式下
+      使用类似下面的代码, 但是在 1.3.0 之前的版本, 这些代码部分确实能够工作。
+ 
+        ```java
+              @PUT
+              public String sayHi(@PathParam("name") String name) {
+                  ContextUtils.getInvocationContext().setStatus(202);
+                  return name + " sayhi";
+              }
+         ``` 
 
-```
-public class SpecialNameModel {
-  // names starts with only one lower case , although getter/setter generated by IDE is correct,
-  // will cause jackson generate incorrect swagger names.
-  // @JsonProperty must be used to make json work in a predictable way.
-  @JsonProperty("aIntName")
-  private int aIntName;
-
-  public int getaIntName() {
-    return aIntName;
-  }
-
-  public void setaIntName(int aIntName) {
-    this.aIntName = aIntName;
-  }
-}
-```
 
 ***优秀实践***:
 
@@ -113,13 +125,24 @@ List<GenericObjectParam<List<RecursiveObjectParam>>> response = consumers.getSCB
 ```
 HttpEntity<SpringmvcBasicRequestModel> requestEntity = new HttpEntity<>(requestModel, null);
 List<SpringmvcBasicResponseModel> responseModelList = 
-    consumers.getSCBRestTemplate().exchange("/postListObject", HttpMethod.POST, requestEntity,
+    template.exchange("/postListObject", HttpMethod.POST, requestEntity,
         new ParameterizedTypeReference<List<SpringmvcBasicResponseModel>>() {
         }).getBody();
 ```
 
 这种方式的语义根据清晰,在使用泛型的时候,建议采用这种用法。
 
+在1.3.0版本支持如下用法:
+
+```java
+template.postForEntity(url, 
+    "{\"time\":3073113710456,\"date\":3073113710456,\"holder\":\"test\"}",
+    DateTimeModel.class)
+```
+
+即通过 JSON String 的方式传递参数给后台的 DateTimeModel 对象。 由于这种用法在解析的时候存在二义性, 2.0.0
+不再支持这种用法。 可以使用 Map 或者 JsonObject 来传递。 
+
 ## AsyncRestTemplate的使用
 
 1.3.0 和 2.0.0 中 AsyncRestTemplate 的使用方式一样,没有变化。但是由于 2.0.0 只支持spring 5版
@@ -271,7 +294,8 @@ Caused by: java.lang.NullPointerException
   *   io.vertx.ext.web中的 `io.vertx.ext.web.Cookie已过时` , 修改
      为 `io.vertx.core.http.Cookie`
 
-2.0.0 一些可能被外部使用的内部接口调整
+2.0.0 一些可能被外部使用的内部接口调整:
+
   * `Invocation` 类删除了 `getArgs` 接口, 替换为 `getSwaggerArguments` , 同时新增了 `getInvocationArguments`,
     关于这个变更的说明,请参考新特性介绍文章[弱类型契约](../features/weak-type-contrast.md)。  
   * 删除 `DynamicSchemaLoader` , 这个类早期版本提供出来是方便注册契约, 最新版本客户端契约发现可以通过服务中心
@@ -281,4 +305,10 @@ Caused by: java.lang.NullPointerException
   * 测试代码可能使用 `CseContext.getInstance().getConsumerProviderManager().setTransport(microserviceName, transport)` , 修改
     为 `ArchaiusUtils.setProperty("servicecomb.references.transport." + microserviceName, transport);`
 
+## 已知缺陷
 
+  * 2.0.0 版本将 `servicecomb.service.registry.registerUrlPrefix` 弄丢了。 这个配置项是为一个特殊场景服务的的,
+    默认值为 false。 在使用 WEB 容器(比如 tomcat) java-chassis的场景下, 如果设置了 context-path, 使用 java-chassis 
+    提供的 RestTemplate 访问服务的时候, 不需要指定 context-path,以保证用户不用关注微服务的部署方式,提供了很大的便利。
+    但是有些用户的代码是历史遗留代码改造过来的,期望 URL 包含完整的 context-path。 使用 2.0.0 版本如果存在这个特殊要
+    求, 程序会运行错误,访问接口提示 NOT FOUND。这个问题在 2.0.1 修复。  
diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/2_0_0T2_0_1.md b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/2_0_0T2_0_1.md
new file mode 100644
index 0000000..49689e7
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/upgrading/2_0_0T2_0_1.md
@@ -0,0 +1,13 @@
+# 2.0.0 升级 2.0.1指导
+
+## trace id 记录的变更说明
+
+2.0.0 采用 %marker 记录 trace id, 由于 Marker 被设计为 Filtering 场景, 不适用于记录 trace id, 否则可能导致有些 logger 系统
+产生 OOM。 2.0.1 将 Marker 调整为了 MDC 。  使用指导参考 [2.0.1 新特性介绍: 在日志中记录trace id](../features/trace-id.md)
+
+## 独立 tomcat (或者其他 web container ) 运行的场景
+
+在使用独立 tomcat 运行的场景, RestServletContextListener 在会在 contextInitialized 环节调用 Log4jUtils.init 初始化 log4j , 
+由于 log4j 目前已经被 log4j2 或者 logback 等替换, 从 2.0.1 开始, 不会调用 Log4jUtils 初始化 log4j 。 如果应用系统需要继续
+使用 log4j, 可以自定义 ServletContextListener ,调用 Log4jUtils.init 初始化 log4j。 
+