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 2021/02/26 03:44:32 UTC
[servicecomb-docs] branch master updated: [SCB-2195]show multi
error code and response type (#226)
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 319adc9 [SCB-2195]show multi error code and response type (#226)
319adc9 is described below
commit 319adc95a71825468a177355c7cfef4baf439149
Author: bao liu <bi...@qq.com>
AuthorDate: Fri Feb 26 11:44:27 2021 +0800
[SCB-2195]show multi error code and response type (#226)
---
.../zh_CN/docs/build-consumer/catalog.md | 2 -
.../zh_CN/docs/build-provider/catalog.md | 1 +
.../zh_CN/docs/build-provider/multi-code.md | 129 +++++++++++++++++++++
.../fault-injection.md | 4 +-
java-chassis-reference/zh_CN/docs/toc.md | 4 +-
java-chassis-reference/zh_CN/mkdocs.yml | 1 +
6 files changed, 135 insertions(+), 6 deletions(-)
diff --git a/java-chassis-reference/zh_CN/docs/build-consumer/catalog.md b/java-chassis-reference/zh_CN/docs/build-consumer/catalog.md
index eb043cf..9321518 100644
--- a/java-chassis-reference/zh_CN/docs/build-consumer/catalog.md
+++ b/java-chassis-reference/zh_CN/docs/build-consumer/catalog.md
@@ -6,6 +6,4 @@
* [使用RPC方式开发服务消费者](develop-consumer-using-rpc.md)
* [泛化调用](../featured-topics/features/invoker.md)
* [使用服务契约](with-contract.md)
-* 调用控制
- * [故障注入](fault-injection.md)
* [调用第三方REST服务](3rd-party-service-invoke.md)
\ No newline at end of file
diff --git a/java-chassis-reference/zh_CN/docs/build-provider/catalog.md b/java-chassis-reference/zh_CN/docs/build-provider/catalog.md
index 3815ee5..b8b7bdc 100644
--- a/java-chassis-reference/zh_CN/docs/build-provider/catalog.md
+++ b/java-chassis-reference/zh_CN/docs/build-provider/catalog.md
@@ -6,6 +6,7 @@
* [用透明RPC开发微服务](transparent-rpc.md)
* [只发布interface的方法为服务接口](use-interface.md)
* [使用 Context 参数](context-param.md)
+* [多个返回值和错误码](multi-code.md)
* [使用Swagger注解](swagger-annotation.md)
* [接口定义和数据类型](interface-constraints.md)
* [服务监听地址和发布地址](listen-address-and-publish-address.md)
diff --git a/java-chassis-reference/zh_CN/docs/build-provider/multi-code.md b/java-chassis-reference/zh_CN/docs/build-provider/multi-code.md
new file mode 100644
index 0000000..0915357
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/build-provider/multi-code.md
@@ -0,0 +1,129 @@
+# 多个返回值和错误码
+
+使用透明RPC开发服务提供者,开发者很容易理解一个接口只有一个返回值类型。使用REST风格(Spring MVC 或者 JAXRS),很多场景会碰到
+多个返回值和错误码的情况。和很多其他开发框架(比如Servlet、Spring MVC等)不一样,Java Chassis要求接口定义的返回值和错误码都
+必须显示的声明,即通过代码生成的swagger,必须包含所有的错误码描述和返回值类型描述。 在Java Chassis,无法使用隐藏参数、未声明
+的错误码。这样设计的直接好处是接口定义更加明确,不需要额外的文档帮助使用者理解接口的使用方法。
+
+在前面的开发指导里面,主要介绍了一个返回值和一个错误码的情况(200)。 下面介绍如何使用多个错误码和返回值,同时会介绍如何返回额外的
+header参数。
+
+Java Chassis将错误码进行了分类:2xx错误码认为是一个正常的响应,一个接口只允许存在一个正常响应错误码;
+其他错误码认为是一个异常的响应,一个接口可以定义多个异常的响应,并且需要采用InvocationException的方式将异常抛出,每个错误码可以指定
+不同的响应类型。
+
+* 采用`ApiResponse`定义多个返回值和错误码
+
+```java
+@Path("/errorCode")
+@POST
+@ApiResponses({
+ @ApiResponse(code = 200, response = MultiResponse200.class, message = ""),
+ @ApiResponse(code = 400, response = MultiResponse400.class, message = ""),
+ @ApiResponse(code = 500, response = MultiResponse500.class, message = "")})
+public MultiResponse200 errorCode(MultiRequest request) {
+ if (request.getCode() == 400) {
+ MultiResponse400 r = new MultiResponse400();
+ r.setCode(400);
+ r.setMessage("bad request");
+ throw new InvocationException(javax.ws.rs.core.Response.Status.BAD_REQUEST, r);
+ } else if (request.getCode() == 500) {
+ MultiResponse500 r = new MultiResponse500();
+ r.setCode(500);
+ r.setMessage("internal error");
+ throw new InvocationException(javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR, r);
+ } else {
+ MultiResponse200 r = new MultiResponse200();
+ r.setCode(200);
+ r.setMessage("success result");
+ return r;
+ }
+}
+```
+
+* 采用 `org.apache.servicecomb.swagger.invocation.Response` 响应类型
+
+采用 `org.apache.servicecomb.swagger.invocation.Response` 响应类型,除了可以定义多个错误码和响应类型,还可以通过
+`ResponseHeader` 定义额外的响应头。
+
+```java
+@Path("/errorCode")
+@POST
+@ApiResponses({
+ @ApiResponse(code = 200, response = MultiResponse200.class, message = ""),
+ @ApiResponse(code = 400, response = MultiResponse400.class, message = ""),
+ @ApiResponse(code = 500, response = MultiResponse500.class, message = "")})
+@ResponseHeaders({@ResponseHeader(name = "x-code", response = String.class)})
+public Response errorCodeWithHeader(MultiRequest request) {
+ Response response = new Response();
+ if (request.getCode() == 400) {
+ MultiResponse400 r = new MultiResponse400();
+ r.setCode(400);
+ r.setMessage("bad request");
+ response.setStatus(Status.BAD_REQUEST);
+ response.setResult(new InvocationException(Status.BAD_REQUEST, r));
+ response.setHeader("x-code", "400");
+ } else if (request.getCode() == 500) {
+ MultiResponse500 r = new MultiResponse500();
+ r.setCode(500);
+ r.setMessage("internal error");
+ response.setStatus(Status.INTERNAL_SERVER_ERROR);
+ response.setResult(new InvocationException(Status.INTERNAL_SERVER_ERROR, r));
+ response.setHeader("x-code", "500");
+ } else {
+ MultiResponse200 r = new MultiResponse200();
+ r.setCode(200);
+ r.setMessage("success result");
+ response.setStatus(Status.OK);
+ response.setResult(r);
+ response.setHeader("x-code", "200");
+ }
+ return response;
+}
+```
+
+* 采用 `javax.ws.rs.core.Response` 响应类型
+
+采用 `javax.ws.rs.core.Response` 响应类型,除了可以定义多个错误码和响应类型,还可以通过
+`ResponseHeader` 定义额外的响应头。
+
+```java
+@Path("/errorCodeWithHeaderJAXRS")
+@POST
+@ApiResponses({
+ @ApiResponse(code = 200, response = MultiResponse200.class, message = ""),
+ @ApiResponse(code = 400, response = MultiResponse400.class, message = ""),
+ @ApiResponse(code = 500, response = MultiResponse500.class, message = "")})
+public javax.ws.rs.core.Response errorCodeWithHeaderJAXRS(MultiRequest request) {
+ javax.ws.rs.core.Response response;
+ if (request.getCode() == 400) {
+ MultiResponse400 r = new MultiResponse400();
+ r.setCode(request.getCode());
+ r.setMessage(request.getMessage());
+ response = javax.ws.rs.core.Response.status(Status.BAD_REQUEST)
+ .entity(new InvocationException(Status.BAD_REQUEST, r))
+ .header("x-code", "400")
+ .build();
+ } else if (request.getCode() == 500) {
+ MultiResponse500 r = new MultiResponse500();
+ r.setCode(request.getCode());
+ r.setMessage(request.getMessage());
+ response = javax.ws.rs.core.Response.status(Status.INTERNAL_SERVER_ERROR)
+ .entity(new InvocationException(Status.INTERNAL_SERVER_ERROR, r))
+ .header("x-code", "500")
+ .build();
+ } else {
+ MultiResponse200 r = new MultiResponse200();
+ r.setCode(request.getCode());
+ r.setMessage(request.getMessage());
+ // If error code is OK family(like 200), we can use the target type.
+ response = javax.ws.rs.core.Response.status(Status.OK)
+ .entity(r)
+ .header("x-code", "200")
+ .build();
+ }
+ return response;
+}
+```
+
+
diff --git a/java-chassis-reference/zh_CN/docs/build-consumer/fault-injection.md b/java-chassis-reference/zh_CN/docs/references-handlers/fault-injection.md
similarity index 98%
rename from java-chassis-reference/zh_CN/docs/build-consumer/fault-injection.md
rename to java-chassis-reference/zh_CN/docs/references-handlers/fault-injection.md
index 7daf407..05fd332 100644
--- a/java-chassis-reference/zh_CN/docs/build-consumer/fault-injection.md
+++ b/java-chassis-reference/zh_CN/docs/references-handlers/fault-injection.md
@@ -1,10 +1,10 @@
-## 场景描述
+# 故障注入
用户在consumer端使用故障注入,可以设置发往指定微服务的请求的时延和错误及其触发概率。
## 注意事项
-延迟注入请求的延迟时间统一为毫秒级别
+延迟注入请求的延迟时间统一为毫秒。
## 配置说明
diff --git a/java-chassis-reference/zh_CN/docs/toc.md b/java-chassis-reference/zh_CN/docs/toc.md
index 84e9188..d538447 100644
--- a/java-chassis-reference/zh_CN/docs/toc.md
+++ b/java-chassis-reference/zh_CN/docs/toc.md
@@ -23,6 +23,7 @@
* [用透明RPC开发微服务](build-provider/transparent-rpc.md)
* [只发布interface的方法为服务接口](build-provider/use-interface.md)
* [使用 Context 参数](build-provider/context-param.md)
+ * [多个返回值和错误码](build-provider/multi-code.md)
* [使用Swagger注解](build-provider/swagger-annotation.md)
* [接口定义和数据类型](build-provider/interface-constraints.md)
* [服务监听地址和发布地址](build-provider/listen-address-and-publish-address.md)
@@ -40,8 +41,6 @@
* [使用RPC方式开发服务消费者](build-consumer/develop-consumer-using-rpc.md)
* [泛化调用](featured-topics/features/invoker.md)
* [使用服务契约](build-consumer/with-contract.md)
- * 调用控制
- * [故障注入](build-consumer/fault-injection.md)
* [调用第三方REST服务](build-consumer/3rd-party-service-invoke.md)
* [通用功能开发](general-development/catalog.md)
* [应用性能监控(metrics)](general-development/metrics.md)
@@ -81,6 +80,7 @@
- [负载均衡](references-handlers/loadbalance.md)
- [限流](references-handlers/ratelimit.md)
- [路由管理](references-handlers/router.md)
+ - [故障注入](references-handlers/fault-injection.md)
- [隔离熔断容错](references-handlers/bizkeeper.md)
- [基于动态配置的流量特征治理](references-handlers/governance.md)
- 网关功能参考:
diff --git a/java-chassis-reference/zh_CN/mkdocs.yml b/java-chassis-reference/zh_CN/mkdocs.yml
index 0ef6c99..914f192 100644
--- a/java-chassis-reference/zh_CN/mkdocs.yml
+++ b/java-chassis-reference/zh_CN/mkdocs.yml
@@ -27,6 +27,7 @@ nav:
- 负载均衡: references-handlers/loadbalance.md
- 限流: references-handlers/ratelimit.md
- 路由管理: references-handlers/router.md
+ - 故障注入: references-handlers/fault-injection.md
- 隔离熔断容错: references-handlers/bizkeeper.md
- 基于动态配置的流量特征治理: references-handlers/governance.md
- 网关功能参考: