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 40659ce add http mapping reference (#321)
40659ce is described below
commit 40659ced234d505e4e1f80a5633734627a9d1e81
Author: liubao68 <[email protected]>
AuthorDate: Tue Jan 30 15:07:08 2024 +0800
add http mapping reference (#321)
---
.../zh_CN/docs/build-provider/http-mapping.md | 451 +++++++++++++++++++++
.../zh_CN/docs/build-provider/springmvc.md | 78 ++--
.../zh_CN/docs/config/read-config.md | 50 +--
.../featured-topics/secrets/interoperability.md | 4 +-
java-chassis-reference/zh_CN/mkdocs.yml | 1 +
5 files changed, 494 insertions(+), 90 deletions(-)
diff --git a/java-chassis-reference/zh_CN/docs/build-provider/http-mapping.md
b/java-chassis-reference/zh_CN/docs/build-provider/http-mapping.md
new file mode 100644
index 0000000..9515f7f
--- /dev/null
+++ b/java-chassis-reference/zh_CN/docs/build-provider/http-mapping.md
@@ -0,0 +1,451 @@
+# HTTP参数映射参考
+
+HTTP协议是一个文本传输协议,RESTFul框架核心部分,就是将语言对象与HTTP协议的组成部件映射起来,提供远程过程调用(RPC)能力。
HTTP的请求响应可以简化描述为:
+
+* 请求
+
+```text
+GET /apps HTTP/1.1
+
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: application/x-www-form-urlencoded
+
+queryParamExample1=example1&queryParamExample2=example2
+```
+
+* 响应
+
+```text
+Host: 127.0.0.1:8080
+Content-Type: application/x-www-form-urlencoded
+
+queryParamExample1=example1&queryParamExample2=example2
+```
+
+## HTTP请求参数映射
+
+### Query
+
+Query参数属于HTTP协议URL的一部分,比如:
+
+```text
+GET /apps?queryParamExample1=example1&queryParamExample2=example2 HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+```
+
+定义了Query参数 `queryParamExample1` 和 `queryParamExample2`。
+
+* Spring MVC
+
+```java
+@GetMapping("")
+public String queryExample(@RequestParam("queryParamExample1") String example1,
+ @RequestParam("queryParamExample2") String example2)
+```
+
+* JAX-RS
+
+```java
+@GET
+@Path("")
+public String queryJAXRSExample(@QueryParam("queryParamExample1") String
example1,
+ @QueryParam("queryParamExample2") String example2)
+```
+
+### Path
+
+Path参数属于HTTP协议URL的一部分,比如:
+
+```text
+GET /apps/pathParamExample1/pathParamExample2 HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+```
+
+定义了Path参数 `pathParamExample1` 和 `pathParamExample2`。
+
+* Spring MVC
+
+```java
+@GetMapping("/{pathParamExample1}/{pathParamExample2}")
+public String pathSpringMVCExample(@PathVariable("pathParamExample1") String
example1,
+ @PathVariable("pathParamExample2") String example2)
+```
+
+* JAX-RS
+
+```java
+@GET
+@Path("/{pathParamExample1}/{pathParamExample2}")
+public String pathJAXRSExample(@PathParam("pathParamExample1") String example1,
+ @PathParam("pathParamExample2") String example2)
+```
+
+### Header
+
+Header对应于HTTP协议请求头,比如:
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+headerParamExample1: example1
+headerParamExample2: example2
+```
+
+定义了Header参数 `headerParamExample1` 和 `headerParamExample2`。
+
+* Spring MVC
+
+```java
+@GetMapping("")
+public String headerSpringMVCExample(@RequestHeader("headerParamExample1")
String example1,
+ @RequestHeader("headerParamExample2") String example2)
+```
+
+* JAX-RS
+
+```java
+@GET
+@Path("")
+public String headerJAXRSExample(@HeaderParam("headerParamExample1") String
example1,
+ @HeaderParam("headerParamExample2") String example2)
+```
+
+### application/x-www-form-urlencoded
+
+当 HTTP 消息体是 `application/x-www-form-urlencoded`, 可以使用 Form 参数。
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: application/x-www-form-urlencoded
+
+queryParamExample1=example1&queryParamExample2=example2
+```
+
+* Spring MVC
+
+```java
+@GetMapping(path = "formSpringMVCExample", consumes =
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+public String formSpringMVCExample(@RequestAttribute("formParamExample1")
String example1,
+ @RequestAttribute("formParamExample2") String example2)
+```
+
+>>> 原生 Spring MVC 的 RequestAttribute 表示 HTTP 的 Attribute, 使用 RequestParam 表示
form 参数,这会导致代码生成契约的时候产生歧义。 Java Chassis 3 推荐使用 RequestAttribute 表示Form参数。
+
+* JAX-RS
+
+```java
+@GET
+@Path("formJAXRSExample")
+@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+public String formJAXRSExample(@FormParam("formParamExample1") String example1,
+ @FormParam("formParamExample2") String example2)
+```
+
+### multipart/form-data
+
+当 HTTP 消息体是 `multipart/form-data`, 表示文件上传。
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: multipart/form-data; boundary=----boundary-example----
+
+----boundary-example----
+Content-Disposition: form-data; name="multiPartParamExample1"
+
+contents of multiPartParamExample1
+----boundary-example----
+Content-Disposition: form-data; name="multiPartParamExample2"
+
+contents of multiPartParamExample2
+----boundary-example----
+```
+
+>>> multipart/form-data 也可以表示 Form 参数, 和 application/x-www-form-urlencoded
用法一样。为了避免混淆和简洁,建议multipart/form-data用于文件上传场景。
+
+```java
+@PostMapping(path = "multiPartSpringMVCExample", consumes =
MediaType.MULTIPART_FORM_DATA_VALUE)
+public String multiPartSpringMVCExample(@RequestPart("multiPartParamExample1")
MultipartFile example1,
+ @RequestPart("multiPartParamExample2") MultipartFile example2)
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("multiPartJAXRSExample")
+@Consumes(MediaType.MULTIPART_FORM_DATA)
+public String multiPartJAXRSExample(@FormParam("multiPartParamExample1") Part
example1,
+ @FormParam("multiPartParamExample2") Part example2)
+```
+
+### application/json
+
+当 HTTP 消息体是 `application/json`, 使用json进行对象序列化。
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: application/json
+
+{"name": "wang", "age": 20}
+```
+
+* Spring MVC
+
+```java
+@PostMapping(path = "jsonSpringMVCExample", consumes =
MediaType.APPLICATION_JSON_VALUE)
+public String jsonSpringMVCExample(@RequestBody Person person)
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("jsonJAXRSExample")
+@Consumes(jakarta.ws.rs.core.MediaType.APPLICATION_JSON)
+public String jsonJAXRSExample(Person person)
+```
+
+>>> JAX-RS没有声明标签的时候表示Body参数。
+
+### application/protobuf
+
+当 HTTP 消息体是 `application/protobuf`, 使用protobuf进行对象序列化。
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: application/protobuf
+
+proto-buffer-binary-data
+```
+
+* Spring MVC
+
+```java
+@PostMapping(path = "protobufSpringMVCExample", consumes =
SwaggerConst.PROTOBUF_TYPE)
+public String protobufSpringMVCExample(@RequestBody Person person)
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("protobufJAXRSExample")
+@Consumes(SwaggerConst.PROTOBUF_TYPE)
+public String protobufJAXRSExample(Person person)
+```
+
+>>> JAX-RS没有声明标签的时候表示Body参数。
+
+### application/text
+
+当 HTTP 消息体是 `application/text`, 使用json进行对象序列化。
+
+>>> application/text 和 application/json 在对象序列化上都采用 json,对于大多数场景两者是等价的。只有当对象类型为
String 的时候, 存在差异:application/text 的 String 序列化后的文本没有双引号;application/json 的
String 序列化后的文本有双引号;
+
+```text
+GET /apps HTTP/1.1
+Host: 127.0.0.1:8080
+Accept-Language: zh
+Content-Type: application/text
+
+{"name": "wang", "age": 20}
+```
+
+* Spring MVC
+
+```java
+@PostMapping(path = "textSpringMVCExample", consumes =
MediaType.TEXT_PLAIN_VALUE)
+public String textSpringMVCExample(@RequestBody Person person)
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("textJAXRSExample")
+@Consumes(MediaType.TEXT_PLAIN)
+public String textJAXRSExample(Person person)
+```
+
+>>> JAX-RS没有声明标签的时候表示Body参数。
+
+## HTTP响应参数映射
+
+### 状态码 和 Header
+
+在没有特殊声明的情况下,正常响应的状态码是 `200`,也可以声明其他状态码。
+
+>>> Java Chassis 2xx 状态码表示正常响应,会进行对象序列化。 可以使用 `@ApiResponse` 自定义状态码,所有 2xx
状态码声明的对象类型必须一样。 其他状态码表示异常,会对 `InvocationException` 进行序列化,不要求对象类型一样。
+
+* Spring MVC
+
+```java
+@PostMapping(path = "statusHeaderSpringMVCExample")
+@ApiResponses(value = {
+ @ApiResponse(
+ responseCode = "200",
+ content = @Content(schema = @Schema(implementation = Person.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))}),
+ @ApiResponse(
+ responseCode = "202",
+ content = @Content(schema = @Schema(implementation = Person.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))}),
+ @ApiResponse(
+ responseCode = "400",
+ content = @Content(schema = @Schema(implementation =
MultiResponse400.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))})})
+public ResponseEntity<Person> statusHeaderSpringMVCExample(@RequestBody Person
person) {
+ return ResponseEntity.status(200).header("h1", "h1")
+ .header("h2", "h2").body(person);
+}
+```
+
+* JAX-RS
+
+```java
+@PostMapping(path = "statusHeaderJAXRSExample")
+@ApiResponses(value = {
+ @ApiResponse(
+ responseCode = "200",
+ content = @Content(schema = @Schema(implementation = Person.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))}),
+ @ApiResponse(
+ responseCode = "202",
+ content = @Content(schema = @Schema(implementation = Person.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))}),
+ @ApiResponse(
+ responseCode = "400",
+ content = @Content(schema = @Schema(implementation =
MultiResponse400.class)),
+ headers = {
+ @Header(name = "h1", schema = @Schema(implementation =
String.class)),
+ @Header(name = "h2", schema = @Schema(implementation =
String.class))})})
+public Response statusHeaderJAXRSExample(@RequestBody Person person) {
+ return Response.status(200).entity(new Person()).header("h1", "h1")
+ .header("h2", "h2").build();
+}
+```
+
+### application/json
+
+响应类型根据 `Accept` 来确定,默认是 application/json。 也可以声明接口只支持 application/json 响应。
+
+```java
+@PostMapping(path = "produceJsonSpringMVCExample", produces =
MediaType.APPLICATION_JSON_VALUE)
+public Person produceJsonSpringMVCExample()
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("produceJsonJAXRSExample")
+@Produces(MediaType.APPLICATION_JSON)
+public Person produceJsonJAXRSExample()
+```
+
+### application/protobuf
+
+响应类型根据 `Accept` 来确定,默认是 application/json。 也可以声明接口只支持 application/protobuf 响应。
+
+```java
+@PostMapping(path = "produceProtobufSpringMVCExample", produces =
SwaggerConst.PROTOBUF_TYPE)
+public Person produceProtobufSpringMVCExample()
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("produceProtobufJAXRSExample")
+@Produces(SwaggerConst.PROTOBUF_TYPE)
+public Person produceProtobufJAXRSExample()
+```
+
+### application/text
+
+响应类型根据 `Accept` 来确定,默认是 application/json。 也可以声明接口只支持 application/text 响应。
+
+```java
+@PostMapping(path = "produceTextSpringMVCExample", produces =
MediaType.TEXT_PLAIN_VALUE)
+public Person produceTextSpringMVCExample()
+```
+
+* JAX-RS
+
+```java
+@POST
+@Path("produceTextJAXRSExample")
+@Produces(MediaType.TEXT_PLAIN)
+public Person produceTextJAXRSExample()
+```
+
+### 其他
+
+Java Chassis提供了通用的 `文件下载` 支持。 如果返回值类型为 `File`、`Resource`、`InputStream`、`Part`
等,则被认为是 `文件下载`。
+
+* Spring MVC
+
+```java
+@GetMapping(path = "/downloadSpringMVCExample")
+public Part downloadSpringMVCExample(String content) throws IOException {
+ File file = createTempFile(content);
+ return new FilePart(null, file)
+ .setDeleteAfterFinished(true)
+ .setSubmittedFileName("test.txt")
+ .contentType("application/octet-stream");
+}
+```
+
+上述接口会返回如下响应头:
+
+```text
+Content-Disposition: attachment;filename=file.txt;filename*=utf-8’’file.txt
+Content-Encoding: gzip
+Content-Type: application/octet-stream
+Transfer-Encoding: chunked
+```
+
+* JAX-RS
+
+```java
+@GET
+@Path("/downloadSpringMVCExample")
+public Part downloadSpringMVCExample(String content) throws IOException {
+ File file = createTempFile(content);
+ return new FilePart(null, file)
+ .setDeleteAfterFinished(true)
+ .setSubmittedFileName("test.txt")
+ .contentType("application/octet-stream");
+}
+```
+
+上述接口会返回如下响应头:
+
+```text
+Content-Disposition: attachment;filename=file.txt;filename*=utf-8’’file.txt
+Content-Encoding: gzip
+Content-Type: application/octet-stream
+Transfer-Encoding: chunked
+```
diff --git a/java-chassis-reference/zh_CN/docs/build-provider/springmvc.md
b/java-chassis-reference/zh_CN/docs/build-provider/springmvc.md
index 0416194..2534fd0 100644
--- a/java-chassis-reference/zh_CN/docs/build-provider/springmvc.md
+++ b/java-chassis-reference/zh_CN/docs/build-provider/springmvc.md
@@ -45,36 +45,6 @@ Spring MVC 是 spring-web 项目定义的一套注解,开发者可以使用这
}
```
-* 发布服务 (可选,默认会扫描 main 函数所在的 package )
-
- 在`resources/META-INF/spring`目录下创建`springmvcprovider.bean.xml`文件,
- 命名规则为`\*.bean.xml`,配置spring进行服务扫描的base-package,文件内容如下:
-
- ```xml
- <?xml version="1.0" encoding="UTF-8"?>
-
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:cse="http://www.huawei.com/schema/paas/cse/rpc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.huawei.com/schema/paas/cse/rpc
classpath:META-INF/spring/spring-paas-cse-rpc.xsd">
-
- <context:component-scan
base-package="org.apache.servicecomb.samples.springmvc.povider"/>
- </beans>
- ```
-
-* 启动 provider 服务
-
- servicecomb 依赖于 Spring, 只需要将 Spring 框架启动起来即可。
-
- ```java
- public class SpringmvcProviderMain {
-
- public static void main(String[] args) throws Exception {
- BeanUtils.init();
- }
- }
- ```
## ServiceComb支持的 Spring MVC 注解说明
@@ -92,30 +62,30 @@ servicecomb 支持使用 Spring MVC 提供的注解
`org.springframework.web.bin
***表1-1 Spring MVC注解情况说明***
-| 标签名称 | 是否支持 | 说明 |
-| :--- | :--- | :--- |
-| RequestMapping | 是 | 不允许制定多个Path,一个接口只允许一个Path,必须显示的声明 method 属性,只能定义唯一一个
method |
-| GetMapping | 是 | |
-| PutMapping | 是 | |
-| PostMapping | 是 | |
-| DeleteMapping | 是 | |
-| PatchMapping | 是 | |
-| RequestParam | 是 | |
-| CookieValue | 是 | |
-| PathVariable | 是 | |
-| RequestHeader | 是 | |
-| RequestBody | 是 | 目前支持application/json,plain/text |
-| RequestPart | 是 | 用于文件上传的场景,对应的标签还有Part、MultipartFile |
-| ResponseBody | 否 | 返回值缺省都是在body返回 |
-| ResponseStatus | 否 | 可以通过ApiResponse指定返回的错误码 |
-| RequestAttribute | 否 | Servlet协议相关的标签 |
-| SessionAttribute | 否 | Servlet协议相关的标签 |
-| MatrixVariable | 否 | |
-| ModelAttribute | 否 | |
-| ControllerAdvice | 否 | |
-| CrossOrigin | 否 | |
-| ExceptionHandler | 否 | |
-| InitBinder | 否 | |
+| 标签名称 | 是否支持 | 说明
|
+|------------------|:----:|:------------------------------------------------------------|
+| RequestMapping | 是 | 不允许制定多个Path,一个接口只允许一个Path,必须显示的声明 method
属性,只能定义唯一一个 method |
+| GetMapping | 是 |
|
+| PutMapping | 是 |
|
+| PostMapping | 是 |
|
+| DeleteMapping | 是 |
|
+| PatchMapping | 是 |
|
+| RequestParam | 是 | 注意含义与Spring MVC不同。Java Chassis 表示 query 参数。
|
+| CookieValue | 是 |
|
+| PathVariable | 是 |
|
+| RequestHeader | 是 |
|
+| RequestBody | 是 | 目前支持application/json,plain/text
|
+| RequestPart | 是 | 用于文件上传的场景,对应的标签还有Part、MultipartFile
|
+| ResponseBody | 否 | 返回值缺省都是在body返回
|
+| ResponseStatus | 否 | 可以通过ApiResponse指定返回的错误码
|
+| RequestAttribute | 是 | 注意含义与Spring MVC不同。Java Chassis 表示 form 参数。
|
+| SessionAttribute | 否 | Servlet协议相关的标签
|
+| MatrixVariable | 否 |
|
+| ModelAttribute | 否 |
|
+| ControllerAdvice | 否 |
|
+| CrossOrigin | 否 |
|
+| ExceptionHandler | 否 |
|
+| InitBinder | 否 |
|
* 服务声明方式
diff --git a/java-chassis-reference/zh_CN/docs/config/read-config.md
b/java-chassis-reference/zh_CN/docs/config/read-config.md
index cad0781..a144cfc 100644
--- a/java-chassis-reference/zh_CN/docs/config/read-config.md
+++ b/java-chassis-reference/zh_CN/docs/config/read-config.md
@@ -40,9 +40,10 @@ Bean 属性对应的配置项名称支持通配符, 一个属性可以关联
* 配置注入对象
- 我们首先设计两个Java类用于注入配置属性,分别用来演示不使用注解和使用注解的场景。使用注解:
+ 我们首先设计两个Java类用于注入配置属性,分别用来演示不使用注解和使用注解的场景。使用@InjectProperties注解并声明为Bean:
```Java
+ @Component
@InjectProperties(prefix = "jaxrstest.jaxrsclient")
public class Configuration {
/*
@@ -116,33 +117,6 @@ Bean 属性对应的配置项名称支持通配符, 一个属性可以关联
}
```
- 不使用注解:
-
- ```Java
- public class ConfigNoAnnotation {
- /*
- * 如果未提供@InjectProperties和@InjectProperty注解,会默认使用字段名作为配置属性名。
- * 注意类名不作为前缀起作用。
- * 此处将配置属性 strValue 绑定到该字段
- */
- public String strValue;
- }
- ```
-
-* 执行注入
-
- 使用注解的场景:
-
- ```Java
- ConfigWithAnnotation config =
SCBEngine.getInstance().getPriorityPropertyManager()
- .createConfigObject(Configuration.class,
- "key", "k",
- "low-list", Arrays.asList("low-1", "low-2"),
- "high-list", Arrays.asList("high-1", "high-2"),
- "full-list", Arrays.asList("l1-1", "l1-2")
- );
- ```
-
Configuration对象的longValue字段按以下顺序查找已配置的属性:
1. root.low-1.a.high-1.b
@@ -151,17 +125,25 @@ Bean 属性对应的配置项名称支持通配符, 一个属性可以关联
4. root.low-2.a.high-2.b
Configuration对象的floatValue字段按以下顺序查找已配置的属性:
-
+
1. root.l1-1
2. root.l1-2
-
- 不使用注解的场景:
+
+ 不使用注解:
```Java
- ConfigNoAnnotation config = SCBEngine.getInstance()
-
.getPriorityPropertyManager().createConfigObject(ConfigNoAnnotation.class);
+ @Component
+ @InjectProperties(prefix = "jaxrstest.jaxrsclient")
+ public class ConfigNoAnnotation {
+ /*
+ * 如果未提供@InjectProperties和@InjectProperty注解,会默认使用字段名作为配置属性名。
+ * 注意类名不作为前缀起作用。
+ * 此处将配置属性 strValue 绑定到该字段
+ */
+ public String strValue;
+ }
```
-
+
ConfigNoAnnotation 对象的 strValue 字段会查找已配置的属性 strValue,没有前缀和优先级。
更多关于配置注入的用法,建议下载 java-chassis 的源码, 查看 TestConfigObjectFactory 类里面的示例。
diff --git
a/java-chassis-reference/zh_CN/docs/featured-topics/secrets/interoperability.md
b/java-chassis-reference/zh_CN/docs/featured-topics/secrets/interoperability.md
index 8eb07c7..c0dc6f4 100644
---
a/java-chassis-reference/zh_CN/docs/featured-topics/secrets/interoperability.md
+++
b/java-chassis-reference/zh_CN/docs/featured-topics/secrets/interoperability.md
@@ -15,10 +15,10 @@ Java Chassis 3一个很重要的设计原则:利用架构的韧性设计来解
从技术原理上梳理下上述互操作需要满足的条件:
-* Spring Cloud和Java Chassis需要有相互认识的注册信息。核心包括:应用名称、服务名称、地址信息和格式等。
需要的共同注册中心越少,越容易对注册中心和客户端进行选型。 在本例子中,我们选择 service center作为注册中心,并选择Spring Cloud
Huawei实现Spring Cloud往service center注册。
+* Spring Cloud和Java Chassis需要有相互认识的注册信息。核心包括:应用名称、服务名称、地址信息和格式等。
需要的共同注册中心越少,越容易对注册中心和客户端进行选型。 在本例子中,我们选择 `Service Center` 或者 `Nacos`
作为注册中心,并选择Spring Cloud Huawei实现Spring Cloud注册。
* Spring Cloud访问Java Chassis,只需要一个地址信息,依赖较少。 Java Chassis访问Spring
Cloud,需要知道Spring Cloud应用提供的契约信息。
-Java Chassis区别于Spring Cloud的REST调用的部分,就是契约依赖。 Spring
Cloud通过FeignClient来声明客户端契约,客户端都需要在FeignClient中重复书写REST标签;Java
Chassis有两种模式发现契约:从注册中心发现和从Provider实例发现。 Java Chassis3默认采用从Provider实例发现, Java
Chassis2采用从注册中心发现。 从Provider发现的好处是可以降低对于注册中心元数据管理能力的要求,虽然本例子中采用 service
center作为注册中心,选择Nacos等作为注册中心也是可以的。
+Java Chassis区别于Spring Cloud的REST调用的部分,就是契约依赖。 Spring
Cloud通过FeignClient来声明客户端契约,客户端都需要在FeignClient中重复书写REST标签;Java
Chassis有两种模式发现契约:从注册中心发现和从Provider实例发现。 Java Chassis3默认采用从Provider实例发现, Java
Chassis2采用从注册中心发现。 从Provider发现的好处是可以降低对于注册中心元数据管理能力的要求,本例既可以采用 `Service Center`
作为注册中心,也可以选择 `Nacos` 作为注册中心。
从Provider发现,要求Provider实现如下接口:
diff --git a/java-chassis-reference/zh_CN/mkdocs.yml
b/java-chassis-reference/zh_CN/mkdocs.yml
index 350d38a..14d73bd 100644
--- a/java-chassis-reference/zh_CN/mkdocs.yml
+++ b/java-chassis-reference/zh_CN/mkdocs.yml
@@ -20,6 +20,7 @@ nav:
- 用JAX-RS开发微服务: build-provider/jaxrs.md
- 用SpringMVC开发微服务: build-provider/springmvc.md
- 用透明RPC开发微服务: build-provider/transparent-rpc.md
+ - HTTP参数映射参考: build-provider/http-mapping.md
- 只发布interface的方法为服务接口: build-provider/use-interface.md
- 异步处理: build-provider/reactive.md
- 使用 Context 参数: build-provider/context-param.md