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 5f4cd22 update build consumers (#324)
5f4cd22 is described below
commit 5f4cd2287368b01f0d61ce201cb5e4cc6f759c4e
Author: liubao68 <[email protected]>
AuthorDate: Wed Feb 21 15:46:46 2024 +0800
update build consumers (#324)
---
.../zh_CN/docs/build-consumer/basics.md | 96 ++++++++++++++++++++++
.../docs/build-consumer/common-configuration.md | 33 --------
.../features => build-consumer}/invoker.md | 5 +-
.../docs/build-consumer/using-resttemplate.md | 67 +++------------
.../zh_CN/docs/build-consumer/with-contract.md | 52 ------------
.../zh_CN/docs/featured-topics/features.md | 1 -
java-chassis-reference/zh_CN/mkdocs.yml | 17 ++--
7 files changed, 118 insertions(+), 153 deletions(-)
diff --git a/java-chassis-reference/zh_CN/docs/build-consumer/basics.md
b/java-chassis-reference/zh_CN/docs/build-consumer/basics.md
new file mode 100644
index 0000000..6b7e61e
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/build-consumer/basics.md
@@ -0,0 +1,96 @@
+# 基础概念
+
+Java Chassis 是以 OpenAPI 为基础的微服务开发框架。一个微服务提供的功能,可以通过 OpenAPI 进行描述。
微服务消费者和提供者完全解耦,开发消费者无需知道提供者的开发方式,只需要知道提供者的OpenAPI信息。
+
+本章节介绍基于[开发服务提供者-基础概念](../build-provider/basics.md)提供的 `HelloWorld` 契约,
描述如何开发服务消费者。
+
+```yaml
+openapi: 3.0.1
+info:
+ version: 1.0.0
+servers:
+- url: /
+paths:
+ /helloWorld:
+ post:
+ operationId: helloWorld
+ requestBody:
+ content:
+ application/json:
+ schema:
+ type: string
+ application/protobuf:
+ schema:
+ type: string
+ text/plain:
+ schema:
+ type: string
+ x-name: name
+ responses:
+ "200":
+ description: response of 200
+ content:
+ application/json:
+ schema:
+ type: string
+ application/protobuf:
+ schema:
+ type: string
+ text/plain:
+ schema:
+ type: string
+components: {}
+```
+
+## Restful风格 - 使用 RestOperations
+
+```java
+RestOperations restOperation =
+ RestTemplateBuilder.create();
+String result = restOperation
+ .postForObject("servicecomb://provider-service/helloWorld",
+ "World", String.class);
+Assertions.assertTrue("Hello World", result);
+```
+
+使用Restful风格开发消费者,需要关注Open
API的Path、参数位置(Body、Header等)、参数类型以及响应类型,并且使用RestOperations的相关接口和参数一一对应。 其中
`servicecomb://provider-service` 表示目标微服务,使用目标微服务的服务名称。
+
+## RPC风格
+
+RPC风格是一种语言有关的开发方法,更加贴近语言的使用习惯。访问服务提供者的服务,就像调用本地的API一样。
+
+使用RPC风格,首先需要声明一个 `interface` 与提供者的服务对应。
+
+```java
+interface HelloWorldService {
+ String helloWorld(String name);
+}
+```
+
+声明 `interface` 会使用到 Open API 的 `operationId`、 参数名称和参数类型、响应类型。
只需要保证方法名等于`operationId`, 参数名称等于Open API里面的参数名称(对于body,使用扩展属性x-name)。
+
+使用起来就非常简单了:
+
+```java
+@RpcReference(schemaId = "HelloWorld",
+ microserviceName = "provider-service")
+private HelloWorldService helloWorldService;
+
+String result = helloWorldService.helloWorld("World");
+Assertions.assertTrue("Hello World", result);
+```
+
+>>>
在具体的开发实践中,开发Provider定义interface(API),然后Consumer依赖Provider发布的包,直接使用Provider的接口也是非常常见的。如果已经习惯这种使用方式,可以继续使用。
在讨论完全解耦和API依赖的好处的时候,存在非常复杂和细节的差异。完全解耦的形式,可以给独立开发带来很大的灵活性,能够提高并行开发的效率。
+
+## 泛化调用 - InvokerUtils
+
+```java
+Map<String, Object> args = new HashMap<>();
+args.put("name", "World");
+String result = InvokerUtils.syncInvoke("provider-service",
+ "HelloWorld", "helloWorld", args, String.class));
+Assertions.assertTrue("Hello World", result);
+```
+
+泛化调用使用服务名、契约名称、`operationId`、 参数直接请求服务提供者,对应到 Open API
的`operationId`、参数名称和参数类型、响应类型。
+
diff --git
a/java-chassis-reference/zh_CN/docs/build-consumer/common-configuration.md
b/java-chassis-reference/zh_CN/docs/build-consumer/common-configuration.md
deleted file mode 100644
index b177171..0000000
--- a/java-chassis-reference/zh_CN/docs/build-consumer/common-configuration.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Consumer的通用配置项
-
-* 请求超时
- * 配置项
- servicecomb.request.timeout
- * 默认值
- 30000,单位为毫秒
- * 含义
- Consumer传输层开始发送时,开始计时,指定时间内未收到应答,则处理为请求超时
-* 指定传输通道
- * 配置项
- servicecomb.references.${目标微服务名}.transport
- servicecomb.references.transport
- 同时支持全局和微服务级的两级控制
- * 默认值
- 无
- * 含义
-
如果目标微服务同时开放多种transport的访问能力时,而Consumer也同时部署了相应的多个transport,但是作为Consumer调用该微服务时,只想使用其中一种transport,则可以通过本配置项指定transport
- 如果不配置,则轮流使用多个transport
-* 指定目标实例的版本规则
- * 配置项
- servicecomb.references.${目标服务名}.version-rule
- servicecomb.references.version-rule
- 同时支持全局和微服务级的两级控制
- * 默认值
- latest
- * 含义
- 目标实例的版本规则,支持以下规则:
- * 最新版本: latest
- * 大于指定版本,比如:1.0.0+
- * 指定版本范围,比如:1.0.0-2.0.0,表示大于等于版本1.0.0,并且小于版本2.0.0
- * 精确版本,比如:1.0.0
-
diff --git
a/java-chassis-reference/zh_CN/docs/featured-topics/features/invoker.md
b/java-chassis-reference/zh_CN/docs/build-consumer/invoker.md
similarity index 91%
rename from
java-chassis-reference/zh_CN/docs/featured-topics/features/invoker.md
rename to java-chassis-reference/zh_CN/docs/build-consumer/invoker.md
index f19eae2..7812204 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/features/invoker.md
+++ b/java-chassis-reference/zh_CN/docs/build-consumer/invoker.md
@@ -1,7 +1,6 @@
-# 特性介绍: 泛化调用
+# 泛化调用
-泛化调用指在不知道 Provider 接口定义信息的情况下,访问 Provider 提供的服务。 与泛化调用对应的方式包括透明 RPC(POJO)和
-RestTemplate。 透明 RPC 需要提供 Provider 对应的接口, RestTemplate 需要提供 Provider 对应的 URL 和
数据 Model 。 泛化
+泛化调用指在不知道 Provider 接口定义信息的情况下,访问 Provider 提供的服务。 泛化
调用需要提供 Provider 的服务元数据: 微服务名称, 版本, Schema ID, Operation ID, 契约参数等信息。
## 使用泛化调用
diff --git
a/java-chassis-reference/zh_CN/docs/build-consumer/using-resttemplate.md
b/java-chassis-reference/zh_CN/docs/build-consumer/using-resttemplate.md
index cd54bca..54b3f04 100644
--- a/java-chassis-reference/zh_CN/docs/build-consumer/using-resttemplate.md
+++ b/java-chassis-reference/zh_CN/docs/build-consumer/using-resttemplate.md
@@ -1,67 +1,51 @@
-# 使用RestTemplate开发服务消费者
+# Restful风格 - 使用 RestOperations
## 概念阐述
-RestTemplate是Spring提供的RESTful访问接口,ServiceComb提供该接口的实现类用于服务的调用。
+RestOperations是Spring提供的RESTful访问接口,ServiceComb提供该接口的实现类用于服务的调用。
## 场景描述
-用户使用ServiceComb提供的RestTemplate实例,可以使用自定义的URL进行服务调用,而不用关心服务的具体地址。
+用户使用ServiceComb提供的RestOperations实例,可以使用自定义的URL进行服务调用,而不用关心服务的具体地址。
## 示例代码
-RestTemplate实例通过调用`RestTemplateBuilder.create()`方法获取,再使用该实例通过自定义的URL进行服务调用,代码如下:
+RestOperations实例通过调用`RestTemplateBuilder.create()`方法获取,再使用该实例通过自定义的URL进行服务调用,代码如下:
* Spring MVC 客户端示例代码:
```java
-@Component
-public class SpringmvcConsumerMain {
- private static RestTemplate restTemplate = RestTemplateBuilder.create();
+public class SpringmvcConsumerExample {
+ private static RestOperations restTemplate = RestTemplateBuilder.create();
- public static void main(String[] args) throws Exception {
- init();
+ public static void test() throws Exception {
Person person = new Person();
person.setName("ServiceComb/Java Chassis");
String sayHiResult = restTemplate
- .postForObject("cse://springmvc/springmvchello/sayhi?name=Java
Chassis", null, String.class);
+
.postForObject("servicecomb://springmvc/springmvchello/sayhi?name=Java
Chassis", null, String.class);
String sayHelloResult = restTemplate
- .postForObject("cse://springmvc/springmvchello/sayhello",
person, String.class);
+
.postForObject("servicecomb://springmvc/springmvchello/sayhello", person,
String.class);
System.out.println("RestTemplate consumer sayhi services: " +
sayHiResult);
System.out.println("RestTemplate consumer sayhello services: " +
sayHelloResult);
}
-
- public static void init() throws Exception {
- Log4jUtils.init();
- BeanUtils.init();
- }
}
```
* JAX RS 客户端示例代码:
```java
-
-@Component
public class JaxrsConsumerMain {
-
- public static void main(String[] args) throws Exception {
- init();
+ public static void test() throws Exception {
//其他都类似spring MVC示例的客户端代码,注意如果服务端只接收 GET 请求,要使用方法 getForObject()
RestTemplate restTemplate = RestTemplateBuilder.create();
- String result =
restTemplate.getForObject("cse://jaxrs/jaxrshello/saybye", String.class);
- }
-
- public static void init() throws Exception {
- Log4jUtils.init();
- BeanUtils.init();
+ String result =
restTemplate.getForObject("servicecomb://jaxrs/jaxrshello/saybye",
String.class);
}
}
```
> 说明:
>
-> *
URL格式为:`cse://microserviceName/path?querystring`。以[用SpringMVC开发微服务](../build-provider/springmvc.md)中定义的服务提供者为例,其微服务名称是`springmvc`,basePath是`/springmvchello`,那么URL中的microserviceName=`springmvc`,请求sayhi时的path=`springmvchello/sayhi`,所以示例代码中请求sayhi的URL是`cse://springmvc/springmvchello/sayhi?name=Java
Chassis`。具体代码示例如下 :
+> *
URL格式为:`servicecomb://microserviceName/path?querystring`。以[用SpringMVC开发微服务](../build-provider/springmvc.md)中定义的服务提供者为例,其微服务名称是`springmvc`,basePath是`/springmvchello`,那么URL中的microserviceName=`springmvc`,请求sayhi时的path=`springmvchello/sayhi`,所以示例代码中请求sayhi的URL是`servicecomb://springmvc/springmvchello/sayhi?name=Java
Chassis`。具体代码示例如下 :
```java
@@ -82,30 +66,3 @@ public class SpringmvcHelloImpl implements Hello {
}
}
```
-> 下述代码是示例项目 [ SpringMVC
](https://github.com/apache/servicecomb-samples/tree/master/java-chassis-samples/springmvc-sample)的
springmvc-provider 模块 中 resources 目录下 microservice.yaml
-
-```yaml
-servicecomb:
- service:
- application: springmvc-sample
- name: springmvc
- version: 0.0.1
-
- registry:
- # Default using local service center
- address: http://localhost:30100
- # address: https://cse.cn-south-1.myhuaweicloud.com
- instance:
- watch: false
- kie:
- serverUri: http://localhost:30110
-
- rest:
- address: 0.0.0.0:8080
-
-```
-
-
-
-
-> * 使用上述这种URL格式,ServiceComb框架会在内部进行服务发现、熔断容错等处理并最终将请求发送到服务提供者。
diff --git a/java-chassis-reference/zh_CN/docs/build-consumer/with-contract.md
b/java-chassis-reference/zh_CN/docs/build-consumer/with-contract.md
deleted file mode 100644
index a0069db..0000000
--- a/java-chassis-reference/zh_CN/docs/build-consumer/with-contract.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# 使用服务契约
-
-## 场景描述
-
-当服务消费者调用服务提供者的服务时,需要获取服务契约。消费者有两种方式获取提供者的服务契约,一种是从服务的提供方离线获取契约文件,手工配置到项目中;另一种是从服务中心自动下载契约。
-
-## 配置说明
-
-> 说明:服务契约的获取方式与服务消费者的开发方式是无关的,用户可以任意组合使用。
-
-### 配置依赖服务
-
-服务消费者需要在microservice.yaml文件中配置依赖的provider,示例配置如下:
-
-```yaml
-servicecomb:
- # other configurations omitted
- references:
- springmvc:
- version-rule: 0.0.1
-```
-
-> version-rule是版本匹配规则,有四种格式:
->
-> * 精确版本匹配:例如`version-rule: 0.0.1`,表示只匹配版本号为0.0.1的服务提供者
-> * 后续版本匹配:例如`version-rule: 1.0.0+`,表示匹配版本号大于或等于1.0.0的服务提供者
-> * 最新版本:`version-rule: latest`,表示匹配最新版本的服务提供者
-> * 版本范围:例如`1.0.0-2.0.2`,表示匹配版本号在1.0.0至2.0.2之间的服务提供者,包含1.0.0和2.0.2
->
-> 此配置项默认为`latest`
-
-### 手工配置服务契约
-
-服务消费者的开发者在线下拿到服务提供者的契约,配置到消费者工程的特定目录下。服务契约在项目中的存放目录与[定义服务契约](../build-provider/define-contract.md)的配置说明部分相同。
-
-microservice目录下的每一个目录代表一个微服务,微服务目录下的每一个yaml文件代表一个schema契约,文件名就是schemaId。applications目录下存放需要指明appId的服务契约,用于跨app调用等场景。目录结构如下所示:
-
-```
-resources
- - microservices
- - serviceName # 微服务名
- - schemaId.yaml # schema接口的契约
- - applications
- - appId # 应用ID
- - serviceName # 微服务名
- - schemaId.yaml # schema接口的契约
-```
-
-### 从服务中心自动下载契约
-
-服务消费者也可以不用显式地将契约存放在项目目录中,当程序启动时,ServiceComb框架会自动根据microservice.yaml文件中配置的服务提供者的微服务名称和版本号,从服务中心自动下载契约信息。
-
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 fbfce09..15a6e0a 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/features.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/features.md
@@ -1,5 +1,4 @@
# 特性介绍
* [特性介绍: date和date-time](features/date-time.md)
-* [特性介绍: 泛化调用](features/invoker.md)
* [特性介绍: Edge Service 通用的 HTTP 转发器
CommonHttpEdgeDispatcher](features/http-dispatcher.md)
diff --git a/java-chassis-reference/zh_CN/mkdocs.yml
b/java-chassis-reference/zh_CN/mkdocs.yml
index aef7eba..e864400 100644
--- a/java-chassis-reference/zh_CN/mkdocs.yml
+++ b/java-chassis-reference/zh_CN/mkdocs.yml
@@ -35,11 +35,10 @@ nav:
- IPV6配置和使用: build-provider/ipv6-configuration.md
- Access Log配置: build-provider/access-log-configuration.md
- 开发服务消费者:
- - 消费者通用配置项: build-consumer/common-configuration.md
- - 使用RestTemplate开发服务消费者: build-consumer/using-resttemplate.md
- - 使用RPC方式开发服务消费者: build-consumer/develop-consumer-using-rpc.md
- - 泛化调用: featured-topics/features/invoker.md
- - 使用服务契约: build-consumer/with-contract.md
+ - 基础概念: build-consumer/basics.md
+ - Restful风格 - 使用 RestOperations: build-consumer/using-resttemplate.md
+ - RPC风格: build-consumer/develop-consumer-using-rpc.md
+ - 泛化调用: build-consumer/invoker.md
- 调用第三方REST服务: build-consumer/3rd-party-service-invoke.md
- 定制请求处理流程:
- 处理链介绍: references-handlers/intruduction.md
@@ -66,10 +65,10 @@ nav:
- 配置日志: general-development/config-logs.md
- 多样化的通信协议功能:
- 多协议介绍: transports/introduction.md
- - REST over HTTP(Vert.x: transports/rest-over-vertx.md
- - REST over HTTP2(Vert.x: transports/http2.md
- - REST over Servlet(Spring Boot Embedded:
transports/rest-over-servlet-embedded.md
- - REST over Servlet(WAR: transports/rest-over-servlet.md
+ - REST over HTTP(Vert.x): transports/rest-over-vertx.md
+ - REST over HTTP2(Vert.x): transports/http2.md
+ - REST over Servlet(Spring Boot Embedded):
transports/rest-over-servlet-embedded.md
+ - REST over Servlet(WAR): transports/rest-over-servlet.md
- Highway: transports/highway-rpc.md
- 多样化的服务注册与发现功能:
- 注册发现介绍: registry/introduction.md