diff --git a/.htmltest.yml b/.htmltest.yml index 3e85b3f5fb40..5a1a16688d17 100644 --- a/.htmltest.yml +++ b/.htmltest.yml @@ -32,4 +32,6 @@ IgnoreURLs: [ "https://www.oschina.net/question/3820517_2306822", "https://www.webjars.org/documentation#servlet3", "https://twitter.com/apachedubbo", - "https://developer.aliyun.com/article/"] + "https://developer.aliyun.com/article/", + "https://doi.org/10.1145/3593856.3595909", + "https://jespen.io"] diff --git a/cn_config.toml b/cn_config.toml index 2692a49c8f53..21981cc13bd4 100644 --- a/cn_config.toml +++ b/cn_config.toml @@ -102,6 +102,8 @@ github_branch = "master" algolia_docsearch = true offlineSearch = false +version_menu = "Java-3.3" +version_menu_pagelinks = false [[menu.main]] name = "Initializer" @@ -116,29 +118,36 @@ offlineSearch = false # post = "New" -# Add Ecosystems -# en_ecosystem_docs_menu = "Advanced Docs" -# cn_ecosystem_docs_menu = "高级文档" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Java SDK" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/java-sdk/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/java-sdk/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Golang SDK" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/golang-sdk/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/golang-sdk/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Pixiu" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/pixiu/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/pixiu/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Admin" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/admin/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/admin/" +# Add your release versions here +[[params.versions]] +version = "Java-3.3" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Java-3.2" +githubbranch = "java-3.2" +url = "https://v3-2.dubbo.apache.org" + +[[params.versions]] +version = "Go-3.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Nodejs-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Web-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Rust-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" # User interface configuration [params.ui] diff --git a/config.toml b/config.toml index 52c3c7a9ee1d..7df6aaf8e09a 100644 --- a/config.toml +++ b/config.toml @@ -96,6 +96,8 @@ github_branch = "master" algolia_docsearch = true offlineSearch = false +version_menu = "Java-3.3" +version_menu_pagelinks = false [[menu.main]] name = "Initializer" @@ -110,29 +112,37 @@ offlineSearch = false # post = "New" -# Add Ecosystems -# en_ecosystem_docs_menu = "Advanced Docs" -# cn_ecosystem_docs_menu = "高级文档" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Java SDK" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/java-sdk/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/java-sdk/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Golang SDK" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/golang-sdk/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/golang-sdk/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Pixiu" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/pixiu/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/pixiu/" -# -# [[params.ecosystems.docs]] -# ecosystem = "Dubbo Admin" -# en.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/en/admin/" -# cn.docs.url = "https://chickenlj.github.io/incubator-dubbo-website/cn/admin/" +# Add your release versions here +[[params.versions]] +version = "Java-3.3" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Java-3.2" +githubbranch = "java-3.2" +url = "https://v3-2.dubbo.apache.org" + +[[params.versions]] +version = "Go-3.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Nodejs-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Web-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + +[[params.versions]] +version = "Rust-0.1" +githubbranch = "master" +url = "https://dubbo.apache.org" + # Enable syntax highlighting and copy buttons on code blocks with Prism #prism_syntax_highlighting = false diff --git a/content/zh-cn/_index.html b/content/zh-cn/_index.html index 1f078462b9ae..20d705f3209f 100644 --- a/content/zh-cn/_index.html +++ b/content/zh-cn/_index.html @@ -48,37 +48,37 @@

选择编程语言后快速体验!

- +
Java
java
- +
Go
golang
- -
Rust
+
+
Node.js
- rust + node.js
- -
Node.js
+
+
Web
- node.js + web
- -
Python
+
+
rust
- python2 + rust
- +
更多
diff --git a/content/zh-cn/blog/integration/dubbo-fescar.md b/content/zh-cn/blog/integration/dubbo-fescar.md index 77a318261d30..ffacd000d97d 100644 --- a/content/zh-cn/blog/integration/dubbo-fescar.md +++ b/content/zh-cn/blog/integration/dubbo-fescar.md @@ -4,7 +4,7 @@ linkTitle: "如何使用Seata保证Dubbo微服务间的一致性" date: 2019-01-17 tags: ["生态", "Java"] description: > - 本文主要介绍如何使用Seata保证Dubbo微服务间的一致性 + 本文主要介绍如何使用Seata保证Dubbo微服务间的一致性,提供Dubbo的分布式事物解决方案。 --- ## 案例 diff --git a/content/zh-cn/blog/news/cocasia-2023-annoucenment.md b/content/zh-cn/blog/news/cocasia-2023-annoucenment.md new file mode 100644 index 000000000000..e5ffb3769873 --- /dev/null +++ b/content/zh-cn/blog/news/cocasia-2023-annoucenment.md @@ -0,0 +1,26 @@ +--- +title: "Apache 亚洲大会 2023 报名正式启动" +linkTitle: "Apache 亚洲大会 2023 报名正式启动" +date: 2023-06-05 +tags: ["新闻动态"] +description: > + Community Over Code 2023 暨 ApacheCon Asia 2023 大会将于 8月18 - 8月20日在北京举办,Apache Dubbo 将带来Mesh、可观测、Kubernetes实践、Serverless部署等 10 多个议题的主题演讲! +--- + +您可以通过 [大会官方网站](https://www.bagevent.com/event/cocasia-2023-EN) 查看介绍、日程安排、演讲嘉宾与议题等! + +## Dubbo 相关议题 + +Apache Dubbo 社区当前已经确定的议题包括: + +* 微服务集群可视化管控实践 - Dubbo Admin 控制台全新升级 +* 微服务流量管控实践 - 演示如何实现灰度发布、同区域优先等能力 +* 打造零信任微服务体系 +* Dubbo Mesh 最新进展 - 如何平滑的迁移到服务网格体系 +* 精进云原生 - Dubbo Kubernetes 最佳实践 +* 基于 Triple 协议实现Web、移动端、后端服务全面打通 +* Dubbo Go 微服务开发与治理 +* Serverless Application - 如何将应用一键部署到 Kubernetes 及云上集群 +* 国内首个开源 IDL 管理平台正式发布 - 让 gRPC、IDL 开发更简单 + +更多合作伙伴议题征集中,敬请期待... \ No newline at end of file diff --git a/content/zh-cn/blog/news/initializer-release-notice.md b/content/zh-cn/blog/news/initializer-release-notice.md new file mode 100644 index 000000000000..50e304992113 --- /dev/null +++ b/content/zh-cn/blog/news/initializer-release-notice.md @@ -0,0 +1,76 @@ +--- +title: "Dubbo 脚手架正式发布,帮你快速创建项目模板" +linkTitle: "Dubbo 脚手架正式发布,帮你快速创建项目模板" +date: 2023-06-04 +tags: ["新闻动态"] +description: > + 使用项目脚手架快速创建 Dubbo Spring Boot 项目模板,帮你解决项目初始化问题。 +--- + +通过这篇文章,你将学习如何在 1 分钟内用 Dubbo Initializer 模板快速创建 Dubbo Spring Boot 项目,帮你解决项目初始化问题。 + +Dubbo Initializer 可用来快速生成 Java 项目脚手架,帮助简化微服务项目搭建、基本配置、组件依赖管理等。 + +> Initializer 仍在持续更新中,更多 Dubbo Feature 的支持将会陆续发布。 + +## 选择 Dubbo 版本 +Initializer 将使用 `dubbo-spring-boot-starter` 创建 Spring Boot 项目,因此我们首先需要选择 Dubbo 与 Spring Boot 的版本。 + +![initializer-choose-version](/imgs/v3/tasks/develop/initializer-choose-version.png) + +## 录入项目基本信息 +接下来,填入项目基本信息,包括项目坐标、项目名称、包名、JDK 版本等。 + +![initializer-project-info](/imgs/v3/tasks/develop/initializer-project-info.png) + +## 选择项目结构 +有两种项目结构可共选择,分别是 `单模块` 和 `多模块`,在这个示例中我们选择 `单模块`。 + +![initializer-project-architecture](/imgs/v3/tasks/develop/initializer-project-architecture.png) + +* 单模块,所有组件代码存放在一个 module 中,特点是结构简单。 +* 多模块,生成的项目有 `API`、`Service` 两个模块,其中 `API` 用于存放 Dubbo 服务定义,`Service` 用于存放服务服务实现或调用逻辑。通常多模块更有利于服务定义的单独管理与发布。 + +## 选择依赖组件 +我们为模板默认选择如下几个依赖组件: +* Dubbo 组件 + * Java Interface + * 注册中心,zookeeper + * 协议 TCP +* 常用微服务组件 + * Web + * Mybatis + * 模版引擎 + +![initializer-dependencies](/imgs/v3/tasks/develop/initializer-dependencies.png) + +基于以上选项,生成的项目将以 Zookeeper 为注册中心,以高性能 Dubbo2 TCP 协议为 RPC 通信协议,并且增加了 Web、Mybatis 等组件依赖和示例。 + +> 注意:上面选中的 Dubbo 组件也都是默认选项,即在不手动添加任何依赖的情况下,打开页面后直接点击代码生成,生成的代码即包含以上 Dubbo 组件。 +> +> 如手动添加依赖组件,请注意 Dubbo 各个依赖组件之间的隐含组合关系限制,比如 +> * 如果选择了【Dubbo Service API】-【IDL】,则目前仅支持选择 【Dubbo Protocol】中的 【HTTP/2】或 【gRPC】 协议。 +> * 同一个依赖分组下,相同类型的依赖只能选择一个,比如 【Dubbo Registry&Config&Metadata】分组下,从注册中心视角【Zookeeper】、【Nacos】只能选一个,如果要设置多注册中心,请在生成的代码中手动修改配置。但注册中心、配置中心可以分别选一个,比如 Zookeeper 和 Apollo 可同时选中。 + +## 生成项目模板 +* 点击 “浏览代码” 可在线浏览项目结构与代码 +* 点击 “获取代码” 生成项目下载地址 + +![initializer-preview](/imgs/v3/tasks/develop/initializer-preview.png) + +项目下载到本地后,解压并导入 IDE 后即可根据需要开发定制 Dubbo 应用。 + +## 总结 + +Dubbo Initializer 作为全面提升 Dubbo 易用性的一个重要规划,其功能仍在持续演进中。以下是正在推进的一些工作。 + +### IntelliJ IDEA 官方合作 + +IntelliJ IDEA 2023 近期刚刚发布集成 Dubbo 的官方框架 [Apache Dubbo in Spring Framework](https://plugins.jetbrains.com/plugin/20938-apache-dubbo-in-spring-framework) + +当前,双方社区正在商讨基于 Dubbo Initializer 的集成方案,相信用不了多久,我们就能在你最喜欢的 IDE 中看到 Dubbo 项目模板的官方支持了。 + +### Dubbo Boot Starters + +除了 Dubbo Initializer 之外,Dubbo 社区还正在建设一批 Dubbo Boot Starters,目标是让用户能够做到零配置使用 Dubbo 框架,只需要引入 starter 依赖即可,不必关心繁琐的 pom 依赖和默认配置。 +请在此快速体验 [Dubbo Initializer](https://start.dubbo.apache.org/) 吧! \ No newline at end of file diff --git a/content/zh-cn/blog/news/triple-performance-tuning.md b/content/zh-cn/blog/news/triple-performance-tuning.md new file mode 100644 index 000000000000..69c2782466ff --- /dev/null +++ b/content/zh-cn/blog/news/triple-performance-tuning.md @@ -0,0 +1,462 @@ +--- +title: "Triple 性能优化:Java & Netty 性能调优 - 工具、技巧与方法论" +linkTitle: "通过 HTTP/2 协议案例学习 Java & Netty 性能调优:工具、技巧与方法论" +date: 2023-06-05 +tags: ["新闻动态"] +description: > + Dubbo3 Triple 在性能调优方面做了大量工作,本文将侧重对 Triple 协议背后的高性能秘密进行深入讲解,涉及一些有价值的性能调优工具、技巧及代码实现;在下一篇文章中,我们将具体展开 Triple 协议在易用性方面的一些具体使用场景。 +--- + +## 前言 + +Dubbo3 Triple 协议是参考 gRPC、gRPC-Web、Dubbo2 等协议特点设计而来,它吸取各自协议特点,完全兼容 gRPC、Streaming 通信、且无缝支持 HTTP/1 和浏览器。 + +当你在 Dubbo 框架中使用 Triple 协议,然后你就可以直接使用 Dubbo 客户端、gRPC 客户端、curl、浏览器等访问你发布的服务,不需要任何额外组件与配置。 +除易用性以外,Dubbo3 Triple 在性能调优方面做了大量工作,本文将侧重对 Triple 协议背后的高性能秘密进行深入讲解,涉及一些有价值的性能调优工具、技巧及代码实现;在下一篇文章中,我们将具体展开 Triple 协议在易用性方面的一些具体使用场景。 + +## 为什么要优化Triple协议的性能? + +自 2021 年开始 Dubbo3 就已经作为下一代服务框架逐步开始取代阿里内部广泛使用的 HSF 框架,截止目前,阿里以淘宝、天猫等电商为代表的绝大多数核心应用已经成功升级到 Dubbo3。作为过去两年支撑阿里双十一万亿级服务调用的关键框架,Triple 通信协议的性能直接影响整个系统的运行效率。 + +## 前置知识 +### 1. Triple + +Triple 协议是参考 gRPC 与 gRPC-Web 两个协议设计而来,它吸取了两个协议各自的特性和优点,将它们整合在一起,成为一个完全兼容 gRPC 且支持 Streaming 通信的协议,同时 Triple 还支持 HTTP/1、HTTP/2。 + +Triple 协议的设计目标如下: + +Triple 设计为对人类友好、开发调试友好的一款基于 HTTP 的协议,尤其是对 unary 类型的 RPC 请求。 +完全兼容基于 HTTP/2 的 gRPC 协议,因此 Dubbo Triple 协议实现可以 100% 与 gRPC 体系互调互通。 + +当你在 Dubbo 框架中使用 Triple 协议,然后你就可以直接使用 Dubbo 客户端、gRPC 客户端、curl、浏览器等访问你发布的服务。 + +以下是使用 curl 客户端访问 Dubbo 服务端一个 Triple 协议服务的示例: + +```shell +curl \ + --header "Content-Type: application/json"\ + --data '{"sentence": "Hello Dubbo."}'\ +https://host:port/org.apache.dubbo.sample.GreetService/sayHello +``` + +在具体实现上,Dubbo Triple 支持 Protobuf Buffer 但并不绑定,比如 Dubbo Java 支持以 Java Interface 定义 Triple 服务,这对于关注特定语言易用性的开发者将更容易上手。另外,Dubbo 当前已经提供了 Java、Go、Rust 等语言实现,目前正在推进 Node.js 等语言的协议实现,我们计划通过多语言和 Triple 协议打通移动端、浏览器、后端微服务体系。 + +在 Triple 的实现中核心的组件有以下几个: + +`TripleInvoker`是Triple协议的核心组件之一,用于请求调用Triple协议的服务端。其中核心方法为`doInvoke`,该方法会根据请求类型如UNARY、BiStream等,发起不一样类型的请求。如UNARY在SYNC下即同步阻塞调用,一个请求对应一个响应。BiStream则是双向通讯,客户端可以持续发送请求,而服务端同样也可以持续推送消息,他们之间通过回调StreamObserver组件的方法实现交互。 + +`TripleClientStream`是Triple协议的核心组件之一,该组件与HTTP/2中的Stream概念与之对应,每次发起一个新的请求均会创建一个新的TripleClientStream,同理与之对应的`HTTP/2的Stream`也是不相同的。TripleClientStream提供核心的方法有sendHeader用来发送头部帧`Header Frame`,以及sendMessage用来发送数据帧`Data Frame`。 + +`WriteQueue`是Triple协议中用于写出消息的缓冲队列,其核心逻辑就是将各种操作命令QueueCommand添加到内部维护的队列中,并尝试将这些`QueueCommand`对应的任务提交到Netty的EventLoop线程中`单线程`、`有序`的执行。 + +`QueueCommand`是专门用于提交到WriteQueue的任务抽象类,不同的Command对应了不同的执行逻辑。 + +`TripleServerStream`是Triple协议中服务端的Stream抽象,该组件与HTTP/2中的Stream概念与之对应,客户端每通过一个新的Stream发起请求,服务端便会创建一个与之对应的TripleServerStream,以便处理客户端发来的请求信息。 + +### 2. HTTP/2 + +HTTP/2是一种新一代的HTTP协议,是HTTP/1.1的替代品,HTTP/2相较于HTTP/1.1的最大改进在于减少了资源的消耗提高了性能。HTTP/1.1中,浏览器只能在一个TCP连接中发送一个请求。如果浏览器需要加载多个资源,那么浏览器就需要建立多个TCP连接。这种方式会导致一些问题,例如TCP连接的建立和断开会增加网络延迟,而且浏览器可能会在同一时间内发送多个请求导致网络拥塞。 + +相反,HTTP/2允许浏览器在一个TCP连接中同时发送多个请求,多个请求对应`多个Stream流`,多个流之间相互独立,并以`并行`的方式流转。而在每个流中,这些请求会被拆分成`多个Frame帧`,这些帧在同一个流中以`串行`的方式流转,严格的保证了`帧的有序性`。因此客户端可以并行发送多个请求,而服务器也可以并行发送多个响应,这有助于减少网络连接数,以及网络延迟和提高性能。 + +HTTP/2还支持服务器推送,这意味着服务器可以在浏览器请求之前预加载资源。例如,如果服务器知道浏览器将要请求一个特定的资源,那么服务器可以在浏览器请求之前将该资源推送到浏览器。这有助于提高性能,因为浏览器不需要等待资源的请求和响应。 + +HTTP/2还支持头部压缩,这意味着HTTP头部中的重复信息可以被压缩。这有助于减少网络带宽的使用。 + +### 3. Netty + +Netty是一个高性能异步事件驱动的网络框架,主要用于快速开发可维护的高性能协议服务器和客户端。它的主要特点是易于使用、灵活性强、性能高、可扩展性好。Netty使用NIO作为基础,可以轻松地实现异步、非阻塞的网络编程,支持TCP、UDP、HTTP、SMTP、WebSocket、SSL等多种协议。 +Netty的核心组件包括Channel、EventLoop、ChannelHandler和ChannelPipeline。 + +`Channel`是一个传输数据的双向通道,可以用来处理网络I/O操作。Netty的Channel实现了Java NIO的Channel接口,并在此基础上添加了一些功能,例如支持异步关闭、绑定多个本地地址、绑定多个事件处理器等。 + +`EventLoop`是Netty的核心组件之一,它负责处理所有I/O事件和任务。一个EventLoop可以管理多个Channel,每个Channel都有一个对应的EventLoop。EventLoop使用`单线程模型`来处理事件,避免了线程之间的竞争和锁的使用,从而提高了性能。 + +`ChannelHandler`是连接到ChannelPipeline的处理器,它可以处理入站和出站的数据,例如编码、解码、加密、解密等。一个Channel可以有`多个ChannelHandler`,ChannelPipeline会`按照添加的顺序`依次调用它们来处理数据。 + +`ChannelPipeline`是Netty的另一个核心组件,它是一组按顺序连接的ChannelHandler,用于处理入站和出站的数据。每个Channel都有自己`独占的ChannelPipeline`,当数据进入或离开Channel时,会经过所有的ChannelHandler,由它们来完成处理逻辑。 + +## 工具准备 + +为了对代码进行调优,我们需要借助一些工具来找到Triple协议性能瓶颈的位置,例如阻塞、热点方法。而本次调优用到的工具主要有`VisualVM`以及`JFR`。 + +### Visual VM + +Visual VM是一个可以监视本地和远程的Java虚拟机的性能和内存使用情况的图形化工具。它是一个开源项目,可以用于识别和解决Java应用程序的性能问题。 + +Visual VM可以显示Java虚拟机的运行状况,包括`CPU使用率`、`线程数`、`内存使用`情况、`垃圾回收`等。它还可以显示每个线程的CPU使用情况和`堆栈跟踪`,以便识别瓶颈。 + +Visual VM还可以分析堆转储文件,以识别内存泄漏和其他内存使用问题。它可以查看对象的大小、引用和类型,以及对象之间的关系。 + +Visual VM还可以在运行时监视应用程序的性能,包括方法调用次数、耗时、异常等。它还可以生成CPU和内存使用情况的快照,以便进一步分析和优化。 + +### JFR + +JFR全称为Java Flight Recorder,是JDK提供的性能分析工具。JFR是一种轻量级的、低开销的事件记录器,它可以用来记录各种事件,包括线程的`生命周期`、`垃圾回收`、`类加载`、`锁竞争`等等。JFR的数据可以用来分析应用程序的性能瓶颈,以及识别`内存泄漏`等问题。与其他性能分析工具相比,JFR的特点在于它的开销非常低,可以一直开启记录,而不会对应用程序本身的性能产生影响。 + +JFR的使用非常简单,只需要在启动JVM时添加启动参数`-XX:+UnlockCommercialFeatures -XX:+FlightRecorder`,就可以开启JFR的记录功能。当JVM运行时,JFR会自动记录各种事件,并将它们保存到一个文件中。记录结束后,我们可以使用工具`JDK Mission Control`来分析这些数据。例如,我们可以查看CPU的使用率、内存的使用情况、线程的数量、锁竞争情况等等。JFR还提供了一些高级的功能,例如`事件过滤`、`自定义事件`、`事件堆栈`跟踪等等。 + +在本次性能调优中,我们重点关注Java中能明显影响性能的事件:Monitor Blocked、Monitor Wait、Thread Park、Thread Sleep。 + +- `Monitor Blocked`事件由synchronized块触发,表示有线程进入了同步代码块 +- `Monitor Wait`事件由Object.wait触发,表示有代码调用了该方法 +- `Thread Park`事件由LockSupport.park触发,表示有线程被挂起 +- `Thread Sleep`事件由Thread.sleep()触发,表示代码中存在手动调用该方法的情况 + +## 调优思路 + +### 1. 非阻塞 + +高性能的关键点之一是编码时必须是非阻塞的,代码中如果出现了`sleep`、`await`等类似方法的调用,将会阻塞线程并直接影响到程序的性能,所以在代码中应尽可能避免使用阻塞式的API,而是使用非阻塞的API。 + +### 2. 异步 + +在调优思路中,异步是其中一个关键点。在代码中,我们可以使用异步的编程方式,例如使用Java8中的`CompletableFuture`等。这样做的好处在于可以避免线程的阻塞,从而提高程序的性能。 + +### 3. 分治 + +在调优过程中,分治也是一个很重要的思路。例如可以将一个大的任务分解成若干个小任务,然后使用多线程并行的方式来处理这些任务。这样做的好处在于可以提高程序的并行度,从而充分利用多核CPU的性能,达到优化性能的目的。 + +### 4. 批量 + +在调优思路中,批量也是一个很重要的思路。例如可以将多个小的请求合并成一个大的请求,然后一次性发送给服务器,这样可以减少网络请求的次数,从而降低网络延迟和提高性能。另外,在处理大量数据时,也可以使用批量处理的方式,例如一次性将一批数据读入内存,然后进行处理,这样可以减少IO操作的次数,从而提高程序的性能。 + +## **高性能的基石——非阻塞** + +### 1.1 不合理的syncUninterruptibly + +通过直接检查代码,我们发现了一处明显明显会阻塞当前线程的方法`syncUninterruptibly`。而使用DEBUG的方式可以很轻松的得知该代码会在`用户线程`中进行,其中源码如下所示。 + +```java +private WriteQueue createWriteQueue(Channel parent) { +  final Http2StreamChannelBootstrap bootstrap = new Http2StreamChannelBootstrap(parent); +  final Future future = bootstrap.open().syncUninterruptibly(); +  if (!future.isSuccess()) { +    throw new IllegalStateException("Create remote stream failed. channel:" + parent); + } +  final Http2StreamChannel channel = future.getNow(); +  channel.pipeline() +   .addLast(new TripleCommandOutBoundHandler()) +   .addLast(new TripleHttp2ClientResponseHandler(createTransportListener())); +  channel.closeFuture() +   .addListener(f -> transportException(f.cause())); +  return new WriteQueue(channel); +} +``` + +此处代码逻辑如下 + +- 通过TCP Channel构造出Http2StreamChannelBootstrap +- 通过调用Http2StreamChannelBootstrap的open方法得到Future +- 通过调用`syncUninterruptibly`阻塞方法等待Http2StreamChannel构建完成 +- 得到Http2StreamChannel后再构造其对应的ChannelPipeline + +而在`前置知识`中我们提到了Netty中大部分的任务都是在EventLoop线程中以`单线程`的方式执行的,同样的当用户线程调用open时将会把创建HTTP2 Stream Channel的任务提交到EventLoop中,并在调用`syncUninterruptibly`方法时阻塞用户线程直到任务完成。 + +而提交后的任务只是提交到一个任务队列中并非立即执行,因为此时的EventLoop可能还在执行Socket读写任务或其他任务,那么提交后很可能因为其他任务占用的时间较多,从而导致迟迟没有执行创建Http2StreamChannel这个任务,那么阻塞用户线程的时间就会变大。 + +而从一个请求的整体的流程分析来看,Stream Channel还没创建完成用户线程就被阻塞了,在真正发起请求后还需要再次进行阻塞等待响应,一次UNARY请求中就出现了两次明显的阻塞行为,这将会极大的制约了Triple协议的性能,那么我们可以大胆假设:`此处的阻塞是不必要的`。为了证实我们的推断,我们可以使用`VisualVM`对其进行采样,分析热点中阻塞创建Stream Channel的耗时。以下是Triple Consumer Side的采样结果。 + +![triple-create-stream.png](/imgs/blog/2023/6/triple/triple-create-stream.png) + +从图中我们可以看到`HttpStreamChannelBootstrap$1.run`创建StreamChannel方法在整个EventLoop的耗时里有着不小的占比,展开后可以看到这些耗时基本上消耗在了`notifyAll`上,即唤醒用户线程。 + +### 1.2 优化方案 + +至此我们已经了解到了性能的阻碍点之一是创建StreamChannel,那么优化方案便是将创建`StreamChannel异步化,`以便消除`syncUninterruptibly`方法的调用。改造后的代码如下所示,将创建StreamChannel的任务抽象成了`CreateStreamQueueCommand`并提交到了WriteQueue中,后续发起请求的`sendHeader`、`sendMessage`也是将其提交到WriteQueue中,这样便可以轻松保证在创建Stream后才会执行发送请求的任务。 + +```java +private TripleStreamChannelFuture initHttp2StreamChannel(Channel parent) { +    TripleStreamChannelFuture streamChannelFuture = new TripleStreamChannelFuture(parent); +    Http2StreamChannelBootstrap bootstrap = new Http2StreamChannelBootstrap(parent); +    bootstrap.handler(new ChannelInboundHandlerAdapter() { +            @Override +            public void handlerAdded(ChannelHandlerContext ctx) throws Exception { +                Channel channel = ctx.channel(); +                channel.pipeline().addLast(new TripleCommandOutBoundHandler()); +                channel.pipeline().addLast(new TripleHttp2ClientResponseHandler(createTransportListener())); +                channel.closeFuture().addListener(f -> transportException(f.cause())); +           } +       }); +    CreateStreamQueueCommand cmd = CreateStreamQueueCommand.create(bootstrap, streamChannelFuture); +    this.writeQueue.enqueue(cmd); +    return streamChannelFuture; +} +``` + +其中`CreateStreamQueueCommand`的核心逻辑如下,通过保证在EventLoop中执行以消除不合理的阻塞方法调用 + +```java +public class CreateStreamQueueCommand extends QueuedCommand { + ...... + @Override + public void run(Channel channel) { + //此处的逻辑可以保证在EventLoop下执行,所以open后可以直接获取结果而不需要阻塞 + Future future = bootstrap.open(); + if (future.isSuccess()) { + streamChannelFuture.complete(future.getNow()); + } else { + streamChannelFuture.completeExceptionally(future.cause()); + } + } +} +``` + +### 2.1 不恰当的synchronized锁竞争 + +此时简单的看源码已经不能发现明显的性能瓶颈了,接下来我们需要借助`Visual VM`工具来找到性能瓶颈。 + +打开工具后我们可以选中需要采集的进程,这里我们采集的是Triple Consumer的进程,并选中选项卡中的`Sampler`,点击`CPU`开始采样CPU的耗时热点方法。以下是我们采样CPU热点方法的结果,我们展开了耗时最为明显的EventLoop线程的调用堆栈。 + +![ensure-write-open.png](/imgs/blog/2023/6/triple/ensure-write-open.png) + +经过层层展开,我们可以从图中发现一个非常的不合理耗时方法——`ensureWriteOpen`,这个方法名看上去不就是一个判断Socket是否可写的方法吗,为什么耗时的占比会这么大?我们带着疑问打开了JDK8中`sun.nio.ch.SocketChannelImpl`的`isConnected`方法,其代码如下。 + +```java +public boolean isConnected() { +  synchronized (stateLock) { +    return (state == ST_CONNECTED); + } +} +``` + +可以看到这个方法中没有任何逻辑,但是有着关键字眼`synchronized`,所以我们可以断定:EventLoop线程出现了大量的同步锁竞争!那么我们下一步思路便是找到在同一时刻竞争该锁的方法。我们的方法也比较简单粗暴,那就是通过DEBUG条件断点的方式找出该方法。如下图所示我们给`isConnected`这个方法里打上条件断点,进入断点的条件是:`当前线程不是EventLoop线程`。 + +![breakpoint.png](/imgs/blog/2023/6/triple/breakpoint.png) + +断点打上后我们启动并发起请求,可以很清晰的看到我们的方法调用堆栈中出现了`TripleInvoker.isAvailable`的方法调用,最终会调用到`sun.nio.ch.SocketChannelImpl`的`isConnected`,从而出现了EventLoop线程的锁竞争耗时的现象。 + +![client-isAvailable.png](/imgs/blog/2023/6/triple/client-isAvailable.png) + +### 2.2 优化方案 + +通过以上的分析,我们接下来的修改思路就很清晰了,那就是修改`isAvailable`的判断逻辑,自身维护一个boolean值表示是否可以用,以便消除锁竞争,提升Triple协议的性能。 + +## **不可忽视的开销——线程上下文切换** + +我们继续观察VisualVM采样的快照,查看整体线程的耗时情况,如下图: + +![client-profiler-snapshot.png](/imgs/blog/2023/6/triple/client-profiler-snapshot.png) + +从图中我们可以提取到以下信息: + +- 耗时最大的线程为`NettyClientWorker-2-1` +- 压测期间有大量非消费者线程即`tri-protocol-214783647-thread-xxx` +- 消费者线程的整体`耗时较高`且`线程数多` +- 用户线程的`耗时非常低` + +我们任意展开其中一个`消费者线程后`也能看到消费者线程主要是做反序列化以及交付反序列化结果(`DeadlineFuture.received`),如下图所示: + +![pb-deserialize.png](/imgs/blog/2023/6/triple/pb-deserialize.png) + +从以上信息来看似乎并不能看到瓶颈点,接下来我们尝试使用JFR(Java Flight Recorder)监控进程信息。下图是JFR的日志分析。 + +![jfr-analysis.png](/imgs/blog/2023/6/triple/jfr-analysis.png) + +### 1. Monitor Blocked事件 + +其中我们可以先查看JFR的简要分析,点击`Java Blocking`查看可能存在的阻塞点,该事件表示有线程进入了`synchronized`代码块,其中结果如下图所示。 + +![jfr-blocking.png](/imgs/blog/2023/6/triple/jfr-blocking.png) + +可以看到这里有一个总阻塞耗时达39秒的Class,点击后可以看到图中Thread一栏,被阻塞的线程全都是benchmark发请求的线程。再往下看火焰图Flame View中展示的方法堆栈,可以分析出这只是在等待响应结果,该阻塞是必要的,该阻塞点可以忽略。 + +接着点击左侧菜单的Event Browser查看JFR收集到的事件日志,并过滤出名为java的事件类型列表,我们首先查看`Java Monitor Blocked`事件,结果如下图所示。 + +![jfr-monitor-blocked.png](/imgs/blog/2023/6/triple/jfr-monitor-blocked.png) + +可以看到被阻塞的线程全都是benchmark发起请求的线程,阻塞的点也只是等待响应,可以排除该事件。 + +### 2. Monitor Wait事件 + +继续查看`Java Monitor Wait`事件,Monitor Wait表示有代码调用了`Object.wait`方法,结果如下图所示。 + +![jfr-monitor-wait.png](/imgs/blog/2023/6/triple/jfr-monitor-wait.png) + +从上图我们可以得到这些信息:benchmark请求线程均被阻塞,平均等待耗时约为87ms,阻塞对象均是同一个DefaultPromise,阻塞的切入方法为`Connection.isAvailable`。接着我们查看该方法的源码,其源码如下所示。很显然,这个阻塞的耗时只是首次建立连接的耗时,对整体性能不会有太大的影响。所以这里的`Java Monitor Wait`事件也可以排除。 + +```java +public boolean isAvailable() { +  if (isClosed()) { +    return false; + } +  Channel channel = getChannel(); +  if (channel != null && channel.isActive()) { +    return true; + } +  if (init.compareAndSet(false, true)) { +    connect(); + } + +  this.createConnectingPromise(); +  //87ms左右的耗时来自这里 +  this.connectingPromise.awaitUninterruptibly(this.connectTimeout, TimeUnit.MILLISECONDS); +  // destroy connectingPromise after used +  synchronized (this) { +    this.connectingPromise = null; + } + +  channel = getChannel(); +  return channel != null && channel.isActive(); +} +``` + +### 3. Thread Sleep事件 + +接下来我们再查看`Java Thread Sleep`事件,该事件表示代码中存在手动调用`Thread.sleep`,检查是否存在阻塞工作线程的行为。从下图可以看到,很显然并没有阻塞消费者线程或benchmark请求线程,这个主动调用sleep的线程主要用于请求超时场景,对整体性能没有影响,同样也可以排除`Java Thread Sleep`事件。 + +![jfr-sleep.png](/imgs/blog/2023/6/triple/jfr-sleep.png) + +### 4. Thread Park事件 + +最后我们再查看`Java Thread Park`事件,park事件表示线程被挂起。下图是park事件列表。 + +![jfr-park.png](/imgs/blog/2023/6/triple/jfr-park.png) + +可以看到park事件有`1877`个,并且大多都是消费者线程池里的线程,从火焰图中的方法堆栈可以得知这些线程都在等待任务,并且没有取到任务的持续时间偏长。由此可以说明一个问题:消费者线程池中大部分线程都是没有执行任务的,消费者线程池的`利用率非常低`。 + +而要提高线程池的利用率则可以减少消费者线程池的线程数,但是在dubbo中消费者线程池并不能直接减少,我们尝试在UNARY场景下将消费者线程池包装成SerializingExecutor,该Executor可以使得提交的任务被串行化执行,变相将线程池大小缩小。我们再查看缩减后的结果如下。 + +``` +benchmark +修改前: +ClientPb.listUser thrpt    3  17.865 ± 1.506 ops/ms +修改后: +ClientPb.listUser thrpt    3  20.282 ± 8.716 ops/ms +``` + +![visualvm-serial.png](/imgs/blog/2023/6/triple/visualvm-serial.png) + +![jfr-serial.png](/imgs/blog/2023/6/triple/jfr-serial.png) + +从以上结果中可以看到已经减少了大量的消费者线程,线程利用率大幅度提高,并且`Java Thread Park`事件也是大幅度减少,性能却提高了约`13%`。 + +由此可见多线程切换对程序性能影响较大,但也带来了另一个问题,我们通过`SerializingExecutor`将大部分的逻辑集中到了少量的消费者线程上是否合理?带着这个疑问我们展开其中一条消费者线程的调用堆栈进行分析。通过展开方法调用堆栈可以看到`deserialize`的字样(如下图所示)。 + +![profiler-snapshot-deserialize.png](/imgs/blog/2023/6/triple/profiler-snapshot-deserialize.png) + +很显然我们虽然提高了性能,但却把不同请求的响应体反序列化行为都集中在了少量的消费者线程上处理,会导致反序列化被”`串行`”执行了,当反序列化大报文时耗时会明显上涨。 + +所以能不能想办法把反序列化的逻辑再次派发到多个线程上并行处理呢?带着这个疑问我们首先梳理出当前的`线程交互模型`,如下图所示。 + +```mermaid + +graph LR + EventLoop[EventLoop] -->|反序列化| Consumer1[tri-thread-199] + EventLoop[EventLoop] -->|反序列化| Consumer2[tri-thread-200] + Consumer1 -->|交付响应结果| U1[UserThread1] + Consumer1 -->|交付响应结果| U2[UserThread2] + Consumer1 -->|交付响应结果| U3[UserThread3] + Consumer1 -->|交付响应结果| U4[UserThread4] + Consumer2 -->|交付响应结果| U5[UserThread5] + Consumer2 -->|交付响应结果| U6[UserThread6] + Consumer2 -->|交付响应结果| U7[......] +``` + +根据以上的线程交互图,以及UNARY SYNC“一个请求对应一个响应”的特点,我们可以大胆推断——`ConsumerThread不是必要的`!我们可以直接将所有非I/O类型的任务都交给用户线程执行,可以有效利用多线程资源`并行处理`,并且也能大幅度减少不必要的线程上下文的切换。所以此处最佳的线程交互模型应如下图所示。 + +```mermaid + +graph LR + EventLoop -->|交付响应结果| U1[UserThread1] + EventLoop -->|交付响应结果| U2[UserThread2] + EventLoop -->|交付响应结果| U3[UserThread3] + EventLoop -->|交付响应结果| U4[UserThread4] + EventLoop -->|交付响应结果| U5[UserThread5] + EventLoop -->|交付响应结果| U6[UserThread6] + EventLoop -->|交付响应结果| U7[......] +``` + +### 5. 优化方案 + +梳理出该线程交互模型后,我们的改动思路就比较简单了。根据`TripleClientStream`的源码得知,每当接收到响应后,I/O线程均会把任务提交到与TripleClientStream绑定的Callback Executor中,该Callback Executor默认即消费者线程池,那么我们只需要替换为`ThreadlessExecutor`即可。其改动如下: + +```java +//当前请求必须是同步阻塞调用才会使用ThreadlessExecutor作为callback executor +Executor callbackExecutor = isSync(methodDescriptor, invocation) ? new ThreadlessExecutor() : streamExecutor; +ClientCall call = new TripleClientCall(connectionClient, callbackExecutor, + getUrl().getOrDefaultFrameworkModel(), writeQueue); +``` + +## **减少I/O的利器——批量** + +我们前面介绍到triple协议是一个基于HTTP/2协议实现的,并且完全兼容gRPC,由此可见gRPC是一个不错的参照对象。于是我们将triple与gRPC做对比,环境一致仅协议不同,最终结果发现triple与gRPC的性能有一定的差距,那么差异点在哪里呢?带着这个问题,我们对这两者继续压测,同时尝试使用`tcpdump`对两者进行抓包,其结果如下。 + +### triple + +![tcpdump-triple.png](/imgs/blog/2023/6/triple/tcpdump-triple.png) + +### gRPC + +![tcpdump-grpc.png](/imgs/blog/2023/6/triple/tcpdump-grpc.png) + +从以上的结果我们可以看到gRPC与triple的抓包差异非常大,gRPC中一个时间点发送了一大批不同Stream的数据,而triple则是非常规矩的请求“一来一回”。所以我们可以大胆猜测gRPC的代码实现中一定会有批量发送的行为,一组数据包被当作一个整体进行发送,大幅度的减少了I/O次数。为了验证我们的猜想,我们需要对gRPC的源码深入了解。最终发现gRPC中批量的实现位于`WriteQueue`中,其核心源码片段如下: + +```java +private void flush() { + PerfMark.startTask("WriteQueue.periodicFlush"); + try { + QueuedCommand cmd; + int i = 0; + boolean flushedOnce = false; + while ((cmd = queue.poll()) != null) { + cmd.run(channel); + if (++i == DEQUE_CHUNK_SIZE) { + i = 0; + // Flush each chunk so we are releasing buffers periodically. In theory this loop + // might never end as new events are continuously added to the queue, if we never + // flushed in that case we would be guaranteed to OOM. + PerfMark.startTask("WriteQueue.flush0"); + try { + channel.flush(); + } finally { + PerfMark.stopTask("WriteQueue.flush0"); + } + flushedOnce = true; + } + } + // Must flush at least once, even if there were no writes. + if (i != 0 || !flushedOnce) { + PerfMark.startTask("WriteQueue.flush1"); + try { + channel.flush(); + } finally { + PerfMark.stopTask("WriteQueue.flush1"); + } + } + } finally { + PerfMark.stopTask("WriteQueue.periodicFlush"); + // Mark the write as done, if the queue is non-empty after marking trigger a new write. + scheduled.set(false); + if (!queue.isEmpty()) { + scheduleFlush(); + } + } +} +``` + +可以看到gRPC的做法是将一个个数据包抽象为QueueCommand,用户线程发起请求时并非真的直接写出,而是先提交到WriteQueue中,并手动调度EventLoop执行任务,EventLoop需要执行的逻辑便是从QueueCommand的队列中取出并执行,当写入数据达到DEQUE_CHUNK_SIZE(默认128)时,才会调用一次`channel.flush`,将缓冲区的内容刷写到对端。当队列的Command都消费完毕后,还会按需执行一次兜底的flush防止消息丢失。以上便是gRPC的批量写入逻辑。 + +同样的,我们检查了triple模块的源码发现也有一个名为WriteQueue的类,其目的同样是批量写入消息,减少I/O次数。但从tcpdump的结果来看,该类的逻辑似乎并没有达到预期,消息仍旧是一个个按序发送并没有批量。 + +我们可以将断点打在triple的WriteQueue构造器中,检查triple的WriteQueue为什么没有达到批量写的预期。如下图所示。 + +![debug-writequeue.png](/imgs/blog/2023/6/triple/debug-writequeue.png) + +可以看到WriteQueue会在TripleClientStream构造器中实例化,而TripleClientStream则是与HTTP/2中的Stream对应,每次发起一个新的请求都需要构建一个新的Stream,也就意味着每个Stream都使用了不同的WriteQueue实例,多个Stream提交Command时并没有提交到一块去,使得不同的Stream发起请求在结束时都会直接flush,导致I/O过高,严重的影响了triple协议的性能。 + +分析出原因后,优化改动就比较清晰了,那便是将WriteQueue作为连接级共享,而不是一个连接下不同的Stream各自持有一个WriteQueue 实例。当WriteQueue连接级别单例后,可以充分利用其持有的ConcurrentLinkedQueue队列作为缓冲,实现一次flush即可将多个不同Stream的数据刷写到对端,大幅度triple协议的性能。 + +## 调优成果 + +最后我们来看一下triple本次优化后成果吧。可以看到小报文场景下性能提高明显,最高提升率达`45%`!而遗憾的是较大报文的场景提升率有限,同时较大报文场景也是triple协议未来的优化目标之一。 + +![Untitled](/imgs/blog/2023/6/triple/Untitled.png) + +## 总结 + +性能解密之外,在下一篇文章中我们将会带来 Triple 易用性、互联互通等方面的设计与使用案例,将主要围绕以下两点展开,敬请期待。 + +在 Dubbo 框架中使用 Triple 协议,可以直接使用 Dubbo 客户端、gRPC 客户端、curl、浏览器等访问你发布的服务,不需要任何额外组件与配置。 + +Dubbo 当前已经提供了 Java、Go、Rust 等语言实现,目前正在推进 Node.js 等语言的协议实现,我们计划通过多语言和 Triple 协议打通移动端、浏览器、后端微服务体系。 \ No newline at end of file diff --git a/content/zh-cn/contact/committer/_index.md b/content/zh-cn/contact/committer/_index.md index 41befd8f3429..37b6ace35a27 100755 --- a/content/zh-cn/contact/committer/_index.md +++ b/content/zh-cn/contact/committer/_index.md @@ -5,5 +5,5 @@ description: Dubbo Committer 指南 linkTitle: Committer 指南 title: Committer 指南 type: docs -weight: 3 +weight: 4 --- diff --git a/content/zh-cn/contact/contributor/_index.md b/content/zh-cn/contact/contributor/_index.md index ce5efafa087f..cb369cfd8d2a 100755 --- a/content/zh-cn/contact/contributor/_index.md +++ b/content/zh-cn/contact/contributor/_index.md @@ -5,5 +5,5 @@ description: Dubbo Contributor 指南 linkTitle: Contributor 指南 title: Contributor 指南 type: docs -weight: 2 +weight: 3 --- diff --git a/content/zh-cn/github/_index.md b/content/zh-cn/contact/github/_index.md similarity index 99% rename from content/zh-cn/github/_index.md rename to content/zh-cn/contact/github/_index.md index cbad71a7bc34..23a53dacbbd7 100755 --- a/content/zh-cn/github/_index.md +++ b/content/zh-cn/contact/github/_index.md @@ -1,10 +1,10 @@ --- title: "Github" linkTitle: "Github" -menu: - main: - post: - weight: 70 +type: docs +weight: 2 +aliases: + - /zh-cn/github/ ---
diff --git a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/_index.md b/content/zh-cn/deprecated/triple/_index.md.bak similarity index 100% rename from content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/_index.md rename to content/zh-cn/deprecated/triple/_index.md.bak diff --git a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/idl.md b/content/zh-cn/deprecated/triple/idl.md.bak similarity index 100% rename from content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/idl.md rename to content/zh-cn/deprecated/triple/idl.md.bak diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/overview.md b/content/zh-cn/deprecated/triple/overview.md.bak similarity index 81% rename from content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/overview.md rename to content/zh-cn/deprecated/triple/overview.md.bak index 246db224d4dd..cca294e935de 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/overview.md +++ b/content/zh-cn/deprecated/triple/overview.md.bak @@ -16,7 +16,7 @@ weight: 1 ## 概述说明 -`Triple` 协议的格式和原理请参阅 [RPC 通信协议](/zh-cn/docs/concepts/rpc-protocol/) +`Triple` 协议的规范 [协议规范](/zh-cn/overview/reference/protocols/triple/)。 根据 Triple 设计的目标,`Triple` 协议有以下优势 @@ -35,17 +35,3 @@ weight: 1 对于需要网关接入的 Dubbo 用户,Triple 协议提供了更加原生的方式,让网关开发或者使用开源的 grpc 网关组件更加简单。网关可以选择不解析 payload ,在性能上也有很大提高。在使用 Dubbo 协议时,语言相关的序列化方式是网关的一个很大痛点,而传统的 HTTP 转 Dubbo 的方式对于跨语言序列化几乎是无能为力的。同时,由于 Triple 的协议元数据都存储在请求头中,网关可以轻松的实现定制需求,如路由和限流等功能。 -## 常见问题 - -### Q1 -protobuf 类找不到 - -由于 Triple 协议底层需要依赖 protobuf 协议进行传输,即使定义的服务接口不使用 protobuf 也需要在环境中引入 protobuf 的依赖。 - -```xml - - com.google.protobuf - protobuf-java - 3.19.4 - -``` \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/streaming.md b/content/zh-cn/deprecated/triple/streaming.md.bak similarity index 100% rename from content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/streaming.md rename to content/zh-cn/deprecated/triple/streaming.md.bak diff --git a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/wrap.md b/content/zh-cn/deprecated/triple/wrap.md.bak similarity index 100% rename from content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/wrap.md rename to content/zh-cn/deprecated/triple/wrap.md.bak diff --git a/content/zh-cn/docsv2.7/user/references/protocol/gRPC.md b/content/zh-cn/docsv2.7/user/references/protocol/gRPC.md index f7da1ad7ed41..4be449559bce 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/gRPC.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/gRPC.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/gRPC/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/grpc/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/grpc/ description: grpc:// 协议参考手册 linkTitle: grpc:// title: gRPC 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/hessian.md b/content/zh-cn/docsv2.7/user/references/protocol/hessian.md index 2a520762cd82..3b9ac70fead0 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/hessian.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/hessian.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/hessian/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/hessian/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/hessian/ description: hessian:// 协议参考手册 linkTitle: hessian:// title: hessian 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/http.md b/content/zh-cn/docsv2.7/user/references/protocol/http.md index 7f6bff0921d3..a85e60c2ffaa 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/http.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/http.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/http/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/http/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/http/ description: http:// 协议参考手册 linkTitle: http:// title: http 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/memcached.md b/content/zh-cn/docsv2.7/user/references/protocol/memcached.md index bae309d8af72..4f71a414c7cd 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/memcached.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/memcached.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/memcached/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/memcached/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/memcached/ description: memcached:// 协议参考手册 linkTitle: memcached:// title: memcached 协议 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview.md b/content/zh-cn/docsv2.7/user/references/protocol/overview.md similarity index 97% rename from content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview.md rename to content/zh-cn/docsv2.7/user/references/protocol/overview.md index b7dfbf965614..45e61042e5bb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/overview.md @@ -2,19 +2,14 @@ aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/overview/ - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/overview/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/overview/ description: 协议概述 linkTitle: 协议概述 title: 协议概述 type: docs -weight: 1 --- - - - - - -Dubbo3 提供了 Triple(Dubbo3)、Dubbo2 协议,这是 Dubbo 框架的原生协议。除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治理体系, +Dubbo3 提供了 Triple、Dubbo2 协议,这是 Dubbo 框架的原生协议。除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治理体系, 包括 gRPC、Thrift、JsonRPC、Hessian2、REST 等。以下重点介绍 Triple 与 Dubbo2 协议。 ## 协议说明 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/redis.md b/content/zh-cn/docsv2.7/user/references/protocol/redis.md index d0e3304efc2d..d11f2f3e2f51 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/redis.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/redis.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/redis/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/redis/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/redis/ description: redis:// 协议参考手册 linkTitle: redis:// title: redis 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/rmi.md b/content/zh-cn/docsv2.7/user/references/protocol/rmi.md index 972aa3e048a9..bbb49d5a0ce2 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/rmi.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/rmi.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/rmi/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/rmi/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rmi/ description: rmi:// 协议参考手册 linkTitle: rmi:// title: rmi 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/thrift.md b/content/zh-cn/docsv2.7/user/references/protocol/thrift.md index b209b865f948..2b735c584023 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/thrift.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/thrift.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/thrift/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/thrift/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/thrift/ description: thrift:// 协议参考手册 linkTitle: thrift:// title: thrift 协议 diff --git a/content/zh-cn/docsv2.7/user/references/protocol/webservice.md b/content/zh-cn/docsv2.7/user/references/protocol/webservice.md index fedcf75f5d4f..7879972659e8 100644 --- a/content/zh-cn/docsv2.7/user/references/protocol/webservice.md +++ b/content/zh-cn/docsv2.7/user/references/protocol/webservice.md @@ -1,6 +1,8 @@ --- aliases: - /zh/docsv2.7/user/references/protocol/webservice/ + - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/webservice/ + - /zh-cn/overview/mannual/java-sdk/reference-manual/protocol/webservice/ description: webservice:// 协议参考手册 linkTitle: webservice:// title: webservice 协议 diff --git a/content/zh-cn/download/_index.md b/content/zh-cn/download/_index.md index 9a37f8867815..b7236e868004 100644 --- a/content/zh-cn/download/_index.md +++ b/content/zh-cn/download/_index.md @@ -4,9 +4,8 @@ aliases: description: 版本发布 layout: basic linkTitle: 版本发布 -menu: - main: - weight: 30 +hide_summary: true +toc_hide: true no_list: true title: 版本发布 type: docs diff --git a/content/zh-cn/overview/core-features/service-definition.md b/content/zh-cn/overview/core-features/service-definition.md deleted file mode 100644 index 9de24816ae92..000000000000 --- a/content/zh-cn/overview/core-features/service-definition.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -aliases: - - /zh/overview/core-features/service-definition/ -description: 微服务开发 -linkTitle: 微服务开发 -title: 微服务开发 -type: docs -weight: 1 ---- - - -Dubbo 解决企业微服务从开发、部署到治理运维的一系列挑战,Dubbo 为开发者提供从项目创建、开发测试,到部署、可视化监测、流量治理,再到生态集成的全套服务。 -* **开发层面**,Dubbo 提供了 Java、Go、Rust、Node.js 等语言实现并定义了一套微服务开发范式,配套脚手架可用于快速创建微服务项目骨架 -* **部署层面**,Dubbo 应用支持虚拟机、Docker 容器、Kubernetes、服务网格架构部署 -* **服务治理层面**,Dubbo 提供了地址发现、负载均衡、流量管控等治理能力,官方还提供 Admin 可视化控制台、丰富的微服务生态集成 - -## 开发 - -接下来以 Java 体系 Spring Boot 项目为例讲解 Dubbo 应用开发的基本步骤,整个过程非常直观简单,其他语言开发过程类似。 - -### 创建项目 -Dubbo 微服务项目脚手架(支持浏览器页面、命令行和 IDE)可用于快速创建微服务项目,只需要告诉脚手架期望包含的功能或组件,脚手架最终可以帮助开发者生成具有必要依赖的微服务工程。更多脚手架使用方式的讲解,请参见任务模块的 [通过模板生成项目脚手架](../../tasks/develop/template/) - -![脚手架示例图](/imgs/v3/advantages/initializer.png) - -### 开发服务 - -**1. 定义服务** - -```java -public interface DemoService { - String hello(String arg); -} -``` - -**2. 提供业务逻辑实现** - -```java -@DubboService -public class DemoServiceImpl implements DemoService { - public String hello(String arg) { - // put your microservice logic here - } -} -``` - -### 发布服务 -**1. 发布服务定义** - -为使消费方顺利调用服务,服务提供者首先要将服务定义以 Jar 包形式发布到 Maven 中央仓库。 - -**2. 对外暴露服务** - -补充 Dubbo 配置并启动 Dubbo Server - -```yaml -dubbo: - application: - name: dubbo-demo - protocol: - name: dubbo - port: -1 - registry: - address: zookeeper://127.0.0.1:2181 -``` - -### 调用服务 - -首先,消费方通过 Maven/Gradle 引入 `DemoService` 服务定义依赖。 - -```xml - - org.apache.dubbo - dubbo-demo-interface - 3.2.0 - -``` - -编程注入远程 Dubbo 服务实例 - -```java -@Bean -public class Consumer { - @DubboReference - private DemoService demoService; -} -``` - -以上是 Dubbo 微服务开发的流程性说明,实际开发的详细指导步骤请参见: -* [Java 微服务开发入门](../../quickstart/java) -* [Go 微服务开发入门](../../quickstart/go) -* [Rust 微服务开发入门](../../quickstart/rust) -* [Node.js 微服务开发入门](https://github.com/apache/dubbo-js) - -## 部署 -Dubbo 原生服务可打包部署到 Docker 容器、Kubernetes、服务网格 等云原生基础设施和微服务架构。 - -关于不同环境的部署示例,可参考: -* [部署 Dubbo 服务到 Docker 容器](../../tasks/deploy/deploy-on-docker) -* [部署 Dubbo 服务到 Kubernetes](../../tasks/deploy/deploy-on-k8s-docker) - -## 治理 -对于服务治理,绝大多数应用只需要增加以下配置即可,Dubbo 应用将具备地址发现和负载均衡能力。 - -```yaml -dubbo: - registry: - address: zookeeper://127.0.0.1:2181 -``` - -部署并打开 [Dubbo Admin 控制台](../../tasks/deploy),可以看到集群的服务部署和调用数据 - -![Admin](/imgs/v3/what/admin.png) - -除此之外,Dubbo Amin 还可以通过以下能力提升研发测试效率 -* 文档管理,提供普通服务、IDL 文档管理 -* 服务测试 & 服务 Mock -* 服务状态查询 - -对于更复杂的微服务实践场景,Dubbo 还提供了更多高级服务治理特性,具体请参见文档了解更多。包括: -* 流量治理 -* 动态配置 -* 限流降级 -* 数据一致性 -* 可观测性 -* 多协议 -* 多注册中心 -* 服务网格 diff --git a/content/zh-cn/overview/core-features/service-definition.md.bak b/content/zh-cn/overview/core-features/service-definition.md.bak deleted file mode 100644 index 27fd038a8e5d..000000000000 --- a/content/zh-cn/overview/core-features/service-definition.md.bak +++ /dev/null @@ -1,497 +0,0 @@ ---- -type: docs -title: "Dubbo 一站式微服务开发" -linkTitle: "微服务开发" -weight: 1 -description: "" -feature: - title: 定义服务 - description: > - 定义服务 ---- - -本文可帮助开发者了解 Dubbo 微服务项目构建、开发、部署、观测、治理的全生命周期基本流程,这篇文档更多的是展示 Dubbo 的开发流程与开发模式。 - -如果您需要可实际动手实践的示例,期望能跟随示例讲解一步步的完成开发,请参考以下每个语言的快速开始: -* [Java 快速开始]() -* [Go 快速开始]() -* [Rust 快速开始]() - -## 第一步,准备微服务环境 -在开发微服务之前,您需要安装相关的微服务基础设施如注册中心、服务治理控制台等。 - -以下文档可以引导您快速的安装 Nacos、Zookeeper、Dubbo Admin 等注册中心与控制台组件。 -* [Kubernetes 环境安装]() -* [传统虚拟机环境安装]() - -安装注册中心、服务治理中心等组件 - -## 第一步,初始化项目 -如果您正在使用 Java 或 Go 开发微服务,则可以使用 Dubbo 提供的脚手架快速创建项目骨架,骨架项目包含开发 Dubbo 必须的依赖和配置,同时还包含一些对应的微服务开发的常用模式: -* Java 项目脚手架 -* Go 项目脚手架 - -以下是一个脚手架示例项目结构: - -![骨架项目截图]() - -可以直接导入 IDE 开始微服务业务开发。对于除 Java 和 Go 之外的其他语言,您也可以基于 Dubbo 提供的指引快速的创建项目。 - -## 第二步,定义服务 -服务是 Dubbo 开发、通信和治理的基本单位,通常我们讲的 Dubbo 服务是一个类似编程语言接口的概念,它是一系列可以被调用的方法的集合。通常来说,服务提供者 (Server) 负责提供服务定义的实现,而服务消费者 (Client) 基于服务定义对服务提供者发起 RPC 调用。 - -Dubbo 提供多种语言实现,开发者既可以选择以语言特有的方式定义服务,也可以选择使用语言中立的 IDL (Proto Buffers) 定义服务。 - -{{< tabpane langEqualsHeader=true >}} -{{< tab header="Java" >}} -public interface DemoService { - String sayHello(String name); -} -{{< /tab >}} -{{< tab header="Go" >}} -type DemoService struct { - SayHello func(req []string) (string, error) -} -{{< /tab >}} -{{< tab header="IDL" >}} -syntax = "proto3"; - -option java_multiple_files = true; -option java_package = "org.apache.dubbo.demo.hello"; -option java_outer_classname = "HelloWorldProto"; -option objc_class_prefix = "HLW"; - -package helloworld; - -service Greeter{ - // unary - rpc greet(HelloRequest) returns (HelloReply); -} - -// The request message containing the user's name. -message HelloRequest { - string name = 1; -} - -// The response message containing the greetings -message HelloReply { - string message = 1; -} -{{< /tab >}} -{{< /tabpane >}} - -## 第三步,开发服务提供者 -服务提供者(Server)需要完成两件事情: -1. 基于上一步的服务定义给出业务逻辑实现 -2. 启动一个 Dubbo Server 监听来自客户端的请求并返回服务响应 -

- -首先,开发者遵循服务定义规范编写业务逻辑实现,如业务类需要实现特定接口或者抽象某个抽象类等。 -

- -{{< tabpane langEqualsHeader=true >}} -{{< tab header="Java" >}} -public class DemoServiceImpl implements DemoService { - @Override - public String sayHello(String name) { - return "Hello " + name + ", response from provider: " + RpcContext.getServiceContext().getLocalAddress(); - } -} -{{< /tab >}} -{{< tab header="Go" >}} -type DemoServiceImpl struct { -} - -func (u *DemoServiceImpl) SayHello(msg string) (string, error) { - return "Response message!", nil -} -{{< /tab >}} -{{< tab header="IDL Java" lang="Java" >}} -// Code generated by Dubbo plugin of protoc compiler -// Greeter.java -public interface Greeter { - String JAVA_SERVICE_NAME = "org.apache.dubbo.demo.hello.Greeter"; - String SERVICE_NAME = "helloworld.Greeter"; - - org.apache.dubbo.demo.hello.HelloReply greet(org.apache.dubbo.demo.hello.HelloRequest request); - - default CompletableFuture greetAsync(org.apache.dubbo.demo.hello.HelloRequest request){ - return CompletableFuture.completedFuture(greet(request)); - } - // ...... -} - -// Code generated by Dubbo plugin of protoc compiler -// DubboGreeterTriple.java -public static abstract class GreeterImplBase implements Greeter, ServerService { - @Override - public org.apache.dubbo.demo.hello.HelloReply greet(org.apache.dubbo.demo.hello.HelloRequest request){ - throw unimplementedMethodException(greetMethod); - } - // ...... -} - -// The actual business logic that is written and provided by Dubbo user -public class GreeterServiceImpl extends DubboGreeterTriple.GreeterImplBase { - @Override - public HelloReply greet(HelloRequest request) { - return HelloReply.newBuilder() - .setMessage("Hello " + request.getName()) - .build(); - } -} -{{< /tab >}} -{{< tab header="IDL Go" lang="Go" >}} -// Paste the protoc generated and user provided code snippet here. -{{< /tab >}} -{{< tab header="IDL Rust" lang="Rust" >}} -use ... - -#[allow(dead_code)] -#[derive(Default, Clone)] -struct GreeterServerImpl { - name: String, -} - -// #[async_trait] -#[async_trait] -impl Greeter for GreeterServerImpl { - async fn greet( - &self, - request: Request, - ) -> Result, dubbo::status::Status> { - println!("GreeterServer::greet {:?}", request.metadata); - - Ok(Response::new(GreeterReply { - message: "hello, dubbo-rust".to_string(), - })) - } -} -{{< /tab >}} -{{< tab header="IDL Node.js" >}} -// Paste the protoc generated and user provided code snippet here. -{{< /tab >}} -{{< /tabpane >}} - -
-配置并注册以上服务实现类,同时,还可以指定服务参数、注册中心地址、协议与端口等配置,以下是支持几种配置格式示例: -

- -{{< tabpane langEqualsHeader=true >}} -{{< tab header="YAML" lang="yaml" >}} -dubbo: - application: - name: demo-provider - protocol: - name: dubbo - port: -1 - registry: - address: zookeeper://127.0.0.1:2181 -{{< /tab >}} -{{< tab header="API" lang="java" >}} -public static void main(String[] args) throws Exception { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(DemoService.class); - service.setRef(new DemoServiceImpl()); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("dubbo-demo-api-provider")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1)) - .service(service) - .start() - .await(); -} -{{< /tab >}} -{{< tab header="Spring XML" >}} - - - - - - - - - - - - - - - -{{< /tab >}} -{{< tab header="Java Annotation" lang="Java" >}} -@DubboService -public class DemoServiceImpl implements DemoService { - // business implementation -} - -public class DemoServiceComponent implements DemoService { - @DubboReference - private DemoService demoService; -} -{{< /tab >}} -{{< tab header="dubbo.properties" lang="properties" >}} -dubbo.application.name=dubbo-demo-annotation-provider -dubbo.protocol.name=dubbo -dubbo.protocol.port=-1 -dubbo.registry.address=zookeeper://127.0.0.1:2181 -{{< /tab >}} -{{< /tabpane >}} - -
-启动 Server 监听服务 -

- -{{< tabpane langEqualsHeader=true >}} -{{< tab header="Java" >}} -public static void main(String[] args) throws Exception { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(DemoService.class); - service.setRef(new DemoServiceImpl()); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("dubbo-demo-api-provider")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .protocol(new ProtocolConfig(CommonConstants.DUBBO, -1)) - .service(service) - .start() - .await(); -} -{{< /tab >}} -{{< tab header="Go" >}} -func main() { - config.SetProviderService(&DemoServiceImpl{}) - if err := config.Load(); err != nil { - panic(err) - } - select {} -} -{{< /tab >}} -{{< tab header="Rust" >}} -#[tokio::main] -async fn main() { - register_server(GreeterServerImpl { - name: "greeter".to_string(), - }); - - // Dubbo::new().start().await; - Dubbo::new() - .with_config({ - let r = RootConfig::new(); - match r.load() { - Ok(config) => config, - Err(_err) => panic!("err: {:?}", _err), // response was droped - } - }) - .start() - .await; -} -{{< /tab >}} -{{< tab header="Node.js" >}} -// Put node.js server bootstrapping snippet here -{{< /tab >}} -{{< /tabpane >}} - -
-至此,能监听请求并提供特定服务的 Dubbo Server 就开发和启动完成了。 - -## 第四步,开发服务消费者 - -接下来就是开发一个调用服务的 Client 了 - -> 在 Client 调用服务的前提是需要有服务定义的依赖,这可以通过语言特定的依赖分发系统或 IDL 管理系统实现。 - -通过配置/API声明服务调用,告诉 Dubbo 要生成 Proxy 的服务,同时可以指定服务发现的注册中心等配置: - -{{< tabpane langEqualsHeader=true >}} -{{< tab header="YAML" lang="yaml" >}} -dubbo: - application: - name: demo-consumer - registry: - address: zookeeper://127.0.0.1:2181 -{{< /tab >}} -{{< tab header="API" lang="java" >}} -private static void main(String[] args) { - ReferenceConfig reference = new ReferenceConfig<>(); - reference.setInterface(DemoService.class); - reference.setGeneric("true"); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("demo-consumer")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .reference(reference) - .start(); -} -{{< /tab >}} -{{< tab header="Spring XML" >}} - - - - - - - - -{{< /tab >}} -{{< tab header="Java Annotation" lang="Java" >}} -public class SpringApplication { - @DubboReference - private DemoService demoService; -} -{{< /tab >}} -{{< tab header="dubbo.properties" lang="properties" >}} -dubbo.application.name=dubbo-demo-annotation-provider -dubbo.registry.address=zookeeper://127.0.0.1:2181 -{{< /tab >}} -{{< /tabpane >}} - -
-启动 Client -

- -{{< tabpane langEqualsHeader=true >}} -{{< tab header="Java" >}} -public static void main(String[] args) throws Exception { - // ... - DemoService demoService = bootstrap.getCache().get(reference); - String message = demoService.sayHello("dubbo"); - System.out.println("Result: " + message); -} -{{< /tab >}} -{{< tab header="Go" >}} -func main() { - config.SetProviderService(&DemoServiceImpl{}) - if err := config.Load(); err != nil { - panic(err) - } - select {} -} -{{< /tab >}} -{{< tab header="Rust" >}} -#[tokio::main] -async fn main() { - let mut cli = GreeterClient::new().with_uri("http://127.0.0.1:8888".to_string()); - - println!("# unary call"); - let resp = cli - .greet(Request::new(GreeterRequest { - name: "message from client".to_string(), - })) - .await; - let resp = match resp { - Ok(resp) => resp, - Err(err) => return println!("{:?}", err), - }; - let (_parts, body) = resp.into_parts(); - println!("Response: {:?}", body); -} -{{< /tab >}} -{{< tab header="Node.js" >}} -// Put node.js client snippet here -{{< /tab >}} -{{< /tabpane >}} - -服务调用 - -## 第五步,打包部署 - -#### 语言特定形式分发包 - -您可以选择以语言特定方式打包 Dubbo 开发的服务 (如 Java Jar、Go Module 等),并以语言提供的发机制将二进制包分发出去。一般来讲,要注意一以下几点: -* 服务定义最好作为单独的二进制包由 Server 端定义并打包分发,以便所有 Client 都能依赖并基于服务定义编码; -* Dubbo Server 和 Dubbo Client 的打包与分发与普通应用完全一样,如 Java 应用就可以用 Maven 或 Gradle 直接打包分发; -* 如果您是以 IDL 方式定义服务,还需要考虑 IDL 的分发与管理方式; - -#### Docker 镜像 - -在当今容器时代,打包为 Docker 镜像已变为更通用的分发形式 - -```sh -docker build -t ${your-organization}/${project-name}:${tag-or-version} . -``` - -> 通常,在脚手架生成的根目录下 `/deploy` 有预先生成的镜像打包 Dockerfile 模版,可以按需修改后直接用来打包。 - - -## 第六步,部署 -Dubbo 微服务支持多种部署架构,与云原生基础设施做了很好的适配: -* 传统的自建服务治理体系模式,需自行维护微服务需要的注册中心集群、配置中心集群等 -* 基于 Kubernetes Native Service 微服务体系,此时 Kubernetes 集群承担服务抽象、注册中心、配置中心等角色 -* 服务网格架构,服务治理角色由控制面承担,Dubbo 作为数据面组件与 Sidecar 部署在一起,或者采用无 Sidecar 的 Proxyless 架构 - -#### 传统自建注册、配置中心模式 - -Dubbo 微服务需要依赖一些中心化集群协调状态,以下是一个抽象的 Dubbo 部署架构图: - -![三中心部署架构图]() - -图:部署在虚拟机或 Kubernetes 集群的传统 Dubbo 微服务架构 - -* 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现 -* 配置中心 (可选) - * 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性 - * 负责服务治理规则(路由规则、动态配置等)的存储与推送。 -* 元数据中心 (可选) - * 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等) - * 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展 - -以上三个中心集群并不是运行 Dubbo 的必要条件,用户完全可以根据自身业务情况决定只启用其中一个或多个,以达到简化部署的目的。通常情况下,所有用户都会从独立的注册中心开始 Dubbo 服务开发,而配置中心、元数据中心则会在微服务演进的过程中逐步的按需被引入进来。注册中心、配置中心和元数据中心都是逻辑概念,它们完全可以是同一个物理集群,如部署一个 Zookeeper 集群同时作为注册中心、配置中心和元数据中心。 - -如您是在 Kubernetes 搭建 Dubbo 微服务集群,请参考 [如何在 Kubernetes 集群部署 Dubbo 服务]() 了解更多。 - -#### Kubernetes 原生服务 - -![参考下 Spring Kubernetes 等的架构图]() - -在这种模式下,Dubbo 服务将与 Kubernetes 原生服务实现概念对齐,同时,开发者也不再需要部署独立的注册、配置中心集群,这部分职责由 Kubernetes 及相应组件如 Service、ConfigMap、Deployment 等承担。具体是原理上,是由 Dubbo 节点直接与 Kubernete api-server 或 DNS 通信实现。 - -请参考 [Dubbo Kubernetes 原生服务任务]() 了解更多 - -#### 服务网格 - -Dubbo 服务可以无缝接入 Istio 体系,并且,Dubbo 支持更灵活的数据面部署形式 -* Sidecar 模式,Dubbo 可以与 Envoy 等代理部署在一起,实现流量拦截和治理 -* Proxyless 模式,Dubbo 通过直接与 Istio 等控制面通信,实现与 Sidecar 模式对等能力的同时,减少了部署成本和性能损耗。 - -![服务网格部署架构图](/imgs/v3/mesh/thinsdk-envoy.png) - -具体可参见 [Dubbo 服务网格]() 部分说明。 - -## 第七步,观测服务状态 - -可以通过 Dubbo 官方提供的 Admin 控制台非常方便的观测服务运行状态。 - -![Admin 截图]() - -请参考 [如何部署 Admin]() 了解如何将 Admin 部署您的开发或生产环境。 - -> 注意:部署过程中必须要配置 Admin 连接到您正在使用的注册中心或配置中心集群,保证 Admin 和 Dubbo 微服务集群共享相同数据源。 - -如果您将 Dubbo 部署在服务网格架构,则还可以使用对应控制面产品支持的控制台来观测 Dubbo 服务状态,如 Istio、Kiali。更多可观测能力如 Accessing Log、Tracing 等,请参考[可观测性]()文档。 - -## 第八步,服务治理 -为了使 Dubbo 服务稳定、可控的运行,我们需要在运行态对 Dubbo 服务进行治理。 - -首先,可以通过 Dubbo Admin 完成绝大多数的治理需求,如查看服务状态、下发流量规则等 - -![Dubbo Admin 治理效果图]() - -对于更高阶的治理诉求,可通过以下内容了解: - -* [网关流量接入](),通过网关实现前端 HTTP 流量接入 Dubbo 服务 -* [限流降级](),通过 Sentinel 等突发流量,就要用到限流降级能力, -* [数据一致性](),了解 Dubbo 服务的分布式事物解决方案 -* [全链路追踪](),了解 Dubbo 服务如何接入 Zipkin、Skywalking、OpenTracing 等全链路监控组件 -* [服务发现](),了解 Dubbo 的服务发现机制和扩展实现 -* [流量管控](),了解 Dubbo 丰富的流量管控规则定义及使用方式 - diff --git a/content/zh-cn/overview/mannual/_index.md b/content/zh-cn/overview/mannual/_index.md index 3b6de506518d..eb0bb4271d55 100755 --- a/content/zh-cn/overview/mannual/_index.md +++ b/content/zh-cn/overview/mannual/_index.md @@ -3,7 +3,6 @@ aliases: - /zh/overview/mannual/ - /zh/docs3-v2/ - /zh-cn/docs3-v2/ -always_unfold: true description: Dubbo SDK 用户手册 feature: description: | @@ -40,7 +39,7 @@ weight: 6

- Golang SDK + Go SDK

Dubbo Golang SDK 手册

@@ -50,9 +49,9 @@ weight: 6

- Erlang SDK + Node.js

-

Dubbo Erlang SDK 手册

+

Dubbo Node.js SDK 手册

@@ -60,9 +59,9 @@ weight: 6

- Dubbo Go Pixiu + Web SDK

-

Dubbo Go Pixiu 手册

+

Dubbo Web SDK 手册

@@ -72,11 +71,10 @@ weight: 6

Rust SDK

-

Rust SDK 手册

+

Dubbo Rust SDK 手册

-
diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/_index.md b/content/zh-cn/overview/mannual/dubbo-go-pixiu/_index.md deleted file mode 100755 index ffc0955c4479..000000000000 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/_index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/dubbo-go-pixiu/ - - /zh-cn/docs3-v2/dubbo-go-pixiu/ -description: Dubbo Go Pixiu -linkTitle: Dubbo Go Pixiu -title: Dubbo Go Pixiu -type: docs -weight: 3 ---- diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/_index.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/_index.md index 502fb0eb9b06..28d93040666e 100644 --- a/content/zh-cn/overview/mannual/golang-sdk/quickstart/_index.md +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/_index.md @@ -2,6 +2,8 @@ aliases: - /zh/docs3-v2/golang-sdk/quickstart/ - /zh-cn/docs3-v2/golang-sdk/quickstart/ + - /zh/overview/quickstart/go/ + - /zh-cn/overview/quickstart/go/ description: Dubbo-go 快速开始 linkTitle: 快速开始 title: 快速开始 diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/customize.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/customize.md new file mode 100644 index 000000000000..ed928ff101ae --- /dev/null +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/customize.md @@ -0,0 +1,135 @@ +--- +description: +linkTitle: 构建自己的 Dubbo 微服务 +title: 如何定制开发 Dubbo 应用并完成打包、部署 +type: docs +weight: 2 +--- + +接下来,我们将创建一个基于 Spring Boot 的 Dubbo 微服务应用,演示如何在此基础上进行定制开发,并最终打包部署到 Kubernetes 集群。 + +{{% alert title="提示" color="primary" %}} +如果您只想快速体验 Dubbo 功能,请参考上一篇 [如何快速开发和部署一个 Dubbo 应用](../develop)。 +{{% /alert %}} + +## 前置条件 +1. 本地可访问的 Kubernetes 集群 +2. [安装 dubboctl](../develop/#前置条件),确保通过以下命令初始化微服务集群 + + ```shell + dubboctl manifest install --profile=demo + ``` + +## 快速创建应用 +除了上一篇用到的 `dubboctl create` 之外,对于 Java 微服务体系,我们还可以使用 start.dubbo.apache.org(支持浏览器页面和 IntelliJ IDEA 插件)脚手架创建功能更丰富的应用模版。 + +
+
+ +
+
+ +请参照以上视频步骤创建示例项目,整个过程只需要一分钟时间。 + +## 定制开发微服务 + +请下载上一步创建的示例项目并导入您喜爱的 IDE 工具,接下来就可以对您的微服务应用进行定制化开发了。 + +### 定义服务 + +### 发布服务 + +### 本地启动应用 +在 IDE 开发环境中,通过以下入口类可以快速启动 Dubbo 应用。 + +{{% alert title="注意" color="warning" %}} +由于配置文件中启用了注册中心,为了能够成功启动应用,您需要首先在本地启动 NacosZookeeper 注册中心 server。 +{{% /alert %}} + +![SpringApplication Run](/imgs/v3/quickstart/application-run.png) + +我们在本地成功使用 Triple 协议发布了服务,在应用启动成功后,可直接使用 cURL 测试服务是否已经正常运行: + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/com.example.demo.dubbo.api.DemoService/sayHello/ +``` + +## 打包构建镜像 +进入您的项目根目录,执行以下命令基于最新代码打包 Docker 镜像: + +```shell +dubboctl build +``` + +`build` 命令会将源码打包为镜像,并推送到远端仓库,取决于网络情况,可能需要一定时间等待命令执行完成。 + +```shell +dubboctl deploy +``` + +`deploy` 命令会使用刚刚 `build` 打包的镜像生成 Kubernetes 资源清单。命令执行成功后,在当前目录看到生成的 `kube.yaml` 文件,其中包括 deployment、service 等 kubernetes 资源定义。 + +接下来,将应用部署到 Kubernetes 环境。 + +```shell +kubectl apply -f ./kube.yaml +``` + +检查部署状态 +```shell +kubectl get services +``` + +## 更多内容 +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+
+

+ 如何在虚拟机环境部署 Dubbo 应用 +

+

如果您当前无法使用 Kubernetes,请参考如何在虚拟机环境部署 Dubbo 应用。

+
+
+
+
+
+
+

+ Dubbo + Istio 服务网格 +

+

如果您计划使用服务网格,可以了解如何让 Dubbo 应用配合 Istio 控制面部署。

+
+
+
+
+
+ +
+
+ +
+
+
+ +{{< /blocks/section >}} diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/develop.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/develop.md new file mode 100644 index 000000000000..50969dd6da14 --- /dev/null +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/develop.md @@ -0,0 +1,185 @@ +--- +description: +linkTitle: 快速体验 Dubbo 开发与部署 +title: 快速开发和部署一个 Dubbo 应用 +type: docs +weight: 1 +--- + +接下来,我们将跟随文档完成: +1. 创建一个 Dubbo 应用 +2. 将应用打包为 Docker 镜像 +3. 将镜像部署到 Kubernetes 集群 + +## 前置条件 +{{% alert title="注意" color="warning" %}} +我们会将应用部署到 Kubernetes,因此请确保您有一个本地环境可访问的 Kuberentes 集群。 +{{% /alert %}} + +Dubbo 提供了相应的工具和解决方案来简化整个微服务开发、打包与部署过程,所以开始前我们需要先安装 `dubboctl` 工具。 + +```sh +curl -L https://dubbo.apache.org/downloadKube.sh | sh - +``` + +```shell +cd dubbo-kube-$version +``` + +```sh +export PATH=$PWD/bin:$PATH +``` +## 快速创建 Dubbo 应用 +在任意目录,运行以下命令即可生成一个基本的 Dubbo 应用。 + +{{< tabpane >}} +{{< tab header="请选择开发语言:" disabled=true />}} +{{< tab header="Java" lang="shell" >}} +dubboctl create -l java dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Go" lang="shell" >}} +dubboctl create -l go dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Web" lang="shell" >}} +dubboctl create -l web dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Node.js" lang="shell" >}} +dubboctl create -l nodejs dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Rust" lang="shell" >}} +dubboctl create -l rust dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< /tabpane >}} + +
+以 `java` 为例,项目目录结构如下: + +```Java +``` + +## 初始化微服务集群 +dubboctl 可以帮助我们快速的初始化微服务集群中需要的注册中心、监控系统、服务治理中心等组件,只需要运行以下命令: + +```sh +dubboctl manifest install --profile=demo +``` + +> 作为示例用途,以上命令会一键安装 Zookeeper、Console、Prometheus、Grafana、Zipkin、Ingress 等组件,关于 `--profile=demo` 更多解释及可选值请参见文档说明。 + +运行以下命令检查集群初始化准备就绪 + +```sh +kubectl get services -n dubbo-system +``` + +## 部署应用 +{{% alert title="注意" color="warning" %}} +为了快速体验应用部署过程,我们将跳过本地源码构建的过程,直接是使用官方预先构建好的 Docker 镜像进行部署。如果您想了解如何从源码构建镜像,请参考下一篇 [定制开发微服务应用](../customize)。 +{{% /alert %}} + +在刚刚创建的示例项目根目录,运行以下命令生成 Kubernetes 资源清单,其中,`--image` 指定了官方预先准备好的示例镜像(镜像与刚刚生成的示例应用源码完全相同)。 + +```sh +dubboctl deploy --image=docker.io/apache/dubbo-java-quickstart:latest +# 如果使用 go 语言项目模板,则请使用 dubbo-go-quickstart:latest,其他语言类推 +``` + +命令执行成功后,可以在当前目录看到生成的 `kube.yaml` 文件,其中包括 deployment、service 等 kubernetes 资源定义。 + +接下来,将应用部署到 Kubernetes 环境。 + +```shell +kubectl apply -f ./kube.yaml +``` + +检查部署状态 +```shell +kubectl get services +``` + +## 访问应用 +部署成功后,可以通过以下方式检查应用状态。 + +{{< tabpane text=true >}} +{{< tab header="请根据情况选择:" disabled=true />}} +{{% tab header="本地集群" lang="en" %}} +1. 如果使用的本地 Kubernetes 集群,请使用以下方式访问应用验证部署状态,执行以下命令: + + ```shell + dubboctl dashboard admin + ``` + +2. 以上命令会自动打开 admin 控制台,如果在您的环境下没有打开,请使用浏览器访问以下地址: + + http://localhost:38080/admin + +3. 通过 triple 协议,可以继续测试 Dubbo 服务,执行以下命令进行端口映射: + + ```shell + kubectl port-forward 50051:50051 + ``` + +4. 通过 curl 访问服务: + + ```shell + curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/com.example.demo.dubbo.api.DemoService/sayHello/ + ``` + +{{% /tab %}} + +{{% tab header="阿里云ACK" lang="zh-cn" %}} +对于云上托管的哦 Kubernetes 集群,可以使用以下方式验证,这里以阿里云 ACK 集群为例: + +ACK ingerss-controller 的访问方式...... + +{{% /tab %}} +{{< /tabpane >}} + +## 更多内容 +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ 部署示例应用到 Kubernetes 集群 +

+

演示如何将当前应用打包为 Docker 镜像,并部署到 Kubernetes 集群。

+
+
+
+
+
+
+

+ 示例源码解读 +

+

关于示例应用的源码讲解,学习如何定制 Dubbo Spring Boot 应用。

+
+
+
+
+
+
+

+ 使用 dubboctl 创建多语言应用 +

+

如何使用 dubboctl 快速创建 go、node.js、web、rust 等多语言应用。

+
+
+
+
+
+
+ +{{< /blocks/section >}} diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/install.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/install.md index aa9e2e3f64f5..a6b634d10160 100644 --- a/content/zh-cn/overview/mannual/golang-sdk/quickstart/install.md +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/install.md @@ -2,6 +2,8 @@ aliases: - /zh/docs3-v2/golang-sdk/quickstart/install/ - /zh-cn/docs3-v2/golang-sdk/quickstart/install/ + - /zh/overview/quickstart/go/install/ + - /zh-cn/overview/quickstart/go/install/ description: 安装 Dubbo-go 开发环境 title: 安装 Dubbo-go 开发环境 type: docs diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/manage.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/manage.md new file mode 100644 index 000000000000..0c242e1927fa --- /dev/null +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/manage.md @@ -0,0 +1,163 @@ +--- +description: 本文会部署一个经典的商城系统,并演示如何使用 Dubbo 的流量治理规则管控商城系统流量,包括灰度发布、金丝雀发布、按比例流量转发等。 +linkTitle: 尝试治理微服务 +title: 尝试治理微服务 +type: docs +weight: 3 +--- + +在前面两篇文档中,我们介绍了一个 Dubbo 应用的完整开发与部署过程。接下来,我们会通过一个更复杂、更完整的微服务商城系统,演示 Dubbo 的服务治理相关能力。 + +示例商城系统的总体架构图如下所示: + +![shop 应用总体架构图](/imgs/v3/traffic/shop-arc.png) + +## 部署示例应用 + +有两种方式可以完成商城系统部署。 + +### 方式一 +{{% alert title="注意" color="primary" %}} +这种方式依赖 `dubboctl manifest install` 安装的注册中心等组件,如果您还没有在 Kubernetes 集群中安装相关组件,请 [按照上一步指令完成安装](../develop#前置条件)。 +{{% /alert %}} + +首先要为目标 kubernetes namespace 开启自动注入模式,以便应用部署后能够自动连接到注册中心等组件。 + +```shell +kubectl label namespace dubbo-demo dubbo-injection=enabled --overwrite +``` + +接下来,使用以下命令部署整个商城系统,所有应用会自动连接到之前安装的注册中心进行地址发现: + +```shell +kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/10-task/dubbo-samples-shop/deploy/App.yml +``` + +### 方式二 + +这种方式不需要使用 dubboctl 工具单独安装组件。因为我们已经将相关组件的安装全部集成到示例脚本中,您可以运行以下命令快速部署示例应用及相关依赖组件: + +```shell +kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/10-task/dubbo-samples-shop/deploy/All.yml +``` + +运行以下命令查看示例应用是否部署成功: + +```shell +kubectl get deployments -n dubbo-demo +``` + +## 可视化监控服务状态 + +应用启动成功后,可以通过 admin 控制台查看部署状态,根据你使用的 Kubernetes 集群,请按照以下步骤操作: + +{{< tabpane text=true >}} +{{< tab header="根据部署集群选择:" disabled=true />}} +{{% tab header="本地集群" lang="en" %}} +如果使用的本地 Kubernetes 集群,请使用以下方式访问应用验证部署状态,执行以下命令: +
+
+ +dubboctl dashboard admin +
+
+ +以上命令会自动打开 admin 控制台,如果在您的环境下没有打开,请使用浏览器访问以下地址: +
+
+ +http://localhost:38080/admin

+ +Admin 控制台显示的服务注册情况界面如下:

+ +![Admin 服务列表截图]()

+ +通过`监控统计`菜单, 可以查看集群的调用情况:

+ +![Admin 内嵌 Grafana 截图]()

+ +{{% /tab %}} + +{{% tab header="阿里云ACK" lang="zh-cn" %}} +对于云上托管的哦 Kubernetes 集群,可以使用以下方式验证,这里以阿里云 ACK 集群为例:

+ +ACK ingerss-controller 的访问方式......

+ +Admin 控制台显示的服务注册情况界面如下:

+ +![Admin 服务列表截图]()

+ +通过`监控统计`菜单, 可以查看集群的调用情况:

+ +![Admin 内嵌 Grafana 截图]()

+ +{{% /tab %}} +{{< /tabpane >}} + + +## 流量管控 + +我们围绕商城系统由 5 个微服务应用组成: +* `Frontend 商城主页`,作为与用户交互的 web 界面,通过调用 `User`、`Detail`、`Order` 等提供用户登录、商品展示和订单管理等服务。 +* `User 用户服务`,负责用户数据管理、身份校验等。 +* `Order 订单服务`,提供订订单创建、订单查询等服务,依赖 `Detail` 服务校验商品库存等信息。 +* `Detail 商品详情服务`,展示商品详情信息,调用 `Comment` 服务展示用户对商品的评论记录。 +* `Comment 评论服务`,管理用户对商品的评论数据。 + +在此基础之上,我们设计了一系列的流量治理任务,多个应用部署有 v1、v2 两个不同的版本,我们会演示通过规则引导流量到不同的版本。完整的部署架构图如下: + +![shop-arc](/imgs/v3/traffic/shop-arc-deploy2.png) + +`Order 订单服务`有两个版本 `v1` 和 `v2`,`v2` 是订单服务优化后发布的新版本。 +* 版本 v1 只是简单的创建订单,不展示订单详情 +* 版本 v2 在订单创建成功后会展示订单的收货地址详情 + +`Detail` 和 `Comment` 服务也分别有两个版本 `v1` 和 `v2`,我们通过多个版本来演示流量导流后的效果。 +* 版本 `v1` 默认为所有请求提供服务 +* 版本 `v2` 模拟被部署在特定的区域的服务,因此 `v2` 实例会带有特定的标签 + +接下来,就请根跟随 [示例任务](/zh-cn/overview/tasks/traffic-management/) 体验 Dubbo 的流量治理能力吧。 + +## 更多内容 + +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ 部署示例应用到 Kubernetes 集群 +

+

演示如何将当前应用打包为 Docker 镜像,并部署到 Kubernetes 集群。

+
+
+
+
+
+
+

+ 示例源码解读 +

+

关于示例应用的源码讲解,学习如何定制 Dubbo Spring Boot 应用。

+
+
+
+
+
+
+

+ 使用 dubboctl 创建多语言应用 +

+

如何使用 dubboctl 快速创建 go、node.js、web、rust 等多语言应用。

+
+
+
+
+
+
+ +{{< /blocks/section >}} + + diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple.md index 92f272bb2670..e9d018b1debb 100644 --- a/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple.md +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple.md @@ -2,6 +2,8 @@ aliases: - /zh/docs3-v2/golang-sdk/quickstart/quickstart_triple/ - /zh-cn/docs3-v2/golang-sdk/quickstart/quickstart_triple/ + - /zh/overview/quickstart/go/quickstart_triple/ + - /zh-cn/overview/quickstart/go/quickstart_triple/ description: 完成一次 RPC 调用 title: 完成一次 RPC 调用 type: docs diff --git a/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple_with_customize.md b/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple_with_customize.md index 7550a192790e..6974bdac2013 100644 --- a/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple_with_customize.md +++ b/content/zh-cn/overview/mannual/golang-sdk/quickstart/quickstart_triple_with_customize.md @@ -2,6 +2,8 @@ aliases: - /zh/docs3-v2/golang-sdk/quickstart/quickstart_triple_with_customize/ - /zh-cn/docs3-v2/golang-sdk/quickstart/quickstart_triple_with_customize/ + - /zh/overview/quickstart/go/quickstart_triple_with_customize/ + - /zh-cn/overview/quickstart/go/quickstart_triple_with_customize/ description: 完成一次 RPC 调用自己定义接口的版本 title: 完成一次自己定义接口的版本 RPC 调用 type: docs diff --git a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols.md b/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols.md index 8bf228f84145..ffe8262ec33a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols.md +++ b/content/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/advanced-features-and-usage/service/multi-protocols/ - /zh-cn/docs3-v2/java-sdk/advanced-features-and-usage/service/multi-protocols/ + - /zh-cn/overview/tasks/protocols/multi-protocols/ description: 在 Dubbo 中配置多协议 linkTitle: 多协议 title: 多协议 @@ -10,7 +11,11 @@ weight: 9 --- +如果是共享注册中心,建议是 +如果是多注册中心,建议是多协议模式。 + +### 消费端行为说明 ## 特性说明 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/_index.md index 9dfd2a783956..739e865d4b71 100755 --- a/content/zh-cn/overview/mannual/java-sdk/faq/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/_index.md @@ -1,17 +1,9 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/ - /zh-cn/docs3-v2/java-sdk/faq/ -description: 错误码 FAQ -linkTitle: 错误码 FAQ -title: 错误码 FAQ +description: 常见问题解答 +linkTitle: 常见问题解答 +title: 常见问题解答 type: docs weight: 6 --- - - - - - - -这里主要是提供 Java SDK 中各个错误码的可能原因和解决方法。 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/1.md similarity index 97% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/1.md index cbd45f1d3087..bb18ced2e9d4 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/1/ + - /zh-cn/overview/mannual/java-sdk/faq/0/1/ - /zh-cn/docs3-v2/java-sdk/faq/0/1/ description: 0-1 - 线程池资源枯竭 linkTitle: 0-1 - 线程池资源枯竭 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/10.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/10.md index d10a44db92cc..2fa5ca123a68 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/10/ + - /zh-cn/overview/mannual/java-sdk/faq/0/10/ - /zh-cn/docs3-v2/java-sdk/faq/0/10/ description: 0-10 - 当前调用不在支持 linkTitle: 0-10 - 当前调用不在支持 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/11.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/11.md index 7aebd7d2dc5d..55768208840d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/11/ + - /zh-cn/overview/mannual/java-sdk/faq/0/11/ - /zh-cn/docs3-v2/java-sdk/faq/0/11/ description: 0-11 - 服务停止失败 linkTitle: 0-11 - 服务停止失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/12.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/12.md index 84315caab80c..848301e82d08 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/12/ + - /zh-cn/overview/mannual/java-sdk/faq/0/12/ - /zh-cn/docs3-v2/java-sdk/faq/0/12/ description: 0-12 - 未知异常 linkTitle: 0-12 - 未知异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/13.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/13.md index 466456d575fb..9ba5a737b2eb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/13/ + - /zh-cn/overview/mannual/java-sdk/faq/0/13/ - /zh-cn/docs3-v2/java-sdk/faq/0/13/ description: 0-13 - 指标收集器发生异常 linkTitle: 0-13 - 指标收集器发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/14.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/14.md index 3154d8bd5d21..2715aa539348 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/14/ + - /zh-cn/overview/mannual/java-sdk/faq/0/14/ - /zh-cn/docs3-v2/java-sdk/faq/0/14/ description: 0-14 - 监控异常 linkTitle: 0-14 - 监控异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/15.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/15.md index 8df92639dd9b..b1f9b37cf883 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/15/ + - /zh-cn/overview/mannual/java-sdk/faq/0/15/ - /zh-cn/docs3-v2/java-sdk/faq/0/15/ description: 0-15 - 加载扩展类时发生异常 linkTitle: 0-15 - 加载扩展类时发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/16.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/16.md index 6e32a1051786..dccc883892d6 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/16/ + - /zh-cn/overview/mannual/java-sdk/faq/0/16/ - /zh-cn/docs3-v2/java-sdk/faq/0/16/ description: 0-16 - 没有可用的执行器 linkTitle: 0-16 - 没有可用的执行器 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/17.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/17.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/17.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/17.md index bf0d2de7924a..753c2419406d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/17.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/17.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/17/ + - /zh-cn/overview/mannual/java-sdk/faq/0/17/ - /zh-cn/docs3-v2/java-sdk/faq/0/17/ description: 0-17 - 执行器在关闭时发生未知异常 linkTitle: 0-17 - 执行器在关闭时发生未知异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/18.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/18.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/18.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/18.md index 6bf762c6d78d..bfa780052781 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/18.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/18.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/18/ + - /zh-cn/overview/mannual/java-sdk/faq/0/18/ - /zh-cn/docs3-v2/java-sdk/faq/0/18/ description: 0-18 - 线程池执行器被错误使用 linkTitle: 0-18 - 线程池执行器被错误使用 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/19.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/19.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/19.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/19.md index 00ea8670fd9d..b7dd1b86f0c1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/19.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/19.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/19/ + - /zh-cn/overview/mannual/java-sdk/faq/0/19/ - /zh-cn/docs3-v2/java-sdk/faq/0/19/ description: 0-19 - 处理任务时发生异常 linkTitle: 0-19 - 处理任务时发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/2.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/2.md index 8ebd9377dfeb..80dbd76ce9a8 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/2/ + - /zh-cn/overview/mannual/java-sdk/faq/0/2/ - /zh-cn/docs3-v2/java-sdk/faq/0/2/ description: 0-2 - 非法属性值 linkTitle: 0-2 - 非法属性值 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/20.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/20.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/20.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/20.md index c5a04f39f9e7..e57631687d48 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/20.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/20.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/20/ + - /zh-cn/overview/mannual/java-sdk/faq/0/20/ - /zh-cn/docs3-v2/java-sdk/faq/0/20/ description: 0-20 - 存储堆栈信息时发生异常 linkTitle: 0-20 - 存储堆栈信息时发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/21.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/21.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/21.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/21.md index e898b669f030..54377a42bc86 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/21.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/21.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/21/ + - /zh-cn/overview/mannual/java-sdk/faq/0/21/ - /zh-cn/docs3-v2/java-sdk/faq/0/21/ description: 0-21 - 构建的实例过多 linkTitle: 0-21 - 构建的实例过多 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/22.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/22.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/22.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/22.md index c7c0b1072755..2f8400a01867 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/22.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/22.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/22/ + - /zh-cn/overview/mannual/java-sdk/faq/0/22/ - /zh-cn/docs3-v2/java-sdk/faq/0/22/ description: 0-22 - 输入输出流异常 linkTitle: 0-22 - 输入输出流异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/23.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/23.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/23.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/23.md index 4fe2df873131..903e31b891e9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/23.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/23.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/23/ + - /zh-cn/overview/mannual/java-sdk/faq/0/23/ - /zh-cn/docs3-v2/java-sdk/faq/0/23/ description: 0-23 - 序列化数据转换异常 linkTitle: 0-23 - 序列化数据转换异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/24.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/24.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/24.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/24.md index d9a07e38a3ef..614b32ffc4bb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/24.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/24.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/24/ + - /zh-cn/overview/mannual/java-sdk/faq/0/24/ - /zh-cn/docs3-v2/java-sdk/faq/0/24/ description: 0-24 - 覆盖字段值异常 linkTitle: 0-24 - 覆盖字段值异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/25.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/25.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/25.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/25.md index 4641d3b24980..b8c6f22f2ddc 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/25.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/25.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/25/ + - /zh-cn/overview/mannual/java-sdk/faq/0/25/ - /zh-cn/docs3-v2/java-sdk/faq/0/25/ description: 0-25 - 加载映射错误 linkTitle: 0-25 - 加载映射错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/26.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/26.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/26.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/26.md index 4f6c42d0e955..bc21c28644c1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/26.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/26.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/26/ + - /zh-cn/overview/mannual/java-sdk/faq/0/26/ - /zh-cn/docs3-v2/java-sdk/faq/0/26/ description: 0-26 - 元数据发布服务时的警告信息 linkTitle: 0-26 - 元数据发布服务时的警告信息 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/27.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/27.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/27.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/27.md index c59ece4d3da5..793751a3aad1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/27.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/27.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/27/ + - /zh-cn/overview/mannual/java-sdk/faq/0/27/ - /zh-cn/docs3-v2/java-sdk/faq/0/27/ description: 0-27 - 线程池隔离配置异常 linkTitle: 0-27 - 线程池隔离配置异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/28.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/28.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/28.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/28.md index ba2076233c99..c4a7bcb80117 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/28.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/28.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/28/ + - /zh-cn/overview/mannual/java-sdk/faq/0/28/ - /zh-cn/docs3-v2/java-sdk/faq/0/28/ description: 0-28 - 操作了可能会引起危险的行为 linkTitle: 0-28 - 危险的行为 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/29.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/29.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/29.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/29.md index 6fcf5d8c1e82..625443d3729d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/29.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/29.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/29/ + - /zh-cn/overview/mannual/java-sdk/faq/0/29/ - /zh-cn/docs3-v2/java-sdk/faq/0/29/ description: 0-29 - 未找到Tracer依赖 linkTitle: 0-29 - 未找到Tracer依赖 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/3.md similarity index 97% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/3.md index 0aa5772050a9..6976323f4d28 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/3/ + - /zh-cn/overview/mannual/java-sdk/faq/0/3/ - /zh-cn/docs3-v2/java-sdk/faq/0/3/ description: 0-3 - 无法访问缓存路径 linkTitle: 0-3 - 无法访问缓存路径 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/4.md similarity index 96% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/4.md index 66343f96033a..42497216f300 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/4/ + - /zh-cn/overview/mannual/java-sdk/faq/0/4/ - /zh-cn/docs3-v2/java-sdk/faq/0/4/ description: 0-4 - 缓存条目超限 linkTitle: 0-4 - 缓存条目超限 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/5.md similarity index 96% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/5.md index 2c361d5605e1..65e73992817f 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/5/ + - /zh-cn/overview/mannual/java-sdk/faq/0/5/ - /zh-cn/docs3-v2/java-sdk/faq/0/5/ description: 0-5 - 缓存文件大小超限 linkTitle: 0-5 - 缓存文件大小超限 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/6.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/6.md index c2ffe485fc7b..d485d9dbeaba 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/6/ + - /zh-cn/overview/mannual/java-sdk/faq/0/6/ - /zh-cn/docs3-v2/java-sdk/faq/0/6/ description: 0-6 - 线程中断异常 linkTitle: 0-6 - 线程中断异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/7.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/7.md index 03ce13cd899a..550fe5682b41 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/7/ + - /zh-cn/overview/mannual/java-sdk/faq/0/7/ - /zh-cn/docs3-v2/java-sdk/faq/0/7/ description: 0-7 - 未找到反射类 linkTitle: 0-7 - 未找到反射类 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/8.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/8.md index 3ab457b2caa8..b9e56b506410 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/8/ + - /zh-cn/overview/mannual/java-sdk/faq/0/8/ - /zh-cn/docs3-v2/java-sdk/faq/0/8/ description: 0-8 - 反射失败 linkTitle: 0-8 - 反射失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/9.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/9.md index 3c8891ba9cbe..d463c09e4ede 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/9/ + - /zh-cn/overview/mannual/java-sdk/faq/0/9/ - /zh-cn/docs3-v2/java-sdk/faq/0/9/ description: 0-9 - 通知事件失败 linkTitle: 0-9 - 通知事件失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/99.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/99.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/99.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/99.md index b5d0b5ac1899..39aeddc75cd9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/99.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/99.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/99/ + - /zh-cn/overview/mannual/java-sdk/faq/0/99/ - /zh-cn/docs3-v2/java-sdk/faq/0/99/ description: 0-99 - 调用了过时 (Deprecated) 的方法 linkTitle: 0-99 - 调用了过时 (Deprecated) 的方法 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/0/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/_index.md similarity index 79% rename from content/zh-cn/overview/mannual/java-sdk/faq/0/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/_index.md index 98d5762eb02b..60782b03db31 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/0/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/0/_index.md @@ -1,12 +1,12 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/0/ + - /zh-cn/overview/mannual/java-sdk/faq/0/ - /zh-cn/docs3-v2/java-sdk/faq/0/ description: 0 - Common 层 linkTitle: 0 - Common 层 title: 0 - Common 层 type: docs -weight: 1 +weight: 2 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/1.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/1.md index 97310820fa0f..f759dab47628 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/1/ + - /zh-cn/overview/mannual/java-sdk/faq/1/1/ - /zh-cn/docs3-v2/java-sdk/faq/1/1/ description: 1-1 - 地址非法 linkTitle: 1-1 - 地址非法 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/10.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/10.md index 9207c2f1f847..22f0fe43b832 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/10/ + - /zh-cn/overview/mannual/java-sdk/faq/1/10/ - /zh-cn/docs3-v2/java-sdk/faq/1/10/ description: 1-10 - 读写注册中心服务缓存失败 linkTitle: 1-10 - 读写注册中心服务缓存失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/11.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/11.md index f1551d976e68..0e2bd6a95c4b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/11/ + - /zh-cn/overview/mannual/java-sdk/faq/1/11/ - /zh-cn/docs3-v2/java-sdk/faq/1/11/ description: 1-11 - 注册服务实例创建失败 linkTitle: 1-11 - 注册服务实例创建失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/12.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/12.md index 777fb5622f95..342db8fc7357 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/12/ + - /zh-cn/overview/mannual/java-sdk/faq/1/12/ - /zh-cn/docs3-v2/java-sdk/faq/1/12/ description: 1-12 - “注册服务” 的实例均已销毁 linkTitle: 1-12 - “注册服务” 的实例均已销毁 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/13.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/13.md index 548db3f41bd8..05f4ebab827a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/13/ + - /zh-cn/overview/mannual/java-sdk/faq/1/13/ - /zh-cn/docs3-v2/java-sdk/faq/1/13/ description: 1-13 - 执行重试任务失败 linkTitle: 1-13 - 执行重试任务失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/14.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/14.md index e2d997269ead..a68348f9794d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/14/ + - /zh-cn/overview/mannual/java-sdk/faq/1/14/ - /zh-cn/docs3-v2/java-sdk/faq/1/14/ description: 1-14 - 动态配置识别失败 linkTitle: 1-14 - 动态配置识别失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/15.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/15.md index 1840cfc3c3ba..06d5b8266c08 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/15/ + - /zh-cn/overview/mannual/java-sdk/faq/1/15/ - /zh-cn/docs3-v2/java-sdk/faq/1/15/ description: 1-15 - 销毁服务失败 linkTitle: 1-15 - 销毁服务失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/16.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/16.md index 00edaa94c7b4..5a764aa7fe75 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/16/ + - /zh-cn/overview/mannual/java-sdk/faq/1/16/ - /zh-cn/docs3-v2/java-sdk/faq/1/16/ description: 1-16 - 存在不支持的类别 linkTitle: 1-16 - 存在不支持的类别 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/17.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/17.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/17.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/17.md index a27e63fece33..8c1f942913d9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/17.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/17.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/17/ + - /zh-cn/overview/mannual/java-sdk/faq/1/17/ - /zh-cn/docs3-v2/java-sdk/faq/1/17/ description: 1-17 - metadata Server 失效 linkTitle: 1-17 - metadata Server 失效 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/18.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/18.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/18.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/18.md index 48dabcc7edb9..3d5f6a26c448 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/18.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/18.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/18/ + - /zh-cn/overview/mannual/java-sdk/faq/1/18/ - /zh-cn/docs3-v2/java-sdk/faq/1/18/ description: 1-18 - 未提供 metadata service 端口 linkTitle: 1-18 - 未提供 metadata service 端口 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/19.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/19.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/19.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/19.md index 5da43438abbe..8ebce1500d34 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/19.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/19.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/19/ + - /zh-cn/overview/mannual/java-sdk/faq/1/19/ - /zh-cn/docs3-v2/java-sdk/faq/1/19/ description: 1-19 - K8S监听异常 linkTitle: 1-19 - K8S监听异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/20.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/20.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/20.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/20.md index e277b4b99309..338c9724cd4c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/20.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/20.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/20/ + - /zh-cn/overview/mannual/java-sdk/faq/1/20/ - /zh-cn/docs3-v2/java-sdk/faq/1/20/ description: 1-20 - K8S Pod不存在 linkTitle: 1-20 - K8S Pod不存在 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/21.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/21.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/21.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/21.md index ce14e8335295..be87a229722d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/21.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/21.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/21/ + - /zh-cn/overview/mannual/java-sdk/faq/1/21/ - /zh-cn/docs3-v2/java-sdk/faq/1/21/ description: 1-21 - K8S 无可用服务 linkTitle: 1-21 - K8S 无可用服务 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/22.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/22.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/22.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/22.md index d696a0cc75e7..9ffd4ea27a81 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/22.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/22.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/22/ + - /zh-cn/overview/mannual/java-sdk/faq/1/22/ - /zh-cn/docs3-v2/java-sdk/faq/1/22/ description: 1-22 - K8S 配置地址错误 linkTitle: 1-22 - K8S 配置地址错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/26.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/26.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/26.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/26.md index 784bd57ba969..79ece2abff4d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/26.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/26.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/26/ + - /zh-cn/overview/mannual/java-sdk/faq/1/26/ - /zh-cn/docs3-v2/java-sdk/faq/1/26/ description: 1-26 - xDS 证书生成失败 linkTitle: 1-26 - xDS 证书生成失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/27.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/27.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/27.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/27.md index 5a7e09846e72..fc6252711228 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/27.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/27.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/27/ + - /zh-cn/overview/mannual/java-sdk/faq/1/27/ - /zh-cn/docs3-v2/java-sdk/faq/1/27/ description: 1-27 - K8S监听异常 linkTitle: 1-27 - K8S监听异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/28.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/28.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/28.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/28.md index 65c834c3afab..2c0f03a1eb12 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/28.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/28.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/28/ + - /zh-cn/overview/mannual/java-sdk/faq/1/28/ - /zh-cn/docs3-v2/java-sdk/faq/1/28/ description: 1-28 - xDS 存根错误 linkTitle: 1-28 - xDS 存根错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/29.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/29.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/29.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/29.md index b2412c390bbe..164a928cbdeb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/29.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/29.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/29/ + - /zh-cn/overview/mannual/java-sdk/faq/1/29/ - /zh-cn/docs3-v2/java-sdk/faq/1/29/ description: 1-29 - xDS 读取文件失败 linkTitle: 1-29 - xDS 读取文件失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/3.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/3.md index 93256f75d074..0e9a553e19e2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/3/ + - /zh-cn/overview/mannual/java-sdk/faq/1/3/ - /zh-cn/docs3-v2/java-sdk/faq/1/3/ description: 1-3 - URL 销毁失败 linkTitle: 1-3 - URL 销毁失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/30.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/30.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/30.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/30.md index 19fc528b375f..d1cedc8f0695 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/30.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/30.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/30/ + - /zh-cn/overview/mannual/java-sdk/faq/1/30/ - /zh-cn/docs3-v2/java-sdk/faq/1/30/ description: 1-30 - xDS 请求失败 linkTitle: 1-30 - xDS 请求失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/31.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/31.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/31.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/31.md index fb97b9a9a2e5..ab1ce200cd6e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/31.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/31.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/31/ + - /zh-cn/overview/mannual/java-sdk/faq/1/31/ - /zh-cn/docs3-v2/java-sdk/faq/1/31/ description: 1-31 - xDS 响应失败 linkTitle: 1-31 - xDS 响应失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/32.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/32.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/32.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/32.md index 6f0cb93dca90..af5831e890d9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/32.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/32.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/32/ + - /zh-cn/overview/mannual/java-sdk/faq/1/32/ - /zh-cn/docs3-v2/java-sdk/faq/1/32/ description: 1-32 - xDS Channel 初始化失败 linkTitle: 1-32 - xDS Channel 初始化失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/33.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/33.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/33.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/33.md index 1270b0302a01..82b62aef5048 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/33.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/33.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/33/ + - /zh-cn/overview/mannual/java-sdk/faq/1/33/ - /zh-cn/docs3-v2/java-sdk/faq/1/33/ description: 1-33 - xDS 服务发现初始化失败 linkTitle: 1-33 - xDS 服务发现初始化失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/34.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/34.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/34.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/34.md index 3bf15a4d8d4a..f6a4f00be8db 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/34.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/34.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/34/ + - /zh-cn/overview/mannual/java-sdk/faq/1/34/ - /zh-cn/docs3-v2/java-sdk/faq/1/34/ description: 1-34 - xDS 解析发生错误 linkTitle: 1-34 - xDS 解析发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/35.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/35.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/35.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/35.md index b916e33f6288..ff6ca351285e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/35.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/35.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/35/ + - /zh-cn/overview/mannual/java-sdk/faq/1/35/ - /zh-cn/docs3-v2/java-sdk/faq/1/35/ description: 1-35 - ZK 异常 linkTitle: 1-35 - ZK 异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/36.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/36.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/36.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/36.md index d16af12813e3..21eb817ec4b1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/36.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/36.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/36/ + - /zh-cn/overview/mannual/java-sdk/faq/1/36/ - /zh-cn/docs3-v2/java-sdk/faq/1/36/ description: 1-36 - 未知异常 linkTitle: 1-36 - 未知异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/37.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/37.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/37.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/37.md index 2c7092d61192..003e9d387322 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/37.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/37.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/37/ + - /zh-cn/overview/mannual/java-sdk/faq/1/37/ - /zh-cn/docs3-v2/java-sdk/faq/1/37/ description: 1-37 - Nacos 异常 linkTitle: 1-37 - Nacos 异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/38.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/38.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/38.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/38.md index 43751051f8fb..7c150a37edd0 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/38.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/38.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/38/ + - /zh-cn/overview/mannual/java-sdk/faq/1/38/ - /zh-cn/docs3-v2/java-sdk/faq/1/38/ description: 1-38 - Socket 连接异常 linkTitle: 1-38 - Socket 连接异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/39.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/39.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/39.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/39.md index ef96e0d452eb..dedcc51d72c6 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/39.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/39.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/39/ + - /zh-cn/overview/mannual/java-sdk/faq/1/39/ - /zh-cn/docs3-v2/java-sdk/faq/1/39/ description: 1-39 - 获取元数据失败 linkTitle: 1-39 - 获取元数据失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/4.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/4.md index d0e67f24f241..6a0f3c90b2d3 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/4/ + - /zh-cn/overview/mannual/java-sdk/faq/1/4/ - /zh-cn/docs3-v2/java-sdk/faq/1/4/ description: 1-4 - 空地址 linkTitle: 1-4 - 空地址 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/40.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/40.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/40.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/40.md index e85e570b273a..0233c717507d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/40.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/40.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/40/ + - /zh-cn/overview/mannual/java-sdk/faq/1/40/ - /zh-cn/docs3-v2/java-sdk/faq/1/40/ description: 1-40 - 路由等待时间过长 linkTitle: 1-40 - 路由等待时间过长 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/41.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/41.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/41.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/41.md index 3bbf65b57ba7..85bd3aa98593 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/41.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/41.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/41/ + - /zh-cn/overview/mannual/java-sdk/faq/1/41/ - /zh-cn/docs3-v2/java-sdk/faq/1/41/ description: 1-41 - Istio 异常 linkTitle: 1-41 - Istio 异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/42.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/42.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/42.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/42.md index 9a8e74000ded..e6343257dfb7 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/42.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/42.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/42/ + - /zh-cn/overview/mannual/java-sdk/faq/1/42/ - /zh-cn/docs3-v2/java-sdk/faq/1/42/ description: 1-42 - Nacos 存在低版本服务 linkTitle: 1-42 - Nacos 存在低版本服务 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/5.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/5.md index 5f447e91d6d6..29f7f5d8d65c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/5/ + - /zh-cn/overview/mannual/java-sdk/faq/1/5/ - /zh-cn/docs3-v2/java-sdk/faq/1/5/ description: 1-5 - 接收到没有任何参数的 URL linkTitle: 1-5 - 接收到没有任何参数的 URL diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/6.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/6.md index 44de6725a912..b45d57ec36d4 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/6/ + - /zh-cn/overview/mannual/java-sdk/faq/1/6/ - /zh-cn/docs3-v2/java-sdk/faq/1/6/ description: 1-6 - 清空URL缓存出错 linkTitle: 1-6 - 清空URL缓存出错 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/7.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/7.md index d7593c97fe7a..092680d204b4 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/7/ + - /zh-cn/overview/mannual/java-sdk/faq/1/7/ - /zh-cn/docs3-v2/java-sdk/faq/1/7/ description: 1-7 - 通知注册事件失败 linkTitle: 1-7 - 读写注册中心服务缓存失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/8.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/8.md index 4bda34865f4e..d758a343233c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/8/ + - /zh-cn/overview/mannual/java-sdk/faq/1/8/ - /zh-cn/docs3-v2/java-sdk/faq/1/8/ description: 1-8 - 销毁时注销(取消订阅)地址失败 linkTitle: 1-8 - 销毁时注销(取消订阅)地址失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/9.md similarity index 96% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/9.md index 30503ce44ae1..bc5b53c53442 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/9/ + - /zh-cn/overview/mannual/java-sdk/faq/1/9/ - /zh-cn/docs3-v2/java-sdk/faq/1/9/ description: 1-9 - 读写注册中心服务缓存失败 linkTitle: 1-9 - 读写注册中心服务缓存失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/1/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/_index.md similarity index 80% rename from content/zh-cn/overview/mannual/java-sdk/faq/1/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/_index.md index 7337794300f1..71e5770b4542 100755 --- a/content/zh-cn/overview/mannual/java-sdk/faq/1/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/1/_index.md @@ -1,12 +1,12 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/1/ + - /zh-cn/overview/mannual/java-sdk/faq/1/ - /zh-cn/docs3-v2/java-sdk/faq/1/ description: 1 - 注册中心层 linkTitle: 1 - 注册中心层 title: 1 - 注册中心层 type: docs -weight: 1 +weight: 3 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/1.md similarity index 83% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/1.md index 83f2a6e1ef7b..897061ce9060 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/1/ + - /zh-cn/overview/mannual/java-sdk/faq/2/1/ - /zh-cn/docs3-v2/java-sdk/faq/2/1/ description: 2-1 - 路由选址执行失败 linkTitle: 2-1 - 路由选址执行失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/10.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/10.md index 10d2b601e466..db92a6be38c7 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/10/ + - /zh-cn/overview/mannual/java-sdk/faq/2/10/ - /zh-cn/docs3-v2/java-sdk/faq/2/10/ description: 2-10 - 调用服务提供方失败 linkTitle: 2-10 - 调用服务提供方失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/11.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/11.md index f5e56267d989..1de98c16b1aa 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/11/ + - /zh-cn/overview/mannual/java-sdk/faq/2/11/ - /zh-cn/docs3-v2/java-sdk/faq/2/11/ description: 2-11 - 标签路由规则不合法 linkTitle: 2-11 - 标签路由规则不合法 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/12.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/12.md index ffd3a9a9b0c4..bfa379d4c66a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/12/ + - /zh-cn/overview/mannual/java-sdk/faq/2/12/ - /zh-cn/docs3-v2/java-sdk/faq/2/12/ description: 2-12 - 标签路由获取提供方应用名为空 linkTitle: 2-12 - 标签路由获取提供方应用名为空 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/13.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/13.md index ae50a3709be6..d97829b9d119 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/13/ + - /zh-cn/overview/mannual/java-sdk/faq/2/13/ - /zh-cn/docs3-v2/java-sdk/faq/2/13/ description: 2-13 - 接收加载mesh的路由规则失败 linkTitle: 2-13 - 接收加载mesh的路由规则失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/14.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/14.md index 29b4eca5b047..7c16a29f3599 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/14/ + - /zh-cn/overview/mannual/java-sdk/faq/2/14/ - /zh-cn/docs3-v2/java-sdk/faq/2/14/ description: 2-14 - 脚本路由执行失败 linkTitle: 2-14 - 脚本路由执行失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/15.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/15.md index 6ce1c5a1128a..1b12194ffcee 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/15/ + - /zh-cn/overview/mannual/java-sdk/faq/2/15/ - /zh-cn/docs3-v2/java-sdk/faq/2/15/ description: 2-15 - 路由规则解析失败 linkTitle: 2-15 - 路由规则解析失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/16.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/16.md index c648e428258a..5fd5eb33831b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/16/ + - /zh-cn/overview/mannual/java-sdk/faq/2/16/ - /zh-cn/docs3-v2/java-sdk/faq/2/16/ description: 2-16 - 请求重试多次失败 linkTitle: 2-16 - 请求重试多次失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/17.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/17.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/17.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/17.md index 292bc64053b9..56583e0e60e9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/17.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/17.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/17/ + - /zh-cn/overview/mannual/java-sdk/faq/2/17/ - /zh-cn/docs3-v2/java-sdk/faq/2/17/ description: 2-17 - mock请求失败 linkTitle: 2-17 - mock请求失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/18.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/18.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/18.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/18.md index e114be7187c8..fe2ca69fd779 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/18.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/18.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/18/ + - /zh-cn/overview/mannual/java-sdk/faq/2/18/ - /zh-cn/docs3-v2/java-sdk/faq/2/18/ description: 2-18 - mesh路由规则未被监听 linkTitle: 2-18 - mesh路由规则未被监听 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/19.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/19.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/19.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/19.md index 5b43b5afafd3..7cdeafb73cb2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/19.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/19.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/19/ + - /zh-cn/overview/mannual/java-sdk/faq/2/19/ - /zh-cn/docs3-v2/java-sdk/faq/2/19/ description: 2-19 - 异步请求失败 linkTitle: 2-19 - 异步请求失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/2.md similarity index 97% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/2.md index 2c0cf3dd11af..2fcc32d328a9 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/2/ + - /zh-cn/overview/mannual/java-sdk/faq/2/2/ - /zh-cn/docs3-v2/java-sdk/faq/2/2/ description: 2-2 - 没有可用的 Provider(地址找不到) linkTitle: 2-2 - 没有可用的 Provider(地址找不到) diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/20.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/20.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/20.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/20.md index 8e02922fceec..4b2bbb6ba6e3 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/20.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/20.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/20/ + - /zh-cn/overview/mannual/java-sdk/faq/2/20/ - /zh-cn/docs3-v2/java-sdk/faq/2/20/ description: 2-20 - 获取分组结果合并时失败 linkTitle: 2-20 - 获取分组结果合并时失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/3.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/3.md index d0027b536b78..72a57c73b871 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/3/ + - /zh-cn/overview/mannual/java-sdk/faq/2/3/ - /zh-cn/docs3-v2/java-sdk/faq/2/3/ description: 2-3 - 路由关闭失败 linkTitle: 2-3 - 路由关闭失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/4.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/4.md index ef2e95060102..ef07a5d05f49 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/4/ + - /zh-cn/overview/mannual/java-sdk/faq/2/4/ - /zh-cn/docs3-v2/java-sdk/faq/2/4/ description: 2-4 - Merger接口加载失败 linkTitle: 2-4 - Merger接口加载失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/5.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/5.md index 6ab4567d838d..039ae76c7f92 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/5/ + - /zh-cn/overview/mannual/java-sdk/faq/2/5/ - /zh-cn/docs3-v2/java-sdk/faq/2/5/ description: 2-5 - 筛选提供方失败 linkTitle: 2-5 - 筛选提供方失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/6.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/6.md index cda8f53f558f..a9a96b5077ca 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/6/ + - /zh-cn/overview/mannual/java-sdk/faq/2/6/ - /zh-cn/docs3-v2/java-sdk/faq/2/6/ description: 2-6 - 条件路由筛选提供方列表为空 linkTitle: 2-6 - 条件路由筛选提供方列表为空 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/7.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/7.md index 2fcda3189e7a..5088e4ecb039 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/7/ + - /zh-cn/overview/mannual/java-sdk/faq/2/7/ - /zh-cn/docs3-v2/java-sdk/faq/2/7/ description: 2-7 - 条件路由执行异常 linkTitle: 2-7 - 条件路由执行异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/8.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/8.md index 2f6c7c87fc32..ec82d5415ec4 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/8/ + - /zh-cn/overview/mannual/java-sdk/faq/2/8/ - /zh-cn/docs3-v2/java-sdk/faq/2/8/ description: 2-8 - 提供方返回异常响应 linkTitle: 2-8 - 提供方返回异常响应 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/9.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/9.md index d0646bee9051..762620f4d948 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/9/ + - /zh-cn/overview/mannual/java-sdk/faq/2/9/ - /zh-cn/docs3-v2/java-sdk/faq/2/9/ description: 2-9 - 增加超时检查任务失败 linkTitle: 2-9 - 增加超时检查任务失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/2/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/_index.md similarity index 71% rename from content/zh-cn/overview/mannual/java-sdk/faq/2/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/_index.md index 85e45b32b744..2d73bcefeb5e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/2/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/2/_index.md @@ -1,10 +1,10 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/2/ + - /zh-cn/overview/mannual/java-sdk/faq/2/ - /zh-cn/docs3-v2/java-sdk/faq/2/ description: 2 - 路由层 linkTitle: 2 - 路由层 title: 2 - 路由层 type: docs -weight: 2 +weight: 5 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/1.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/1.md index fce76233db55..9c25d815a64e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/1/ + - /zh-cn/overview/mannual/java-sdk/faq/3/1/ - /zh-cn/docs3-v2/java-sdk/faq/3/1/ description: 3-1 - 将地址转换成 Invoker 失败 linkTitle: 3-1 - 将地址转换成 Invoker 失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/2.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/2.md index f75605ddc79d..ac78bb36c357 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/2/ + - /zh-cn/overview/mannual/java-sdk/faq/3/2/ - /zh-cn/docs3-v2/java-sdk/faq/3/2/ description: 3-2 - 发布或推送服务失败 linkTitle: 3-2 - 发布或推送服务失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/3.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/3.md index 701f5ef56be8..bef543f5e607 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/3/ + - /zh-cn/overview/mannual/java-sdk/faq/3/3/ - /zh-cn/docs3-v2/java-sdk/faq/3/3/ description: 3-3 - 通过Javassist生成字节码失败 linkTitle: 3-3 - 通过Javassist生成字节码失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/4.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/4.md index 4829c5198fd4..835e13283e3d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/4/ + - /zh-cn/overview/mannual/java-sdk/faq/3/4/ - /zh-cn/docs3-v2/java-sdk/faq/3/4/ description: 3-4 - 客户端发送请求超时 linkTitle: 3-4 - 客户端发送请求超时 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/5.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/5.md index 42b088ea8acf..1602e2281087 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/5/ + - /zh-cn/overview/mannual/java-sdk/faq/3/5/ - /zh-cn/docs3-v2/java-sdk/faq/3/5/ description: 3-5 - 异步响应出现异常 linkTitle: 3-5 - 异步响应出现异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/6.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/6.md index 27c7391fb734..c2a029af242b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/6/ + - /zh-cn/overview/mannual/java-sdk/faq/3/6/ - /zh-cn/docs3-v2/java-sdk/faq/3/6/ description: 3-6 - 代理执行服务发生异常 linkTitle: 3-6 - 代理执行服务发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/7.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/7.md index c08548b27d59..5a2f570bac91 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/7/ + - /zh-cn/overview/mannual/java-sdk/faq/3/7/ - /zh-cn/docs3-v2/java-sdk/faq/3/7/ description: 3-7 - 服务端响应结果超时 linkTitle: 3-7 - 服务端响应结果超时 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/8.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/8.md index 78abb67b83c4..035a05bf58c7 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/8/ + - /zh-cn/overview/mannual/java-sdk/faq/3/8/ - /zh-cn/docs3-v2/java-sdk/faq/3/8/ description: 3-8 - 代理失败 linkTitle: 3-8 - 代理失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/3/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/_index.md similarity index 78% rename from content/zh-cn/overview/mannual/java-sdk/faq/3/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/_index.md index 5c7a4a1d5fb4..26c74658fde8 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/3/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/3/_index.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/3/ + - /zh-cn/overview/mannual/java-sdk/faq/3/ - /zh-cn/docs3-v2/java-sdk/faq/3/ description: 3 - 动态代理层 linkTitle: 3 - 动态代理层 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/1.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/1.md index 71bb9b2d2294..6d5dd0d1e6c7 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/1/ + - /zh-cn/overview/mannual/java-sdk/faq/4/1/ - /zh-cn/docs3-v2/java-sdk/faq/4/1/ description: 4-1 - 不支持的协议 linkTitle: 4-1 - 不支持的协议 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/10.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/10.md index f65cac47d4dd..aac6bb846700 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/10/ + - /zh-cn/overview/mannual/java-sdk/faq/4/10/ - /zh-cn/docs3-v2/java-sdk/faq/4/10/ description: 4-10 - Triple 序列化结果失败 linkTitle: 4-10 - Triple 序列化结果失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/11.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/11.md index b1d90b1ebacb..6826be850a2e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/11/ + - /zh-cn/overview/mannual/java-sdk/faq/4/11/ - /zh-cn/docs3-v2/java-sdk/faq/4/11/ description: 4-11 - 发起请求失败 linkTitle: 4-11 - 发起请求失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/12.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/12.md index 895aa65f517f..1383a197ef86 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/12/ + - /zh-cn/overview/mannual/java-sdk/faq/4/12/ - /zh-cn/docs3-v2/java-sdk/faq/4/12/ description: 4-12 - 创建Triple流失败 linkTitle: 4-12 - 创建Triple流失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/13.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/13.md index 1fd9e90227fb..27f143146928 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/13/ + - /zh-cn/overview/mannual/java-sdk/faq/4/13/ - /zh-cn/docs3-v2/java-sdk/faq/4/13/ description: 4-13 - 服务端超时 linkTitle: 4-13 - 服务端超时 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/14.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/14.md index 60760428a3ea..af42c5358594 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/14/ + - /zh-cn/overview/mannual/java-sdk/faq/4/14/ - /zh-cn/docs3-v2/java-sdk/faq/4/14/ description: 4-14 - 响应结果失败 linkTitle: 4-14 - 响应结果失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/15.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/15.md index 5357c5851c2c..5981babd840b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/15/ + - /zh-cn/overview/mannual/java-sdk/faq/4/15/ - /zh-cn/docs3-v2/java-sdk/faq/4/15/ description: 4-15 - 客户端流监听器 linkTitle: 4-15 - 客户端流监听器 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/16.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/16.md index bb7d5bb3fc1a..c133eef1243b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/16/ + - /zh-cn/overview/mannual/java-sdk/faq/4/16/ - /zh-cn/docs3-v2/java-sdk/faq/4/16/ description: 4-16 - 服务已关闭 linkTitle: 4-16 - 服务已关闭 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/17.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/17.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/17.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/17.md index 809a73be20f5..074b19b43be5 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/17.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/17.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/17/ + - /zh-cn/overview/mannual/java-sdk/faq/4/17/ - /zh-cn/docs3-v2/java-sdk/faq/4/17/ description: 4-17 - 关闭所有调用程序时发生错误 linkTitle: 4-17 - 关闭所有调用程序时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/18.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/18.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/18.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/18.md index 25e7a169ebd1..d9e1db91639a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/18.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/18.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/18/ + - /zh-cn/overview/mannual/java-sdk/faq/4/18/ - /zh-cn/docs3-v2/java-sdk/faq/4/18/ description: 4-18 - 无法从调用中获取服务模型 linkTitle: 4-18 - 无法从调用中获取服务模型 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/19.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/19.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/19.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/19.md index 99386cb3cff2..809ee13aa9bb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/19.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/19.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/19/ + - /zh-cn/overview/mannual/java-sdk/faq/4/19/ - /zh-cn/docs3-v2/java-sdk/faq/4/19/ description: 4-19 - 参数值有出错的可能 linkTitle: 4-19 - 参数值有出错的可能 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/2.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/2.md index 5092464061a6..b9c32f34f52f 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/2/ + - /zh-cn/overview/mannual/java-sdk/faq/4/2/ - /zh-cn/docs3-v2/java-sdk/faq/4/2/ description: 4-2 - 序列化优化器初始发生错误 linkTitle: 4-2 - 序列化优化器初始发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/20.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/20.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/20.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/20.md index d44b6836917a..ac34b8136082 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/20.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/20.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/20/ + - /zh-cn/overview/mannual/java-sdk/faq/4/20/ - /zh-cn/docs3-v2/java-sdk/faq/4/20/ description: 4-20 - 数据解码失败 linkTitle: 4-20 - 数据解码失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/21.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/21.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/21.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/21.md index c2d206fff16a..e3ab2e1cab14 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/21.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/21.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/21/ + - /zh-cn/overview/mannual/java-sdk/faq/4/21/ - /zh-cn/docs3-v2/java-sdk/faq/4/21/ description: 4-21 - 检测到不安全的序列化数据 linkTitle: 4-21 - 检测到不安全的序列化数据 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/3.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/3.md index b1187086455f..417cd9a28566 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/3/ + - /zh-cn/overview/mannual/java-sdk/faq/4/3/ - /zh-cn/docs3-v2/java-sdk/faq/4/3/ description: 4-3 - 接口引用调用失败 linkTitle: 4-3 - 接口引用调用失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/4.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/4.md index 4051b5f5fa9e..2e088dc1f111 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/4/ + - /zh-cn/overview/mannual/java-sdk/faq/4/4/ - /zh-cn/docs3-v2/java-sdk/faq/4/4/ description: 4-4 - 非安全序列化方式 linkTitle: 4-4 - 非安全序列化方式 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/5.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/5.md index d2f8c70f0991..29af6443ae5d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/5/ + - /zh-cn/overview/mannual/java-sdk/faq/4/5/ - /zh-cn/docs3-v2/java-sdk/faq/4/5/ description: 4-5 - 流关闭异常 linkTitle: 4-5 - 流关闭异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/6.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/6.md index 7ef8460375ec..8abc5757a682 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/6/ + - /zh-cn/overview/mannual/java-sdk/faq/4/6/ - /zh-cn/docs3-v2/java-sdk/faq/4/6/ description: 4-6 - 反序列化失败 linkTitle: 4-6 - 反序列化失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/7.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/7.md index 217f4ab782b1..110de57ea750 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/7/ + - /zh-cn/overview/mannual/java-sdk/faq/4/7/ - /zh-cn/docs3-v2/java-sdk/faq/4/7/ description: 4-7 - 关闭客户端时发生错误 linkTitle: 4-7 - 关闭客户端时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/8.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/8.md index 704f9511d202..2aa343e3f2cb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/8/ + - /zh-cn/overview/mannual/java-sdk/faq/4/8/ - /zh-cn/docs3-v2/java-sdk/faq/4/8/ description: 4-8 - 关闭服务端时发生错误 linkTitle: 4-8 - 关闭服务端时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/9.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/9.md index 75e5ef7dc501..a9912177e477 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/9/ + - /zh-cn/overview/mannual/java-sdk/faq/4/9/ - /zh-cn/docs3-v2/java-sdk/faq/4/9/ description: 4-9 - 解析失败 linkTitle: 4-9 - 解析失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/4/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/_index.md similarity index 71% rename from content/zh-cn/overview/mannual/java-sdk/faq/4/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/_index.md index 526ecd98b722..e64fdd43327b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/4/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/4/_index.md @@ -1,10 +1,10 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/4/ + - /zh-cn/overview/mannual/java-sdk/faq/4/ - /zh-cn/docs3-v2/java-sdk/faq/4/ description: 4 - 协议层 linkTitle: 4 - 协议层 title: 4 - 协议层 type: docs -weight: 4 +weight: 6 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/1.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/1.md index eda716babb58..e8275145830b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/1/ + - /zh-cn/overview/mannual/java-sdk/faq/5/1/ - /zh-cn/docs3-v2/java-sdk/faq/5/1/ description: 5-1 - 配置中心连接失败 linkTitle: 5-1 - 配置中心连接失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/10.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/10.md index cb4c48cf1125..a4e82ac81941 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/10/ + - /zh-cn/overview/mannual/java-sdk/faq/5/10/ - /zh-cn/docs3-v2/java-sdk/faq/5/10/ description: 5-10 - 服务的注册接口应用程序映射失败 linkTitle: 5-10 - 服务的注册接口应用程序映射失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/11.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/11.md index d6de835d7a19..cdb3b6e084e2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/11/ + - /zh-cn/overview/mannual/java-sdk/faq/5/11/ - /zh-cn/docs3-v2/java-sdk/faq/5/11/ description: 5-11 - 注册实例错误 linkTitle: 5-11 - 注册实例错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/12.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/12.md index 3a18cd91bad8..803974ea7412 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/12/ + - /zh-cn/overview/mannual/java-sdk/faq/5/12/ - /zh-cn/docs3-v2/java-sdk/faq/5/12/ description: 5-12 - 刷新实例和元数据错误 linkTitle: 5-12 - 刷新实例和元数据错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/13.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/13.md index e23978f993e4..0a8a85d6b915 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/13/ + - /zh-cn/overview/mannual/java-sdk/faq/5/13/ - /zh-cn/docs3-v2/java-sdk/faq/5/13/ description: 5-13 - 无法销毁模型 linkTitle: 5-13 - 无法销毁模型 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/14.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/14.md index 4fcf8097d571..17f53b0b677e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/14/ + - /zh-cn/overview/mannual/java-sdk/faq/5/14/ - /zh-cn/docs3-v2/java-sdk/faq/5/14/ description: 5-14 - 模型启动错误 linkTitle: 5-14 - 模型启动错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/15.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/15.md index 449d8607a350..0025a207eaa3 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/15/ + - /zh-cn/overview/mannual/java-sdk/faq/5/15/ - /zh-cn/docs3-v2/java-sdk/faq/5/15/ description: 5-15 - 模型引用错误 linkTitle: 5-15 - 模型引用错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/16.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/16.md index 5cb536446bf6..d0cd386d21bb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/16/ + - /zh-cn/overview/mannual/java-sdk/faq/5/16/ - /zh-cn/docs3-v2/java-sdk/faq/5/16/ description: 5-16 - 无法找到任何有效的协议 linkTitle: 5-16 - 无法找到任何有效的协议 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/17.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/17.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/17.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/17.md index 917311b4ccb1..b9769c3dc67b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/17.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/17.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/17/ + - /zh-cn/overview/mannual/java-sdk/faq/5/17/ - /zh-cn/docs3-v2/java-sdk/faq/5/17/ description: 5-17 - 参数值格式错误 linkTitle: 5-17 - 参数值格式错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/18.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/18.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/18.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/18.md index 05526a0dccd9..049221b78c4c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/18.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/18.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/18/ + - /zh-cn/overview/mannual/java-sdk/faq/5/18/ - /zh-cn/docs3-v2/java-sdk/faq/5/18/ description: 5-18 - 通知注册事件失败 linkTitle: 5-18 - 通知注册事件失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/2.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/2.md index d3099d72f9be..68911be60916 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/2/ + - /zh-cn/overview/mannual/java-sdk/faq/5/2/ - /zh-cn/docs3-v2/java-sdk/faq/5/2/ description: 5-2 - 注册/注销关闭钩子方法失败 linkTitle: 5-2 - 注册/注销关闭钩子方法失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/20.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/20.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/20.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/20.md index 924e0d7f3110..32800a458e88 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/20.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/20.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/20/ + - /zh-cn/overview/mannual/java-sdk/faq/5/20/ - /zh-cn/docs3-v2/java-sdk/faq/5/20/ description: 5-20 - 停止 dubbo 模块时发生错误 linkTitle: 5-20 - 停止 dubbo 模块时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/21.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/21.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/21.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/21.md index 108a58734f32..790077c240ec 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/21.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/21.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/21/ + - /zh-cn/overview/mannual/java-sdk/faq/5/21/ - /zh-cn/docs3-v2/java-sdk/faq/5/21/ description: 5-21 - 服务销毁时发生异常错误 linkTitle: 5-21 - 服务销毁时发生异常错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/22.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/22.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/22.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/22.md index a8d219b5c812..f26164780676 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/22.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/22.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/22/ + - /zh-cn/overview/mannual/java-sdk/faq/5/22/ - /zh-cn/docs3-v2/java-sdk/faq/5/22/ description: 5-22 - 注册中心在初始化时发生错误 linkTitle: 5-22 - 注册中心在初始化时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/23.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/23.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/23.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/23.md index 394bb906dc1a..cc3c329a5f5d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/23.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/23.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/23/ + - /zh-cn/overview/mannual/java-sdk/faq/5/23/ - /zh-cn/docs3-v2/java-sdk/faq/5/23/ description: 5-23 - 等待导出/引用服务发生异常 linkTitle: 5-23 - 等待导出/引用服务发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/24.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/24.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/24.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/24.md index ba42ef96d850..9e6c377d1057 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/24.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/24.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/24/ + - /zh-cn/overview/mannual/java-sdk/faq/5/24/ - /zh-cn/docs3-v2/java-sdk/faq/5/24/ description: 5-24 - 异步等待引用服务发生异常 linkTitle: 5-24 - 异步等待引用服务发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/25.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/25.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/25.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/25.md index 318fcce3c333..08c9ab1e6772 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/25.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/25.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/25/ + - /zh-cn/overview/mannual/java-sdk/faq/5/25/ - /zh-cn/docs3-v2/java-sdk/faq/5/25/ description: 5-25 - 自定义实现发生未定义异常 linkTitle: 5-25 - 自定义实现发生未定义异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/26.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/26.md similarity index 85% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/26.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/26.md index 3de42b275bd0..b6cb44f1a12a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/26.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/26.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/26/ + - /zh-cn/overview/mannual/java-sdk/faq/5/26/ - /zh-cn/docs3-v2/java-sdk/faq/5/26/ description: 5-26 - 元数据已导出 linkTitle: 5-26 - 元数据已导出 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/27.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/27.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/27.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/27.md index 7e5d9a142f97..a3a2d2daa38d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/27.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/27.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/27/ + - /zh-cn/overview/mannual/java-sdk/faq/5/27/ - /zh-cn/docs3-v2/java-sdk/faq/5/27/ description: 5-27 - 内部类API被错误使用 linkTitle: 5-27 - 内部类API被错误使用 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/28.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/28.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/28.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/28.md index 72ae78589994..b410087393a2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/28.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/28.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/28/ + - /zh-cn/overview/mannual/java-sdk/faq/5/28/ - /zh-cn/docs3-v2/java-sdk/faq/5/28/ description: 5-28 - 未发现可用注解 linkTitle: 5-28 - 未发现可用注解 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/29.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/29.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/29.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/29.md index a4db53a64701..cb0b043c3247 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/29.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/29.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/29/ + - /zh-cn/overview/mannual/java-sdk/faq/5/29/ - /zh-cn/docs3-v2/java-sdk/faq/5/29/ description: 5-29 - 扫描包未配置 linkTitle: 5-29 - 扫描包未配置 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/3.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/3.md index ab7e1abc16bf..ba7cf6840d98 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/3/ + - /zh-cn/overview/mannual/java-sdk/faq/5/3/ - /zh-cn/docs3-v2/java-sdk/faq/5/3/ description: 5-3 - 销毁方法调用时发生意外错误 linkTitle: 5-3 - 销毁方法调用时发生意外错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/30.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/30.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/30.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/30.md index f462cecdbe6c..8c5061e47f1c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/30.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/30.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/30/ + - /zh-cn/overview/mannual/java-sdk/faq/5/30/ - /zh-cn/docs3-v2/java-sdk/faq/5/30/ description: 5-30 - 声明bean定义重复 linkTitle: 5-30 - 声明bean定义重复 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/31.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/31.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/31.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/31.md index e6fc1429f88c..e509e70ba1ef 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/31.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/31.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/31/ + - /zh-cn/overview/mannual/java-sdk/faq/5/31/ - /zh-cn/docs3-v2/java-sdk/faq/5/31/ description: 5-31 - 状态检查错误 linkTitle: 5-31 - 状态检查错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/32.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/32.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/32.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/32.md index c8406182a109..fe0db4db33a8 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/32.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/32.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/32/ + - /zh-cn/overview/mannual/java-sdk/faq/5/32/ - /zh-cn/docs3-v2/java-sdk/faq/5/32/ description: 5-32 - Apollo 断开连接时发生错误 linkTitle: 5-32 - Apollo 断开连接时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/33.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/33.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/33.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/33.md index 50e904f0df05..b34807cd0fd5 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/33.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/33.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/33/ + - /zh-cn/overview/mannual/java-sdk/faq/5/33/ - /zh-cn/docs3-v2/java-sdk/faq/5/33/ description: 5-33 - Apollo 配置更新事件发生异常 linkTitle: 5-33 - Apollo 配置更新事件发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/34.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/34.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/34.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/34.md index 086c3ce5a546..0ba8be884ef1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/34.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/34.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/34/ + - /zh-cn/overview/mannual/java-sdk/faq/5/34/ - /zh-cn/docs3-v2/java-sdk/faq/5/34/ description: 5-34 - NACOS 发生错误 linkTitle: 5-34 - NACOS 发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/35.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/35.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/35.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/35.md index 03f5e6040d91..f3d3455d0cfe 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/35.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/35.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/35/ + - /zh-cn/overview/mannual/java-sdk/faq/5/35/ - /zh-cn/docs3-v2/java-sdk/faq/5/35/ description: 5-35 - 容器初始化失败 linkTitle: 5-35 - 容器初始化失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/36.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/36.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/36.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/36.md index 392698b9e375..1f7e399c41de 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/36.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/36.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/36/ + - /zh-cn/overview/mannual/java-sdk/faq/5/36/ - /zh-cn/docs3-v2/java-sdk/faq/5/36/ description: 5-36 - 过滤器校验时发生错误 linkTitle: 5-36 - 过滤器校验时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/37.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/37.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/37.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/37.md index 5eafb4aea10f..5abdddff9c8a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/37.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/37.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/37/ + - /zh-cn/overview/mannual/java-sdk/faq/5/37/ - /zh-cn/docs3-v2/java-sdk/faq/5/37/ description: 5-37 - 动态配置监听处理发生错误 linkTitle: 5-37 - 动态配置监听处理发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/38.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/38.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/38.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/38.md index de9b02550952..5c412abdcbfc 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/38.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/38.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/38/ + - /zh-cn/overview/mannual/java-sdk/faq/5/38/ - /zh-cn/docs3-v2/java-sdk/faq/5/38/ description: 5-38 - 配置参数未定义 linkTitle: 5-38 - 配置参数未定义 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/39.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/39.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/39.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/39.md index 63563556664e..0035ba75b0be 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/39.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/39.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/39/ + - /zh-cn/overview/mannual/java-sdk/faq/5/39/ - /zh-cn/docs3-v2/java-sdk/faq/5/39/ description: 5-39 - Dubbo配置bean初始化器发生错误 linkTitle: 5-39 - Dubbo配置bean初始化器发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/4.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/4.md index b3e90dd23cae..acf7f1f912c1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/4/ + - /zh-cn/overview/mannual/java-sdk/faq/5/4/ - /zh-cn/docs3-v2/java-sdk/faq/5/4/ description: 5-4 - 服务接口中找不到方法 linkTitle: 5-4 - 服务接口中找不到方法 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/40.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/40.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/40.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/40.md index 5bb8bfa6c8fd..1ffdbc967cf2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/40.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/40.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/40/ + - /zh-cn/overview/mannual/java-sdk/faq/5/40/ - /zh-cn/docs3-v2/java-sdk/faq/5/40/ description: 5-40 - Dubbo配置bean未找到 linkTitle: 5-40 - Dubbo配置bean未找到 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/41.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/41.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/41.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/41.md index dfd2dd826133..6a61eb92fb39 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/41.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/41.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/41/ + - /zh-cn/overview/mannual/java-sdk/faq/5/41/ - /zh-cn/docs3-v2/java-sdk/faq/5/41/ description: 5-41 - SSL证书读取失败 linkTitle: 5-41 - SSL证书读取失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/42.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/42.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/42.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/42.md index 1ae4e75fd16b..2fdbd434b59e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/42.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/42.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/42/ + - /zh-cn/overview/mannual/java-sdk/faq/5/42/ - /zh-cn/docs3-v2/java-sdk/faq/5/42/ description: 5-42 - Dubbo 证书签发失败 linkTitle: 5-42 - Dubbo 证书签发失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/43.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/43.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/43.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/43.md index 6cab512292e1..dc91d8400c07 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/43.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/43.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/43/ + - /zh-cn/overview/mannual/java-sdk/faq/5/43/ - /zh-cn/docs3-v2/java-sdk/faq/5/43/ description: 5-43 - Dubbo 证书签发连接不安全 linkTitle: 5-43 - Dubbo 证书签发连接不安全 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/5.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/5.md index 2f48fa867b8a..61bda9c1c757 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/5/ + - /zh-cn/overview/mannual/java-sdk/faq/5/5/ - /zh-cn/docs3-v2/java-sdk/faq/5/5/ description: 5-5 - 无法获得env变量 linkTitle: 5-5 - 无法获得env变量 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/6.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/6.md index 1218b22d9a23..1475c055fbed 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/6/ + - /zh-cn/overview/mannual/java-sdk/faq/5/6/ - /zh-cn/docs3-v2/java-sdk/faq/5/6/ description: 5-6 - 接口类型的属性冲突 linkTitle: 5-6 - 接口类型的属性冲突 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/7.md similarity index 93% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/7.md index 6f91dab68b62..3d35b746e881 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/7/ + - /zh-cn/overview/mannual/java-sdk/faq/5/7/ - /zh-cn/docs3-v2/java-sdk/faq/5/7/ description: 5-7 - 取消导出时发生意外错误 linkTitle: 5-7 - 取消导出时发生意外错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/8.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/8.md index 06de1d49f1fd..1942c144017f 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/8/ + - /zh-cn/overview/mannual/java-sdk/faq/5/8/ - /zh-cn/docs3-v2/java-sdk/faq/5/8/ description: 5-8 - 协议将使用随机可用端口 linkTitle: 5-8 - 协议将使用随机可用端口 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/9.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/9.md index 43c2fb69ea7c..38d96c0f2788 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/9/ + - /zh-cn/overview/mannual/java-sdk/faq/5/9/ - /zh-cn/docs3-v2/java-sdk/faq/5/9/ description: 5-9 - 服务配置导出失败 linkTitle: 5-9 - 服务配置导出失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/5/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/_index.md similarity index 75% rename from content/zh-cn/overview/mannual/java-sdk/faq/5/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/_index.md index 0cbeaaa4eaf6..651a2b2121dc 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/5/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/5/_index.md @@ -1,10 +1,10 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/5/ + - /zh-cn/overview/mannual/java-sdk/faq/5/ - /zh-cn/docs3-v2/java-sdk/faq/5/ description: 5 - 配置(中心)层 linkTitle: 5 - 配置(中心)层 title: 5 - 配置(中心)层 type: docs -weight: 5 +weight: 7 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/1.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/1.md index a5e20d76faf9..dabc2331d190 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/1/ + - /zh-cn/overview/mannual/java-sdk/faq/6/1/ - /zh-cn/docs3-v2/java-sdk/faq/6/1/ description: 6-1 - 服务端连接失败 linkTitle: 6-1 - 服务端连接失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/10.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/10.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/10.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/10.md index cd8014ecee82..85dc4f851288 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/10.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/10.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/10/ + - /zh-cn/overview/mannual/java-sdk/faq/6/10/ - /zh-cn/docs3-v2/java-sdk/faq/6/10/ description: 6-10 - 超过有效载荷限制异常 linkTitle: 6-10 - 超过有效载荷限制异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/11.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/11.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/11.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/11.md index 05a27d4d079f..4461a6ba93b2 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/11.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/11.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/11/ + - /zh-cn/overview/mannual/java-sdk/faq/6/11/ - /zh-cn/docs3-v2/java-sdk/faq/6/11/ description: 6-11 - 字符集不被支持 linkTitle: 6-11 - 字符集不被支持 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/12.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/12.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/12.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/12.md index 1c8744c76166..491def557a01 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/12.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/12.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/12/ + - /zh-cn/overview/mannual/java-sdk/faq/6/12/ - /zh-cn/docs3-v2/java-sdk/faq/6/12/ description: 6-12 - ZK客户端销毁时发生错误 linkTitle: 6-12 - ZK客户端销毁时发生错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/13.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/13.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/13.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/13.md index 1771fd395f1b..d38334d3db06 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/13.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/13.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/13/ + - /zh-cn/overview/mannual/java-sdk/faq/6/13/ - /zh-cn/docs3-v2/java-sdk/faq/6/13/ description: 6-13 - 流关闭异常 linkTitle: 6-13 - 流关闭异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/14.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/14.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/14.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/14.md index f33f8c488035..a0ab34fc1041 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/14.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/14.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/14/ + - /zh-cn/overview/mannual/java-sdk/faq/6/14/ - /zh-cn/docs3-v2/java-sdk/faq/6/14/ description: 6-14 - 服务端响应失败 linkTitle: 6-14 - 服务端响应失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/15.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/15.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/15.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/15.md index 2a5d0e531fa6..a48e91c5467c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/15.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/15.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/15/ + - /zh-cn/overview/mannual/java-sdk/faq/6/15/ - /zh-cn/docs3-v2/java-sdk/faq/6/15/ description: 6-15 - 跳过未读完的流数据 linkTitle: 6-15 - 跳过未读完的流数据 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/16.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/16.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/16.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/16.md index aa1abed1307e..ba1356680f3b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/16.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/16.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/16/ + - /zh-cn/overview/mannual/java-sdk/faq/6/16/ - /zh-cn/docs3-v2/java-sdk/faq/6/16/ description: 6-16 - 重连时发生异常 linkTitle: 6-16 - 重连时发生异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/2.md similarity index 97% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/2.md index f939796c7bc6..ec24a68a7c7c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/2/ + - /zh-cn/overview/mannual/java-sdk/faq/6/2/ - /zh-cn/docs3-v2/java-sdk/faq/6/2/ description: 6-2 - 客户端超时 linkTitle: 6-2 - 客户端超时 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/3.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/3.md index 60730203dc2e..79d4a8bd65be 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/3/ + - /zh-cn/overview/mannual/java-sdk/faq/6/3/ - /zh-cn/docs3-v2/java-sdk/faq/6/3/ description: 6-3 - 网络连接关闭失败 linkTitle: 6-3 - 网络连接关闭失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/4.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/4.md index 01044b0fa057..65c63cf16316 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/4/ + - /zh-cn/overview/mannual/java-sdk/faq/6/4/ - /zh-cn/docs3-v2/java-sdk/faq/6/4/ description: 6-4 - 网络通讯层未知异常 linkTitle: 6-4 - 网络通讯层未知异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/5.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/5.md index b207b5cf71db..8bccfe8358d1 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/5/ + - /zh-cn/overview/mannual/java-sdk/faq/6/5/ - /zh-cn/docs3-v2/java-sdk/faq/6/5/ description: 6-5 - 网络连接断开失败 linkTitle: 6-5 - 网络连接断开失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/6.md similarity index 91% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/6.md index f0f7fe42f150..3f7159d92602 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/6/ + - /zh-cn/overview/mannual/java-sdk/faq/6/6/ - /zh-cn/docs3-v2/java-sdk/faq/6/6/ description: 6-6 - 不支持的消息 linkTitle: 6-6 - 不支持的消息 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/7.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/7.md index cca4df2d1a5c..81f039e1d11d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/7/ + - /zh-cn/overview/mannual/java-sdk/faq/6/7/ - /zh-cn/docs3-v2/java-sdk/faq/6/7/ description: 6-7 - 线程连接数超限警告 linkTitle: 6-7 - 服务端连接失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/8.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/8.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/8.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/8.md index 18887f69f222..343c4c0b3d89 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/8.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/8.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/8/ + - /zh-cn/overview/mannual/java-sdk/faq/6/8/ - /zh-cn/docs3-v2/java-sdk/faq/6/8/ description: 6-8 - 返回数据解码失败 linkTitle: 6-8 - 返回数据解码失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/9.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/9.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/9.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/9.md index 9ef4669ad7d7..aa34a5507b4b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/9.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/9.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/9/ + - /zh-cn/overview/mannual/java-sdk/faq/6/9/ - /zh-cn/docs3-v2/java-sdk/faq/6/9/ description: 6-9 - 序列号ID存在重复 linkTitle: 6-9 - 服务端连接失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/6/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/_index.md similarity index 73% rename from content/zh-cn/overview/mannual/java-sdk/faq/6/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/_index.md index 7f6733d5078d..fe5df483972d 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/6/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/6/_index.md @@ -1,10 +1,10 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/6/ + - /zh-cn/overview/mannual/java-sdk/faq/6/ - /zh-cn/docs3-v2/java-sdk/faq/6/ description: 6 - 网络传输层 linkTitle: 6 - 网络传输层 title: 6 - 网络传输层 type: docs -weight: 6 +weight: 8 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/1.md similarity index 87% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/1.md index 260ace9a9e13..6e401264b577 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/1/ + - /zh-cn/overview/mannual/java-sdk/faq/7/1/ - /zh-cn/docs3-v2/java-sdk/faq/7/1/ description: 7-1 - QOS 已关闭 linkTitle: 7-1 - QOS 已关闭 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/2.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/2.md index cc9b5db7bedc..c520b4c84bc0 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/2/ + - /zh-cn/overview/mannual/java-sdk/faq/7/2/ - /zh-cn/docs3-v2/java-sdk/faq/7/2/ description: 7-2 - QOS 已开启 linkTitle: 7-2 - QOS 已开启 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/3.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/3.md index 489fca34c168..c12e9e12500c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/3/ + - /zh-cn/overview/mannual/java-sdk/faq/7/3/ - /zh-cn/docs3-v2/java-sdk/faq/7/3/ description: 7-3 - 设置超时时间的警告百分比值 linkTitle: 7-3 - 设置超时时间的警告百分比值 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/4.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/4.md index 22f25956b930..bba7a342f7eb 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/4/ + - /zh-cn/overview/mannual/java-sdk/faq/7/4/ - /zh-cn/docs3-v2/java-sdk/faq/7/4/ description: 7-4 - QOS 服务启动失败 linkTitle: 7-4 - QOS 服务启动失败 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/5.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/5.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/5.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/5.md index f95f2946f258..78d89eab01ad 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/5.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/5.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/5/ + - /zh-cn/overview/mannual/java-sdk/faq/7/5/ - /zh-cn/docs3-v2/java-sdk/faq/7/5/ description: 7-5 - QOS 命令未找到 linkTitle: 7-5 - QOS 命令未找到 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/6.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/6.md similarity index 90% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/6.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/6.md index d0771f377e42..aa89d611e494 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/6.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/6.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/6/ + - /zh-cn/overview/mannual/java-sdk/faq/7/6/ - /zh-cn/docs3-v2/java-sdk/faq/7/6/ description: 7-6 - QOS 发生未知异常 linkTitle: 7-6 - QOS 发生未知异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/7.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/7.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/7.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/7.md index 837b3c00e31d..acf0071fe88b 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/7.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/7.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/7/ + - /zh-cn/overview/mannual/java-sdk/faq/7/7/ - /zh-cn/docs3-v2/java-sdk/faq/7/7/ description: 7-7 - QOS 无权限访问 linkTitle: 7-7 - QOS 无权限访问 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/7/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/_index.md similarity index 74% rename from content/zh-cn/overview/mannual/java-sdk/faq/7/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/_index.md index decf987dbebb..0086ea304f6c 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/7/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/7/_index.md @@ -1,10 +1,10 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/7/ + - /zh-cn/overview/mannual/java-sdk/faq/7/ - /zh-cn/docs3-v2/java-sdk/faq/7/ description: 7 - QoS 插件模块 linkTitle: 7 - QoS 插件模块 title: 7 - QoS 插件模块 type: docs -weight: 7 +weight: 9 --- diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/81/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/1.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/81/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/1.md index 81c2858f8833..727e751ef678 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/81/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/81/1/ + - /zh-cn/overview/mannual/java-sdk/faq/81/1/ - /zh-cn/docs3-v2/java-sdk/faq/81/1/ description: 81-1 - ZK 启动异常 linkTitle: 81-1 - ZK 启动异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/81/2.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/2.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/81/2.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/2.md index 1d9f641fb83c..3295fce6b749 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/81/2.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/2.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/81/2/ + - /zh-cn/overview/mannual/java-sdk/faq/81/2/ - /zh-cn/docs3-v2/java-sdk/faq/81/2/ description: 81-2 - ZK 销毁异常 linkTitle: 81-2 - ZK 销毁异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/81/3.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/3.md similarity index 89% rename from content/zh-cn/overview/mannual/java-sdk/faq/81/3.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/3.md index 9965bf51954d..dec8ab3275fa 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/81/3.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/3.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/81/3/ + - /zh-cn/overview/mannual/java-sdk/faq/81/3/ - /zh-cn/docs3-v2/java-sdk/faq/81/3/ description: 81-3 - 通过url无法下载文件 linkTitle: 81-3 - 通过url无法下载文件 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/81/4.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/4.md similarity index 94% rename from content/zh-cn/overview/mannual/java-sdk/faq/81/4.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/4.md index e4410955707e..f58d6503a238 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/81/4.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/4.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/81/4/ + - /zh-cn/overview/mannual/java-sdk/faq/81/4/ - /zh-cn/docs3-v2/java-sdk/faq/81/4/ description: 81-4 - 嵌入式ZooKeeper运行异常 linkTitle: 81-4 - 嵌入式ZooKeeper运行异常 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/81/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/_index.md similarity index 88% rename from content/zh-cn/overview/mannual/java-sdk/faq/81/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/_index.md index a165a18b4845..37b36f97b088 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/81/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/81/_index.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/81/ + - /zh-cn/overview/mannual/java-sdk/faq/81/ - /zh-cn/docs3-v2/java-sdk/faq/81/ description: 81 - 单元测试辅助模块(注册中心) linkTitle: 81 - 单元测试辅助模块(注册中心) diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/99/0.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/0.md similarity index 95% rename from content/zh-cn/overview/mannual/java-sdk/faq/99/0.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/0.md index 3a5b968ed78c..83515b82010a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/99/0.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/0.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/99/0/ + - /zh-cn/overview/mannual/java-sdk/faq/99/0/ - /zh-cn/docs3-v2/java-sdk/faq/99/0/ description: 99-0 - 内部未知错误 linkTitle: 99-0 - 内部未知错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/99/1.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/1.md similarity index 92% rename from content/zh-cn/overview/mannual/java-sdk/faq/99/1.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/1.md index 7a897c613d5c..89ca2635445a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/99/1.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/1.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/99/1/ + - /zh-cn/overview/mannual/java-sdk/faq/99/1/ - /zh-cn/docs3-v2/java-sdk/faq/99/1/ description: 99-1 - 程序被打断 linkTitle: 99-1 - 程序被打断 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/99/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/_index.md similarity index 79% rename from content/zh-cn/overview/mannual/java-sdk/faq/99/_index.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/_index.md index a34155a24a0b..babb36c74f63 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/99/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/99/_index.md @@ -1,6 +1,6 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/99/ + - /zh-cn/overview/mannual/java-sdk/faq/99/ - /zh-cn/docs3-v2/java-sdk/faq/99/ description: 99 - 其它未知错误 linkTitle: 99 - 其它未知错误 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/error-code/_index.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/_index.md new file mode 100755 index 000000000000..40859cae97d2 --- /dev/null +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/_index.md @@ -0,0 +1,12 @@ +--- +aliases: + - /zh-cn/overview/mannual/java-sdk/faq/ + - /zh-cn/docs3-v2/java-sdk/faq/ +description: 错误码 FAQ +linkTitle: 错误码 FAQ +title: 错误码 FAQ +type: docs +weight: 10 +--- + +这里主要是提供 Java SDK 中各个错误码的可能原因和解决方法。 diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/intro.md b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/intro.md similarity index 96% rename from content/zh-cn/overview/mannual/java-sdk/faq/intro.md rename to content/zh-cn/overview/mannual/java-sdk/faq/error-code/intro.md index 9a68d87c8bc9..7d24774c5b79 100644 --- a/content/zh-cn/overview/mannual/java-sdk/faq/intro.md +++ b/content/zh-cn/overview/mannual/java-sdk/faq/error-code/intro.md @@ -1,19 +1,15 @@ --- aliases: - - /zh/docs3-v2/java-sdk/faq/intro/ + - /zh-cn/overview/mannual/java-sdk/faq/intro/ - /zh-cn/docs3-v2/java-sdk/faq/intro/ description: 错误码机制的介绍 linkTitle: 错误码机制的介绍 title: 错误码机制的介绍 type: docs -weight: 0 +weight: 1 --- - - - - ### 背景 Dubbo 内部依赖的 Logger 抽象层提供了日志输出能力,但是大部分的异常日志都没有附带排查说明,导致用户看到异常后无法进行处理。 @@ -30,7 +26,7 @@ This may be caused by ..., go to https://dubbo.apache.org/faq/[Cat]/[X] to find ``` > 另外在这句话后可以指定补充的信息(即 extendedInformation)。 -### 显示的实例 +### 日志示例 ``` [31/07/22 02:43:07:796 CST] main WARN support.AbortPolicyWithReport: [DUBBO] Thread pool is EXHAUSTED! Thread Name: Test, Pool Size: 0 (active: 0, core: 1, max: 1, largest: 0), Task: 0 (completed: 0), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://10.20.130.230:20880!, dubbo version: , current host: 10.20.130.230, error code: 0-1. This may be caused by too much client requesting provider, go to https://dubbo.apache.org/faq/0/1 to find instructions. ``` diff --git a/content/zh-cn/overview/mannual/java-sdk/faq/faq.md b/content/zh-cn/overview/mannual/java-sdk/faq/faq.md new file mode 100644 index 000000000000..65c77e890197 --- /dev/null +++ b/content/zh-cn/overview/mannual/java-sdk/faq/faq.md @@ -0,0 +1,14 @@ +--- +description: "常见 Dubbo 问题解答 FAQ" +linkTitle: 常见问题解答 +title: 常见问题解答 +type: docs +weight: 1 +--- + +1. 对于纯Consumer应用,如何关闭 MetadataService 端口? + register-consumer=false +2. 让 MetadataService 暴露在指定的协议和端口上 + metadata-protocol=dubbo, metadata-port=xxx +3. QoS 的开启 + diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/_index.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/_index.md index 78185a2d9265..75d83134925b 100755 --- a/content/zh-cn/overview/mannual/java-sdk/quick-start/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/quick-start/ - /zh-cn/docs3-v2/java-sdk/quick-start/ + - /zh-cn/overview/quickstart/java/ description: "" linkTitle: 快速入门 title: 快速入门 diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/brief.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/brief.md index 574733c5bab5..0ab4c85ed534 100644 --- a/content/zh-cn/overview/mannual/java-sdk/quick-start/brief.md +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/brief.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/quick-start/brief/ - /zh-cn/docs3-v2/java-sdk/quick-start/brief/ + - /zh-cn/overview/quickstart/java/brief/ description: 本文将基于 Dubbo Samples 示例演示如何快速搭建并部署一个微服务应用。 linkTitle: 快速部署一个微服务应用 title: 1 - 零基础快速部署一个微服务应用 @@ -9,11 +10,6 @@ type: docs weight: 1 --- - - - - - ## 背景 ![arch-service-discovery](/imgs/architecture.png) diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/idl.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/idl.md index 4ba38f360527..c2394f2f3efe 100755 --- a/content/zh-cn/overview/mannual/java-sdk/quick-start/idl.md +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/idl.md @@ -3,75 +3,86 @@ aliases: - /zh/docs3-v2/java-sdk/quick-start/idl/ - /zh-cn/docs3-v2/java-sdk/quick-start/idl/ description: 从零演示如何基于 IDL 方式来定义 Dubbo 服务并使用 Triple 协议 -linkTitle: IDL 定义跨语言服务 -title: IDL 定义跨语言服务 +linkTitle: 基于 IDL 定义跨语言服务 +title: 基于 IDL 定义跨语言服务 type: docs weight: 11 --- +使用 IDL 定义服务具有更好的跨语言友好性,对于 Dubbo3 新用户而言,我们推荐使用这种方式。可在此查看[本示例的完整代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 +然而 Triple 协议并不是和 IDL 强绑定的,也可以[使用 Java Interface + Pojo 的方式定义服务](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/pojo/)并启用 Triple 协议。 - - - -使用 IDL 定义服务具有更好的跨语言友好性,对于 Dubbo3 新用户而言,我们推荐使用这种方式。 -然而 Triple 协议并不是和 IDL 强绑定的,也可以使用 Java Interface + Pojo 的方式定义服务并启用 Triple 协议,具体可参见[示例](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/pojo)。 - -更多 Triple 和 IDL 使用方式,请参考[官方示例](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-triple) - -### 前置条件 +## 前置条件 - [JDK](https://jdk.java.net/) 版本 >= 8 - 已安装 [Maven](https://maven.apache.org/) -### 创建工程 -1. 首先创建一个空的 maven 工程 - ``` - $ mvn archetype:generate \ - -DgroupId=org.apache.dubbo \ - -DartifactId=tri-stub-demo \ - -DarchetypeArtifactId=maven-archetype-quickstart \ - -DarchetypeVersion=1.4 \ - -DarchetypeGroupId=org.apache.maven.archetypes \ - -Dversion=1.0-SNAPSHOT - ``` -2. 切换到工程目录 - ``` - $ cd tri-stub-demo - ``` -3. 在 `pom.xml` 中设置 JDK 版本,添加 Dubbo 依赖和插件 - ```xml - - UTF-8 - 1.8 - 1.8 - 3.1.7 - - +## 运行示例 +首先可通过以下命令下载示例源码 +```shell +git clone https://github.com/apache/dubbo-samples.git +``` + +编译项目,由 IDL 生成代码 +```shell +cd dubbo-samples +mvn clean compile +``` + +### 启动 Server +进入示例目录并运行以下命令启动 server。 +```shell +cd 1-basic/dubbo-samples-triple-unary +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryServer" +``` + +### 访问服务 +有两种方式可以访问 Triple 服务: +* 以标准 HTTP 工具访问 +* 以 Dubbo client sdk 访问 + +#### cURL 访问 + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '[{"name": "Dubbo"}]' \ + http://localhost:50052/org.apache.dubbo.samples.tri.unary.Greeter/greet/ +``` + +#### Dubbo client 访问 +运行以下命令,启动 Dubbo client 并完成服务调用 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryClient" +``` + +## 示例讲解 +可在此查看 [完整示例代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 + +### 项目依赖 +由于使用 IDL 开发模式,因此要添加 dubbo、protobuf-java 等依赖,同时还要配置 protobuf-maven-plugin 等插件,用于生成桩代码。 + +```xml + - - junit - junit - 4.13 - test - - - org.apache.dubbo - dubbo - ${dubbo.version} - - - org.apache.dubbo - dubbo-dependencies-zookeeper-curator5 - pom - ${dubbo.version} - + + org.apache.dubbo + dubbo + ${dubbo.version} + com.google.protobuf protobuf-java - 3.19.4 + 3.19.6 + + + org.apache.dubbo + dubbo-dependencies-zookeeper-curator5 + ${dubbo.version} + pom - + @@ -86,7 +97,7 @@ weight: 11 protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:3.19.4:exe:${os.detected.classifier} + com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier} dubbo @@ -105,137 +116,128 @@ weight: 11 + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.level} + ${target.level} + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.3.0 + + + generate-sources + + add-source + + + + target/generated-sources/protobuf/java + + + + + - ``` -4. 添加接口定义文件`src/main/proto/hello.proto`,Dubbo 使用 [Protobuf](https://developers.google.com/protocol-buffers) 作为 IDL - ```protobuf - syntax = "proto3"; - - option java_multiple_files = true; - option java_package = "org.apache.dubbo.hello"; - option java_outer_classname = "HelloWorldProto"; - option objc_class_prefix = "HLW"; - - package helloworld; - - message HelloRequest { - string name = 1; - } + +``` + +### 服务定义 +使用 Protocol Buffers 定义服务 + +```protobuf +syntax = "proto3"; + +option java_multiple_files = true; + +package org.apache.dubbo.samples.tri.unary; - message HelloReply { - string message = 1; +message GreeterRequest { + string name = 1; +} + +message GreeterReply { + string message = 1; +} + +service Greeter{ + rpc greet(GreeterRequest) returns (GreeterReply); +} +``` + +### 代码生成 +执行 `mvn clean compile` 后,生成代码如下 + + +### 服务实现 +继承生成的基础类 `DubboGreeterTriple.GreeterImplBase`,以下具体的业务逻辑实现。 + +```java +public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase { + @Override + public GreeterReply greet(GreeterRequest request) { + LOGGER.info("Server {} received greet request {}", serverName, request); + return GreeterReply.newBuilder() + .setMessage("hello," + request.getName()) + .build(); } - service Greeter{ - rpc greet(HelloRequest) returns (HelloReply); +} +``` + +注册服务到 server + +```java +public class TriUnaryServer { + public static void main(String[] args) throws IOException { + new EmbeddedZooKeeper(TriSampleConstants.ZK_PORT, false).start(); + ServiceConfig service = new ServiceConfig<>(); + service.setInterface(Greeter.class); + service.setRef(new GreeterImpl("tri-stub")); + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-server"); + applicationConfig.setQosEnable(false); + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + bootstrap.application(applicationConfig) + .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)) + .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT)) + .service(service) + .start(); + System.out.println("Dubbo triple unary server started, port=" + TriSampleConstants.SERVER_PORT); + } +} +``` + +### 编写 client 逻辑 +```java +public class TriUnaryClient { + private static final Logger LOGGER = LoggerFactory.getLogger(TriUnaryClient.class); + + public static void main(String[] args) throws IOException { + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + ReferenceConfig ref = new ReferenceConfig<>(); + ref.setInterface(Greeter.class); + ref.setProtocol(CommonConstants.TRIPLE); + ref.setProxy(CommonConstants.NATIVE_STUB); + ref.setTimeout(3000); + + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-consumer"); + applicationConfig.setQosEnable(false); + bootstrap.application(applicationConfig).reference(ref).registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)).start(); + Greeter greeter = ref.get(); + + //sync + unarySync(greeter); } - ``` -5. 编译 IDL - ``` - $ mvn clean install - ``` - 编译成功后,可以看到`target/generated-sources/protobuf/java` 目录下生成了代码文件 - ``` - $ ls org/apache/dubbo/hello/ - DubboGreeterTriple.java HelloReply.java HelloRequest.java HelloWorldProto.java - Greeter.java HelloReplyOrBuilder.java HelloRequestOrBuilder.java - ``` - -6. 添加服务端接口实现`src/main/java/org/apache/dubbo/GreeterImpl.java` - ```java - package org.apache.dubbo; - - import org.apache.dubbo.hello.DubboGreeterTriple; - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase { - @Override - public HelloReply greet(HelloRequest request) { - return HelloReply.newBuilder() - .setMessage("Hello," + request.getName() + "!") - .build(); - } - } - ``` -7. 添加服务端启动类 `src/main/java/org/apache/dubbo/MyDubboServer.java` - ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ProtocolConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.ServiceConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - import org.apache.dubbo.hello.Greeter; - - import java.io.IOException; - - public class MyDubboServer { - - public static void main(String[] args) throws IOException { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(Greeter.class); - service.setRef(new GreeterImpl()); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("tri-stub-server")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)) - .service(service) - .start(); - System.out.println("Dubbo triple stub server started"); - System.in.read(); - } - } - ``` - -8. 添加客户端启动类`src/main/java/org/apache/dubbo/MyDubboClient.java` - ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ReferenceConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - import org.apache.dubbo.hello.Greeter; - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public class MyDubboClient { - public static void main(String[] args) { - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - ReferenceConfig ref = new ReferenceConfig<>(); - ref.setInterface(Greeter.class); - ref.setProtocol(CommonConstants.TRIPLE); - ref.setProxy(CommonConstants.NATIVE_STUB); - ref.setTimeout(3000); - bootstrap.application(new ApplicationConfig("tri-stub-client")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .reference(ref) - .start(); - - Greeter greeter = ref.get(); - HelloRequest request = HelloRequest.newBuilder().setName("Demo").build(); - HelloReply reply = greeter.greet(request); - System.out.println("Received reply:" + reply); - } - } - ``` -9. 编译代码 - ``` - $ mvn clean install - ``` -10. 启动服务端 - ``` - $ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer" - Dubbo triple stub server started - ``` -11. 打开新的终端,启动客户端 - ``` - $ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient" - Received reply:message: "Hello,Demo!" - ``` + private static void unarySync(Greeter greeter) { + LOGGER.info("{} Start unary", "tri-unary-client"); + final GreeterReply reply = greeter.greet(GreeterRequest.newBuilder().setName("name").build()); + LOGGER.info("{} Unary reply <-{}", "tri-unary-client", reply); + } +} +``` diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/sourcecode.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/sourcecode.md new file mode 100644 index 000000000000..9d890820aacc --- /dev/null +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/sourcecode.md @@ -0,0 +1,114 @@ +## 示例源码说明(可选阅读) +### Maven 依赖 +示例项目中 Dubbo 相关核心依赖如下: + +```xml + + + + org.apache.dubbo + dubbo-bom + 3.3.0-beta.1 + pom + import + + + + + + + org.apache.dubbo + dubbo-spring-boot-starter + + + org.apache.dubbo + dubbo-spring-boot-nacos-starter + + + org.apache.dubbo + dubbo-spring-boot-zookeeper-starter + + + org.apache.dubbo + dubbo-spring-boot-observability-starter + + + org.apache.dubbo + dubbo-spring-boot-tracing-otel-starter + + +``` + +### 服务定义 + +以下是标准的 Dubbo 服务定义。 + +```java +public interface DemoService { + String sayHello(String name); +} +``` + +在 `DemoService` 中,定义了 `sayHello` 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 `DemoService` 接口展开的。 + +### 提供服务实现 + +定义了服务接口之后,可以在服务端这一侧定义对应的实现。 +```java +@DubboService +public class DemoServiceImpl implements DemoService { + @Override + public String sayHello(String name) { + return "Hello " + name; + } +} +``` + +在`DemoServiceImpl` 类中添加了 `@DubboService` 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。 + +### 发起服务调用 +示例中有一个 consumer 包,用于模拟发起对 provider 服务的远程调用。 + +```java +@Component +public class Consumer implements CommandLineRunner { + @DubboReference + private DemoService demoService; + + @Override + public void run(String... args) throws Exception { + String result = demoService.sayHello("world"); + System.out.println("Receive result ======> " + result); + } +} +``` + +在 `Task` 类中,通过`@DubboReference` 从 Dubbo 获取了一个 RPC 订阅,这个 `demoService` 可以像本地调用一样直接调用。在 `run`方法中创建了一个线程进行调用。 + +### 应用入口与配置文件 + +由于我们创建的是一个 Spring Boot 应用,Dubbo 相关配置信息都被直接存放在 `application.yml` 配置文件中。 + +```yaml +# application.yml +dubbo: + application: + name: dubbo-demo + protocol: + name: tri + port: -1 + registry: + address: zookeeper://${zookeeper.address:127.0.0.1}:2181 +``` + +以下是整个应用的启动入口,额外加入了 `@EnableDubbo` 注解来启动 Dubbo 相关组件。 + +```java +@SpringBootApplication +@EnableDubbo +public class DemoApplication { + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } +} +``` diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-boot.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-boot.md index fb81b4509c79..cc6cf49c734a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-boot.md +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-boot.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/quick-start/spring-boot/ - /zh-cn/docs3-v2/java-sdk/quick-start/spring-boot/ + - /zh-cn/overview/quickstart/java/spring-boot/ description: 本文将基于 Dubbo Samples 示例演示如何通过 Dubbo x Spring Boot 快速开发微服务应用。 linkTitle: 基于 Spring Boot Starter 开发微服务应用 title: 3 - 基于 Spring Boot Starter 开发微服务应用 @@ -9,11 +10,6 @@ type: docs weight: 3 --- - - - - - ## 目标 从零上手开发基于 dubbo-spring-boot-starter 开发微服务,了解 Dubbo x Spring Boot 配置方式。 diff --git a/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-xml.md b/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-xml.md index ab7c1320570c..8a65b005f7dd 100644 --- a/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-xml.md +++ b/content/zh-cn/overview/mannual/java-sdk/quick-start/spring-xml.md @@ -11,11 +11,6 @@ type: docs weight: 4 --- - - - - - ## 目标 从零上手开发基于 Dubbo x Spring XML 的微服务开发,了解 Dubbo x Spring XML 配置方式。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/_index.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/_index.md index ba40804fc9ec..385e3e4e9f6f 100755 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/_index.md @@ -9,3 +9,7 @@ title: RPC 协议 type: docs weight: 4 --- + +Dubbo3 定义了 Triple、Dubbo2 协议,这是 Dubbo 框架的内置原生协议。其中 Triple 协议能跑在 HTTP 之上,具有更高的灵活性和通用性,可帮助开发者轻松的联通浏览器、移动设备与后端服务,使用 Dubbo 协议开发者可以解决普通组件 RPC 通信、微服务间数据传输等问题,具体可参见快速开始中的 RPC、微服务等不同开发示例。 + +除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务理体系,包括 gRPC、Thrift、JsonRPC、Hessian2、REST 等。其中 REST 使用标准 HTTP+JSON 的传输格式,其在 Java 实现中也是一种编程模式,可以让用户开发后端 Web 服务,支持 Spring Web、JAX-RS 等常用注解使用方式。 \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo.md index 25cfb9f9d4c0..068724e1bf6a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/dubbo.md @@ -1,15 +1,16 @@ --- aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/dubbo/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/dubbo/ - /zh/overview/what/ecosystem/protocol/dubbo/ -description: Dubbo协议 -linkTitle: Dubbo协议 -title: Dubbo协议 +description: 基于 TCP 的 Dubbo 二进制通信协议实现及使用方式 +linkTitle: 基于 TCP 的 Dubbo 二进制协议 +title: 基于 TCP 的 Dubbo 二进制协议 type: docs weight: 2 --- +请在此查看 [Dubbo 协议规范](/zh-cn/overview/reference/protocols/tcp/)。 + ## 特性说明 Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/grpc.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/grpc.md deleted file mode 100644 index 07eb38fa2f3b..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/grpc.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/grpc/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/grpc/ - - /zh/overview/what/ecosystem/protocol/grpc/ -description: gRPC协议 -linkTitle: gRPC协议 -title: gRPC协议 -type: docs -weight: 5 ---- - - - - - - - -## 特性说明 -Dubbo 自 2.7.5 版本开始支持 gRPC 协议,对于计划使用 HTTP/2 通信,或者想利用 gRPC 带来的 Stream、反压、Reactive 编程等能力的开发者来说, -都可以考虑启用 gRPC 协议。 - -#### 支持 gRPC 的好处 -* 为期望使用 gRPC 协议的用户带来服务治理能力,方便接入 Dubbo 体系 -* 用户可以使用 Dubbo 风格的,基于接口的编程风格来定义和使用远程服务 - -## 使用场景 - -- 需要立即响应才能继续处理的同步后端微服务到微服务通信。 -- 需要支持混合编程平台的 Polyglot 环境。 -- 性能至关重要的低延迟和高吞吐量通信。 -- 点到点实时通信 - gRPC 无需轮询即可实时推送消息,并且能对双向流式处理提供出色的支持。 -- 网络受约束环境 - 二进制 gRPC 消息始终小于等效的基于文本的 JSON 消息。 - -## 使用方式 -### 在 Dubbo 中使用 gRPC -[示例](https://github.com/apache/dubbo-samples/tree/master/99-integration/dubbo-samples-grpc) - -### 步骤 -1. 使用 IDL 定义服务 -2. 配置 compiler 插件,本地预编译 -3. 配置暴露/引用 Dubbo 服务 - -> 除了原生 StreamObserver 接口类型之外,Dubbo 还支持 [RxJava](https://github.com/apache/dubbo-samples/tree/master/99-integration/dubbo-samples-grpc/dubbo-samples-rxjava)、[Reactor](https://github.com/apache/dubbo-samples/tree/master/99-integration/dubbo-samples-grpc/dubbo-samples-reactor) 编程风格的 API。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/hessian.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/hessian.md deleted file mode 100644 index 58cfe4508363..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/hessian.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/hessian/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/hessian/ -description: Hessian协议 -linkTitle: Hessian协议 -title: Hessian协议 -type: docs -weight: 10 ---- - - - - - - - -## 特性说明 -Hessian 协议用于集成 Hessian 的服务,Hessian 底层采用 Http 通讯,采用 Servlet 暴露服务,Dubbo 缺省内嵌 Jetty 作为服务器实现。 - -[Hessian](http://hessian.caucho.com) 是 Caucho 开源的一个 RPC 框架,其通讯效率高于 WebService 和 Java 自带的序列化。 - -* 连接个数:多连接 -* 连接方式:短连接 -* 传输协议:HTTP -* 传输方式:同步传输 -* 序列化:Hessian二进制序列化 -* 适用范围:传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。 -* 适用场景:页面传输,文件传输,或与原生hessian服务互操作。 - -Dubbo 的 Hessian 协议可以和原生 Hessian 服务互操作,即: - -* 提供者用 Dubbo 的 Hessian 协议暴露服务,消费者直接用标准 Hessian 接口调用, -* 或者提供方用标准 Hessian 暴露服务,消费方用 Dubbo 的 Hessian 协议调用。 - -#### 约束 -* 参数及返回值需实现 `Serializable` 接口。 -* 参数及返回值不能自定义实现 `List`, `Map`, `Number`, `Date`, `Calendar` 等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。 - -## 使用场景 -hessian是一个轻量级的RPC服务,是基于Binary-RPC协议实现的,序列化与反序列化实例。 - - -## 使用方式 - -### 依赖 - -从 Dubbo 3 开始,Hessian 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-hessian - 1.0.0 - -``` - -```xml - - com.caucho - hessian - 4.0.7 - -``` - -### 定义 hessian 协议 -```xml - -``` - -### 设置默认协议 -```xml - -``` - -### 设置 service 协议 -```xml - -``` - -### 多端口 -```xml - - -``` - -### 直连 -```xml - -``` \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/http.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/http.md deleted file mode 100644 index 067fd8bf65f4..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/http.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/http/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/http/ - - /zh/overview/what/ecosystem/protocol/http/ -description: HTTP协议 -linkTitle: HTTP协议 -title: HTTP协议 -type: docs -weight: 6 ---- - - - - - - - -## 特性说明 -基于 HTTP 表单的远程调用协议,采用 Spring 的 HttpInvoker 实现,`2.3.0` 以上版本支持。 - -* 连接个数:多连接 -* 连接方式:短连接 -* 传输协议:HTTP -* 传输方式:同步传输 -* 序列化:表单序列化 -* 适用范围:传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。 -* 适用场景:需同时给应用程序和浏览器 JS 使用的服务。 - -#### 约束 -* 参数及返回值需符合 Bean 规范 - -## 使用场景 - -http短连接,协议标准化且易读,容易对接外部系统,适用于上层业务模块。 - -## 使用方式 - -从 Dubbo 3 开始,Http 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-http - 1.0.0 - -``` - -### 配置协议 -```xml - -``` - -### 配置 Jetty Server (默认) -```xml - -``` - -### 配置 Servlet Bridge Server (推荐使用) -```xml - -``` - -### 配置 DispatcherServlet - -```xml - - dubbo - org.apache.dubbo.remoting.http.servlet.DispatcherServlet - 1 - - - dubbo - /* - -``` - -{{% alert title="注意" color="primary" %}} -如果使用 servlet 派发请求 -* 协议的端口 `` 必须与 servlet 容器的端口相同, -* 协议的上下文路径 `` 必须与 servlet 应用的上下文路径相同。 -{{% /alert %}} diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/memcached.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/memcached.md deleted file mode 100644 index 8f6c8686401d..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/memcached.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/memcached/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/memcached/ -description: Memcached协议 -linkTitle: Memcached协议 -title: Memcached协议 -type: docs -weight: 12 ---- - - - - - -## 特性说明 -[Memcached](http://memcached.org/) 是一个高效的 KV 缓存服务器。基于 memcached 实现的 RPC 协议。 - -> `2.3.0` 以上版本支持。 - - - -## 使用场景 -缓解数据库压力,提高交互速度等。 - -## 使用方式 -### 引入依赖 - -从 Dubbo 3 开始,Memcached 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-memcached - 1.0.0 - -``` - -### 注册 memcached 服务的地址 -```java -RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); -Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181")); -registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash")); -``` - -### 在客户端引用 -**不需要感知 Memcached 的地址** - -在客户端使用 - -```xml - -``` - -或者点对点直连 - -```xml - -``` - -也可以使用自定义接口 -```xml - -``` - -其中 "p:xxx" 为 spring 的标准 p 标签 -```xml - -``` -如果方法名和 memcached 的标准方法名不相同,则需要配置映射关系; - -方法名建议和 memcached 的标准方法名相同,即:get(key), set(key, value), delete(key)。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/redis.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/redis.md deleted file mode 100644 index a36225e9cff4..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/redis.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/redis/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/redis/ -description: Redis协议 -linkTitle: Redis协议 -title: Redis协议 -type: docs -weight: 9 ---- - - - - - - - -## 特性说明 -[Redis](http://redis.io) 是一个高效的 KV 存储服务器。基于 Redis 实现的 RPC 协议。 - -> `2.3.0` 以上版本支持。 - - -## 使用场景 - -缓存,限流,分布式锁等 - -## 使用方式 - -### 引入依赖 - -从 Dubbo 3 开始,Redis 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-redis - 1.0.0 - -``` - - -### 注册 redis 服务的地址 -```java -RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension(); -Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181")); -registry.register(URL.valueOf("redis://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash")); -``` - -### 在客户端引用 -不需要感知 Redis 的地址 - -在客户端使用: -```xml - -``` -或者点对点直连: -```xml - -``` -也可以使用自定义接口: -```xml - -``` - -其中 "p:xxx" 为 spring 的标准 p 标签 -```xml - -``` -方法名建议和 redis 的标准方法名相同,即:get(key), set(key, value), delete(key)。 - -如果方法名和 redis 的标准方法名不相同,则需要配置映射关系。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rest.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rest.md index 271a74071b24..845059646b8e 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rest.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rest.md @@ -1,760 +1,629 @@ --- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/rest/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/rest/ -description: Rest协议 -linkTitle: Rest协议 -title: Rest协议 +alias: + - /zh-cn/overview/reference/protocols/http/ +description: "Dubbo 中 REST 风格的 HTTP+JSON 通信及编码使用方式" +linkTitle: REST 风格的 HTTP+JSON 通信及编码使用方式 +title: REST 风格的 HTTP+JSON 通信及编码使用方式 type: docs -weight: 4 +weight: 3 +working_in_progress: true --- +> 此文档描述内容基于 Dubbo 3.3.0 及以上版本。如果要参考 2.7 老版本 REST 协议实现,请参考此文档。 +## 什么是 Dubbo 要支持 rest 编程范式 +当前一些微服务体系,基于 spring web 和 resteasy 注解编码风格,通过http协议进行服务间调用互通,dubbo protocol扩展实现的协议 +典型使用场景: +- 基于标准 http+json 可以实现 Dubbo 与 Spring 等微服务体系的互调互通 +- 多协议发布服务,可以实现服务协议间的平滑迁移 +- 得益于 http 的通用性,解决跨语言互通 +- Resteasy 以及 Spring-web 的编码风格,上手更快 +## REST 协议规范 +由于 Dubbo 体系中有 group、version 的概念作为隔离服务的不同维度,Dubbo 中的 rest 请求也增加了 version 和 group 这两个 header 用于确定服务的唯一。 +* 如果provider一端没有声明group和version,http请求时就不需要传递这两个header。 +* 如果provider声明了group和version,则请求header中必须包含声明的header,否则调用将找不到服务。 -基于标准的 Java REST API——JAX-RS 2.0(Java API for RESTful Web Services 的简写)实现的 REST 调用支持 +为区别于其他的header,我们增加了 `rest-service-` 前缀,因此通过其他形式的 http client 调用 dubbo http 服务需要传递 rest-service-version 和 rest-service-group 两个header。 -## 特性说明 -此协议提供通过 web 访问服务的简单方式,将服务与其他基于 web 的应用程序集成。 -支持 JSON、XML 和 Text 格式的请求和响应,发布和使用服务的便捷方式,也提供了服务版本控制、服务过滤、服务元数据和服务参数, 实现 Dubbo 框架的灵活性和可伸缩性。 +### 示例请求 -## 使用场景 -将 Dubbo 服务公开为 RESTful API,与微服务和现有 RESTful 系统集成,实现与非 Java 客户端的互操作性,并促进混合通信。 - -## 使用方式 +- Request -### 快速入门 +```` +POST /test/path HTTP/1.1 +Host: localhost:8080 +Content-type: application/json +Accept: text/html +rest-service-version: 1.0.0 +rest-service-group: dubbo -在 dubbo 中开发一个 REST 风格的服务会比较简单,下面以一个注册用户的简单服务为例说明。 +{"name":"dubbo","age":10,"address":"hangzhou"} +```` -这个服务要实现的功能是提供如下 URL(注:这个URL不是完全符合 REST 的风格,但是更简单实用) -``` -http://localhost:8080/users/register -``` -而任何客户端都可以将包含用户信息的 JSON 字符串 POST 到以上 URL 来完成用户注册。 +- Response -首先,开发服务的接口 -```java -public class UserService { - void registerUser(User user); -} -``` +```` +HTTP/1.1 200 +Content-Type: text/html +Content-Length: 4 +Date: Fri, 28 Apr 2023 14:16:42 GMT -然后,开发服务的实现 +"success" +```` -```java -@Path("users") -public class UserServiceImpl implements UserService { - - @POST - @Path("register") - @Consumes({MediaType.APPLICATION_JSON}) - public void registerUser(User user) { - // save the user... - } -} -``` -上面的实现非常简单,但是由于该 REST 服务是要发布到指定 URL 上,供任意语言的客户端甚至浏览器来访问,所以这里额外添加了几个 JAX-RS 的标准 annotation 来做相关的配置。 +content-type支持 + - application/json + - application/x-www-form-urlencoded + - text/plain + - text/xml -@Path("users"):指定访问 UserService 的 URL 相对路径是 /users,即 http://localhost:8080/users +目前支持以上media,后面还会对type进行扩展 -@Path("register"):指定访问 registerUser() 方法的 URL 相对路径是 /register,再结合上一个 @Path为UserService 指定的路径,则调用 UserService.register() 的完整路径为 http://localhost:8080/users/register +## 快速入门 +详细的依赖以及spring配置,可以参见dubbo 项目的dubbo-demo-xml模块 +https://github.com/apache/dubbo/tree/3.2/dubbo-demo/dubbo-demo-xml -@POST:指定访问 registerUser()用HTTP POST方法 +- spring web 编码 +在使用dubbo http的spring web编码时,类注解我们要求必须出现@RequestMapping或者@Controller,以此来判断用户使用的编码风格,决定使用对应的SpringMvcServiceRestMetadataResolver +注解解析器进行元注解解析,Provider一侧我们允许用户使用实现类作为Dubbo Service(相比之前dubbo service export时service必须是接口的要求) -@Consumes({MediaType.APPLICATION_JSON}):指定 registerUser() 接收 JSON 格式的数据。REST 框架会自动将 JSON 数据反序列化为 User 对象 +API +````java +@RequestMapping("/spring/demo/service") +public interface SpringRestDemoService { -最后,在 spring 配置文件中添加此服务,即完成所有服务开发工作 + @RequestMapping(method = RequestMethod.GET, value = "/hello") + Integer hello(@RequestParam("a") Integer a, @RequestParam("b") Integer b); - ```xml - - - - - - - - -``` + @RequestMapping(method = RequestMethod.GET, value = "/error") + String error(); -### REST 服务提供端 + @RequestMapping(method = RequestMethod.POST, value = "/say") + String sayHello(@RequestBody String name); -下面我们扩充“快速入门”中的UserService,进一步展示在dubbo中REST服务提供端的开发要点。 + @RequestMapping(method = RequestMethod.POST, value = "/testFormBody", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + Long testFormBody(@RequestBody Long number); -### HTTP POST/GET 的实现 + @RequestMapping(method = RequestMethod.POST, value = "/testJavaBeanBody", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + User testJavaBeanBody(@RequestBody User user); -REST 服务中虽然建议使用 HTTP 协议中四种标准方法 POST、DELETE、PUT、GET 来分别实现常见的“增删改查”,但实际中,我们一般情况直接用POST来实现“增改”,GET 来实现“删查”即可(DELETE 和 PUT 甚至会被一些防火墙阻挡)。 -前面已经简单演示了 POST 的实现,在此,我们为 UserService 添加一个获取注册用户资料的功能,来演示 GET 的实现。 + @RequestMapping(method = RequestMethod.GET, value = "/primitive") + int primitiveInt(@RequestParam("a") int a, @RequestParam("b") int b); -这个功能就是要实现客户端通过访问如下不同 URL 来获取不同 ID 的用户资料 + @RequestMapping(method = RequestMethod.GET, value = "/primitiveLong") + long primitiveLong(@RequestParam("a") long a, @RequestParam("b") Long b); -``` -http://localhost:8080/users/1001 -http://localhost:8080/users/1002 -http://localhost:8080/users/1003 -``` + @RequestMapping(method = RequestMethod.GET, value = "/primitiveByte") + long primitiveByte(@RequestParam("a") byte a, @RequestParam("b") Long b); -当然,也可以通过其他形式的URL来访问不同 ID 的用户资料,例如 -``` -http://localhost:8080/users/load?id=1001 -``` + @RequestMapping(method = RequestMethod.POST, value = "/primitiveShort") + long primitiveShort(@RequestParam("a") short a, @RequestParam("b") Long b, @RequestBody int c); -JAX-RS 本身可以支持所有这些形式。但是上面那种在 URL 路径中包含查询参数的形式(http://localhost:8080/users/1001) 更符合 REST 的一般习惯,所以更推荐大家来使用。下面我们就为 UserService 添加一个 getUser() 方法来实现这种形式的 URL 访问 -```java -@GET -@Path("{id : \\d+}") -@Produces({MediaType.APPLICATION_JSON}) -public User getUser(@PathParam("id") Long id) { - // ... -} -``` + @RequestMapping(method = RequestMethod.GET, value = "/testMapParam") + String testMapParam(@RequestParam Map params); -@GET:指定用 HTTP GET 方法访问 + @RequestMapping(method = RequestMethod.GET, value = "/testMapHeader") + String testMapHeader(@RequestHeader Map headers); -@Path("{id : \\d+}"):根据上面的功能需求,访问 getUser() 的 URL 应当是 “http://localhost:8080/users/ + 任意数字",并且这个数字要被做为参数传入 getUser() 方法。 这里的 annotation 配置中,@Path中间的 {id: xxx} 指定 URL 相对路径中包含了名为id参数,而它的值也将被自动传递给下面用 @PathParam("id") 修饰的方法参数 id。{id:后面紧跟的\\d+ 是一个正则表达式,指定了 id 参数必须是数字。 + @RequestMapping(method = RequestMethod.POST, value = "/testMapForm", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) + List testMapForm(MultiValueMap params); -@Produces({MediaType.APPLICATION_JSON}):指定getUser()输出JSON格式的数据。框架会自动将User对象序列化为JSON数据。 -### Annotation + @RequestMapping(method = RequestMethod.GET, value = "/headerInt") + int headerInt(@RequestHeader("header") int header); -在 Dubbo 中开发 REST 服务主要都是通过 JAX-RS的annotation 来完成配置的,在上面的示例中,我们都是将 annotation 放在服务的实现类中。但其实,我们完全也可以将 annotation 放到服务的接口上,这两种方式是完全等价的,例如: -```java -@Path("users") -public interface UserService { - - @GET - @Path("{id : \\d+}") - @Produces({MediaType.APPLICATION_JSON}) - User getUser(@PathParam("id") Long id); } -``` +```` -在一般应用中,我们建议将 annotation 放到服务实现类,这样 annotation 和 java 实现代码位置更接近,更便于开发和维护。另外更重要的是,我们一般倾向于避免对接口的污染,保持接口的纯净性和广泛适用性。 +Provider -但是,如后文所述,如果我们要用 dubbo 直接开发的消费端来访问此服务,则 annotation 必须放到接口上。 +````java + @DubboService(interfaceClass = SpringRestDemoService.class ,protocol = "rest") +public class SpringRestDemoServiceImpl implements SpringRestDemoService { -如果接口和实现类都同时添加了 annotation,则实现类的 annotation 配置会生效,接口上的 annotation 被直接忽略。 + @Override + public String sayHello(String name) { + return "Hello, " + name; + } -### 多数据格式支持 + @Override + public Long testFormBody(Long number) { + return number; + } -在 dubbo 中开发的 REST 服务可以同时支持传输多种格式的数据,以给客户端提供最大的灵活性。其中我们目前对最常用的 JSON 和 XML 格式特别添加了额外的功能。 + @Override + public User testJavaBeanBody(User user) { + return user; + } -比如,我们要让上例中的getUser()方法支持分别返回 JSON 和 XML 格式的数据,只需要在 annotation 中同时包含两种格式即可 -```java -@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) -User getUser(@PathParam("id") Long id); -``` + @Override + public int primitiveInt(int a, int b) { + return a + b; + } -或者也可以直接用字符串(还支持通配符)表示 MediaType + @Override + public long primitiveLong(long a, Long b) { + return a + b; + } -```java -@Produces({"application/json", "text/xml"}) -User getUser(@PathParam("id") Long id); -``` + @Override + public long primitiveByte(byte a, Long b) { + return a + b; + } -如果所有方法都支持同样类型的输入输出数据格式,则我们无需在每个方法上做配置,只需要在服务类上添加 annotation 即可 + @Override + public long primitiveShort(short a, Long b, int c) { + return a + b; + } -```java -@Path("users") -@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) -@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML}) -public class UserServiceImpl implements UserService { - // ... -} - -``` - -在一个 REST 服务同时对多种数据格式支持的情况下,根据 JAX-RS 标准,一般是通过HTTP中的MIME header(content-type和accept)来指定当前想用的是哪种格式的数据。 -但是在 dubbo 中,我们还自动支持目前业界普遍使用的方式,即用一个 URL 后缀(.json和.xml)来指定想用的数据格式。例如,在添加上述 annotation后,直接访问 http://localhost:8888/users/1001.json 则表示用 json 格式,直接访问 http://localhost:8888/users/1002.xml 则表示用 xml 格式,比用 HTTP Header 更简单直观。Twitter、微博等的 REST API 都是采用这种方式。 -如果你既不加 HTTP header,也不加后缀,则 dubbo 的 REST 会优先启用在以上 annotation 定义中排位最靠前的那种数据格式。 + @Override + public String testMapParam(Map params) { + return params.get("param"); + } -> 注意:这里要支持 XML 格式数据,在 annotation 中既可以用 MediaType.TEXT_XML,也可以用 MediaType.APPLICATION_XML,但是 TEXT_XML 是更常用的,并且如果要利用上述的 URL 后缀方式来指定数据格式,只能配置为 TEXT_XML 才能生效。 + @Override + public String testMapHeader(Map headers) { + return headers.get("header"); + } -### 中文字符支持 + @Override + public List testMapForm(MultiValueMap params) { + return params.get("form"); + } -为了在 dubbo REST 中正常输出中文字符,和通常的 Java web 应用一样,我们需要将 HTTP 响应的 contentType 设置为 UTF-8编码。 -基于 JAX-RS 的标准用法,我们只需要做如下 annotation 配置即可: + @Override + public int headerInt(int header) { + return header; + } -```java -@Produces({"application/json; charset=UTF-8", "text/xml; charset=UTF-8"}) -User getUser(@PathParam("id") Long id); -``` -为了方便用户,我们在 dubbo REST 中直接添加了一个支持类,来定义以上的常量,可以直接使用,减少出错的可能性。 + @Override + public Integer hello(Integer a, Integer b) { + return a + b; + } -```java -@Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8}) -User getUser(@PathParam("id") Long id); -``` -### XML 数据格式 + @Override + public String error() { + throw new RuntimeException("test error"); + } -由于 JAX-RS 的实现一般都用标准的 JAXB(Java API for XML Binding)来序列化和反序列化 XML 格式数据,所以我们需要为每一个要用 XML 传输的对象添加一个类级别的 JAXB annotation,否则序列化将报错。例如为 getUser() 中返回的 User 添加如下 - -```java -@XmlRootElement -public class User implements Serializable { - // ... } -``` - -此外,如果service方法中的返回值是Java的 primitive类型(如int,long,float,double等),最好为它们添加一层wrapper对象,因为JAXB不能直接序列化primitive类型。 - -例如,我们想让前述的registerUser()方法返回服务器端为用户生成的ID号: - -```java -long registerUser(User user); -``` - -由于 primitive 类型不被 JAXB 序列化支持,所以添加一个 wrapper 对象: - -```java -@XmlRootElement -public class RegistrationResult implements Serializable { - - private Long id; - - public RegistrationResult() { - } - - public RegistrationResult(Long id) { - this.id = id; +```` +Consumer +````java +@Component +public class SpringRestDemoServiceConsumer { + @DubboReference(interfaceClass = SpringRestDemoService.class ) + SpringRestDemoService springRestDemoService; + + public void invoke(){ + String hello = springRestDemoService.sayHello("hello"); + assertEquals("Hello, hello", hello); + Integer result = springRestDemoService.primitiveInt(1, 2); + Long resultLong = springRestDemoService.primitiveLong(1, 2l); + long resultByte = springRestDemoService.primitiveByte((byte) 1, 2l); + long resultShort = springRestDemoService.primitiveShort((short) 1, 2l, 1); + + assertEquals(result, 3); + assertEquals(resultShort, 3l); + assertEquals(resultLong, 3l); + assertEquals(resultByte, 3l); + + assertEquals(Long.valueOf(1l), springRestDemoService.testFormBody(1l)); + + MultiValueMap forms = new LinkedMultiValueMap<>(); + forms.put("form", Arrays.asList("F1")); + + assertEquals(Arrays.asList("F1"), springRestDemoService.testMapForm(forms)); + assertEquals(User.getInstance(), springRestDemoService.testJavaBeanBody(User.getInstance())); } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } -} -``` - -并修改 service 方法: - -```java -RegistrationResult registerUser(User user); -``` - -这样不但能够解决 XML 序列化的问题,而且使得返回的数据都符合 XML 和 JSON 的规范。例如,在 JSON中,返回的将是如下形式 - -```javascript -{"id": 1001} -``` - -如果不加 wrapper,JSON 返回值将直接是 - -``` -1001 -``` - -而在 XML 中,加 wrapper 后返回值将是: -```xml - - 1002 - -``` - -这种 wrapper 对象其实利用所谓 Data Transfer Object(DTO)模式,采用 DTO 还能对传输数据做更多有用的定制。 - -### 定制序列化 - -如上所述,REST 的底层实现会在 service 的对象和 JSON/XML 数据格式之间自动做序列化/反序列化。但有些场景下,如果觉得这种自动转换不满足要求,可以对其做定制。 - -Dubbo 中的 REST 实现是用 JAXB 做 XML 序列化,用 Jackson 做 JSON 序列化,所以在对象上添加 JAXB 或 Jackson 的 annotation 即可以定制映射。 - -例如,定制对象属性映射到 XML 元素的名字: - -```java -@XmlRootElement -@XmlAccessorType(XmlAccessType.FIELD) -public class User implements Serializable { - - @XmlElement(name="username") - private String name; -} -``` - -定制对象属性映射到 JSON 字段的名字: - -```java -public class User implements Serializable { - - @JsonProperty("username") - private String name; -} -``` + private void assertEquals(Object returnStr, Object exception) { + boolean equal = returnStr != null && returnStr.equals(exception); -更多资料请参考 JAXB 和 Jackson 的官方文档,或自行 google。 - -### REST Server 的实现 - -目前在 dubbo 中,我们支持5种嵌入式 rest server 的实现,并同时支持采用外部应用服务器来做 rest server 的实现。rest server 可以通过如下配置实现: - -```xml - -``` - -以上配置选用了嵌入式的 jetty 来做 rest server,同时,如果不配置 server 属性,rest 协议默认也是选用 jetty。jetty 是非常成熟的 java servlet 容器,并和 dubbo 已经有较好的集成(目前5种嵌入式 server 中只有 jetty 和后面所述的 tomcat、tjws,与 dubbo 监控系统等完成了无缝的集成),所以,如果你的 dubbo 系统是单独启动的进程,你可以直接默认采用 jetty 即可。 - - -```xml - -``` - -以上配置选用了嵌入式的 tomcat 来做 rest server。在嵌入式 tomcat 上,REST 的性能比 jetty 上要好得多(参见后面的基准测试),建议在需要高性能的场景下采用 tomcat。 - -```xml - -``` - -以上配置选用嵌入式的 netty 来做 rest server。(TODO more contents to add) - -```xml - (tjws is now deprecated) - -``` - -以上配置选用嵌入式的 tjws 或 Sun HTTP server 来做 rest server。这两个 server 实现非常轻量级,非常方便在集成测试中快速启动使用,当然也可以在负荷不高的生产环境中使用。 注:tjws目前已经被deprecated掉了,因为它不能很好的和servlet 3.1 API工作。 - -如果你的 dubbo 系统不是单独启动的进程,而是部署到了 Java 应用服务器中,则建议你采用以下配置 - -```xml - -``` - -通过将 server 设置为 servlet,dubbo 将采用外部应用服务器的 servlet 容器来做 rest server。同时,还要在 dubbo 系统的 web.xml 中添加如下配置 - -```xml - - - contextConfigLocation - /WEB-INF/classes/META-INF/spring/dubbo-demo-provider.xml - - - - org.apache.dubbo.remoting.http.servlet.BootstrapListener - - - - org.springframework.web.context.ContextLoaderListener - - - - dispatcher - org.apache.dubbo.remoting.http.servlet.DispatcherServlet - 1 - - - - dispatcher - /* - - -``` - -即必须将 dubbo 的 BootstrapListener 和 DispatherServlet 添加到 web.xml,以完成 dubbo 的 REST 功能与外部 servlet 容器的集成。 - -> 注意:如果你是用 spring 的 ContextLoaderListener 来加载 spring,则必须保证 BootstrapListener 配置在 ContextLoaderListener 之前,否则 dubbo 初始化会出错。 - -其实,这种场景下你依然可以坚持用嵌入式 server,但外部应用服务器的 servlet 容器往往比嵌入式 server 更加强大(特别是如果你是部署到更健壮更可伸缩的 WebLogic,WebSphere 等),另外有时也便于在应用服务器做统一管理、监控等等。 - -### 获取 Context 信息 - -在远程调用中,值得获取的上下文信息可能有很多种,这里特别以获取客户端 IP 为例。 - -在 dubbo 的 REST 中,我们有两种方式获取客户端 IP。 - -第一种方式,用 JAX-RS 标准的 @Context annotation - -```java -public User getUser(@PathParam("id") Long id, @Context HttpServletRequest request) { - System.out.println("Client address is " + request.getRemoteAddr()); -} -``` - -用 Context 修饰 getUser() 的一个方法参数后,就可以将当前的 HttpServletRequest 注入进来,然后直接调用 servlet api 获取 IP。 - -> 注意:这种方式只能在将server设置为 tjws、tomcat、jetty 或者 servlet 的时候才能工作,因为只有这几种 server 的实现才提供了 servlet 容器。另外,标准的JAX-RS还支持用@Context修饰service类的一个实例字段来获取HttpServletRequest,但在dubbo中我们没有对此作出支持。 - -第二种方式,用 dubbo 中常用的 RpcContext - -```java -public User getUser(@PathParam("id") Long id) { - System.out.println("Client address is " + RpcContext.getContext().getRemoteAddressString()); -} -``` - -> 注意:这种方式只能在设置 server="jetty" 或者 server="tomcat" 或者 server="servlet" 或者 server="tjws" 的时候才能工作。另外,目前 dubbo 的 RpcContext 是一种比较有侵入性的用法,未来我们很可能会做出重构。 - -如果你想保持你的项目对 JAX-RS 的兼容性,未来脱离 dubbo 也可以运行,请选择第一种方式。如果你想要更优雅的服务接口定义,请选用第二种方式。 - -此外,在最新的 dubbo rest 中,还支持通过 RpcContext 来获取 HttpServletRequest和 HttpServletResponse,以提供更大的灵活性来方便用户实现某些复杂功能,比如在 dubbo 标准的 filter 中访问 HTTP Header。用法示例如下 + if (equal) { + return; + } else { + throw new RuntimeException(); + } + } -```java -if (RpcContext.getContext().getRequest() != null && RpcContext.getContext().getRequest() instanceof HttpServletRequest) { - System.out.println("Client address is " + ((HttpServletRequest) RpcContext.getContext().getRequest()).getRemoteAddr()); -} -if (RpcContext.getContext().getResponse() != null && RpcContext.getContext().getResponse() instanceof HttpServletResponse) { - System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse()); } -``` -> 注意:为了保持协议的中立性,RpcContext.getRequest()和RpcContext.getResponse()返回的仅仅是一个Object类,而且可能为null。所以,你必须自己做null和类型的检查。 +```` -> 注意:只有在设置server="jetty"或者server="tomcat"或者server="servlet"的时候,你才能通过以上方法正确的得到HttpServletRequest和HttpServletResponse,因为只有这几种server实现了servlet容器。 +- JaxRs 编码 + JaxRs注解使用的时候我们要求service 类上必须使用@Path注解,来确定使用JAXRSServiceRestMetadataResolver + 注解解析器来解析注解元信息 -为了简化编程,在此你也可以用泛型的方式来直接获取特定类型的 request/response: - -```java -if (RpcContext.getContext().getRequest(HttpServletRequest.class) != null) { - System.out.println("Client address is " + RpcContext.getContext().getRequest(HttpServletRequest.class).getRemoteAddr()); -} - -if (RpcContext.getContext().getResponse(HttpServletResponse.class) != null) { - System.out.println("Response object from RpcContext: " + RpcContext.getContext().getResponse(HttpServletResponse.class)); -} -``` - -如果 request/response 不符合指定的类型,这里也会返回 null。 +API +````java +@Path("/jaxrs/demo/service") +public interface JaxRsRestDemoService { + @GET + @Path("/hello") + Integer hello(@QueryParam("a") Integer a, @QueryParam("b") Integer b); -### 端口号和 Context Path + @GET + @Path("/error") + String error(); -dubbo 中的 rest 协议默认将采用80端口,如果想修改端口,直接配置: + @POST + @Path("/say") + String sayHello(String name); -```xml - -``` -另外,如前所述,我们可以用 @Path 来配置单个 rest 服务的 URL 相对路径。但其实,我们还可以设置一个所有 rest 服务都适用的基础相对路径,即 java web 应用中常说的 context path。 -只需要添加如下 contextpath 属性即可: -```xml - -``` -以前面代码为例: + @POST + @Path("/testFormBody") + Long testFormBody(@FormParam("number") Long number); -```java -@Path("users") -public class UserServiceImpl implements UserService { - @POST - @Path("register") + @Path("/testJavaBeanBody") @Consumes({MediaType.APPLICATION_JSON}) - public void registerUser(User user) { - // save the user... - } -} -``` - -现在 registerUser() 的完整访问路径 - -``` -http://localhost:8888/services/users/register -``` - -注意:如果你是选用外部应用服务器做 rest server,即配置 - -```xml - -``` - -则必须保证这里设置的 port、contextpath,与外部应用服务器的端口、DispatcherServlet 的上下文路径(即 webapp path 加上 servlet url pattern)保持一致。例如,对于部署为 tomcat ROOT 路径的应用,这里的 contextpath 必须与 web.xml 中 DispacherServlet 的`` 完全一致: - -```xml - - dispatcher - /services/* - -``` - -### 线程数和 IO 线程数 - -可以为 rest 服务配置线程池大小 - -```xml - -``` - -> 注意:目前线程池的设置只有当server="netty"或者server="jetty"或者server="tomcat"的时候才能生效。另外,如果server="servlet",由于这时候启用的是外部应用服务器做rest server,不受dubbo控制,所以这里的线程池设置也无效。 - -如果是选用 netty server,还可以配置 Netty 的 IO worker 线程数 - -```xml - -``` - -### 配置长连接 - -Dubbo 中的 rest 服务默认都是采用 http 长连接来访问,如果想切换为短连接,直接配置 - -```xml - -``` - -> 注意:这个配置目前只对 server="netty"和server="tomcat" 才能生效。 + User testJavaBeanBody(User user); -### 最大 HTTP 连接数 -可以配置服务器提供端所能同时接收的最大 HTTP 连接数,防止 REST server 被过多连接撑爆,以作为一种最基本的自我保护机制 -```xml - -``` + @GET + @Path("/primitiveLong") + long primitiveLong(@QueryParam("a") long a, @QueryParam("b") Long b); -当然,由于这个配置针对消费端生效的,所以也可以在消费端配置 + @GET + @Path("/primitiveByte") + long primitiveByte(@QueryParam("a") byte a, @QueryParam("b") Long b); -```xml - -``` + @POST + @Path("/primitiveShort") + long primitiveShort(@QueryParam("a") short a, @QueryParam("b") Long b, int c); -但是,通常我们建议配置在服务提供端提供此类配置。按照 dubbo 官方文档的说法:“Provider 上尽量多配置 Consumer 端的属性,让 Provider 实现者一开始就思考 Provider 服务特点、服务质量的问题。” + @GET + @Path("testMapParam") + @Produces({MediaType.TEXT_PLAIN}) + @Consumes({MediaType.TEXT_PLAIN}) + String testMapParam(@QueryParam("test") Map params); -> 注意:如果 dubbo 的 REST 服务是发布给非 dubbo 的客户端使用,则这里 `` 上的配置完全无效,因为这种客户端不受 dubbo 控制。 + @GET + @Path("testMapHeader") + @Produces({MediaType.TEXT_PLAIN}) + @Consumes({MediaType.TEXT_PLAIN}) + String testMapHeader(@HeaderParam("test") Map headers); + @POST + @Path("testMapForm") + @Produces({MediaType.APPLICATION_JSON}) + @Consumes({MediaType.APPLICATION_FORM_URLENCODED}) + List testMapForm(MultivaluedMap params); -### Annotation 取代部分 Spring XML 配置 + @POST + @Path("/header") + @Consumes({MediaType.TEXT_PLAIN}) + String header(@HeaderParam("header") String header); -以上所有的讨论都是基于 dubbo 在 spring 中的 xml 配置。但是,dubbo/spring 本身也支持用 annotation 来作配置,所以我们也可以按dubbo官方文档中的步骤,把相关 annotation 加到 REST 服务的实现中,取代一些 xml 配置,例如 + @POST + @Path("/headerInt") + @Consumes({MediaType.TEXT_PLAIN}) + int headerInt(@HeaderParam("header") int header); -```java -@Service(protocol = "rest") -@Path("users") -public class UserServiceImpl implements UserService { - @Autowired - private UserRepository userRepository; - - @POST - @Path("register") - @Consumes({MediaType.APPLICATION_JSON}) - public void registerUser(User user) { - // save the user - userRepository.save(user); - } } -``` +```` -annotation 的配置更简单更精确,通常也更便于维护(当然现代IDE都可以在xml中支持比如类名重构,所以就这里的特定用例而言,xml 的维护性也很好)。而 xml 对代码的侵入性更小一些,尤其有利于动态修改配置,特别是比如你要针对单个服务配置连接超时时间、每客户端最大连接数、集群策略、权重等等。另外,特别对复杂应用或者模块来说,xml 提供了一个中心点来涵盖的所有组件和配置,更一目了然,一般更便于项目长时期的维护。 +Provider +````java +@DubboService(interfaceClass =JaxRsRestDemoService.class ,protocol = "rest",version = "1.0.0",group = "test") +public class JaxRsRestDemoServiceImpl implements JaxRsRestDemoService { -当然,选择哪种配置方式没有绝对的优劣,和个人的偏好也不无关系。 + @Override + public String sayHello(String name) { + return "Hello, " + name; + } -### 添加自定义的 Filter、Interceptor + @Override + public Long testFormBody(Long number) { + return number; + } -Dubbo 的 REST 也支持 JAX-RS 标准的 Filter 和 Interceptor,以方便对 REST 的请求与响应过程做定制化的拦截处理。 + @Override + public User testJavaBeanBody(User user) { + return user; + } -其中,Filter 主要用于访问和设置 HTTP 请求和响应的参数、URI 等等。例如,设置 HTTP 响应的 cache header: -```java -public class CacheControlFilter implements ContainerResponseFilter { + @Override + public int primitiveInt(int a, int b) { + return a + b; + } - public void filter(ContainerRequestContext req, ContainerResponseContext res) { - if (req.getMethod().equals("GET")) { - res.getHeaders().add("Cache-Control", "someValue"); - } + @Override + public long primitiveLong(long a, Long b) { + return a + b; } -} -``` -Interceptor 主要用于访问和修改输入与输出字节流,例如,手动添加 GZIP 压缩 + @Override + public long primitiveByte(byte a, Long b) { + return a + b; + } -```java -public class GZIPWriterInterceptor implements WriterInterceptor { - @Override - public void aroundWriteTo(WriterInterceptorContext context) - throws IOException, WebApplicationException { - OutputStream outputStream = context.getOutputStream(); - context.setOutputStream(new GZIPOutputStream(outputStream)); - context.proceed(); + public long primitiveShort(short a, Long b, int c) { + return a + b; } -} -``` - -在标准 JAX-RS 应用中,我们一般是为 Filter 和 Interceptor 添加 @Provider annotation,然后 JAX-RS runtime 会自动发现并启用它们。而在 dubbo 中,我们是通过添加XML配置的方式来注册 Filter 和 Interceptor: - -```xml - -``` - -在此,我们可以将 Filter、Interceptor 和 DynamicFeature 这三种类型的对象都添加到 `extension` 属性上,多个之间用逗号分隔。(DynamicFeature 是另一个接口,可以方便我们更动态的启用 Filter 和 Interceptor,感兴趣请自行 google。) - -当然,dubbo 自身也支持 Filter 的概念,但我们这里讨论的 Filter 和 Interceptor 更加接近协议实现的底层,相比 dubbo 的 filter,可以做更底层的定制化。 - -> 注:这里的 XML 属性叫 extension,而不是叫 interceptor 或者 filter,是因为除了 Interceptor 和 Filter,未来我们还会添加更多的扩展类型。 - -如果 REST 的消费端也是 dubbo 系统(参见下文的讨论),则也可以用类似方式为消费端配置 Interceptor 和 Filter。但注意,JAX-RS 中消费端的 Filter 和提供端的 Filter 是两种不同的接口。例如前面例子中服务端是 ContainerResponseFilter 接口,而消费端对应的是 ClientResponseFilter: - -```java -public class LoggingFilter implements ClientResponseFilter { - - public void filter(ClientRequestContext reqCtx, ClientResponseContext resCtx) throws IOException { - System.out.println("status: " + resCtx.getStatus()); - System.out.println("date: " + resCtx.getDate()); - System.out.println("last-modified: " + resCtx.getLastModified()); - System.out.println("location: " + resCtx.getLocation()); - System.out.println("headers:"); - for (Entry> header : resCtx.getHeaders().entrySet()) { - System.out.print("\t" + header.getKey() + " :"); - for (String value : header.getValue()) { - System.out.print(value + ", "); - } - System.out.print("\n"); - } - System.out.println("media-type: " + resCtx.getMediaType().getType()); - } -} -``` -### 添加自定义的 Exception 处理 -Dubbo 的 REST 也支持 JAX-RS 标准的 ExceptionMapper,可以用来定制特定 exception 发生后应该返回的 HTTP 响应。 -```java -public class CustomExceptionMapper implements ExceptionMapper { + @Override + public String testMapParam(Map params) { + return params.get("param"); + } - public Response toResponse(NotFoundException e) { - return Response.status(Response.Status.NOT_FOUND).entity("Oops! the requested resource is not found!").type("text/plain").build(); + @Override + public String testMapHeader(Map headers) { + return headers.get("header"); } -} -``` -和 Interceptor、Filter 类似,将其添加到 XML 配置文件中即可启用 + @Override + public List testMapForm(MultivaluedMap params) { + return params.get("form"); + } -```xml - -``` + @Override + public String header(String header) { + return header; + } -### HTTP 日志输出 + @Override + public int headerInt(int header) { + return header; + } -Dubbo rest 支持输出所有 HTTP 请求/响应中的 header 字段和 body 消息体。 -在 XML 配置中添加如下自带的 REST filter: + @Override + public Integer hello(Integer a, Integer b) { + return a + b; + } -```xml - -``` -然后配置在 logging 配置中至少为 org.apache.dubbo.rpc.protocol.rest.support 打开 INFO 级别日志输出,例如,在 log4j.xml 中配置 + @Override + public String error() { + throw new RuntimeException("test error"); + } -```xml - - - - -``` +} +```` +Consumer +````java +@Component +public class JaxRsRestDemoService { + @DubboReference(interfaceClass = JaxRsRestDemoService.class) + JaxRsRestDemoService jaxRsRestDemoService; + + public void jaxRsRestDemoServiceTest(ClassPathXmlApplicationContext context) { + JaxRsRestDemoService jaxRsRestDemoService = context.getBean("jaxRsRestDemoService", JaxRsRestDemoService.class); + String hello = jaxRsRestDemoService.sayHello("hello"); + assertEquals("Hello, hello", hello); + Integer result = jaxRsRestDemoService.primitiveInt(1, 2); + Long resultLong = jaxRsRestDemoService.primitiveLong(1, 2l); + long resultByte = jaxRsRestDemoService.primitiveByte((byte) 1, 2l); + long resultShort = jaxRsRestDemoService.primitiveShort((short) 1, 2l, 1); + + assertEquals(result, 3); + assertEquals(resultShort, 3l); + assertEquals(resultLong, 3l); + assertEquals(resultByte, 3l); + + assertEquals(Long.valueOf(1l), jaxRsRestDemoService.testFormBody(1l)); + + MultivaluedMapImpl forms = new MultivaluedMapImpl<>(); + forms.put("form", Arrays.asList("F1")); + + assertEquals(Arrays.asList("F1"), jaxRsRestDemoService.testMapForm(forms)); + assertEquals(User.getInstance(), jaxRsRestDemoService.testJavaBeanBody(User.getInstance())); + } -当然,你也可以直接在 ROOT logger 打开 INFO 级别日志输出 +} +```` -```xml - - - - -``` -然后在日志中会有类似如下的内容输出 +## 使用场景 -``` -The HTTP headers are: -accept: application/json;charset=UTF-8 -accept-encoding: gzip, deflate -connection: Keep-Alive -content-length: 22 -content-type: application/json -host: 192.168.1.100:8888 -user-agent: Apache-HttpClient/4.2.1 (java 1.5) -``` + 因为dubbo http consumer一端实现http 调用的RestClient 实现有三种形式:httpclient,okhttp,URLConnection(jdk内置) + 默认请情况下采用okhttp,因此在使用dubbo http 去调用其他http服务时,需要添加引入的依赖有 + +````xml + + org.apache.dubbo + dubbo-rpc + ${dubbo-version} + + + + com.squareup.okhttp3 + mockwebserver + ${okhttp_version} + + 或 + + org.apache.httpcomponents + httpclient + ${httpclient_version} + +```` + +- 微服务服务调用dubbo http + +````java + +/** + * URL rest://localhost:8888/services + * rest: protocol + * localhost:8888: server address + * services: context path + */ +@DubboReference(interfaceClass = HttpService.class ,url = "rest://localhost:8888/services",version = "1.0.0",group = "test") + HttpService httpService; + + public void invokeHttpService() { + String http = httpService.http("Others Java Architecture Invoke Dubbo Rest"); + System.out.println(http); + } +```` + +- 跨语言调用 + + python + ```` + import requests + url = 'http://localhost:8888/services/curl' + headers = { + 'rest-service-group': 'test', + 'rest-service-version': '1.0.0' + } + response = requests.get(url, headers=headers) + ```` + + go + ```` + import ( + "fmt" + "net/http" + ) + + func main() { + url := "http://localhost:8888/services/curl" + req, err := http.NewRequest("GET", url, nil) + if err != nil { + fmt.Println("Error creating request:", err) + return + } -``` -The contents of request body is: -{"id":1,"name":"dang"} -``` + req.Header.Set("rest-service-group", "test") + req.Header.Set("rest-service-version", "1.0.0") + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return + } + + defer resp.Body.Close() -打开 HTTP 日志输出后,除了正常日志输出的性能开销外,也会在比如 HTTP 请求解析时产生额外的开销,因为需要建立额外的内存缓冲区来为日志的输出做数据准备。 -### 输入参数的校验 +- 多协议发布 + - dubbo 协议的代码使用http 进行数据请求测试 + - 服务协议迁移 -dubbo 的 rest 支持采用 Java 标准的 bean validation annotation(JSR 303) 来做输入校验 http://beanvalidation.org/ +````java +@DubboService(interfaceClass = HttpService.class, protocol = "rest,dubbo", version = "1.0.0", group = "test") +public class HttpServiceImpl implements HttpService { -为了和其他 dubbo 远程调用协议保持一致,在 rest 中作校验的 annotation 必须放在服务的接口上,例如 -```java -public interface UserService { - - User getUser(@Min(value=1L, message="User ID must be greater than 1") Long id); + @Override + public String http(String invokeType) { + return "Rest http request test success! by invokeType: " + invokeType; + } } +```` -``` + - http client组件调用dubbo http(可以不引入 service api) -当然,在很多其他的 bean validation 的应用场景都是将 annotation 放到实现类而不是接口上。把 annotation 放在接口上至少有一个好处是,dubbo 的客户端可以共享这个接口的信息,dubbo 甚至不需要做远程调用,在本地就可以完成输入校验。 +````java +public class HttpClientInvoke { -然后按照 dubbo 的标准方式在 XML 配置中打开验证: -```xml - -``` + private final String versionHeader = RestHeaderEnum.VERSION.getHeader(); + private final String groupHeader = RestHeaderEnum.GROUP.getHeader(); + /** + * contextPath services + */ + private final String url = "http://localhost:8888/services/http"; -在 dubbo 的其他很多远程调用协议中,如果输入验证出错,是直接将 `RpcException` 抛向客户端,而在 rest 中由于客户端经常是非 dubbo,甚至非 java 的系统,所以不便直接抛出 Java 异常。因此,目前我们将校验错误以 XML 的格式返回 -```xml - - - getUserArgument0 - User ID must be greater than 1 - 0 - - -``` + public void httpServiceHttpClientInvoke() throws IOException { + CloseableHttpClient httpClient = createHttpClient(); + HttpRequestBase httpUriRequest = new HttpGet(url); + httpUriRequest.addHeader(versionHeader, "1.0.0"); + httpUriRequest.addHeader(RestConstant.ACCEPT, "text/plain"); + httpUriRequest.addHeader(groupHeader, "test"); + httpUriRequest.addHeader("type", "Http Client Invoke Dubbo Rest Service"); + CloseableHttpResponse response = httpClient.execute(httpUriRequest); -稍后也会支持其他数据格式的返回值。至于如何对验证错误消息作国际化处理,直接参考 bean validation 的相关文档即可。 + RestResult restResult = parseResponse(response); -如果你认为默认的校验错误返回格式不符合你的要求,可以如上面章节所述,添加自定义的 ExceptionMapper 来自由的定制错误返回格式。需要注意的是,这个 ExceptionMapper 必须用泛型声明来捕获 dubbo 的 RpcException,才能成功覆盖 dubbo rest 默认的异常处理策略。为了简化操作,其实这里最简单的方式是直接继承 dubbo rest 的 RpcExceptionMapper,并覆盖其中处理校验异常的方法即可 + System.out.println(new String(restResult.getBody())); + } -```java -public class MyValidationExceptionMapper extends RpcExceptionMapper { + private RestResult parseResponse(CloseableHttpResponse response) { + return new RestResult() { + @Override + public String getContentType() { + return response.getFirstHeader("Content-Type").getValue(); + } + + @Override + public byte[] getBody() throws IOException { + if (response.getEntity() == null) { + return new byte[0]; + } + return IOUtils.toByteArray(response.getEntity().getContent()); + } + + @Override + public Map> headers() { + return Arrays.stream(response.getAllHeaders()).collect(Collectors.toMap(Header::getName, h -> Collections.singletonList(h.getValue()))); + } + + @Override + public byte[] getErrorResponse() throws IOException { + return getBody(); + } + + @Override + public int getResponseCode() { + return response.getStatusLine().getStatusCode(); + } + + @Override + public String getMessage() throws IOException { + return appendErrorMessage(response.getStatusLine().getReasonPhrase(), + new String(getErrorResponse())); + } + }; + } - protected Response handleConstraintViolationException(ConstraintViolationException cve) { - ViolationReport report = new ViolationReport(); - for (ConstraintViolation cv : cve.getConstraintViolations()) { - report.addConstraintViolation(new RestConstraintViolation( - cv.getPropertyPath().toString(), - cv.getMessage(), - cv.getInvalidValue() == null ? "null" : cv.getInvalidValue().toString())); - } - // 采用json输出代替xml输出 - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(report).type(ContentType.APPLICATION_JSON_UTF_8).build(); + + private CloseableHttpClient createHttpClient() { + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + return HttpClients.custom().setConnectionManager(connectionManager).build(); } } -``` +```` + +## 3.2 与 3.0 HTTP 实现对比 -然后将这个 ExceptionMapper 添加到 XML 配置中即可: +因为 Dubbo Java 3.2 内部移除了原本 Resteasy 的实现,因此在对 Resteasy 内置的 Response,extend,ExceptionMapper 支持上将会有所变化 +ExceptionMapper 转换成了org.apache.dubbo.rpc.protocol.rest.exception.mapper.ExceptionHandler,Response后面也会做适配处理 -```xml - -``` +| 版本 | JaxRs| j2ee | web容器(tomcat/jetty)|spring web| http client\(okhttp/httpclient/jdk URLConnnection ) +| ---- | ---- |--- |--- |--- |---| +| 3.0 | 依赖与resteasy的client和server |遵循j2ee规范|依赖常见web容器|不依赖|不依赖 +| 3.2 | 不依赖(仅需要JaxRs注解包) |不遵循|netty实现的http服务器|仅依赖spring web注解|内部实现RestClient依赖http client(默认为okhttp) diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rmi.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rmi.md deleted file mode 100644 index 3b88e8f097a9..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rmi.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/rmi/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/rmi/ - - /zh/overview/what/ecosystem/protocol/rmi/ -description: Rmi协议 -linkTitle: Rmi协议 -title: Rmi协议 -type: docs -weight: 8 ---- - - - - - - -## 特性说明 -RMI 协议采用 JDK 标准的 `java.rmi.*` 实现,采用阻塞式短连接和 JDK 标准序列化方式。 - -* 连接个数:多连接 -* 连接方式:短连接 -* 传输协议:TCP -* 传输方式:同步传输 -* 序列化:Java 标准二进制序列化 -* 适用范围:传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。 -* 适用场景:常规远程服务方法调用,与原生RMI服务互操作 - -#### 约束 - -* 参数及返回值需实现 `Serializable` 接口 -* dubbo 配置中的超时时间对 RMI 无效,需使用 java 启动参数设置:`-Dsun.rmi.transport.tcp.responseTimeout=3000`,参见下面的 RMI 配置 - - -## 使用场景 - -是 Java 的一组拥护开发分布式应用程序的 API,实现了不同操作系统之间程序的方法调用。 - -## 使用方式 - -### 引入依赖 - -从 Dubbo 3 开始,RMI 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-rmi - 1.0.0 - -``` - -```sh -java -Dsun.rmi.transport.tcp.responseTimeout=3000 -``` -> 更多 RMI 优化参数请查看 [JDK 文档](https://docs.oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html) - -### 接口说明 -如果服务接口继承了 `java.rmi.Remote` 接口,可以和原生 RMI 互操作,即: - -* 提供者用 Dubbo 的 RMI 协议暴露服务,消费者直接用标准 RMI 接口调用, -* 或者提供方用标准 RMI 暴露服务,消费方用 Dubbo 的 RMI 协议调用。 - -如果服务接口没有继承 `java.rmi.Remote` 接口: - -* 缺省 Dubbo 将自动生成一个 `com.xxx.XxxService$Remote` 的接口,并继承 `java.rmi.Remote` 接口,并以此接口暴露服务, -* 但如果设置了 ``,将不生成 `$Remote` 接口,而使用 Spring 的 `RmiInvocationHandler` 接口暴露服务,和 Spring 兼容。 - -**定义 RMI 协议** - -```xml - -``` - -**设置默认协议** - -```xml - -``` - -**设置某个服务的协议** - -```xml - -``` - -**多端口** - -```xml - - - - -``` - -**Spring 兼容性** - -```xml - -``` - -{{% alert title="注意" color="primary" %}} -- **如果正在使用 RMI 提供服务给外部访问,** 公司内网环境应该不会有攻击风险。 - -- **同时应用里依赖了老的 common-collections 包的情况下,** dubbo 不会依赖这个包,请排查自己的应用有没有使用。 - -- **存在反序列化安全风险。** 请检查应用:将 commons-collections3 请升级到 [3.2.2](https://commons.apache.org/proper/commons-collections/release_3_2_2.html);将 commons-collections4 请升级到 [4.1](https://commons.apache.org/proper/commons-collections/release_4_1.html)。新版本的 commons-collections 解决了该问题。 -{{% /alert %}} diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/thrift.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/thrift.md deleted file mode 100644 index 66cc08932405..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/thrift.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/thrift/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/thrift/ - - /zh/overview/what/ecosystem/protocol/thrift/ -description: Thrift协议 -linkTitle: Thrift协议 -title: Thrift协议 -type: docs -weight: 7 ---- - - - - - - - -## 特性说明 -当前 dubbo 支持的 thrift 协议是对 thrift 原生协议的扩展,在原生协议的基础上添加了一些额外的头信息,比如 service name,magic number 等。`2.3.0` 以上版本支持。 - -[Thrift](http://thrift.apache.org) 是 Facebook 捐给 Apache 的一个 RPC 框架。 - -使用 dubbo thrift 协议同样需要使用 thrift 的 idl compiler 编译生成相应的 java 代码,后续版本中会在这方面做一些增强。 - -## 使用场景 - -适用于 SOA 标准 RPC 框架。 - -## 使用方式 -### 依赖 - -从 Dubbo 3 开始,Thrift 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-native-thrift - 1.0.0 - -``` - - -```xml - - org.apache.thrift - libthrift - 0.8.0 - -``` - -### 所有服务共用一个端口 - -与原生 Thrift 不兼容 -```xml - -``` - - [dubbo 项目中的示例代码](https://github.com/apache/dubbo/tree/master/dubbo-rpc/dubbo-rpc-thrift/src/test/java/org/apache/dubbo/rpc/protocol/thrift) - - -> Thrift 不支持 null 值,即:不能在协议中传递 null 值 \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/_index.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/_index.md index f60111c32a33..a10b7fe96151 100755 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/_index.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/_index.md @@ -6,9 +6,11 @@ aliases: - /zh/docs3-v2/java-sdk/concepts-and-architecture/triple/ - /zh-cn/docs3-v2/java-sdk/concepts-and-architecture/triple/ - zh-cn/overview/mannual/java-sdk/concepts-and-architecture/triple/ -description: Triple协议 -linkTitle: Triple协议 -title: Triple协议 + - zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/guide/ + - zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/overview/ +description: 基于 HTTP 的 Triple 协议实现及使用方式 +linkTitle: 基于 HTTP 的 Triple 协议 +title: 基于 HTTP 的 Triple 协议 type: docs weight: 3 --- @@ -33,10 +35,12 @@ Triple 是 Dubbo3 提出的基于 HTTP 的开放协议,旨在解决 Dubbo2 私 **目前 Java 和 Go 的 Dubbo SDK 已全面支持 Triple 协议。** 在阿里巴巴,Triple 协议广泛用于跨环境、跨语言、跨生态互通,已有数十万容器生产级使用。 ## 使用方式 -Java SDK 支持 [IDL 生成 Stub](/zh-cn/overview/mannual/java-sdk/quick-start/idl) -和 [Java Interface](/zh-cn/overview/mannual/java-sdk/quick-start/idl) 两种方式,多语言、生态互通、流式需求推荐使用 IDL 方式,现有服务平滑升级推荐使用 -Interface 方式。 +Java SDK 支持 [IDL 生成 Stub](/zh-cn/overview/mannual/java-sdk/reference-mannual/protocol/triple/idl) +和 [Java Interface](/zh-cn/overview/mannual/java-sdk/reference-mannual/protocol/triple/pojo) 两种方式,多语言、生态互通、流式需求推荐使用 IDL 方式,现有服务平滑升级推荐使用 Interface 方式。 -- Dubbo2 老用户如何从现有协议升级至 Triple(TBD) - 新用户或业务参考 [Dubbo3 Triple Quick Start](/zh-cn/overview/mannual/java-sdk/quick-start/idl/) -- 深入了解 Triple 协议: [Dubbo3 Triple 协议设计与原理](https://github.com/apache/dubbo-awesome/blob/master/proposals/D0-triple.md) +- [Dubbo2 老用户如何从现有协议升级至 Triple](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration/) +- 了解 [Triple Streaming 流式通信模式](/zh-cn/overview/mannual/java-sdk/reference-mannual/protocol/triple/streaming/) +- 了解 [Triple 多语言体系与布局](/zh-cn/overview/quickstart/rpc/) +- 了解 [Triple 相关性能指标](/zh-cn/overview/what/advantages/performance/) +- 了解 [Triple 协议设计与原理](/zh-cn/overview/reference/protocols/triple/) \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/guide.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/guide.md deleted file mode 100644 index c14bbe9a1d02..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/guide.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/triple/guide/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/triple/guide/ -description: 协议使用方式 -linkTitle: 协议使用方式 -title: 协议使用方式 -type: docs -weight: 2 ---- - - - - - - -Triple 协议是 Dubbo3 的主力协议,完整兼容 gRPC over HTTP/2,并在协议层面扩展了负载均衡和流量控制相关机制。本文档旨在指导用户正确的使用 Triple 协议。 - -在开始前,需要决定服务使用的序列化方式,如果为新服务,推荐使用 protobuf 作为默认序列化,在性能和跨语言上的效果都会更好。如果是原有服务想进行协议升级,Triple 协议也已经支持其他序列化方式,如 Hessian / JSON 等 - - - -### Protobuf 方式 - -1. 编写 IDL 文件 -```protobuf - syntax = "proto3"; - - option java_multiple_files = true; - option java_package = "org.apache.dubbo.hello"; - option java_outer_classname = "HelloWorldProto"; - option objc_class_prefix = "HLW"; - - package helloworld; - - // The request message containing the user's name. - message HelloRequest { - string name = 1; - } - - // The response message containing the greetings - message HelloReply { - string message = 1; - } -``` - -2. 添加编译 protobuf 的 extension 和 plugin (以 maven 为例) -```xml - - - kr.motd.maven - os-maven-plugin - 1.6.1 - - - - - org.xolstice.maven.plugins - protobuf-maven-plugin - 0.6.1 - - com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier} - triple-java - build/generated/source/proto/main/java - - - - - compile - test-compile - - - - - -``` - -3. 构建/ 编译生成 protobuf Message 类 -```shell -mvn clean install -``` - -### Unary 方式 - -4. 编写 Java 接口 -```java - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public interface IGreeter { - /** - *
-         *  Sends a greeting
-         * 
- */ - HelloReply sayHello(HelloRequest request); - - } -``` - -5. 创建 Provider -```java - public static void main(String[] args) throws InterruptedException { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(IGreeter.class); - service.setRef(new IGreeter1Impl()); - // 这里需要显示声明使用的协议为triple - service.setProtocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)); - service.setApplication(new ApplicationConfig("demo-provider")); - service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181")); - service.export(); - System.out.println("dubbo service started"); - new CountDownLatch(1).await(); - } - -``` - - -6. 创建 Consumer - -```java - public static void main(String[] args) throws IOException { - ReferenceConfig ref = new ReferenceConfig<>(); - ref.setInterface(IGreeter.class); - ref.setCheck(false); - ref.setProtocol(CommonConstants.TRIPLE); - ref.setLazy(true); - ref.setTimeout(100000); - ref.setApplication(new ApplicationConfig("demo-consumer")); - ref.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181")); - final IGreeter iGreeter = ref.get(); - - System.out.println("dubbo ref started"); - try { - final HelloReply reply = iGreeter.sayHello(HelloRequest.newBuilder() - .setName("name") - .build()); - TimeUnit.SECONDS.sleep(1); - System.out.println("Reply:" + reply); - } catch (Throwable t) { - t.printStackTrace(); - } - System.in.read(); - } -``` - -7. 运行 Provider 和 Consumer ,可以看到请求正常返回 -```java -> Reply:message: "name" -``` - -### stream 方式 - -8. 编写 Java 接口 -```java - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public interface IGreeter { - /** - *
-     	*  Sends greeting by stream
-     	* 
- */ - StreamObserver sayHello(StreamObserver replyObserver); - - } -``` - -9. 编写实现类 -```java - public class IStreamGreeterImpl implements IStreamGreeter { - - @Override - public StreamObserver sayHello(StreamObserver replyObserver) { - - return new StreamObserver() { - private List replyList = new ArrayList<>(); - - @Override - public void onNext(HelloRequest helloRequest) { - System.out.println("onNext receive request name:" + helloRequest.getName()); - replyList.add(HelloReply.newBuilder() - .setMessage("receive name:" + helloRequest.getName()) - .build()); - } - - @Override - public void onError(Throwable cause) { - System.out.println("onError"); - replyObserver.onError(cause); - } - - @Override - public void onCompleted() { - System.out.println("onComplete receive request size:" + replyList.size()); - for (HelloReply reply : replyList) { - replyObserver.onNext(reply); - } - replyObserver.onCompleted(); - } - }; - } - } -``` - -10. 创建 Provider - -```java - public class StreamProvider { - public static void main(String[] args) throws InterruptedException { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(IStreamGreeter.class); - service.setRef(new IStreamGreeterImpl()); - service.setProtocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)); - service.setApplication(new ApplicationConfig("stream-provider")); - service.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181")); - service.export(); - System.out.println("dubbo service started"); - new CountDownLatch(1).await(); - } - } -``` - -11. 创建 Consumer - -```java - public class StreamConsumer { - public static void main(String[] args) throws InterruptedException, IOException { - ReferenceConfig ref = new ReferenceConfig<>(); - ref.setInterface(IStreamGreeter.class); - ref.setCheck(false); - ref.setProtocol(CommonConstants.TRIPLE); - ref.setLazy(true); - ref.setTimeout(100000); - ref.setApplication(new ApplicationConfig("stream-consumer")); - ref.setRegistry(new RegistryConfig("zookeeper://mse-6e9fda00-p.zk.mse.aliyuncs.com:2181")); - final IStreamGreeter iStreamGreeter = ref.get(); - - System.out.println("dubbo ref started"); - try { - - StreamObserver streamObserver = iStreamGreeter.sayHello(new StreamObserver() { - @Override - public void onNext(HelloReply reply) { - System.out.println("onNext"); - System.out.println(reply.getMessage()); - } - - @Override - public void onError(Throwable throwable) { - System.out.println("onError:" + throwable.getMessage()); - } - - @Override - public void onCompleted() { - System.out.println("onCompleted"); - } - }); - - streamObserver.onNext(HelloRequest.newBuilder() - .setName("tony") - .build()); - - streamObserver.onNext(HelloRequest.newBuilder() - .setName("nick") - .build()); - - streamObserver.onCompleted(); - } catch (Throwable t) { - t.printStackTrace(); - } - System.in.read(); - } - } -``` - -12. 运行 Provider 和 Consumer ,可以看到请求正常返回了 -```java -> onNext\ -> receive name:tony\ -> onNext\ -> receive name:nick\ -> onCompleted -``` - -### 其他序列化方式 -省略上文中的 1-3 步,指定 Provider 和 Consumer 使用的协议即可完成协议升级。 - -> 本文的示例可以在 [triple-samples](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-triple) 找到 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/idl.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/idl.md index 40c2cb2ffa78..05404ebdf43a 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/idl.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/idl.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/triple/idl/ - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/triple/idl/ + - /zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/idl/ description: IDL 方式使用 Triple linkTitle: IDL 方式使用 Triple title: IDL 方式使用 Triple @@ -10,68 +11,79 @@ weight: 2 --- +使用 IDL 定义服务具有更好的跨语言友好性,对于 Dubbo3 新用户而言,我们推荐使用这种方式。可在此查看[本示例的完整代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 - - - -这篇教程会通过从零构建一个简单的工程来演示如何基于 IDL 方式使用 Dubbo Triple +然而 Triple 协议并不是和 IDL 强绑定的,也可以[使用 Java Interface + Pojo 的方式定义服务](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/pojo/)并启用 Triple 协议。 ## 前置条件 - [JDK](https://jdk.java.net/) 版本 >= 8 - 已安装 [Maven](https://maven.apache.org/) -- 已安装并启动 [Zookeeper](https://zookeeper.apache.org/) - -## 创建工程 -### 1. 创建一个空的 maven 工程 - ``` -$ mvn archetype:generate \ - -DgroupId=org.apache.dubbo \ - -DartifactId=tri-stub-demo \ - -DarchetypeArtifactId=maven-archetype-quickstart \ - -DarchetypeVersion=1.4 \ - -DarchetypeGroupId=org.apache.maven.archetypes \ - -Dversion=1.0-SNAPSHOT + +## 运行示例 +首先可通过以下命令下载示例源码 +```shell +git clone https://github.com/apache/dubbo-samples.git +``` + +编译项目,由 IDL 生成代码 +```shell +cd dubbo-samples/1-basic/dubbo-samples-triple-unary +mvn clean compile +``` + +### 启动 Server +运行以下命令启动 server。 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryServer" ``` -### 2. 切换到工程目录 + +### 访问服务 +有两种方式可以访问 Triple 服务: +* 以标准 HTTP 工具访问 +* 以 Dubbo client sdk 访问 + +#### cURL 访问 + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '[{"name": "Dubbo"}]' \ + http://localhost:50052/org.apache.dubbo.samples.tri.unary.Greeter/greet/ ``` - $ cd tri-stub-demo + +#### Dubbo client 访问 +运行以下命令,启动 Dubbo client 并完成服务调用 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryClient" ``` -### 3. 添加 Dubbo 依赖和插件 -在 `pom.xml` 中设置 JDK 版本 +## 示例讲解 +可在此查看 [完整示例代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 + +### 项目依赖 +由于使用 IDL 开发模式,因此要添加 dubbo、protobuf-java 等依赖,同时还要配置 protobuf-maven-plugin 等插件,用于生成桩代码。 + ```xml - - UTF-8 - 1.8 - 1.8 - 3.1.7 - - + - - junit - junit - 4.13 - test - - - org.apache.dubbo - dubbo - ${dubbo.version} - - - org.apache.dubbo - dubbo-dependencies-zookeeper-curator5 - pom - ${dubbo.version} - + + org.apache.dubbo + dubbo + ${dubbo.version} + com.google.protobuf protobuf-java - 3.19.4 + 3.19.6 + + + org.apache.dubbo + dubbo-dependencies-zookeeper-curator5 + ${dubbo.version} + pom - + @@ -86,7 +98,7 @@ $ mvn archetype:generate \ protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:3.19.4:exe:${os.detected.classifier} + com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier} dubbo @@ -105,143 +117,143 @@ $ mvn archetype:generate \ + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.level} + ${target.level} + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.3.0 + + + generate-sources + + add-source + + + + target/generated-sources/protobuf/java + + + + + + ``` -### 4. 添加接口定义文件 -`src/main/proto/hello.proto`,Dubbo 使用 [Protobuf](https://developers.google.com/protocol-buffers) 作为 IDL +### 服务定义 +使用 Protocol Buffers 定义服务 + ```protobuf - syntax = "proto3"; - - option java_multiple_files = true; - option java_package = "org.apache.dubbo.hello"; - option java_outer_classname = "HelloWorldProto"; - option objc_class_prefix = "HLW"; +syntax = "proto3"; - package helloworld; +option java_multiple_files = true; - message HelloRequest { - string name = 1; - } +package org.apache.dubbo.samples.tri.unary; - message HelloReply { - string message = 1; - } - service Greeter{ - rpc greet(HelloRequest) returns (HelloReply); - } +message GreeterRequest { + string name = 1; +} +message GreeterReply { + string message = 1; +} + +service Greeter{ + rpc greet(GreeterRequest) returns (GreeterReply); +} ``` -### 5. 编译 IDL -``` - $ mvn clean install -``` - 编译成功后,可以看到`target/generated-sources/protobuf/java` 目录下生成了代码文件 -``` - $ ls org/apache/dubbo/hello/ - DubboGreeterTriple.java HelloReply.java HelloRequest.java HelloWorldProto.java - Greeter.java HelloReplyOrBuilder.java HelloRequestOrBuilder.java + +### 代码生成 +执行 `mvn clean compile` 后,生成代码如下 + +```text +└── org + └── apache + └── dubbo + └── samples + └── tri + └── unary + ├── DubboGreeterTriple.java + ├── Greeter.java + ├── GreeterOuterClass.java + ├── GreeterReply.java + ├── GreeterReplyOrBuilder.java + ├── GreeterRequest.java + └── GreeterRequestOrBuilder.java ``` -### 6. 添加服务端接口实现 +### 服务实现 +继承生成的基础类 `DubboGreeterTriple.GreeterImplBase`,以下具体的业务逻辑实现。 -`src/main/java/org/apache/dubbo/GreeterImpl.java` ```java - package org.apache.dubbo; - - import org.apache.dubbo.hello.DubboGreeterTriple; - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase { - @Override - public HelloReply greet(HelloRequest request) { - return HelloReply.newBuilder() - .setMessage("Hello," + request.getName() + "!") - .build(); - } - } +public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase { + @Override + public GreeterReply greet(GreeterRequest request) { + LOGGER.info("Server {} received greet request {}", serverName, request); + return GreeterReply.newBuilder() + .setMessage("hello," + request.getName()) + .build(); + } +} ``` -### 7. 添加服务端启动类 -`src/main/java/org/apache/dubbo/MyDubboServer.java` + +注册服务到 server,其中 protocol 设置为 tri 代表开启 triple 协议。 + ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ProtocolConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.ServiceConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - import org.apache.dubbo.hello.Greeter; - - import java.io.IOException; - - public class MyDubboServer { - - public static void main(String[] args) throws IOException { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(Greeter.class); - service.setRef(new GreeterImpl()); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("tri-stub-server")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)) - .service(service) - .start(); - System.out.println("Dubbo triple stub server started"); - System.in.read(); - } - } +public class TriUnaryServer { + public static void main(String[] args) throws IOException { + new EmbeddedZooKeeper(TriSampleConstants.ZK_PORT, false).start(); + ServiceConfig service = new ServiceConfig<>(); + service.setInterface(Greeter.class); + service.setRef(new GreeterImpl("tri-stub")); + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-server"); + applicationConfig.setQosEnable(false); + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + bootstrap.application(applicationConfig) + .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)) + .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT)) + .service(service) + .start(); + System.out.println("Dubbo triple unary server started, port=" + TriSampleConstants.SERVER_PORT); + } +} ``` -### 8. 添加客户端启动类 -`src/main/java/org/apache/dubbo/MyDubboClient.java` +### 编写 client 逻辑 ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ReferenceConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - import org.apache.dubbo.hello.Greeter; - import org.apache.dubbo.hello.HelloReply; - import org.apache.dubbo.hello.HelloRequest; - - public class MyDubboClient { - public static void main(String[] args) { - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - ReferenceConfig ref = new ReferenceConfig<>(); - ref.setInterface(Greeter.class); - ref.setProtocol(CommonConstants.TRIPLE); - ref.setProxy(CommonConstants.NATIVE_STUB); - ref.setTimeout(3000); - bootstrap.application(new ApplicationConfig("tri-stub-client")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .reference(ref) - .start(); - - Greeter greeter = ref.get(); - HelloRequest request = HelloRequest.newBuilder().setName("Demo").build(); - HelloReply reply = greeter.greet(request); - System.out.println("Received reply:" + reply); - } - } -``` -### 9. 编译代码 -``` -$ mvn clean install -``` -### 10. 启动服务端 -``` -$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer" -Dubbo triple stub server started -``` -### 11. 打开新的终端,启动客户端 +public class TriUnaryClient { + private static final Logger LOGGER = LoggerFactory.getLogger(TriUnaryClient.class); + + public static void main(String[] args) throws IOException { + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + ReferenceConfig ref = new ReferenceConfig<>(); + ref.setInterface(Greeter.class); + ref.setProtocol(CommonConstants.TRIPLE); + ref.setProxy(CommonConstants.NATIVE_STUB); + ref.setTimeout(3000); + + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-consumer"); + applicationConfig.setQosEnable(false); + bootstrap.application(applicationConfig).reference(ref).registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)).start(); + Greeter greeter = ref.get(); + + //sync + unarySync(greeter); + } + + private static void unarySync(Greeter greeter) { + LOGGER.info("{} Start unary", "tri-unary-client"); + final GreeterReply reply = greeter.greet(GreeterRequest.newBuilder().setName("name").build()); + LOGGER.info("{} Unary reply <-{}", "tri-unary-client", reply); + } +} ``` -$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient" -Received reply:message: "Hello,Demo!" -``` \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration.md index 34371fba4a9c..2ddf98293fae 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration.md @@ -2,26 +2,21 @@ aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/triple/migration/ - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/triple/migration/ -description: Dubbo2 协议迁移 -linkTitle: Dubbo2 协议迁移 -title: Dubbo2 协议迁移 +description: "如何从 Dubbo2 协议平滑的迁移到 Triple 协议" +linkTitle: 老用户协议平滑迁移 +title: 老用户协议平滑迁移 type: docs weight: 10 --- - - - - - ## 迁移流程说明 -Dubbo2 的用户使用 dubbo 协议 + 自定义序列化,如 hessian2 完成远程调用。 - -而 Grpc 的默认仅支持 Protobuf 序列化,对于 Java 语言中的多参数以及方法重载也无法支持。 +Dubbo2 的老用户使用 dubbo 协议 + 自定义序列化,如 hessian2 完成远程调用。 Dubbo3 的之初就有一条目标是完美兼容 Dubbo2,所以为了 Dubbo2 能够平滑升级, Dubbo 框架侧做了很多工作来保证升级的无感,目前默认的序列化和 Dubbo2 保持一致为 `hessian2`。 +> 而 Grpc 的默认仅支持 Protobuf 序列化,对于 Java 语言中的多参数以及方法重载也无法支持。 + 所以,如果决定要升级到 Dubbo3 的 `Triple` 协议,只需要修改配置中的协议名称为 `tri` (注意: 不是 triple )即可。 接下来我们以一个使用 Dubbo2 协议的[工程](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/migration)来举例,如何一步一步安全的升级。 @@ -100,3 +95,6 @@ public class IGreeter2Impl implements IWrapperGreeter { {{% alert title="输出结果" color="info" %}} ![result](/imgs/v3/migration/tri/dubbo3-tri-migration-both-dubbo-tri-result.png) {{% /alert %}} + +## 总结 +升级中用到了 Dubbo 的多协议发布能力,为了保证升级稳定性,请仔细阅读 [Dubbo 的多协议支持]() 相关文档。 diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/pojo.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/pojo.md index e73dc3be66e0..8b4441941e31 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/pojo.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/pojo.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/triple/pojo/ - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/triple/pojo/ + - /zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/wrap/ description: POJO 方式使用 Triple linkTitle: POJO 方式使用 Triple title: POJO 方式使用 Triple @@ -9,201 +10,186 @@ type: docs weight: 2 --- +这篇教程演示了非 Protocol Buffers 模式下的 Triple 协议开发模式。这对于两种场景非常有用: +* **老版本基于 Java Interface 的应用,可以在不改变已有接口定义的情况下直接升级到 Triple 协议** +* **没有多语言编码诉求,想使用 Triple 协议但又想引入 IDL 复杂性的新应用** +### 前置条件 +- [JDK](https://jdk.java.net/) 版本 >= 8 +- 已安装 [Maven](https://maven.apache.org/) +## 运行示例 +首先可通过以下命令下载示例源码 +```shell +git clone https://github.com/apache/dubbo-samples.git +``` +编译项目,由 IDL 生成代码 +```shell +cd dubbo-samples/1-advanced/dubbo-samples-triple-no-idl/ +mvn clean compile +``` +### 启动 Server +运行以下命令启动 server。 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.noidl.TriPojoServer" +``` -这篇教程会通过从零构建一个简单的工程来演示如何基于 POJO 方式使用 Dubbo Triple, 在应用不改变已有接口定义的同时升级到 Triple 协议。 - - -### 实现原理 - -通过上面介绍的升级过程,我们可以很简单的通过修改协议类型来完成升级。框架是怎么帮我们做到这些的呢? - -通过对 `Triple` 协议的介绍,我们知道Dubbo3的 `Triple` 的数据类型是 `protobuf` 对象,那为什么非 `protobuf` 的 java 对象也可以被正常传输呢。 - -这里 Dubbo3 使用了一个巧妙的设计,首先判断参数类型是否为 `protobuf` 对象,如果不是。用一个 `protobuf` 对象将 `request` 和 `response` 进行 wrapper,这样就屏蔽了其他各种序列化带来的复杂度。在 `wrapper` 对象内部声明序列化类型,来支持序列化的扩展。 - -wrapper 的`protobuf`的 IDL如下: -```proto -syntax = "proto3"; - -package org.apache.dubbo.triple; +### 访问服务 +有两种方式可以访问 Triple 服务: +* 以标准 HTTP 工具访问 +* 以 Dubbo client sdk 访问 -message TripleRequestWrapper { - // hessian4 - // json - string serializeType = 1; - repeated bytes args = 2; - repeated string argTypes = 3; -} +#### cURL 访问 +```shell +curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50052/org.apache.dubbo.samples.tri.noidl.api.PojoGreeter/greet/ +``` -message TripleResponseWrapper { - string serializeType = 1; - bytes data = 2; - string type = 3; -} +#### Dubbo client 访问 +```shell +$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.noidl.TriPojoClient" ``` -对于请求,使用`TripleRequestWrapper`进行包装,对于响应使用`TripleResponseWrapper`进行包装。 +## 示例讲解 +可在此查看 [完整示例代码 dubbo-samples-triple-no-idl](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-no-idl)。 -> 对于请求参数,可以看到 args 被`repeated`修饰,这是因为需要支持 java 方法的多个参数。当然,序列化只能是一种。序列化的实现沿用 Dubbo2 实现的 spi +### 项目依赖 +由于依赖配置与普通 Dubbo 应用依赖完全一致,在此不再展开,感兴趣请直接点击上面链接查看源码。 -### 前置条件 -- [JDK](https://jdk.java.net/) 版本 >= 8 -- 已安装 [Maven](https://maven.apache.org/) -- 已安装并启动 [Zookeeper](https://zookeeper.apache.org/) +### 服务定义 +相比于 IDL 模式使用 Protocol Buffers 定义服务,我们直接定义 Java interface 和要传输的数据定义。 -### 创建工程 -1. 首先创建一个空的 maven 工程 -``` -$ mvn archetype:generate \ - -DgroupId=org.apache.dubbo \ - -DartifactId=tri-pojo-demo \ - -DarchetypeArtifactId=maven-archetype-quickstart \ - -DarchetypeVersion=1.4 \ - -DarchetypeGroupId=org.apache.maven.archetypes \ - -Dversion=1.0-SNAPSHOT -``` -2. 切换到工程目录 -``` -$ cd tri-pojo-demo -``` -3. 在 `pom.xml` 中设置 JDK 版本,添加 Dubbo 依赖和插件 -```xml - - UTF-8 - 1.8 - 1.8 - - - - - junit - junit - 4.13 - test - - - org.apache.dubbo - dubbo - 3.0.8 - - - org.apache.dubbo - dubbo-dependencies-zookeeper-curator5 - pom - 3.0.8 - - - com.google.protobuf - protobuf-java - 3.19.4 - - +定义接口,包括 unary、streaming 模式 +```java +public interface PojoGreeter { + /** + * unary + */ + String greet(String request); + /** + * bi stream + */ + StreamObserver greetStream(StreamObserver response); + /** + * server stream + */ + void greetServerStream(String request, StreamObserver response); +} ``` -4. 添加接口定义`src/main/java/org/apache/dubbo/Greeter.java` -```java - package org.apache.dubbo; +### 服务实现 +直接实现以上 interface 并增加逻辑实现即可,请注意这里的 StreamObserver 等类都是由 Dubbo 框架提供,并不需要任何 gRPC 依赖。 - public interface Greeter { - String sayHello(String name); - } -``` -5. 添加服务端接口实现`src/main/java/org/apache/dubbo/GreeterImpl.java` -```java - package org.apache.dubbo; - - public class GreeterImpl implements Greeter { - @Override - public String sayHello(String name) { - return "Hello," + name + "!"; - } - } -``` -6. 添加服务端启动类 `src/main/java/org/apache/dubbo/MyDubboServer.java` ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ProtocolConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.ServiceConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - - import java.io.IOException; - - public class MyDubboServer { - - public static void main(String[] args) throws IOException { - ServiceConfig service = new ServiceConfig<>(); - service.setInterface(Greeter.class); - service.setRef(new GreeterImpl()); - - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - bootstrap.application(new ApplicationConfig("tri-pojo-server")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)) - .service(service) - .start(); - System.out.println("Dubbo triple pojo server started"); - System.in.read(); - } - } +public class PojoGreeterImpl implements PojoGreeter { + @Override + public String greet(String request) { + return "hello," + request; + } + + @Override + public StreamObserver greetStream(StreamObserver response) { + return new StreamObserver() { + @Override + public void onNext(String data) { + LOGGER.info(data); + response.onNext("hello," + data); + } + + @Override + public void onError(Throwable throwable) { + throwable.printStackTrace(); + } + + @Override + public void onCompleted() { + LOGGER.info("onCompleted"); + response.onCompleted(); + } + }; + } + + @Override + public void greetServerStream(String request, StreamObserver response) { + for (int i = 0; i < 10; i++) { + response.onNext("hello," + request); + } + response.onCompleted(); + } +} ``` -7. 添加客户端启动类`src/main/java/org/apache/dubbo/MyDubboClient.java` +注册服务到 server + ```java - package org.apache.dubbo; - - import org.apache.dubbo.common.constants.CommonConstants; - import org.apache.dubbo.config.ApplicationConfig; - import org.apache.dubbo.config.ReferenceConfig; - import org.apache.dubbo.config.RegistryConfig; - import org.apache.dubbo.config.bootstrap.DubboBootstrap; - - public class MyDubboClient { - public static void main(String[] args) { - DubboBootstrap bootstrap = DubboBootstrap.getInstance(); - ReferenceConfig ref = new ReferenceConfig<>(); - ref.setInterface(Greeter.class); - ref.setProtocol(CommonConstants.TRIPLE); - ref.setTimeout(3000); - bootstrap.application(new ApplicationConfig("tri-pojo-client")) - .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) - .reference(ref) - .start(); - - Greeter greeter = ref.get(); - String reply = greeter.sayHello("pojo"); - System.out.println("Received reply:" + reply); - } - } +public class TriPojoServer { + public static void main(String[] args) { + ServiceConfig service = new ServiceConfig<>(); + service.setInterface(PojoGreeter.class); + service.setRef(new PojoGreeterImpl()); + + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + bootstrap.application(new ApplicationConfig("tri-stub-server")) + .registry(new RegistryConfig("N/A")) + .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT)) + .service(service) + .start() + .await(); + } +} ``` -8. 编译代码 -``` -$ mvn clean install -``` -9. 启动服务端 -``` -$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboServer" -``` -{{% alert title="输出结果" color="info" %}} -```shell -Dubbo triple pojo server started -``` -{{% /alert %}} +### 编写 client 逻辑 -10. 打开新的终端,启动客户端 -``` -$ mvn org.codehaus.mojo:exec-maven-plugin:3.0.0:java -Dexec.mainClass="org.apache.dubbo.MyDubboClient" -``` -{{% alert title="输出结果" color="info" %}} -```shell -Received reply:message: "Hello,Demo!" -``` -{{% /alert %}} +```java +public class TriPojoClient { + public TriPojoClient() { + ReferenceConfig ref = new ReferenceConfig<>(); + ref.setInterface(PojoGreeter.class); + ref.setTimeout(3000); + ref.setProtocol(CommonConstants.TRIPLE); + ref.setUrl("tri://localhost:" + TriSampleConstants.SERVER_PORT); + + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + bootstrap.application(new ApplicationConfig("tri-pojo-client")) + .registry(new RegistryConfig("N/A")) + .reference(ref) + .start(); + this.delegate = ref.get(); + } + + public static void main(String[] args) throws IOException { + final TriPojoClient consumer = new TriPojoClient(); + consumer.greetUnary(); + consumer.greetStream(); + consumer.greetServerStream(); + System.in.read(); + } + + public void greetUnary() { + LOGGER.info("{} Start unary", clientName); + String reply = delegate.greet("unary"); + LOGGER.info("{} Unary reply <-{}", clientName, reply); + } + + public void greetServerStream() { + LOGGER.info("{} Start server streaming", clientName); + delegate.greetServerStream("server stream", new StdoutStreamObserver<>("greetServerStream")); + LOGGER.info("{} Server stream done", clientName); + } + + public void greetStream() { + LOGGER.info("{} Start bi streaming", clientName); + final StreamObserver request = delegate.greetStream(new StdoutStreamObserver<>("greetStream")); + for (int i = 0; i < 10; i++) { + request.onNext("stream request"); + } + request.onCompleted(); + LOGGER.info("{} Bi stream done", clientName); + } +} +``` \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/streaming.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/streaming.md index 2e24b02ed6bd..94fdddb80475 100644 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/streaming.md +++ b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/streaming.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/java-sdk/reference-manual/protocol/triple/streaming/ - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/triple/streaming/ + - /zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/triple/streaming/ description: Streaming 通信 linkTitle: Streaming 通信 title: Streaming 通信 @@ -9,17 +10,13 @@ type: docs weight: 10 --- - - - - ## 流实现原理 -`Triple`协议的流模式 +`Triple` 协议的流模式与 gRPC 所定义的流模式在概念和编程模式上基本保持对等能力。 -- 从协议层来说,`Triple` 是建立在 `HTTP2` 基础上的,所以直接拥有所有 `HTTP2` 的能力,故拥有了分 `stream` 和全双工的能力。 +- 从协议层来说,`Triple` 流是建立在 `HTTP2` 基础上的,所以直接复用所有 `HTTP2` 的能力,故拥有了 `stream` 和全双工的能力。 -- 框架层来说,`StreamObserver` 作为流的接口提供给用户,用于入参和出参提供流式处理。框架在收发 stream data 时进行相应的接口调用, 从而保证流的生命周期完整。 +- 框架层来说,`org.apache.dubbo.common.stream.StreamObserver` 作为流的接口提供给用户,用于入参和出参提供流式处理。框架在收发 stream data 时进行相应的接口调用, 从而保证流的生命周期完整。 ## 流使用方式 @@ -40,9 +37,9 @@ Stream 分为以下三种: 由于 `java` 语言的限制,BIDIRECTIONAL_STREAM 和 CLIENT_STREAM 的实现是一样的。 -在 Dubbo3 中,流式接口以 `SteamObserver` 声明和使用,用户可以通过使用和实现这个接口来发送和处理流的数据、异常和结束。 +在 Dubbo3 中,流式接口以 `org.apache.dubbo.common.stream.StreamObserver` 声明和使用,用户可以通过使用和实现这个接口来发送和处理流的数据、异常和结束。 -对于 Dubbo2 用户来说,可能会对StreamObserver感到陌生,这是Dubbo3定义的一种流类型,Dubbo2 中并不存在 Stream 的类型,所以对于迁移场景没有任何影响。 +> 对于 Dubbo2 用户来说,可能会对StreamObserver感到陌生,这是Dubbo3定义的一种流类型,Dubbo2 中并不存在 Stream 的类型,所以对于迁移场景没有任何影响。 {{% alert title="流的语义保证" color="primary" %}} - 提供消息边界,可以方便地对消息单独处理 @@ -51,114 +48,12 @@ Stream 分为以下三种: - 支持取消和超时 {{% /alert %}} -### Protobuf 序列化的流 - -对于 `Protobuf` 序列化方式,推荐编写 `IDL` 使用 `compiler` 插件进行编译生成。生成的代码大致如下: -```java -public interface PbGreeter { - - static final String JAVA_SERVICE_NAME = "org.apache.dubbo.sample.tri.PbGreeter"; - static final String SERVICE_NAME = "org.apache.dubbo.sample.tri.PbGreeter"; +前面我们提到了,对于 Triple 协议,Dubbo 支持 IDL 和 Interface 两种编码模式。对于流模式来说,同样支持这两种编码和通信模式。 +### Protobuf 流(IDL 模式)。 +关于这部分的详细说明,请参见 [dubbo-samples-triple-streaming 示例](https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-triple-streaming) - static final boolean inited = PbGreeterDubbo.init(); - - //... - - void greetServerStream(org.apache.dubbo.sample.tri.GreeterRequest request, org.apache.dubbo.common.stream.StreamObserver responseObserver); - - org.apache.dubbo.common.stream.StreamObserver greetStream(org.apache.dubbo.common.stream.StreamObserver responseObserver); -} -``` - -## 非 Protobuf 序列化的流 -### api -```java -public interface IWrapperGreeter { - - StreamObserver sayHelloStream(StreamObserver response); - - void sayHelloServerStream(String request, StreamObserver response); -} -``` +## 非 Protobuf 流(Interface 模式) +非 Protobuf 模式的 Streaming 部分示例在 [Interface 模式](../pojo/) 中有详细说明。 > Stream 方法的方法入参和返回值是严格约定的,为防止写错而导致问题,Dubbo3 框架侧做了对参数的检查, 如果出错则会抛出异常。 > 对于 `双向流(BIDIRECTIONAL_STREAM)`, 需要注意参数中的 `StreamObserver` 是响应流,返回参数中的 `StreamObserver` 为请求流。 -### 实现类 -```java -public class WrapGreeterImpl implements WrapGreeter { - - //... - - @Override - public StreamObserver sayHelloStream(StreamObserver response) { - return new StreamObserver() { - @Override - public void onNext(String data) { - System.out.println(data); - response.onNext("hello,"+data); - } - - @Override - public void onError(Throwable throwable) { - throwable.printStackTrace(); - } - - @Override - public void onCompleted() { - System.out.println("onCompleted"); - response.onCompleted(); - } - }; - } - - @Override - public void sayHelloServerStream(String request, StreamObserver response) { - for (int i = 0; i < 10; i++) { - response.onNext("hello," + request); - } - response.onCompleted(); - } -} -``` - -### 调用方式 -```java -delegate.sayHelloServerStream("server stream", new StreamObserver() { - @Override - public void onNext(String data) { - System.out.println(data); - } - - @Override - public void onError(Throwable throwable) { - throwable.printStackTrace(); - } - - @Override - public void onCompleted() { - System.out.println("onCompleted"); - } -}); - - -StreamObserver request = delegate.sayHelloStream(new StreamObserver() { - @Override - public void onNext(String data) { - System.out.println(data); - } - - @Override - public void onError(Throwable throwable) { - throwable.printStackTrace(); - } - - @Override - public void onCompleted() { - System.out.println("onCompleted"); - } -}); -for (int i = 0; i < n; i++) { - request.onNext("stream request" + i); -} -request.onCompleted(); -``` diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/v3.2_rest_protocol_design.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/v3.2_rest_protocol_design.md deleted file mode 100644 index 4dd501e625e8..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/v3.2_rest_protocol_design.md +++ /dev/null @@ -1,659 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/concepts-and-architecture/v3.2_rest_protocol_design/ - - /zh-cn/docs3-v2/java-sdk/concepts-and-architecture/v3.2_rest_protocol_design/ - - zh-cn/overview/mannual/java-sdk/concepts-and-architecture/v3.2_rest_protocol_design/ -description: 本文将介绍 Dubbo 的 Rest 协议。 -linkTitle: Rest 协议 -title: Rest 协议 -type: docs -weight: 6 ---- - - - - -# Dubbo RestProtocol 设计文档 - -## 原版本dubbo rest - -consumer - -restClient支持 依赖resteasy 不支持spring mvc  - -provider(较重) - -依赖web container   (tomcat,jetty,)servlet 模式,jaxrs netty server - -### 改版dubbo rest  - -方向: - -更加轻量,具有dubbo风格的rest,微服务体系互通(Springcloud Alibaba) - -1.注解解析 - -2.报文编解码 - -3.restClient - -4.restServer(netty) - -支持程度: - -content-type   text json xml form(后续会扩展) - -注解 - -param,header,body,pathvariable (spring mvc & resteasy) - -## Http 协议报文 - - POST /test/path? HTTP/1.1 - Host: localhost:8080 - Connection: keep-alive - Content-type: application/json - - - {"name":"dubbo","age":10,"address":"hangzhou"} - - - -### dubbo http(header) - - // service key header - path: com.demo.TestInterface - group: demo - port: 80 - version: 1.0.0 - - // 保证长连接 - Keep-Alive,Connection: keep-alive - Keep-alive: 60 - - // RPCContext Attachment - userId: 123456 - - -## 目前支持粒度: - -| 数据位置 | content-type | spring注解 | resteasy注解 | -| --- | --- | --- | --- | -| body | 无要求 | ReuqestBody |  无注解即为body | -| querystring(?test=demo) | 无要求 | RequestParam | QueryParam | -| header | 无要求 | RequestHeader | PathParam | -| form | application/x-www-form-urlencoded | RequestParam ReuqestBody | FormParam | -| path | 无要求 | PathVariable | PathParam | -| method | 无要求 | PostMapping GetMapping | GET POST | -| url | | PostMapping GetMapping path属性 | Path | -| content-type | | PostMapping GetMapping consumers属性 | Consumers | -| Accept | | PostMapping GetMapping produces属性 | Produces | - -## rest注解解析(ServiceRestMetadataResolver) - - JAXRSServiceRestMetadataResolver - - SpringMvcServiceRestMetadataResolver - -ServiceRestMetadata - - public class ServiceRestMetadata implements Serializable { - - private String serviceInterface; // com.demo.TestInterface - - private String version;// 1.0.0 - - private String group;// demo - - private Set meta;// method 元信息 - - private int port;// 端口 for provider service key - - private boolean consumer;// consumer 标志 - - /** - * make a distinction between mvc & resteasy - */ - private Class codeStyle;// - - /** - * for provider - */ - private Map pathToServiceMap; - - /** - * for consumer - */ - private Map> methodToServiceMa - -RestMethodMetadata - - public class RestMethodMetadata implements Serializable { - - private MethodDefinition method; // method 定义信息(name ,pramType,returnType) - - private RequestMetadata request;// 请求元信息 - - private Integer urlIndex; - - private Integer bodyIndex; - - private Integer headerMapIndex; - - private String bodyType; - - private Map> indexToName; - - private List formParams; - - private Map indexToEncoded; - - private ServiceRestMetadata serviceRestMetadata; - - private List argInfos; - - private Method reflectMethod; - - /** - * make a distinction between mvc & resteasy - */ - private Class codeStyle; - - -ArgInfo - - public class ArgInfo { - /** - * method arg index 0,1,2,3 - */ - private int index; - /** - * method annotation name or name - */ - private String annotationNameAttribute; - - /** - * param annotation type - */ - private Class paramAnnotationType; - - /** - * param Type - */ - private Class paramType; - - /** - * param name - */ - private String paramName; - - /** - * url split("/") String[n] index - */ - private int urlSplitIndex; - - private Object defaultValue; - - private boolean formContentType; - -RequestMeatadata - - public class RequestMetadata implements Serializable { - - private static final long serialVersionUID = -240099840085329958L; - - private String method;// 请求method - - private String path;// 请求url - - - private Map> params // param参数?拼接 - - private Map> headers// header; - - private Set consumes // content-type; - - private Set produces // Accept; - -### Consumer 代码: - -refer: - - @Override - protected Invoker protocolBindingRefer(final Class type, final URL url) throws RpcException { - - // restClient spi创建 - ReferenceCountedClient refClient = - clients.computeIfAbsent(url.getAddress(), key -> createReferenceCountedClient(url, clients)); - - refClient.retain(); - - // resolve metadata - Map> metadataMap = MetadataResolver.resolveConsumerServiceMetadata(type, url); - - ReferenceCountedClient finalRefClient = refClient; - Invoker invoker = new AbstractInvoker(type, url, new String[]{INTERFACE_KEY, GROUP_KEY, TOKEN_KEY}) { - @Override - protected Result doInvoke(Invocation invocation) { - try { - // 获取 method的元信息 - RestMethodMetadata restMethodMetadata = metadataMap.get(invocation.getMethodName()).get(ParameterTypesComparator.getInstance(invocation.getParameterTypes())); - - RequestTemplate requestTemplate = new RequestTemplate(invocation, restMethodMetadata.getRequest().getMethod(), url.getAddress(), getContextPath(url)); - - HttpConnectionCreateContext httpConnectionCreateContext = new HttpConnectionCreateContext(); - // TODO dynamic load config - httpConnectionCreateContext.setConnectionConfig(new HttpConnectionConfig()); - httpConnectionCreateContext.setRequestTemplate(requestTemplate); - httpConnectionCreateContext.setRestMethodMetadata(restMethodMetadata); - httpConnectionCreateContext.setInvocation(invocation); - httpConnectionCreateContext.setUrl(url); - - // http 信息构建拦截器 - for (HttpConnectionPreBuildIntercept intercept : httpConnectionPreBuildIntercepts) { - intercept.intercept(httpConnectionCreateContext); - } - - - CompletableFuture future = finalRefClient.getClient().send(requestTemplate); - CompletableFuture responseFuture = new CompletableFuture<>(); - AsyncRpcResult asyncRpcResult = new AsyncRpcResult(responseFuture, invocation); - // response 处理 - future.whenComplete((r, t) -> { - if (t != null) { - responseFuture.completeExceptionally(t); - } else { - AppResponse appResponse = new AppResponse(); - try { - int responseCode = r.getResponseCode(); - MediaType mediaType = MediaType.TEXT_PLAIN; - - if (400 < responseCode && responseCode < 500) { - throw new HttpClientException(r.getMessage()); - } else if (responseCode >= 500) { - throw new RemoteServerInternalException(r.getMessage()); - } else if (responseCode < 400) { - mediaType = MediaTypeUtil.convertMediaType(r.getContentType()); - } - - - Object value = HttpMessageCodecManager.httpMessageDecode(r.getBody(), - restMethodMetadata.getReflectMethod().getReturnType(), mediaType); - appResponse.setValue(value); - Map headers = r.headers() - .entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); - appResponse.setAttachments(headers); - responseFuture.complete(appResponse); - } catch (Exception e) { - responseFuture.completeExceptionally(e); - } - } - }); - return asyncRpcResult; - } catch (RpcException e) { - if (e.getCode() == RpcException.UNKNOWN_EXCEPTION) { - e.setCode(getErrorCode(e.getCause())); - } - throw e; - } - } - - @Override - public void destroy() { - super.destroy(); - invokers.remove(this); - destroyInternal(url); - } - }; - invokers.add(invoker); - return invoker; - -### provider 代码: - -export: - - public Exporter export(final Invoker invoker) throws RpcException { - URL url = invoker.getUrl(); - final String uri = serviceKey(url); - Exporter exporter = (Exporter) exporterMap.get(uri); - if (exporter != null) { - // When modifying the configuration through override, you need to re-expose the newly modified service. - if (Objects.equals(exporter.getInvoker().getUrl(), invoker.getUrl())) { - return exporter; - } - } - - - // TODO addAll metadataMap to RPCInvocationBuilder metadataMap - Map metadataMap = MetadataResolver.resolveProviderServiceMetadata(url.getServiceModel().getProxyObject().getClass(),url); - - PathAndInvokerMapper.addPathAndInvoker(metadataMap, invoker); - - - final Runnable runnable = doExport(proxyFactory.getProxy(invoker, true), invoker.getInterface(), invoker.getUrl()); - exporter = new AbstractExporter(invoker) { - @Override - public void afterUnExport() { - exporterMap.remove(uri); - if (runnable != null) { - try { - runnable.run(); - } catch (Throwable t) { - logger.warn(PROTOCOL_UNSUPPORTED, "", "", t.getMessage(), t); - } - } - } - }; - exporterMap.put(uri, exporter); - return exporter; - } - -RestHandler - - private class RestHandler implements HttpHandler { - - @Override - public void handle(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException, ServletException { - // 有servlet reuqest 和nettyRequest - RequestFacade request = RequestFacadeFactory.createRequestFacade(servletRequest); - RpcContext.getServiceContext().setRemoteAddress(request.getRemoteAddr(), request.getRemotePort()); - // dispatcher.service(request, servletResponse); - - Pair build = null; - try { - // 根据请求信息创建 RPCInvocation - build = RPCInvocationBuilder.build(request, servletRequest, servletResponse); - } catch (PathNoFoundException e) { - servletResponse.setStatus(404); - } - - Invoker invoker = build.getSecond(); - - Result invoke = invoker.invoke(build.getFirst()); - - // TODO handling exceptions - if (invoke.hasException()) { - servletResponse.setStatus(500); - } else { - - try { - Object value = invoke.getValue(); - String accept = request.getHeader(RestConstant.ACCEPT); - MediaType mediaType = MediaTypeUtil.convertMediaType(accept); - // TODO write response - HttpMessageCodecManager.httpMessageEncode(servletResponse.getOutputStream(), value, invoker.getUrl(), mediaType); - servletResponse.setStatus(200); - } catch (Exception e) { - servletResponse.setStatus(500); - } - - - } - - // TODO add Attachment header - - - } - } - -RPCInvocationBuilder - - { - - - private static final ParamParserManager paramParser = new ParamParserManager(); - - - public static Pair build(RequestFacade request, Object servletRequest, Object servletResponse) { - - // 获取invoker - Pair invokerRestMethodMetadataPair = getRestMethodMetadata(request); - - RpcInvocation rpcInvocation = createBaseRpcInvocation(request, invokerRestMethodMetadataPair.getSecond()); - - ProviderParseContext parseContext = createParseContext(request, servletRequest, servletResponse, invokerRestMethodMetadataPair.getSecond()); - // 参数构建 - Object[] args = paramParser.providerParamParse(parseContext); - - rpcInvocation.setArguments(args); - - return Pair.make(rpcInvocation, invokerRestMethodMetadataPair.getFirst()); - - } - - private static ProviderParseContext createParseContext(RequestFacade request, Object servletRequest, Object servletResponse, RestMethodMetadata restMethodMetadata) { - ProviderParseContext parseContext = new ProviderParseContext(request); - parseContext.setResponse(servletResponse); - parseContext.setRequest(servletRequest); - - Object[] objects = new Object[restMethodMetadata.getArgInfos().size()]; - parseContext.setArgs(Arrays.asList(objects)); - parseContext.setArgInfos(restMethodMetadata.getArgInfos()); - - - return parseContext; - } - - private static RpcInvocation createBaseRpcInvocation(RequestFacade request, RestMethodMetadata restMethodMetadata) { - RpcInvocation rpcInvocation = new RpcInvocation(); - - - int localPort = request.getLocalPort(); - String localAddr = request.getLocalAddr(); - int remotePort = request.getRemotePort(); - String remoteAddr = request.getRemoteAddr(); - - String HOST = request.getHeader(RestConstant.HOST); - String GROUP = request.getHeader(RestConstant.GROUP); - - String PATH = request.getHeader(RestConstant.PATH); - String VERSION = request.getHeader(RestConstant.VERSION); - - String METHOD = restMethodMetadata.getMethod().getName(); - String[] PARAMETER_TYPES_DESC = restMethodMetadata.getMethod().getParameterTypes(); - - rpcInvocation.setParameterTypes(restMethodMetadata.getReflectMethod().getParameterTypes()); - - - rpcInvocation.setMethodName(METHOD); - rpcInvocation.setAttachment(RestConstant.GROUP, GROUP); - rpcInvocation.setAttachment(RestConstant.METHOD, METHOD); - rpcInvocation.setAttachment(RestConstant.PARAMETER_TYPES_DESC, PARAMETER_TYPES_DESC); - rpcInvocation.setAttachment(RestConstant.PATH, PATH); - rpcInvocation.setAttachment(RestConstant.VERSION, VERSION); - rpcInvocation.setAttachment(RestConstant.HOST, HOST); - rpcInvocation.setAttachment(RestConstant.REMOTE_ADDR, remoteAddr); - rpcInvocation.setAttachment(RestConstant.LOCAL_ADDR, localAddr); - rpcInvocation.setAttachment(RestConstant.REMOTE_PORT, remotePort); - rpcInvocation.setAttachment(RestConstant.LOCAL_PORT, localPort); - - Enumeration attachments = request.getHeaders(RestConstant.DUBBO_ATTACHMENT_HEADER); - - while (attachments != null && attachments.hasMoreElements()) { - String s = attachments.nextElement(); - - String[] split = s.split("="); - - rpcInvocation.setAttachment(split[0], split[1]); - } - - - // TODO set path,version,group and so on - return rpcInvocation; - } - - - private static Pair getRestMethodMetadata(RequestFacade request) { - String path = request.getRequestURI(); - String version = request.getHeader(RestConstant.VERSION); - String group = request.getHeader(RestConstant.GROUP); - int port = request.getIntHeader(RestConstant.REST_PORT); - - return PathAndInvokerMapper.getRestMethodMetadata(path, version, group, port); - } - - - } - -## 编码示例 - -API - -mvc: - - @RestController() - @RequestMapping("/demoService") - public interface DemoService { - @RequestMapping(value = "/hello", method = RequestMethod.GET) - Integer hello(@RequestParam Integer a, @RequestParam Integer b); - - @RequestMapping(value = "/error", method = RequestMethod.GET) - String error(); - - @RequestMapping(value = "/say", method = RequestMethod.POST, consumes = MediaType.TEXT_PLAIN_VALUE) - String sayHello(@RequestBody String name); - } - -resteasy: - - @Path("/demoService") - public interface RestDemoService { - @GET - @Path("/hello") - Integer hello(@QueryParam("a")Integer a,@QueryParam("b") Integer b); - - @GET - @Path("/error") - String error(); - - @POST - @Path("/say") - @Consumes({MediaType.TEXT_PLAIN}) - String sayHello(String name); - - boolean isCalled(); - } - -impl(service) - - @DubboService() - public class RestDemoServiceImpl implements RestDemoService { - private static Map context; - private boolean called; - - - @Override - public String sayHello(String name) { - called = true; - return "Hello, " + name; - } - - - public boolean isCalled() { - return called; - } - - @Override - public Integer hello(Integer a, Integer b) { - context = RpcContext.getServerAttachment().getObjectAttachments(); - return a + b; - } - - - @Override - public String error() { - throw new RuntimeException(); - } - - public static Map getAttachments() { - return context; - } - } - -## 流程图 - -**Consumer**   - -![image](https://static.dingtalk.com/media/lQLPJxLOtqTxs9TNA5rNBQCwci8F2QYiGAYD5sSyd4BVAA_1280_922.png) - -**Provider(RestServer)** - -![image](https://static.dingtalk.com/media/lQLPJxZcNUm4M9TNA1_NBMuwZUu6IC3FeYAD5sSydYADAA_1227_863.png) - -## 场景 : - -**非dubbo体系互通(Springcloud alibaba  互通)** - -互通条件: - -| | 协议 | Dubbo | SpringCloud Alibaba | 互通 | -| --- | --- | --- | --- | --- | -| 通信协议 | rest | spring web/resteasy  编码风格 | 集成feignclient,ribbon (spring web 编码风格) | 是 | -| | triple | | | | -| | dubbo | | | | -| | grpc | | | | -| | hessian | | | | -| 注册中心 | zookeeper | | | | -| | nacos | 支持 | 支持 | 应用级别注册 | - -### 2.dubbo 双注册  - - 完成应用级别注册,(dubo2-dubbo3 过度),dubbo版本升级 - -![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/LvBPlNAjAmw3OdG8/img/0ceca951-f467-4ab3-9b71-8e7d52e5e7d1.png) - -![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/LvBPlNAjAmw3OdG8/img/6bcc7aed-1d22-470f-b185-efbab32df1e5.png) - -### 3.多协议发布 - -配置: - - - -### 4.跨语言 - -![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/LvBPlNAjAmw3OdG8/img/1bdf8f91-9666-4c20-9aea-8396c745f554.png) - -### 5.多协议交互 - -![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/LvBPlNAjAmw3OdG8/img/af72e3df-05d5-42a2-a333-618be7ec6cb8.png) - -### 6.协议迁移 - -![image](https://alidocs.oss-cn-zhangjiakou.aliyuncs.com/res/LvBPlNAjAmw3OdG8/img/36d30183-8d5f-494c-8ebb-b57403c88661.png) - -rest编码风格 - -Http协议更通用跨语言调用 - -dubbo rest 对其他http服务 进行调用 - -其他httpclient 对dubbo rest进行调用 - -dubbo restServer 可以与其他web服务,浏览器等客户端直接进行http交互 - -## consumer TODOLIST(功能已经初步实现,可以调通解析response) - -1. org/apache/dubbo/rpc/protocol/rest/RestProtocol.java:157  dynamic load config - -2.org/apache/dubbo/remoting/http/factory/AbstractHttpClientFactory.java:50 load config  HttpClientConfig - -3.org/apache/dubbo/rpc/protocol/rest/annotation/metadata/MetadataResolver.java:52  support Dubbo style service - -4.org/apache/dubbo/remoting/http/restclient/HttpClientRestClient.java:120  TODO config - -5.org/apache/dubbo/remoting/http/restclient/HttpClientRestClient.java:140 TODO close judge - -6.org/apache/dubbo/rpc/protocol/rest/message/decode/MultiValueCodec.java:35  TODO java bean  get set convert - -## provider TODOLIST(待实现) - -基于netty实现支持http协议的NettyServer - -无注解协议定义 - -官网场景补充 - -## Rest使用说明文档及demo: diff --git a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/webservice.md b/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/webservice.md deleted file mode 100644 index 544a78baaf59..000000000000 --- a/content/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/webservice.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -aliases: - - /zh/docs3-v2/java-sdk/reference-manual/protocol/webservice/ - - /zh-cn/docs3-v2/java-sdk/reference-manual/protocol/webservice/ -description: Webservice协议 -linkTitle: Webservice协议 -title: Webservice协议 -type: docs -weight: 11 ---- - - - - - - - -## 特性说明 -基于 WebService 的远程调用协议,基于 [Apache CXF](http://cxf.apache.org) 的 `frontend-simple` 和 `transports-http` 实现。`2.3.0` 以上版本支持。 - -CXF 是 Apache 开源的一个 RPC 框架,由 Xfire 和 Celtix 合并而来。 -* 连接个数:多连接 -* 连接方式:短连接 -* 传输协议:HTTP -* 传输方式:同步传输 -* 序列化:SOAP 文本序列化 -* 适用场景:系统集成,跨语言调用 - -可以和原生 WebService 服务互操作,即: - -* 提供者用 Dubbo 的 WebService 协议暴露服务,消费者直接用标准 WebService 接口调用, -* 或者提供方用标准 WebService 暴露服务,消费方用 Dubbo 的 WebService 协议调用。 -#### 约束 -* 参数及返回值需实现 `Serializable` 接口 -* 参数尽量使用基本类型和 POJO - -## 使用场景 -发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议使用webservice。服务端已经确定使用webservice,客户端不能选择,必须使用webservice。 -## 使用方式 -### 依赖 - -从 Dubbo 3 开始,Webservice 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的[模块](/zh-cn/download/spi-extensions/#dubbo-rpc)。 -```xml - - org.apache.dubbo.extensions - dubbo-rpc-webservice - 1.0.0 - -``` - -```xml - - org.apache.cxf - cxf-rt-frontend-simple - 2.6.1 - - - org.apache.cxf - cxf-rt-transports-http - 2.6.1 - -``` - -### 配置协议 -```xml - -``` - -### 配置默认协议 -```xml - -``` - -### 配置服务协议 -```xml - -``` - -### 多端口 -```xml - - -``` - -### 直连 -```xml - -``` - -### WSDL -``` -http://10.20.153.10:8080/com.foo.HelloWorld?wsdl -``` - -### Jetty Server (默认) - -```xml - -``` - -### Servlet Bridge Server (推荐) -```xml - -``` - -### 配置 DispatcherServlet -```xml - - dubbo - org.apache.dubbo.remoting.http.servlet.DispatcherServlet - 1 - - - dubbo - /* - -``` -{{% alert title="注意" color="primary" %}} - 如果使用 servlet 派发请求: - - 协议的端口 `` 必须与 servlet 容器的端口相同。 - - 协议的上下文路径 `` 必须与 servlet 应用的上下文路径相同。 -{{% /alert %}} diff --git a/content/zh-cn/overview/mannual/nodejs-sdk/_index.md b/content/zh-cn/overview/mannual/nodejs-sdk/_index.md new file mode 100755 index 000000000000..294410b450f9 --- /dev/null +++ b/content/zh-cn/overview/mannual/nodejs-sdk/_index.md @@ -0,0 +1,7 @@ +--- +description: Node.js SDK 使用手册 +linkTitle: Node.js SDK +title: Node.js SDK 手册 +type: docs +weight: 3 +--- diff --git a/content/zh-cn/overview/mannual/nodejs-sdk/quick-start.md b/content/zh-cn/overview/mannual/nodejs-sdk/quick-start.md new file mode 100644 index 000000000000..891d12eee854 --- /dev/null +++ b/content/zh-cn/overview/mannual/nodejs-sdk/quick-start.md @@ -0,0 +1,186 @@ +--- +aliases: + - /zh/docs3-v2/rust-sdk/quick-start/ + - /zh-cn/docs3-v2/rust-sdk/quick-start/ +description: 使用 Node.js 开发后端微服务 +linkTitle: 快速开始 +title: 快速开始 +type: docs +weight: 1 +--- + +基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Node.js SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + +本示例演示了基于 Triple 协议的 RPC 通信模式,示例使用 Protocol Buffer 定义 RPC 服务,并演示了代码生成、服务发布和服务访问等过程。 + +## 前置条件 + +因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 `@bufbuild/protoc-gen-es`、`@bufbuild/protobuf`、`@apachedubbo/protoc-gen-apache-dubbo-es`、`@apachedubbo/dubbo`。 + +```Shell +npm install @bufbuild/protoc-gen-es @bufbuild/protobuf @apachedubbo/protoc-gen-apache-dubbo-es @apachedubbo/dubbo +``` + +## 定义服务 + +现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。 + +创建目录,并生成文件 + +```Shell +mkdir -p proto && touch proto/example.proto +``` + +写入内容 + +```Protobuf +syntax = "proto3"; + +package apache.dubbo.demo.example.v1; + +message SayRequest { + string sentence = 1; +} + +message SayResponse { + string sentence = 1; +} + +service ExampleService { + rpc Say(SayRequest) returns (SayResponse) {} +} +``` + +这个文件声明了一个叫做 `ExampleService` 的服务,为这个服务定义了 `Say` 方法以及它的请求参数 `SayRequest` 和返回值 `SayResponse`。 + +## 生成代码 + +创建 gen 目录,做为生成文件放置的目标目录 + +``` +mkdir -p gen +``` + +运行以下命令,在 gen 目录下生成代码文件 + +```Shell +PATH=$PATH:$(pwd)/node_modules/.bin \ + protoc -I proto \ + --es_out gen \ + --es_opt target=ts \ + --apache-dubbo-es_out gen \ + --apache-dubbo-es_opt target=ts \ + example.proto +``` + +运行命令后,应该可以在目标目录中看到以下生成的文件: + +```Plain Text +├── gen +│ ├── example_dubbo.ts +│ └── example_pb.ts +├── proto +│ └── example.proto +``` + +## 实现服务 + +接下来我们就需要添加业务逻辑了,实现 ExampleService ,并将其注册到 DubboRouter 中。 + +创建 dubbo.ts 文件 + +```typescript +import { DubboRouter } from "@apachedubbo/dubbo"; +import { ExampleService } from "./gen/example_dubbo"; + +export default (router: DubboRouter) => + // registers apache.dubbo.demo.example.v1 + router.service(ExampleService, { + // implements rpc Say + async say(req) { + return { + sentence: `You said: ${req.sentence}`, + }; + }, + }, { serviceGroup: 'dubbo', serviceVersion: '1.0.0' }); +``` + +## 启动 Server + +Dubbo 服务可以嵌入到普通的 Node.js 服务器、Next.js、Express 或 Fastify 中。 +在这里我们将使用 Fastify,所以让我们安装 Fastify 以及我们为 Fastify 准备的插件。 + +```Shell +npm install fastify @apachedubbo/dubbo-fastify +``` + +创建 server.ts 文件,新建一个 Server,把上一步中实现的 `ExampleService` 注册给它。 +接下来就可以直接初始化和启动 Server 了,它将在指定的端口接收请求。 + +```typescript +import { fastify } from "fastify"; +import { fastifyDubboPlugin } from "@apachedubbo/dubbo-fastify"; +import routes from "./dubbo"; + +async function main() { + const server = fastify(); + await server.register(fastifyDubboPlugin, { + routes, + }); + server.get("/", (_, reply) => { + reply.type("text/plain"); + reply.send("Hello World!"); + }); + await server.listen({ host: "localhost", port: 8080 }); + console.log("server is listening at", server.addresses()); +} + +void main(); +``` + +最后,运行代码启动服务 + +```Shell +npx tsx server.ts +``` + +## 访问服务 + +最简单方式是使用 HTTP/1.1 POST 请求访问服务,参数则作以标准 JSON 格式作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例: + +```Shell +curl \ + --header 'Content-Type: application/json' \ + --header 'TRI-Service-Version: 1.0.0' \ + --header 'TRI-Service-group: dubbo' \ + --data '{"sentence": "Hello World"}' \ + http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say +``` + +也可以使用标准的 Dubbo client 请求服务,我们首先需要从生成代码即 dubbo-node 包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起起 RPC 调用了。 + +创建 client.ts 文件。 + +```typescript +import { createPromiseClient } from "@apachedubbo/dubbo"; +import { ExampleService } from "./gen/example_dubbo"; +import { createDubboTransport } from "@apachedubbo/dubbo-node"; + +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", + httpVersion: "1.1", +}); + +async function main() { + const client = createPromiseClient(ExampleService, transport, { serviceVersion: '1.0.0', serviceGroup: 'dubbo' }); + const res = await client.say({ sentence: "Hello World" }); + console.log(res); +} +void main(); +``` + +运行客户端 + +```Shell +npx tsx client.ts +``` \ No newline at end of file diff --git a/content/zh-cn/overview/mannual/rust-sdk/_index.md b/content/zh-cn/overview/mannual/rust-sdk/_index.md index 70c2ad64c8cd..cc146fb0aa73 100755 --- a/content/zh-cn/overview/mannual/rust-sdk/_index.md +++ b/content/zh-cn/overview/mannual/rust-sdk/_index.md @@ -6,5 +6,5 @@ description: Rust SDK 使用手册 linkTitle: Rust SDK title: Rust SDK 手册 type: docs -weight: 4 +weight: 5 --- diff --git a/content/zh-cn/overview/mannual/web-sdk/_index.md b/content/zh-cn/overview/mannual/web-sdk/_index.md new file mode 100755 index 000000000000..0c16b02ac2d5 --- /dev/null +++ b/content/zh-cn/overview/mannual/web-sdk/_index.md @@ -0,0 +1,7 @@ +--- +description: Web SDK 使用手册 +linkTitle: Web SDK +title: Web SDK 手册 +type: docs +weight: 4 +--- diff --git a/content/zh-cn/overview/mannual/web-sdk/quick-start.md b/content/zh-cn/overview/mannual/web-sdk/quick-start.md new file mode 100644 index 000000000000..b3690167fabb --- /dev/null +++ b/content/zh-cn/overview/mannual/web-sdk/quick-start.md @@ -0,0 +1,267 @@ +--- +aliases: + - /zh/docs3-v2/rust-sdk/quick-start/ + - /zh-cn/docs3-v2/rust-sdk/quick-start/ +description: 使用 dubbo-js 开发运行在浏览器页面的微服务。 +linkTitle: Web浏览器访问Dubbo服务 +title: Web 浏览器访问 Dubbo 服务 +type: docs +weight: 1 +--- + +基于 Dubbo3 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。[Dubbo TypeScript SDK](https://github.com/apache/dubbo-js/) 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + +Dubbo-js 已于 9 月份发布支持 Dubbo3 协议的首个 alpha 版本,它的发布将有机会彻底改变微服务前后端的架构与通信模式,让你能直接在浏览器页面或web服务器中访问后端 Dubbo RPC 服务。 + +![dubbo-web.png](/imgs/v3/web/web-1.png) + +# 浏览器 Web 应用示例 + +本示例演示了如何使用 dubbo-js 开发运行在浏览器上的 web 应用程序,web 页面将调用 dubbo node.js 开发的后端服务并生成页面内容。本示例演示基于 IDL 和非 IDL 两种编码模式。 + +![dubbo-web.png](/imgs/v3/web/web-2.png) + +## IDL 模式 + +### 前置条件 + +首先,我们将使用 Vite 来生成我们的前端项目模板,它内置了我们稍后需要的所有功能支持。 + +```shell +npm create vite@latest -- dubbo-web-example --template react-ts +cd dubbo-web-example +npm install +``` + +因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 `@bufbuild/protoc-gen-es`、`@bufbuild/protobuf`、`@apachedubbo/protoc-gen-apache-dubbo-es`、`@apachedubbo/dubbo`。 + +```shell +npm install @bufbuild/protoc-gen-es @bufbuild/protobuf @apachedubbo/protoc-gen-apache-dubbo-es @apachedubbo/dubbo +``` + +### 使用 Proto 定义服务 + +现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。 + +src 下创建 util/proto 目录,并生成文件 + +```shell +mkdir -p src/util/proto && touch src/util/proto/example.proto +``` + +写入内容 + +```protobuf +syntax = "proto3"; + +package apache.dubbo.demo.example.v1; + +message SayRequest { + string sentence = 1; +} + +message SayResponse { + string sentence = 1; +} + +service ExampleService { + rpc Say(SayRequest) returns (SayResponse) {} +} +``` + +这个文件声明了一个叫做 `ExampleService` 的服务,为这个服务定义了 `Say` 方法以及它的请求参数 `SayRequest` 和返回值 `SayResponse`。 + +### 生成代码 + +创建 gen 目录,作为生成文件放置的目标目录 + +```shell +mkdir -p src/util/gen +``` + +运行以下命令,利用 `protoc-gen-es`、`protoc-gen-apache-dubbo-es` 等插件在 gen 目录下生成代码文件 + +```shell +PATH=$PATH:$(pwd)/node_modules/.bin \ + protoc -I src/util/proto \ + --es_out src/util/gen \ + --es_opt target=ts \ + --apache-dubbo-es_out src/util/gen \ + --apache-dubbo-es_opt target=ts \ + example.proto +``` + +运行命令后,应该可以在目标目录中看到以下生成的文件: + +``` +├── src +│ ├── util +│ │ ├── gen +│ │ │ ├── example_dubbo.ts +│ │ │ └── example_pb.ts +│ │ └── proto +│ │ └── example.proto +``` + +### 创建 App + +需要先下载 `@apachedubbo/dubbo-web` + +```shell +npm install @apachedubbo/dubbo-web +``` + +现在我们可以从包中导入服务并设置一个客户端。在 App.tsx 中添加以下内容: + +```typescript +import { useState } from "react"; +import "./App.css"; + +import { createPromiseClient } from "@apachedubbo/dubbo"; +import { createDubboTransport } from "@apachedubbo/dubbo-web"; + +// Import service definition that you want to connect to. +import { ExampleService } from "./util/gen/example_dubbo"; + +// The transport defines what type of endpoint we're hitting. +// In our example we'll be communicating with a Dubbo endpoint. +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", +}); + +// Here we make the client itself, combining the service +// definition with the transport. +const client = createPromiseClient(ExampleService, transport, { serviceGroup: 'dubbo', serviceVersion: '1.0.0' }); + +function App() { + const [inputValue, setInputValue] = useState(""); + const [messages, setMessages] = useState< + { + fromMe: boolean; + message: string; + }[] + >([]); + return ( + <> +
    + {messages.map((msg, index) => ( +
  1. {`${msg.fromMe ? "ME:" : "Dubbo Server:"} ${msg.message}`}
  2. + ))} +
+
{ + e.preventDefault(); + // Clear inputValue since the user has submitted. + setInputValue(""); + // Store the inputValue in the chain of messages and + // mark this message as coming from "me" + setMessages((prev) => [ + ...prev, + { + fromMe: true, + message: inputValue, + }, + ]); + const response = await client.say({ + sentence: inputValue, + }); + setMessages((prev) => [ + ...prev, + { + fromMe: false, + message: response.sentence, + }, + ]); + }} + > + setInputValue(e.target.value)} /> + +
+ + ); +} + +export default App; +``` + +执行以下命令,即可得到样例页面 + +```shell +npm run dev +``` + +### 启动 Server + +接下来我们需要启动 Server,可以使用 Java、Go、Node.js 等 Dubbo 支持的任一语言开发 Server。这里我们采用 Dubbo 服务嵌入的 Node.js 服务器,具体可参考 [Node.js 开发 Dubbo 后端服务](https://github.com/apache/dubbo-js/tree/dubbo3/example/dubbo-node-example) 中的操作步骤。 + +不过需要注意,我们额外需要修改 Node.js 示例:引入 @fastify/cors 来解决前端请求的跨域问题 + +```shell +npm install @fastify/cors +``` + +需要在 server.ts 文件下修改 + +```typescript +... +import cors from "@fastify/cors"; + +... +async function main() { + const server = fastify(); + ... + await server.register(cors, { + origin: true, + }); + ... + await server.listen({ host: "localhost", port: 8080 }); + ... +} + +void main(); +``` + +最后,运行代码启动服务 + +```shell +npx tsx server.ts +``` + +## 无 IDL 模式 + +在接下来的版本中,我们将继续提供无 IDL 模式的通信支持,这样就可以更方便的访问无 IDL 的后端服务。在这里,我们先快速的看一下无 IDL 模式的使用方式。 + +同样需要先安装 `@apachedubbo/dubbo`、`@apachedubbo/dubbo-web` + +```shell +npm install @apachedubbo/dubbo @apachedubbo/dubbo-web +``` + +现在就可以一个启动一个客户端,并发起调用了。App.tsx 中的代码与 IDL 模式基本一致,区别点在于以下内容: + +```typescript +// ... +// set backend server to connect +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", +}); +// init client +const client = createPromiseClient(transport); + +function App() { + // ... + // call remote Dubbo service + const response = await client.call( + "apache.dubbo.demo.example.v1.ExampleService", + "say", + { + sentence: inputValue, + }); +} +``` + +执行以下命令,即可得到样例页面 + +```shell +npm run dev +``` diff --git a/content/zh-cn/overview/quickstart/_index.md b/content/zh-cn/overview/quickstart/_index.md index de26b9216f95..0cbd77c4f74a 100755 --- a/content/zh-cn/overview/quickstart/_index.md +++ b/content/zh-cn/overview/quickstart/_index.md @@ -9,7 +9,7 @@ type: docs weight: 2 --- - +**Dubbo 既能作为轻量 RPC 框架解决组件之间的通信问题,又能为复杂的微服务集群提供完善的服务治理解决方案。** {{< blocks/section color="white" height="auto">}}
@@ -19,35 +19,9 @@ weight: 2

- Java 微服务开发入门 -

-

通过以下教程快速上手 Dubbo Java 开发:

-

1 - 快速部署

-

2 - 基于 dubbo-spring-boot-starter 开发

-
-
-
- -
-
-
-

- Rust 微服务开发入门 + 轻量级 RPC SDK

-

快速开始 Rust 微服务开发。 -

+

演示如何使用 Dubbo 提供的轻量级 SDK 编写 RPC 通信服务与客户端,涵盖 Java、Go、Node.js、Javascript、Rust 等语言

@@ -55,15 +29,16 @@ weight: 2

- Nodejs 微服务开发入门 + 微服务解决方案

-

快速开始 Node.js 微服务开发。 -

+

通过一个完整的微服务示例,演示基于 Dubbo 的微服务开发、部署与治理基本步骤。

- -
- {{< /blocks/section >}} + +下图展示了 Dubbo 的多语言生态:在端上有 dubbo-web 和 dubbo-mobile 以标准的 http+json 格式与后端微服务体系通信;后端实现则涵盖 Java、Go、Node.js、Rust 等语言。基于 Triple 协议打通了端上设备、后端微服务、异构体系如 gRPC 等之间的数据通信。 + + + diff --git a/content/zh-cn/overview/quickstart/go/install.md b/content/zh-cn/overview/quickstart/go/install.md deleted file mode 100644 index 9bc307968d50..000000000000 --- a/content/zh-cn/overview/quickstart/go/install.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/go/install/ -description: 1 - 安装 Dubbo-go 开发环境 -title: 安装 Dubbo-go 开发环境 -type: docs -weight: 1 ---- - - -### 1. 安装Go语言环境 - -> go version >= go 1.15。建议使用最新版 go 1.19 - -[【Go 语言官网下载地址】](https://golang.google.cn/) - -安装成功后将 `$GOPATH/bin` 加入环境变量 - -### 2. 安装序列化工具protoc - -[【protoc 下载地址】](https://github.com/protocolbuffers/protobuf/releases) - -### 3. 安装 dubbogo-cli 以及相关插件 - -执行以下指令安装dubbogo-cli 至 `$GOPATH/bin` - -```bash -$ export GOPROXY="https://goproxy.cn" -$ go install github.com/dubbogo/dubbogo-cli@latest -$ dubbogo-cli -hello -``` - -安装依赖的工具插件 - -```bash -$ dubbogo-cli install all -``` - -确保上述安装的工具位于在系统环境变量内 - -```bash -$ protoc --version -libprotoc 3.14.0 -$ protoc-gen-go --version -protoc-gen-go v1.26.0 -$ protoc-gen-go-triple --version -protoc-gen-go-triple 1.0.8 -``` \ No newline at end of file diff --git a/content/zh-cn/overview/quickstart/go/quickstart_triple.md b/content/zh-cn/overview/quickstart/go/quickstart_triple.md deleted file mode 100644 index 57371295c7c8..000000000000 --- a/content/zh-cn/overview/quickstart/go/quickstart_triple.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/go/quickstart_triple/ -description: 2 - 完成一次 RPC 调用 -title: 完成一次 RPC 调用 -type: docs -weight: 2 ---- - - - - -## 1. 生成 Demo 项目 - -使用安装好的 dubbogo-cli 工具,创建demo工程。 - -```bash -$ mkdir quickstart -$ cd quickstart -$ dubbogo-cli newDemo . -$ tree . -. -├── api -│   ├── samples_api.pb.go -│   ├── samples_api.proto -│   └── samples_api_triple.pb.go -├── go-client -│   ├── cmd -│   │   └── client.go -│   └── conf -│   └── dubbogo.yaml -├── go-server -│   ├── cmd -│   │   └── server.go -│   └── conf -│   └── dubbogo.yaml -└── go.mod -``` - -可看到生成的项目中包含一个 client 项目和一个 server 项目,以及相关的配置文件。 - -### 1.1 查看接口描述文件 helloworld.proto - -```protobuf -syntax = "proto3"; -package api; - -option go_package = "./;api"; - -// The greeting service definition. -service Greeter { - // Sends a greeting - rpc SayHello (HelloRequest) returns (User) {} - // Sends a greeting via stream - rpc SayHelloStream (stream HelloRequest) returns (stream User) {} -} - -// The request message containing the user's name. -message HelloRequest { - string name = 1; -} - -// The response message containing the greetings -message User { - string name = 1; - string id = 2; - int32 age = 3; -} -``` - -demo项目中,默认生成了一个接口描述文件,接口服务名为 api.Greeter, 包含两个 RPC 方法,入参为 HelloRequest,返回值为 User,两个方法分别为普通 RPC 方法和 Streaming 类型 RPC 方法。 - -### 1.2 (*可选) 使用安装好的编译工具编译 pb 接口 - -```bash -$ cd api -$ protoc --go_out=. --go-triple_out=. ./samples_api.proto -``` - -参数意义:`--go_out=.` 使用上述安装的 `protoc-gen-go` 插件,生成文件到当前目录,`--go-triple_out=.`使用上述安装的 `protoc-gen-go-triple` 插件,生成文件到当前目录。 - -执行该指令后,会生成两个文件,分别是helloworld.pb (包含 proto 结构) 和 helloworld_triple.pb.go (包含 triple 协议接口)。 - -在 demo 工程中,预先生成好了这两个文件,修改 .proto 文件后重新执行命令生成,即可覆盖。 - -## 2. 开启一次RPC调用 - -项目根目录执行 - -``` -$ go mod tidy -``` - -拉取到最新的框架依赖: - -```go -module helloworld - -go 1.17 - -require ( - dubbo.apache.org/dubbo-go/v3 v3.0.1 - github.com/dubbogo/grpc-go v1.42.9 - github.com/dubbogo/triple v1.1.8 - google.golang.org/protobuf v1.27.1 -) - -require ( - ... -) - -``` - -先后启动服务端和客户端: 开启两个终端,在 go-server/cmd 和 go-client/cmd 文件夹下分别执行 `go run .` , 可在客户端看到输出: - -```shell -client response result: name:"Hello laurence" id:"12345" age:21 -``` - -获得调用结果成功 - -## 3. 更多 - -细心的读者可以发现,以上例子编写的的服务端可以接受来自客户端的普通RPC、流式RPC调用请求。目前只编写了普通调用的Client,读者可以根据 samples 库中的例子来尝试编写流式客户端和服务端。 \ No newline at end of file diff --git a/content/zh-cn/overview/quickstart/go/quickstart_triple_with_customize.md b/content/zh-cn/overview/quickstart/go/quickstart_triple_with_customize.md deleted file mode 100644 index e0dea332f874..000000000000 --- a/content/zh-cn/overview/quickstart/go/quickstart_triple_with_customize.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/go/quickstart_triple_with_customize/ -description: 3 - 完成一次 RPC 调用自己定义接口的版本 -title: 完成一次自己定义接口的 RPC 调用 -type: docs -weight: 3 ---- - - - -## 1.概述 -我们本章来实现一个简单的小需求,实现一个分布式ID生成服务,通过该服务可以获取分布式ID -(假设的分布式ID,我们不探讨ID的生成方案和算法,这里直接使用uuid代替,只为演示自定义服务的创建) - -## 2. 服务端实现 -首先使用 dubbogo-cli 创建 IDC 服务 -```bash -dubbogo-cli newApp IDC -cd IDC -tree . - -. -├── Makefile -├── api -│   ├── api.pb.go -│   ├── api.proto -│   └── api_triple.pb.go -├── build -│   └── Dockerfile -├── chart -│   ├── app -│   │   ├── Chart.yaml -│   │   ├── templates -│   │   │   ├── _helpers.tpl -│   │   │   ├── deployment.yaml -│   │   │   ├── service.yaml -│   │   │   └── serviceaccount.yaml -│   │   └── values.yaml -│   └── nacos_env -│   ├── Chart.yaml -│   ├── templates -│   │   ├── _helpers.tpl -│   │   ├── deployment.yaml -│   │   └── service.yaml -│   └── values.yaml -├── cmd -│   └── app.go -├── conf -│   └── dubbogo.yaml -├── go.mod -├── go.sum -└── pkg - └── service - └── service.go - -``` - -我们编辑proto定义我们的接口 - -```protobuf -syntax = "proto3"; -package api; - -option go_package = "./;api"; - -service Generator { - rpc GetID (GenReq) returns (GenResp) {} -} - -message GenReq { - string appId = 1; -} - -message GenResp { - string id = 1; -} -``` - -生成代码 - -```bash -$ cd api -$ protoc --go_out=. --go-triple_out=. ./api.proto -``` - -我们来调整service -目录:pkg/service/service.go -修改后的代码如下 - -```go -type GeneratorServerImpl struct { - api.UnimplementedGeneratorServer -} - -func (s *GeneratorServerImpl) GetID(ctx context.Context, in *api.GenReq) (*api.GenResp, error) { - logger.Infof("Dubbo-go GeneratorProvider AppId = %s\n", in.AppId) - uuid, err := uuid.NewV4() - if err != nil { - logger.Infof("Dubbo-go GeneratorProvider get id err = %v\n", err) - return nil, err - } - return &api.GenResp{Id: uuid.String()}, nil -} - -func init() { - config.SetProviderService(&GeneratorServerImpl{}) -} -``` -同时,我们调整conf/dubbogo.yaml中的provider部分, -```yaml -dubbo: - registries: - nacos: - protocol: nacos - address: 127.0.0.1:8848 - protocols: - triple: - name: tri - port: 20000 - provider: - services: - GeneratorServerImpl: - interface: "" # read from stub -``` -我们需要拉起一个依赖的注册中心,nacos,如果你有现成的,本步骤可以忽略,我们使用docker来快速启动一个nacos, - -```bash -git clone https://github.com/nacos-group/nacos-docker.git -cd nacos-docker -docker-compose -f example/standalone-derby.yaml up -``` - -最后,我们启动服务端。 -```go -export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yaml -go run cmd/app.go -``` -打开nacos的控制台,可以看到服务已经注册 -![img](/imgs/docs3-v2/golang-sdk/quickstart/nacos.jpg) - - -## 2. 客户端使用 -首先,我们可以共享我们的服务端的api给客户端,并生成相关的代码(这里可以根据实际项目需要,共享共享proto,每个consumer自行生成代码,或统一生成sdk后给依赖的服务引入) -客户端目录如下: -```bash -. -├── api -│   ├── api.pb.go -│   ├── api.proto -│   └── api_triple.pb.go -├── cmd -│   └── client.go -├── conf -│   └── dubbogo.yml -├── go.mod -├── go.sum - -``` -api目录同服务端的api目录 -client.go 代码如下 -```go - -var grpcGeneratorImpl = new(api.GeneratorClientImpl) - -func main() { - config.SetConsumerService(grpcGeneratorImpl) - if err := config.Load(); err != nil { - panic(err) - } - - logger.Info("start to test dubbo") - req := &api.GenReq{ - AppId: "laurence", - } - reply, err := grpcGeneratorImpl.GetID(context.Background(), req) - if err != nil { - logger.Error(err) - } - logger.Infof("get id result: %v\n", reply.Id) -} - -``` - -dubbogo.yml 如下 -```yaml -dubbo: - registries: - nacos: - protocol: nacos - address: 127.0.0.1:8848 - consumer: - references: - GeneratorClientImpl: - protocol: tri - interface: "" -``` - -运行client,获取id,如下: - -```bash -export DUBBO_GO_CONFIG_PATH=conf/dubbogo.yml -go run cmd/client.go -…… -…… -2022-12-30T20:59:19.971+0800 INFO cmd/client.go:44 start to test dubbo -2022-12-30T20:59:19.982+0800 INFO cmd/client.go:52 get id result: aafd9c73-4014-4d67-a67f-5d107105647b - -``` -## 3. 更多 - -可以发现注册中心我们是使用nacos,当然,我们也可以使用其他的注册中心,更多的使用方式,可以参考[注册中心](/zh-cn/overview/mannual/golang-sdk/tutorial/develop/registry/) diff --git a/content/zh-cn/overview/quickstart/java/_index.md b/content/zh-cn/overview/quickstart/java/_index.md deleted file mode 100755 index 64e5814c6646..000000000000 --- a/content/zh-cn/overview/quickstart/java/_index.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/java/ -description: Java 微服务开发入门 -linkTitle: Java -no_list: true -title: Java 微服务开发入门 -type: docs -weight: 1 ---- - - - -{{< blocks/section color="white" height="auto">}} -
-
-
-
-
-

- 快速部署 -

-

零基础快速部署一个微服务应用

-
-
-
-
-
-
-

- Dubbo x Spring Boot 开发 -

-

使用 dubbo-spring-boot-starter 开发微服务应用

-
-
-
-
-
-
- -{{< /blocks/section >}} diff --git a/content/zh-cn/overview/quickstart/java/brief.md b/content/zh-cn/overview/quickstart/java/brief.md deleted file mode 100644 index bf0098941995..000000000000 --- a/content/zh-cn/overview/quickstart/java/brief.md +++ /dev/null @@ -1,313 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/java/brief/ -description: 本文将基于 Dubbo Samples 示例演示如何快速搭建并部署一个微服务应用。 -linkTitle: 快速部署一个微服务应用 -title: 1 - 零基础快速部署一个微服务应用 -type: docs -weight: 1 ---- - -## 背景 - -![arch-service-discovery](/imgs/architecture.png) - -Dubbo 作为一款微服务框架,最重要的是向用户提供跨进程的 RPC 远程调用能力。如上图所示,Dubbo 的服务消费者(Consumer)通过一系列的工作将请求发送给服务提供者(Provider)。 - -为了实现这样一个目标,Dubbo 引入了注册中心(Registry)组件,通过注册中心,服务消费者可以感知到服务提供者的连接方式,从而将请求发送给正确的服务提供者。 - -## 目标 - -了解微服务调用的方式以及 Dubbo 的能力 - -## 难度 - -低 - -## 环境要求 - -- 系统:Windows、Linux、MacOS - -- JDK 8 及以上(推荐使用 JDK17) - -- Git - -- Docker (可选) - -## 动手实践 - -本章将通过几个简单的命令,一步一步教你如何部署并运行一个最简单的 Dubbo 用例。 - -### 1. 获取测试工程 - -在开始整个教程之前,我们需要先获取测试工程的代码。Dubbo 的所有测试用例代码都存储在 [apache/dubbo-samples](https://github.com/apache/dubbo-samples) 这个仓库中,以下这个命令可以帮你获取 Samples 仓库的所有代码。 - -```bash -git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git -``` - -### 2. 认识 Dubbo Samples 项目结构 - -在将 [apache/dubbo-samples](https://github.com/apache/dubbo-samples) 这个仓库 clone 到本地以后,本小节将就仓库的具体组织方式做说明。 - -``` -. -├── codestyle // 开发使用的 style 配置文件 - -├── 1-basic // 基础的入门用例 -├── 2-advanced // 高级用法 -├── 3-extensions // 扩展使用示例 -├── 4-governance // 服务治理用例 -├── 10-task // Dubbo 学习系列示例 - -├── 99-integration // 集成测试使用 -├── test // 集成测试使用 -└── tools // 三方组件快速启动工具 -``` - -如上表所示,[apache/dubbo-samples](https://github.com/apache/dubbo-samples) 主要由三个部分组成:代码风格文件、测试代码、集成测试。 - -1. 代码风格文件是开发 Dubbo 代码的时候可以使用,其中包括了 IntelliJ IDEA 的配置文件。 - -2. 测试代码即本教材所需要的核心内容。目前包括了 5 个部分的内容:面向初学者的 basic 入门用例、面向开发人员的 advanced 高级用法、面向中间件维护者的 extensions Dubbo 周边扩展使用示例、面向生产的 governance 服务治理用例以及 Dubbo 学习系列。本文将基于 basic 入门用例中最简单的 Dubbo API 使用方式进行讲解。 - -3. 集成测试是 Dubbo 的质量保证体系中重要的一环,Dubbo 的每个版本都会对所有的 samples 进行回归验证,保证 Dubbo 的所有变更都不会影响 samples 的使用。 - -### 3. 启动一个简易的注册中心 - -从这一小节开始,将正式通过三个命令部署一个微服务应用。 - -从 [背景](#背景) 一节中可知,运行起 Dubbo 应用的一个大前提是部署一个注册中心,为了让本教程更易于上手,我们提供了一个基于 Apache Zookeeper 注册中心的简易启动器,如果您需要在生产环境部署注册中心,请参考[生产环境初始化](/)一文部署高可用的注册中心。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper - -Linux / MacOS: -./mvnw clean compile exec:java -pl tools/embedded-zookeeper - -注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。 - -Docker: -docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper -``` - -在执行完上述命令以后,等待一会出现如下图所示的日志即代表注册中心启动完毕,可以继续执行后续任务。 - -![registry](/imgs/docs3-v2/java-sdk/quickstart/2023-01-19-15-55-23-image.png) - -### 4. 启动服务提供者 - -在启动了注册中心之后,下一步是启动一个对外提供服务的服务提供者。在 dubbo-samples 中也提供了对应的示例,可以通过以下命令快速拉起。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api "-Dexec.mainClass=org.apache.dubbo.samples.provider.Application" - -Linux / MacOS: -./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.provider.Application" - -注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。 -``` - -在执行完上述命令以后,等待一会出现如下图所示的日志(`DubboBootstrap awaiting`)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。 - -![provider](/imgs/docs3-v2/java-sdk/quickstart/2023-01-19-15-56-09-image.png) - -```log -[19/01/23 03:55:49:049 CST] org.apache.dubbo.samples.provider.Application.main() INFO bootstrap.DubboBootstrap: [DUBBO] DubboBootstrap awaiting ..., dubbo version: 3.2.0-beta.3, current host: 169.254.44.42 -``` - -### 5. 启动服务消费者 - -最后一步是启动一个服务消费者来调用服务提供者,也即是 RPC 调用的核心,为服务消费者提供调用服务提供者的桥梁。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api "-Dexec.mainClass=org.apache.dubbo.samples.client.Application" - -Linux / MacOS: -./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.Application" -``` - -在执行完上述命令以后,等待一会出现如下图所示的日志(`hi, dubbo`),打印出的数据就是服务提供者处理之后返回的,标志着一次服务调用的成功。 - -![consumer](/imgs/docs3-v2/java-sdk/quickstart/2023-01-19-16-30-14-image.png) - -```log -Receive result ======> hi, dubbo -``` - -## 延伸阅读 - -### 1. 消费端是怎么找到服务端的? - -在本用例中的步骤 3 启动了一个 Zookeeper 的注册中心,服务提供者会向注册中心中写入自己的地址,供服务消费者获取。 - -Dubbo 会在 Zookeeper 的 `/dubbo/interfaceName` 和 `/services/appName` 下写入服务提供者的连接信息。 - -如下所示是 Zookeeper 上的数据示例: - -``` -[zk: localhost:2181(CONNECTED) 5] ls /dubbo/org.apache.dubbo.samples.api.GreetingsService/providers -[dubbo%3A%2F%2F30.221.146.35%3A20880%2Forg.apache.dubbo.samples.api.GreetingsService%3Fanyhost%3Dtrue%26application%3Dfirst-dubbo-provider%26background%3Dfalse%26deprecated%3Dfalse%26dubbo%3D2.0.2%26dynamic%3Dtrue%26environment%3Dproduct%26generic%3Dfalse%26interface%3Dorg.apache.dubbo.samples.api.GreetingsService%26ipv6%3Dfd00%3A1%3A5%3A5200%3A3218%3A774a%3A4f67%3A2341%26methods%3DsayHi%26pid%3D85639%26release%3D3.1.4%26service-name-mapping%3Dtrue%26side%3Dprovider%26timestamp%3D1674960780647] - -[zk: localhost:2181(CONNECTED) 2] ls /services/first-dubbo-provider -[30.221.146.35:20880] -[zk: localhost:2181(CONNECTED) 3] get /services/first-dubbo-provider/30.221.146.35:20880 -{"name":"first-dubbo-provider","id":"30.221.146.35:20880","address":"30.221.146.35","port":20880,"sslPort":null,"payload":{"@class":"org.apache.dubbo.registry.zookeeper.ZookeeperInstance","id":"30.221.146.35:20880","name":"first-dubbo-provider","metadata":{"dubbo.endpoints":"[{\"port\":20880,\"protocol\":\"dubbo\"}]","dubbo.metadata-service.url-params":"{\"connections\":\"1\",\"version\":\"1.0.0\",\"dubbo\":\"2.0.2\",\"release\":\"3.1.4\",\"side\":\"provider\",\"ipv6\":\"fd00:1:5:5200:3218:774a:4f67:2341\",\"port\":\"20880\",\"protocol\":\"dubbo\"}","dubbo.metadata.revision":"871fbc9cb2730caea9b0d858852d5ede","dubbo.metadata.storage-type":"local","ipv6":"fd00:1:5:5200:3218:774a:4f67:2341","timestamp":"1674960780647"}},"registrationTimeUTC":1674960781893,"serviceType":"DYNAMIC","uriSpec":null} -``` - -更多关于 Dubbo 服务发现模型的细节,可以参考[服务发现](/zh-cn/overview/mannual/java-sdk/concepts-and-architecture/service-discovery/)一文。 - -### 2. 消费端是如何发起请求的? - -在 Dubbo 的调用模型中,起到连接服务消费者和服务提供者的桥梁是接口。 - -服务提供者通过对指定接口进行实现,服务消费者通过 Dubbo 去订阅这个接口。服务消费者调用接口的过程中 Dubbo 会将请求封装成网络请求,然后发送到服务提供者进行实际的调用。 - -在本用例中,定义了一个 `GreetingsService` 的接口,这个接口有一个名为 `sayHi` 的方法。 - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.java - -package org.apache.dubbo.samples.api; - -public interface GreetingsService { - - String sayHi(String name); - -} -``` - -服务消费者通过 Dubbo 的 API 可以获取这个 `GreetingsService` 接口的代理,然后就可以按照普通的接口调用方式进行调用。**得益于 Dubbo 的动态代理机制,这一切都像本地调用一样。** - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java - -// 获取订阅到的 Stub -GreetingsService service = reference.get(); -// 像普通的 java 接口一样调用 -String message = service.sayHi("dubbo"); -``` - -### 3. 服务端可以部署多个吗? - -可以,本小节将演示如何启动一个服务端**集群**。 - -1)启动一个注册中心,可以参考动手实践中第 3 小节的[教程](#3-启动一个简易的注册中心) - -2)修改服务提供者返回的数据,让第一个启动的服务提供者返回 `hi, dubbo. I am provider 1.` - -修改 `1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java` 文件的第 25 行如下所示。 - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java - -package org.apache.dubbo.samples.provider; - -import org.apache.dubbo.samples.api.GreetingsService; - -public class GreetingsServiceImpl implements GreetingsService { - @Override - public String sayHi(String name) { - return "hi, " + name + ". I am provider 1."; - } -} -``` - -3)启动第一个服务提供者,可以参考动手实践中第 4 小节的[教程](#4-启动服务提供者) - -4)修改服务提供者返回的数据,让第二个启动的服务提供者返回 `hi, dubbo. I am provider 2.` - -修改 `1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java` 文件的第 25 行如下所示。 - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java - -package org.apache.dubbo.samples.provider; - -import org.apache.dubbo.samples.api.GreetingsService; - -public class GreetingsServiceImpl implements GreetingsService { - @Override - public String sayHi(String name) { - return "hi, " + name + ". I am provider 2."; - } -} -``` - -4)启动第二个服务提供者,可以参考动手实践中第 4 小节的[教程](#4-启动服务提供者) - -5)启动服务消费者,可以参考动手实践中第 5 小节的[教程](#5-启动服务消费者)。多次启动消费者可以看到返回的结果是不一样的。 - -在 dubbo-samples 中也提供了一个会定时发起调用的消费端应用`org.apache.dubbo.samples.client.AlwaysApplication`,可以通过以下命令启动。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-api "-Dexec.mainClass=org.apache.dubbo.samples.client.AlwaysApplication" - -Linux / MacOS: -./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-api -Dexec.mainClass="org.apache.dubbo.samples.client.AlwaysApplication" -``` - -启动后可以看到类似以下的日志,消费端会随机调用到不同的服务提供者,返回的结果也是远端的服务提供者觉得其结果。 - -``` -Sun Jan 29 11:23:37 CST 2023 Receive result ======> hi, dubbo. I am provider 1. -Sun Jan 29 11:23:38 CST 2023 Receive result ======> hi, dubbo. I am provider 2. -Sun Jan 29 11:23:39 CST 2023 Receive result ======> hi, dubbo. I am provider 2. -Sun Jan 29 11:23:40 CST 2023 Receive result ======> hi, dubbo. I am provider 1. -Sun Jan 29 11:23:41 CST 2023 Receive result ======> hi, dubbo. I am provider 1. -``` - -### 4. 这个用例复杂吗? - -不,Dubbo 只需要简单的配置就可以实现稳定、高效的远程调用。 - -以下是一个服务提供者的简单示例,通过定义若干个配置就可以启动。 - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/Application.java - -// 定义所有的服务 -ServiceConfig service = new ServiceConfig<>(); -service.setInterface(GreetingsService.class); -service.setRef(new GreetingsServiceImpl()); - -// 启动 Dubbo -DubboBootstrap.getInstance() - .application("first-dubbo-provider") - .registry(new RegistryConfig(ZOOKEEPER_ADDRESS)) - .protocol(new ProtocolConfig("dubbo", -1)) - .service(service) - .start(); -``` - -以下是一个服务消费者的简单示例,通过定义若干个配置启动后就可以获取到对应的代理对象,之后用户完全不需要感知这个对象背后的复杂实现,**一切只需要和本地调用一样就行了**。 - -```java -// 1-basic/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java - -// 定义所有的订阅 -ReferenceConfig reference = new ReferenceConfig<>(); -reference.setInterface(GreetingsService.class); - -// 启动 Dubbo -DubboBootstrap.getInstance() - .application("first-dubbo-consumer") - .registry(new RegistryConfig(ZOOKEEPER_ADDRESS)) - .reference(reference) - .start(); - -// 获取订阅到的 Stub -GreetingsService service = reference.get(); -// 像普通的 java 接口一样调用 -String message = service.sayHi("dubbo"); -``` - -## 更多 - -本用例介绍了一个 RPC 远程调用的基础流程,通过启动注册中心、服务提供者、服务消费者三个节点来模拟一个微服务的部署架构。 - -下一个教程中,将就服务提供者和服务消费者分别都做了什么配置进行讲解,[从零告诉你如何搭建一个微服务应用](../api/)。 diff --git a/content/zh-cn/overview/quickstart/java/spring-boot.md b/content/zh-cn/overview/quickstart/java/spring-boot.md deleted file mode 100644 index 0531ab567d71..000000000000 --- a/content/zh-cn/overview/quickstart/java/spring-boot.md +++ /dev/null @@ -1,571 +0,0 @@ ---- -aliases: - - /zh/overview/quickstart/java/spring-boot/ -description: 本文将基于 Dubbo Samples 示例演示如何通过 Dubbo x Spring Boot 快速开发微服务应用。 -linkTitle: Dubbo Spring Boot Starter 开发微服务应用 -title: 3 - Dubbo Spring Boot Starter 开发微服务应用 -type: docs -weight: 3 ---- - - - -## 目标 - -从零上手开发基于 Dubbo x Spring Boot 的微服务开发,了解 Dubbo x Spring Boot 配置方式。 - -## 难度 - -低 - -## 环境要求 - -- 系统:Windows、Linux、MacOS - -- JDK 8 及以上(推荐使用 JDK17) - -- Git - -- IntelliJ IDEA(可选) - -- Docker (可选) - -## 项目介绍 - -在本任务中,将分为 3 个子模块进行独立开发,模拟生产环境下的部署架构。 - -``` -. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot -├── dubbo-samples-spring-boot-interface // 共享 API 模块 -├── dubbo-samples-spring-boot-consumer // 消费端模块 -└── dubbo-samples-spring-boot-provider // 服务端模块 -``` - -如上所示,共有 3 个模块,其中 `interface` 模块被 `consumer` 和 `provider` 两个模块共同依赖,存储 RPC 通信使用的 API 接口。 - -``` -. // apache/dubbo-samples/1-basic/dubbo-samples-spring-boot -├── dubbo-samples-spring-boot-interface // 共享 API 模块 -│   ├── pom.xml -│   └── src -│   └── main -│   └── java -│   └── org -│   └── apache -│   └── dubbo -│   └── springboot -│   └── demo -│   └── DemoService.java // API 接口 -├── dubbo-samples-spring-boot-consumer // 消费端模块 -│   ├── pom.xml -│   └── src -│   ├── main -│   │   ├── java -│   │   │   └── org -│   │   │   └── apache -│   │   │   └── dubbo -│   │   │   └── springboot -│   │   │   └── demo -│   │   │   └── consumer -│   │   │   ├── ConsumerApplication.java // 消费端启动类 -│   │   │   └── Task.java // 消费端模拟调用任务 -│   │   └── resources -│   │   └── application.yml // Spring Boot 配置文件 -├── dubbo-samples-spring-boot-provider // 服务端模块 -│   ├── pom.xml -│   └── src -│   └── main -│   ├── java -│   │   └── org -│   │   └── apache -│   │   └── dubbo -│   │   └── springboot -│   │   └── demo -│   │   └── provider -│   │   ├── DemoServiceImpl.java // 服务端实现类 -│   │   └── ProviderApplication.java // 服务端启动类 -│   └── resources -│   └── application.yml // Spring Boot 配置文件 -└── pom.xml -``` - -如上为本教程接下来会使用到的项目的文件结构。 - -## 快速部署(基于 Samples 直接启动) - -本章将通过几个简单的命令,一步一步教你如何部署并运行一个基于 Dubbo x Spring Boot 的用例。 - -注:本章部署的代码细节可以在 [apache/dubbo-samples](https://github.com/apache/dubbo-samples) 这个仓库中 `1-basic/dubbo-samples-spring-boot` 中找到,在下一章中也将展开进行讲解。 - -### 1. 获取测试工程 - -在开始整个教程之前,我们需要先获取测试工程的代码。Dubbo 的所有测试用例代码都存储在 [apache/dubbo-samples](https://github.com/apache/dubbo-samples) 这个仓库中,以下这个命令可以帮你获取 Samples 仓库的所有代码。 - -```bash -git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git -``` - -### 2. 启动一个简易的注册中心 - -对于一个微服务化的应用来说,注册中心是不可或缺的一个组件。只有通过注册中心,消费端才可以成功发现服务端的地址信息,进而进行调用。 - -为了让本教程更易于上手,我们提供了一个基于 Apache Zookeeper 注册中心的简易启动器,如果您需要在生产环境部署注册中心,请参考[生产环境初始化](/)一文部署高可用的注册中心。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper - -Linux / MacOS: -./mvnw clean compile exec:java -pl tools/embedded-zookeeper - -Docker: -docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper -``` - -### 3. 本地打包 API 模块 - -为了成功编译服务端、消费端模块,需要先在本地打包安装 `dubbo-samples-spring-boot-interface` 模块。 - -```bash -./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot -./mvnw clean install -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-interface -``` - -### 4. 启动服务提供者 - -在启动了注册中心之后,下一步是启动一个对外提供服务的服务提供者。在 dubbo-samples 中也提供了对应的示例,可以通过以下命令快速拉起。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication" - -Linux / MacOS: -./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-provider -Dexec.mainClass="org.apache.dubbo.springboot.demo.provider.ProviderApplication" - -注:需要开一个独立的 terminal 运行,命令将会保持一直执行的状态。 -``` - -在执行完上述命令以后,等待一会出现如下所示的日志(`Current Spring Boot Application is await`)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。 - -```log -2023-02-08 17:13:00.357 INFO 80600 --- [lication.main()] o.a.d.c.d.DefaultApplicationDeployer : [DUBBO] Dubbo Application[1.1](dubbo-springboot-demo-provider) is ready., dubbo version: 3.2.0-beta.4, current host: 30.221.128.96 -2023-02-08 17:13:00.369 INFO 80600 --- [lication.main()] o.a.d.s.d.provider.ProviderApplication : Started ProviderApplication in 9.114 seconds (JVM running for 26.522) -2023-02-08 17:13:00.387 INFO 80600 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await... -``` - -### 5. 启动服务消费者 - -最后一步是启动一个服务消费者来调用服务提供者,也即是 RPC 调用的核心,为服务消费者提供调用服务提供者的桥梁。 - -```bash -Windows: -./mvnw.cmd clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication" - -Linux / MacOS: -./mvnw clean compile exec:java -pl 1-basic/dubbo-samples-spring-boot/dubbo-samples-spring-boot-consumer -Dexec.mainClass="org.apache.dubbo.springboot.demo.consumer.ConsumerApplication" -``` - -在执行完上述命令以后,等待一会出现如下所示的日志(`Hello world`),打印出的数据就是服务提供者处理之后返回的,标志着一次服务调用的成功。 - -```log -2023-02-08 17:14:33.045 INFO 80740 --- [lication.main()] o.a.d.s.d.consumer.ConsumerApplication : Started ConsumerApplication in 11.052 seconds (JVM running for 31.62) -Receive result ======> Hello world -2023-02-08 17:14:33.146 INFO 80740 --- [pool-1-thread-1] .b.c.e.AwaitingNonWebApplicationListener : [Dubbo] Current Spring Boot Application is await... -Wed Feb 08 17:14:34 CST 2023 Receive result ======> Hello world -Wed Feb 08 17:14:35 CST 2023 Receive result ======> Hello world -Wed Feb 08 17:14:36 CST 2023 Receive result ======> Hello world -Wed Feb 08 17:14:37 CST 2023 Receive result ======> Hello world -``` - -## 动手实践(从零代码开发版) - -本章将通过手把手的教程一步一步教你如何从零开发一个微服务应用。 - -### 1. 启动注册中心 - -对于一个微服务化的应用来说,注册中心是不可或缺的一个组件。只有通过注册中心,消费端才可以成功发现服务端的地址信息,进而进行调用。 - -为了让本教程更易于上手,我们提供了一个基于 Apache Zookeeper 注册中心的简易启动器,如果您需要在生产环境部署注册中心,请参考[生产环境初始化](/)一文部署高可用的注册中心。 - -```bash -Windows: -git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git -cd dubbo-samples -./mvnw.cmd clean compile exec:java -pl tools/embedded-zookeeper - -Linux / MacOS: -git clone --depth=1 --branch master git@github.com:apache/dubbo-samples.git -cd dubbo-samples -./mvnw clean compile exec:java -pl tools/embedded-zookeeper - -Docker: -docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper -``` - -### 2. 初始化项目 - -从本小节开始,将基于 IntelliJ IDEA 进行工程的搭建以及测试。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-25-27-image.png) - -如上图所示,可以建立一个基础的项目。 - -搭建了基础项目之后,我们还需要创建 `dubbo-spring-boot-demo-interface` 、`dubbo-spring-boot-demo-provider` 和 `dubbo-spring-boot-demo-consumer` 三个子模块。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-27-17-image.png) - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-26-57-image.png) - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-27-45-image.png) - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-28-26-image.png) - -创建了三个子模块之后,需要创建一下几个文件夹: - -1. 在 `dubbo-spring-boot-demo-consumer/src/main/java` 下创建 `org.apache.dubbo.springboot.demo.consumer` package - -2. 在 `dubbo-spring-boot-demo-interface/src/main/java` 下创建 `org.apache.dubbo.springboot.demo` package - -3. 在 `dubbo-spring-boot-demo-provider/src/main/java` 下创建 `org.apache.dubbo.springboot.demo.provider` package - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-32-50-image.png) - -最终的文件夹参考如上图所示。 - -### 3. 添加 Maven 依赖 - -在初始化完项目以后,我们需要先添加 Dubbo 相关的 maven 依赖。 - -对于多模块项目,首先需要在父项目的 `pom.xml` 里面配置依赖信息。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-53-18-image.png) - -编辑 `./pom.xml` 这个文件,添加下列配置。 - -```xml - org.apache.dubbo - dubbo-spring-boot-demo - 1.0-SNAPSHOT - pom - - - dubbo-spring-boot-demo-interface - dubbo-spring-boot-demo-provider - dubbo-spring-boot-demo-consumer - - - - 3.2.0-beta.4 - 2.7.8 - 17 - 17 - UTF-8 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - org.apache.dubbo - dubbo-bom - ${dubbo.version} - pom - import - - - - org.apache.dubbo - dubbo-dependencies-zookeeper-curator5 - ${dubbo.version} - pom - - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - - - -``` - -然后在 `dubbo-spring-boot-consumer` 和 `dubbo-spring-boot-provider` 两个模块 `pom.xml` 中进行具体依赖的配置。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-52-53-image.png) - -编辑 `./dubbo-spring-boot-consumer/pom.xml` 和 `./dubbo-spring-boot-provider/pom.xml` 这两文件,都添加下列配置。 - -```xml - - - org.apache.dubbo - dubbo-spring-boot-demo-interface - ${project.parent.version} - - - - - org.apache.dubbo - dubbo-spring-boot-starter - - - org.apache.dubbo - dubbo-dependencies-zookeeper-curator5 - pom - - - slf4j-reload4j - org.slf4j - - - - - - - org.springframework.boot - spring-boot-starter - - - -``` - -在这份配置中,定义了 dubbo 和 zookeeper(以及对应的连接器 curator)的依赖。 - -添加了上述的配置以后,可以通过 IDEA 的 `Maven - Reload All Maven Projects` 刷新依赖。 - -### 4. 定义服务接口 - -服务接口 Dubbo 中沟通消费端和服务端的桥梁。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-57-29-image.png) - -在 `dubbo-spring-boot-demo-interface` 模块的 `org.apache.dubbo.samples.api` 下建立 `DemoService` 接口,定义如下: - -```java -package org.apache.dubbo.springboot.demo; - -public interface DemoService { - - String sayHello(String name); -} -``` - -在 `GreetingsService` 中,定义了 `sayHi` 这个方法。后续服务端发布的服务,消费端订阅的服务都是围绕着 `GreetingsService` 接口展开的。 - -### 5. 定义服务端的实现 - -定义了服务接口之后,可以在服务端这一侧定义对应的实现,这部分的实现相对于消费端来说是远端的实现,本地没有相关的信息。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-17-59-46-image.png) - -在`dubbo-spring-boot-demo-provider` 模块的 `org.apache.dubbo.samples.provider` 下建立 `DemoServiceImpl` 类,定义如下: - -```java -package org.apache.dubbo.springboot.demo.provider; - -import org.apache.dubbo.config.annotation.DubboService; -import org.apache.dubbo.springboot.demo.DemoService; - -@DubboService -public class DemoServiceImpl implements DemoService { - - @Override - public String sayHello(String name) { - return "Hello " + name; - } -} -``` - -在 `DemoServiceImpl` 中,实现了 `DemoService` 接口,对于 `sayHello` 方法返回 `Hello name`。 - -注:在`DemoServiceImpl` 类中添加了 `@DubboService` 注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务。 - -### 6. 配置服务端 Yaml 配置文件 - -从本步骤开始至第 7 步,将会通过 Spring Boot 的方式配置 Dubbo 的一些基础信息。 - -首先,我们先创建服务端的配置文件。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-00-24-image.png) - -在 `dubbo-spring-boot-demo-provider` 模块的 `resources` 资源文件夹下建立 `application.yml` 文件,定义如下: - -```yaml -dubbo: - application: - name: dubbo-springboot-demo-provider - protocol: - name: dubbo - port: -1 - registry: - address: zookeeper://${zookeeper.address:127.0.0.1}:2181 -``` - -在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。 - -### 7. 配置消费端 YAML 配置文件 - -同样的,我们需要创建消费端的配置文件。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-01-03-image.png) - -在 `dubbo-spring-boot-demo-consumer` 模块的 `resources` 资源文件夹下建立 `application.yml` 文件,定义如下: - -```yaml -dubbo: - application: - name: dubbo-springboot-demo-consumer - protocol: - name: dubbo - port: -1 - registry: - address: zookeeper://${zookeeper.address:127.0.0.1}:2181 -``` - -在这个配置文件中,定义了 Dubbo 的应用名、Dubbo 协议信息、Dubbo 使用的注册中心地址。 - -### 8. 基于 Spring 配置服务端启动类 - -除了配置 Yaml 配置文件之外,我们还需要创建基于 Spring Boot 的启动类。 - -首先,我们先创建服务端的启动类。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-01-38-image.png) - -在 `dubbo-spring-boot-demo-provider` 模块的 `org.apache.dubbo.springboot.demo.provider` 下建立 `Application` 类,定义如下: - -```java -package org.apache.dubbo.springboot.demo.provider; - -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -@EnableDubbo -public class ProviderApplication { - public static void main(String[] args) { - SpringApplication.run(ProviderApplication.class, args); - } -} -``` - -在这个启动类中,配置了一个 `ProviderApplication` 去读取我们前面第 6 步中定义的 `application.yml` 配置文件并启动应用。 - -### 9. 基于 Spring 配置消费端启动类 - -同样的,我们需要创建消费端的启动类。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-02-11-image.png) - -在 `dubbo-spring-boot-demo-consumer` 模块的 `org.apache.dubbo.springboot.demo.consumer` 下建立 `Application` 类,定义如下: - -```java -package org.apache.dubbo.springboot.demo.consumer; - -import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -@EnableDubbo -public class ConsumerApplication { - - public static void main(String[] args) { - SpringApplication.run(ConsumerApplication.class, args); - } -} -``` - -在这个启动类中,配置了一个 `ConsumerApplication` 去读取我们前面第 7 步中定义的 `application.yml` 配置文件并启动应用。 - -### 10. 配置消费端请求任务 - -除了配置消费端的启动类,我们在 Spring Boot 模式下还可以基于 `CommandLineRunner`去创建 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-02-33-image.png) - -在 `dubbo-spring-boot-demo-consumer` 模块的 `org.apache.dubbo.springboot.demo.consumer` 下建立 `Task` 类,定义如下: - -```java -package org.apache.dubbo.springboot.demo.consumer; - -import java.util.Date; - -import org.apache.dubbo.config.annotation.DubboReference; -import org.apache.dubbo.springboot.demo.DemoService; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; - -@Component -public class Task implements CommandLineRunner { - @DubboReference - private DemoService demoService; - - @Override - public void run(String... args) throws Exception { - String result = demoService.sayHello("world"); - System.out.println("Receive result ======> " + result); - - new Thread(()-> { - while (true) { - try { - Thread.sleep(1000); - System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world")); - } catch (InterruptedException e) { - e.printStackTrace(); - Thread.currentThread().interrupt(); - } - } - }).start(); - } -} -``` - -在 `Task` 类中,通过`@DubboReference` 从 Dubbo 获取了一个 RPC 订阅,这个 `demoService` 可以像本地调用一样直接调用。在 `run`方法中创建了一个线程进行调用。 - -### 11. 启动应用 - -截止第 10 步,代码就已经开发完成了,本小节将启动整个项目并进行验证。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-03-59-image.png) - -首先是启动 `org.apache.dubbo.samples.provider.Application` ,等待一会出现如下图所示的日志(`Current Spring Boot Application is await`)即代表服务提供者启动完毕,标志着该服务提供者可以对外提供服务了。 - -```log -[Dubbo] Current Spring Boot Application is await... -``` - -然后是启动`org.apache.dubbo.samples.client.Application` ,等待一会出现如下图所示的日志(`Hello world` )即代表服务消费端启动完毕并调用到服务端成功获取结果。 - -![img](/imgs/docs3-v2/java-sdk/quickstart/2023-02-08-18-05-02-image.png) - -```log -Receive result ======> Hello world -``` - -## 延伸阅读 - -### 1. Dubbo 的 Spring 配置介绍 - -Dubbo 的主要配置入口有 yaml 的配置内容、`@DubboReference` 和`@DubboService` 等,更多的细节可以参考 [Annotation 配置 | Apache Dubbo](/zh-cn/overview/mannual/java-sdk/reference-manual/config/annotation/) 一文。 - -## 更多 - -本教程介绍了如何基于 Dubbo x Spring Boot 开发一个微服务应用。在下一节中,将介绍[另外一种 Dubbo 的配置方式 —— Dubbo x Spring XML](../spring-xml/)。 diff --git a/content/zh-cn/overview/quickstart/go/_index.md b/content/zh-cn/overview/quickstart/microservice/_index.md similarity index 51% rename from content/zh-cn/overview/quickstart/go/_index.md rename to content/zh-cn/overview/quickstart/microservice/_index.md index 1bf518a36b9f..7c29d0f9399e 100755 --- a/content/zh-cn/overview/quickstart/go/_index.md +++ b/content/zh-cn/overview/quickstart/microservice/_index.md @@ -1,16 +1,12 @@ --- -aliases: - - /zh/overview/quickstart/go/ -description: Go 微服务开发入门 -linkTitle: Go +description: "" +linkTitle: 微服务 no_list: true -title: Go 微服务开发入门 +title: 快速体验如何基于 Dubbo 构建微服务体系解决方案 type: docs -weight: 2 +weight: 1 --- - - {{< blocks/section color="white" height="auto">}}
@@ -29,9 +25,9 @@ weight: 2

- 完成一次 RPC 调用 + Dubbo 应用的打包与部署

-

快速上手启动一个基于 Dubbo-go 的微服务应用

+

演示如何部署将 Dubbo 微服务应用打包为镜像,之后部署到 Kubernetes 集群

@@ -39,14 +35,15 @@ weight: 2

- 完成一次自己定义接口的 RPC 调用 + 尝试治理 Dubbo 微服务集群

-

从零上手开发一个基于 Dubbo-go 的微服务应用

+

部署一个经典的商城系统,并演示如何使用 Dubbo 的流量治理规则管控商城系统流量,包括灰度发布、金丝雀发布、按比例流量转发等。

-
{{< /blocks/section >}} + + diff --git a/content/zh-cn/overview/quickstart/microservice/deploy.md b/content/zh-cn/overview/quickstart/microservice/deploy.md new file mode 100644 index 000000000000..2f20bc58dfbb --- /dev/null +++ b/content/zh-cn/overview/quickstart/microservice/deploy.md @@ -0,0 +1,168 @@ +--- +aliases: + - /zh/overview/quickstart/java/brief/ +description: 演示如何部署 Dubbo 微服务应用到 Kubernetes 集群 +linkTitle: 应用打包与部署 +title: 部署 Dubbo 微服务应用到 Kubernetes 集群 +type: docs +weight: 2 +--- + +在本示例中,我们会将 [上一步开发的 Dubbo 微服务应用](../develop) 以容器镜像模式部署到 Kubernetes 集群,并使用 dubboctl 简化整个部署过程。 + +## 前置条件 +dubbo 提供了相应的工具和解决方案来简化整个 Kubernetes 环境的打包与部署过程,所以开始前我们需要先安装相关工具。 + +1. 安装 dubboctl(如尚未安装) + ```sh + curl -L https://dubbo.apache.org/downloadKube.sh | sh - + + cd dubbo-kube-$version + export PATH=$PWD/bin:$PATH + ``` + +2. dubboctl 安装完成之后,接下来通过以下命令初始化微服务开发环境。 + + ```sh + dubboctl manifest install --profile=demo + ``` + + 作为示例用途,以上命令会一键安装 Zookeeper、Console、Prometheus、Grafana、Zipkin、Ingress 等组件,关于 `--profile=demo` 更多解释及可选值请参见文档说明。 + +3. 检查环境准备就绪 + + ```sh + kubectl get services -n dubbo-system + ``` + +## 部署应用 +接下来我们为之前创建的应用打包镜像,在应用根目录分别运行以下命令: + +```shell +dubboctl build +``` + +`build` 命令会将源码打包为镜像,并推送到远端仓库,取决于网络情况,可能需要一定时间等待命令执行完成。 + +```shell +dubboctl deploy +``` + +`deploy` 命令会使用刚刚 `build` 打包的镜像生成 Kubernetes 资源清单。命令执行成功后,在当前目录看到生成的 `kube.yaml` 文件,其中包括 deployment、service 等 kubernetes 资源定义。 + + +{{% alert title="注意" color="warning" %}} +本地构建可能会花费比较长时间,如您本地构建遇到问题,也可以使用以下命令跳过 `build` 过程。 + +```sh +dubboctl deploy --image=docker.io/apache/dubbo-java-quickstart:latest +# `--image` 指定使用官方预先准备好的示例镜像 +``` +{{% /alert %}} + +接下来,将应用部署到 Kubernetes 环境。 + +```shell +kubectl apply -f ./kube.yaml +``` + +检查部署状态 +```shell +kubectl get services +``` + +## 访问应用 +部署成功后,可以通过以下方式检查应用状态。 + +{{< tabpane text=true >}} +{{< tab header="请根据情况选择:" disabled=true />}} +{{% tab header="本地 Kubernetes 集群" lang="en" %}} +
+ +1. 如果使用的本地 Kubernetes 集群,请使用以下方式访问应用验证部署状态: + + ```shell + dubboctl dashboard admin + ``` + +2. 以上命令会自动打开 admin 控制台,如果在您的环境下没有打开,请使用浏览器访问以下地址: + + http://localhost:38080/admin + +3. 通过 triple 协议,可以继续测试 Dubbo 服务,执行以下命令进行端口映射: + + ```shell + kubectl port-forward 50051:50051 + ``` + +4. 通过 curl 访问服务: + + ```shell + curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/com.example.demo.dubbo.api.DemoService/sayHello/ + ``` + +{{% /tab %}} + +{{% tab header="阿里云ACK" lang="zh-cn" %}} +
+ +对于云上托管的哦 Kubernetes 集群,可以使用以下方式验证,这里以阿里云 ACK 集群为例: + +ACK ingerss-controller 的访问方式...... + +{{% /tab %}} +{{< /tabpane >}} + +## 更多内容 +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ 如何在虚拟机环境部署 Dubbo 应用 +

+

如果您当前无法使用 Kubernetes,请参考如何在虚拟机环境部署 Dubbo 应用。

+
+
+
+
+
+
+

+ Dubbo + Istio 服务网格 +

+

如果您计划使用服务网格,可以了解如何让 Dubbo 应用配合 Istio 控制面部署。

+
+
+
+
+
+ +
+
+ +
+
+
+ +{{< /blocks/section >}} diff --git a/content/zh-cn/overview/quickstart/microservice/develop.md b/content/zh-cn/overview/quickstart/microservice/develop.md new file mode 100644 index 000000000000..7d526e85b49f --- /dev/null +++ b/content/zh-cn/overview/quickstart/microservice/develop.md @@ -0,0 +1,117 @@ +--- +aliases: + - /zh/overview/quickstart/java/brief/ +description: 演示如何快速开发一个 Dubbo 微服务应用 +linkTitle: 快速创建一个应用 +title: 演示如何快速开发一个 Dubbo 微服务应用 +type: docs +weight: 1 +--- + +以下文档将引导您从头创建一个基于 Spring Boot 的 Dubbo 应用,应用将开启 Triple 通信协议、服务发现等微服务基础能力。 + +## 快速创建应用 +Dubbo 提供了 `dubboctl cli` 和`在线 web 服务`两种方式帮助开发者快速初始化项目,可以根据需要选择其中一种方式。 +* `dubboctl` 可以生成任意语言的项目模板,如 Java、Go、Node.js、Web 等; +* 在线 web 服务的访问地址是:start.dubbo.apache.org,它是针对 Java 语言定制的,和 Spring Initializr 效果一致。 + +### 方式一:dubboctl +首先,确保本地已安装 [dubboctl](),如未安装可运行以下命令完成安装: + +```sh +curl -L https://dubbo.apache.org/downloadKube.sh | sh - + +cd dubbo-kube-$version +export PATH=$PWD/bin:$PATH +``` + +在任意目录,运行以下命令即可基于预置模板生成新项目: + +```shell +dubboctl create -l java dubbo-demo +``` + +进入 `dubbo-demo` 目录,可看到如下项目结构: + +```shell + +``` + +### 方式二:start.dubbo.apache.org 在线服务 +如果您是 Java 开发者,我们更推荐使用 `start.dubbo.apache.org` 在线服务创建面向生产环境的复杂项目,这里有更多的组件供您选择。 + +请打开 start.dubbo.apache.org(支持浏览器页面和 IntelliJ IDEA 插件),参照以下视频步骤可在一分钟之内快速创建一个 Dubbo 应用。 + +
+
+ +
+
+ +下载生成的示例应用并解压,可看到以下项目结构: + + +## 定制开发与本地调试 + +{{% alert title="注意" color="primary" %}} +如果你想快速体验如何部署 Dubbo 应用,完全可以跳过接下来的代码定制和本地启动环节,直接 [进入下一小节学习如何部署应用](../deploy)。 +{{% /alert %}} + +将应用导入您喜爱的 IDE 工具,接下来就可以对您的微服务应用进行定制化开发了,更多开发及 SDK 使用方式请参考 [Dubbo Java 用户手册](/zh-cn/overview/mannual/java-sdk/quick-start/)。在 IDE 开发环境中,通过以下入口类可以快速启动 Dubbo 应用。 + +{{% alert title="注意" color="warning" %}} +由于配置文件中启用了注册中心,为了能够成功启动应用,您需要首先在本地启动 NacosZookeeper 注册中心 server。 +{{% /alert %}} + +![SpringApplication Run](/imgs/v3/quickstart/application-run.png) + + +我们在本地成功使用 Triple 协议发布了服务,在应用启动成功后,可直接使用 cURL 测试服务是否已经正常运行: + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/com.example.demo.dubbo.api.DemoService/sayHello/ +``` + +## 更多内容 +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ 部署示例应用到 Kubernetes 集群 +

+

演示如何将当前应用打包为 Docker 镜像,并部署到 Kubernetes 集群。

+
+
+
+
+
+
+

+ 示例源码解读 & 定制开发 +

+

关于示例应用的源码讲解,学习如何定制 Dubbo Spring Boot 应用。

+
+
+
+
+
+
+

+ 使用 dubboctl 创建多语言应用 +

+

如何使用 dubboctl 快速创建 go、node.js、web、rust 等多语言应用。

+
+
+
+
+
+
+ +{{< /blocks/section >}} diff --git a/content/zh-cn/overview/quickstart/microservice/manage.md b/content/zh-cn/overview/quickstart/microservice/manage.md new file mode 100644 index 000000000000..aa5bb081ca17 --- /dev/null +++ b/content/zh-cn/overview/quickstart/microservice/manage.md @@ -0,0 +1,176 @@ +--- +aliases: + - /zh/overview/quickstart/java/brief/ +description: 本文会部署一个经典的商城系统,并演示如何使用 Dubbo 的流量治理规则管控商城系统流量,包括灰度发布、金丝雀发布、按比例流量转发等。 +linkTitle: 尝试治理Dubbo微服务 +title: 通过一个商场示例了解流量治理规则 +type: docs +weight: 3 +--- + +在前面两篇文档中,我们介绍了一个 Dubbo 应用的完整开发与部署过程。接下来,我们会通过一个更复杂、更完整的微服务商城系统,演示 Dubbo 的服务治理相关能力。 + +示例商城系统的总体架构图如下所示: + +![shop 应用总体架构图](/imgs/v3/traffic/shop-arc.png) + +## 部署示例应用 + +首先要为目标 kubernetes namespace 开启自动注入模式,以便应用部署后能够自动连接到注册中心等组件。 + +```shell +kubectl label namespace dubbo-demo dubbo-injection=enabled --overwrite +``` + +接下来,使用以下命令部署整个商城系统,所有应用会自动连接到之前安装的注册中心进行地址发现: + +```shell +kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/10-task/dubbo-samples-shop/deploy/App.yml +``` + +运行以下命令查看示例应用是否部署成功: + +```shell +kubectl get deployments -n dubbo-demo +``` + +{{% alert title="注意" color="warning" %}} +使用以上部署方式,请确保已经使用 `dubboctl manifest install` 提前安装注册中心等组件,如果您还没有在 Kubernetes 集群中安装相关组件,请 [按照上一步指令完成安装](../deploy#前置条件)。 + +为了方便,我们在示例脚本中提供了包含 nacos 等组件的安装资源,您也可以运行以下命令快速部署示例应用及相关依赖组件: + +```shell +kubectl apply -f https://raw.githubusercontent.com/apache/dubbo-samples/master/10-task/dubbo-samples-shop/deploy/All.yml +``` +{{% /alert %}} + +## 查看商城系统运行状态 + +应用启动成功后,可以通过 admin 控制台查看部署状态,根据你使用的 Kubernetes 集群,请按照以下步骤操作: + +{{< tabpane text=true >}} +{{< tab header="根据部署集群选择:" disabled=true />}} +{{% tab header="本地集群" lang="en" %}} +1. 如果使用的本地 Kubernetes 集群,请使用以下方式访问应用验证部署状态,执行以下命令: + + ```shell + dubboctl dashboard admin + ``` + +2. 以上命令会自动打开 admin 控制台,如果在您的环境下没有打开,请使用浏览器访问以下地址: + + http://localhost:38080/admin + +3. Admin 控制台显示的服务注册情况界面如下: + + ![Admin 服务列表截图]() + +4. 通过`监控统计`菜单, 可以查看集群的调用情况: + + ![Admin 内嵌 Grafana 截图]() + +{{% /tab %}} + +{{% tab header="阿里云ACK" lang="zh-cn" %}} +对于云上托管的哦 Kubernetes 集群,可以使用以下方式验证,这里以阿里云 ACK 集群为例: + +ACK ingerss-controller 的访问方式...... + +Admin 控制台显示的服务注册情况界面如下: + +![Admin 服务列表截图]() + +通过`监控统计`菜单, 可以查看集群的调用情况: + +![Admin 内嵌 Grafana 截图]() + +{{% /tab %}} +{{< /tabpane >}} + + +## 完成流量管控任务 + +我们围绕商城系统由 5 个微服务应用组成: +* `Frontend 商城主页`,作为与用户交互的 web 界面,通过调用 `User`、`Detail`、`Order` 等提供用户登录、商品展示和订单管理等服务。 +* `User 用户服务`,负责用户数据管理、身份校验等。 +* `Order 订单服务`,提供订订单创建、订单查询等服务,依赖 `Detail` 服务校验商品库存等信息。 +* `Detail 商品详情服务`,展示商品详情信息,调用 `Comment` 服务展示用户对商品的评论记录。 +* `Comment 评论服务`,管理用户对商品的评论数据。 + +在此基础之上,我们设计了一系列的流量治理任务,多个应用部署有 v1、v2 两个不同的版本,我们会演示通过规则引导流量到不同的版本。完整的部署架构图如下: + +![shop-arc](/imgs/v3/traffic/shop-arc-deploy2.png) + +`Order 订单服务`有两个版本 `v1` 和 `v2`,`v2` 是订单服务优化后发布的新版本。 +* 版本 v1 只是简单的创建订单,不展示订单详情 +* 版本 v2 在订单创建成功后会展示订单的收货地址详情 + +`Detail` 和 `Comment` 服务也分别有两个版本 `v1` 和 `v2`,我们通过多个版本来演示流量导流后的效果。 +* 版本 `v1` 默认为所有请求提供服务 +* 版本 `v2` 模拟被部署在特定的区域的服务,因此 `v2` 实例会带有特定的标签 + +**接下来,就请根跟随 [示例任务](/zh-cn/overview/tasks/traffic-management/) 体验 Dubbo 的流量治理能力吧。** + +## 更多内容 + +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ 更好的观测集群状态 +

+

可观测接入、metrics、tracing 等

+
+
+
+
+
+
+

+ 分布式事务 +

+

分布式事务

+
+
+
+
+
+
+

+ 网关 +

+

网关

+
+
+
+
+
+
+

+ 安全 +

+

安全。

+
+
+
+
+
+
+

+ 接入 Istio 服务网格 +

+

服务网格治理能力接入

+
+
+
+
+
+
+ +{{< /blocks/section >}} + + diff --git a/content/zh-cn/overview/quickstart/nodejs/_index.md b/content/zh-cn/overview/quickstart/nodejs/_index.md deleted file mode 100755 index 2ae8a3da79f0..000000000000 --- a/content/zh-cn/overview/quickstart/nodejs/_index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -_build: - render: link -description: Node.js 微服务开发入门 -icon: fas fa-external-link-alt -linkTitle: Node.js -manualLink: https://github.com/apache/dubbo-js -manualLinkTarget: _blank -title: Node.js 微服务开发入门 -type: docs -weight: 40 ---- diff --git a/content/zh-cn/overview/quickstart/rpc/_index.md b/content/zh-cn/overview/quickstart/rpc/_index.md new file mode 100755 index 000000000000..467d8221c893 --- /dev/null +++ b/content/zh-cn/overview/quickstart/rpc/_index.md @@ -0,0 +1,74 @@ +--- +description: "Dubbo 是一款轻量的 RPC 框架,提供 Java、Go、Node.js、Javascript 等语言支持,帮助开发者构建浏览器、gRPC 兼容的 HTTP API。" +linkTitle: RPC +no_list: true +title: Dubbo 作为轻量 RPC 框架解决组件通信问题 +type: docs +weight: 1 +--- + + 基于 Dubbo3 定义的 Triple 协议,你可以轻松编写浏览器、移动端、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Node.js SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + + 当前提供完整 Triple 协议通信的多语言 SDK 如下: + + + +{{< blocks/section color="white" height="auto">}} +
+
+
+
+
+

+ Java RPC +

+

使用轻量的 Java SDK 开发 RPC Server 和 Client。

+
+
+
+
+
+
+

+ Go RPC +

+

使用轻量的 Go SDK 开发 RPC Server 和 Client。

+
+
+
+
+
+
+

+ Node.js RPC +

+

使用轻量的 Node.js SDK 开发 RPC Server 和 Client。

+
+
+
+
+
+
+

+ Web +

+

基于 Dubbo Javascript 客户端,开发在浏览器中访问后端服务的 Web 页面。

+
+
+
+
+
+
+

+ Rust RPC +

+

使用轻量的 Rust SDK 开发 RPC Server 和 Client。

+
+
+
+
+
+
+ +{{< /blocks/section >}} diff --git a/content/zh-cn/overview/quickstart/rpc/go.md b/content/zh-cn/overview/quickstart/rpc/go.md new file mode 100644 index 000000000000..be4212694ec4 --- /dev/null +++ b/content/zh-cn/overview/quickstart/rpc/go.md @@ -0,0 +1,131 @@ +--- +description: 使用轻量的 Go SDK 开发 RPC Server 和 Client +linkTitle: Go +title: 使用轻量的 Go SDK 开发 RPC Server 和 Client +type: docs +weight: 2 +--- + +基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Go SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + +本示例演示了基于 Triple 协议的 RPC 通信模式,示例使用 Protocol Buffer 定义 RPC 服务,并演示了代码生成、服务发布和服务访问等过程。本示例完整代码请参见 dubbo-go-samples。 + +## 前置条件 + +因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 `buf`、`protoc-gen-go`、`protoc-gen-triple-go`。 + +```shell +go install github.com/bufbuild/buf/cmd/buf@latest +go install google.golang.org/protobuf/cmd/protoc-gen-go@latest +go install github.com/bufbuild/connect-go/cmd/protoc-gen-triple-go@latest +``` + +## 定义服务 + +现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。 + +```protobuf +syntax = "proto3"; + +package greet.v1; + +option go_package = "example/gen/greet/v1;greetv1"; + +message GreetRequest { + string name = 1; +} + +message GreetResponse { + string greeting = 1; +} + +service GreetService { + rpc Greet(GreetRequest) returns (GreetResponse) {} +} +``` + +这个文件声明了一个叫做 `GreetService` 的服务,为这个服务定义了 Greet 方法以及它的请求参数 GreetRequest 和返回值 GreetResponse。 + +## 生成代码 + +接下来,我们就使用 `protoc-gen-go`、`protoc-gen-triple-go`生成相关的代码 + +```bash +$ buf lint +$ buf generate +``` + +运行以上命令后,你应该可以在目标目录中看到以下生成的文件: + +``` +gen +└── greet + └── v1 + ├── greet.pb.go + └── greetv1triple + └── greet.triple.go +``` + +在 gen/greet/v1 包下有两部分内容: + +- `greet.pb.go` 是由谷歌标准的 `protoc-gen-go`生成,它包含 `GreetRequest`、`GreetResponse` 结构体和响应的编解码规则。 +- `gen/greet/v1/greetv1triple` 包下的文件`reet.triple.go`是由 Dubbo 自定义的插件`protoc-gen-triple-go`成,其中关键的信息包括生成的接口 `GreeterClient`、构造器等。 + +## 实现服务 + +接下来我们就需要添加业务逻辑了,实现 `greetv1triple.GreeterClient` 接口即可。 + +```go +type GreeterServer struct { + greet.UnimplementedGreeterServer +} + +func (s *GreeterServer) SayHello(ctx context.Context, in *greet.HelloRequest) (*greet.User, error) { + return &greet.User{Name: "Hello " + in.Name, Id: "12345", Age: 21}, nil +} +``` + +## 启动 Server + +创建一个新的 Server,把我们上一步中实现的 `GreeterServer`注册给它,接下来就可以直接初始化和启动 Server 了,它将在指定的端口接收请求。 + +```go + +func main() { + s := config.NewServer() + + s.RegisterService(&GreeterServer{})//config.SetProviderService(s, &GreeterProvider{}) + s.Init(config.WithXxxOption())//config.Load() + + s.Serve() + // s.Serve(net.Listen("tcp", ":50051")) +} +``` + +## 访问服务 + +最简单方式是使用 HTTP/1.1 POST 请求访问服务,参数则作以[标准 JSON 格式](aa)作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例: +```shell +curl \ + --header "Content-Type: application/json" \ + --data '{"name": "Dubbo"}' \ + http://localhost:50051/org.apache.dubbo.demo.DemoService/sayHello +``` + +也可以使用标准的 Dubbo client 请求服务,我们首先需要从生成代码即`greetv1triple`包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起 RPC 调用了。 + +```go +func main() { + c := greetv1triple.NewGreeterClient() + // Init 完成 config.Load(), config.SetConsumerService(grpcGreeterImpl) + c.init(config.withAddressOption(), config.withTimeoutOption()) + c.SayHello(ctx, request) +} +``` +恭喜您, 以上即是 Dubbo Go RPC 通信的基本使用方式! 🎉 + +## 更多内容 +- 请查看 [Dubbo Go 开发文档](/zh-cn/overview/mannual/go-sdk) 了解更多使用方式。 + + + diff --git a/content/zh-cn/overview/quickstart/rpc/java.md b/content/zh-cn/overview/quickstart/rpc/java.md new file mode 100644 index 000000000000..6fdd3ebc46b0 --- /dev/null +++ b/content/zh-cn/overview/quickstart/rpc/java.md @@ -0,0 +1,115 @@ +--- +description: 使用轻量的 Java SDK 开发 RPC Server 和 Client +linkTitle: Java +title: 使用轻量的 Java SDK 开发 RPC Server 和 Client +type: docs +weight: 1 +--- + +基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Java SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + +本示例演示了基于 Triple 协议的 RPC 通信模式,示例使用 Java Interface 方式定义、发布和访问 RPC 服务。本示例完整代码请参见 dubbo-samples。 + +## Maven 依赖 + +在基于 Dubbo RPC 编码之前,您只需要在项目添加一个非常轻量的 `dubbo`依赖包即可,以 Maven 为例: +```xml + + org.apache.dubbo + dubbo + 3.3.0-beta.1 + + + + +``` + +## 定义服务 + +定义一个名为 `DemoService`的标准 Java 接口作为 Dubbo 服务(Dubbo 还支持[基于 IDL 的服务定义模式](/zh-cn/overview/mannual/java-sdk/quick-start/idl/))。 + +```java +public interface DemoService { + String sayHello(String name); +} +``` + +实现 `DemoService` 接口并编写业务逻辑代码。 + +```java +public class DemoServiceImpl implements DemoService { + @Override + public String sayHello(String name) { + return "Hello " + name + ", response from provider."; + } +} +``` + +## 注册服务并启动 Server + +启动 server 并在指定端口监听 RPC 请求,在此之前,我们向 server 注册了以下信息: + +- 使用 `Triple` 作为通信 RPC 协议与并监听端口 `50051` +- 注册 Dubbo 服务到 `DemoService` server + +```java +public class Application { + public static void main(String[] args) { + DubboBootstrap.getInstance() + .protocol(new ProtocolConfig(CommonConstants.TRIPLE, 50051)) + .service(ServiceBuilder.newBuilder().ref(new DemoServiceImpl()).build()) + .start() + .await(); + } +} +``` + +## 访问服务 + +最简单方式是使用 HTTP/1.1 POST 请求访问服务,参数则以标准 JSON 格式作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例: + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/org.apache.dubbo.demo.DemoService/sayHello +``` + +> 参数必须以数组格式进行传递,如果有多个参数,则格式类似 `["param1", {"param2-field": "param2-value"}, ...]`,具体请参见 triple 协议规范。 + +接下来,您也可以使用标准的 Dubbo client 请求服务,指定 server 地址即可发起 RPC 调用,其格式为 `protocol://ip:host` + +```java +public class Application { + public static void main(String[] args) { + DemoService demoService = + ReferenceBuilder.newBuilder() + .interfaceClass(DemoService.class) + .url("tri://localhost:50051") + .build() + .get(); + + String message = demoService.sayHello("dubbo"); + System.out.println(message); + } +} +``` + +恭喜您, 以上即是 Dubbo Java RPC 通信的基本使用方式! 🎉 + +## 更多内容 + +- Triple 协议完全兼容 gRPC,您可以参考这里了解如何 [使用 IDL 编写 gRPC 兼容的服务](/zh-cn/overview/mannual/java-sdk/quick-start/idl/) +- 查看 [更多 API 使用示例](/zh-cn/overview/mannual/java-sdk/quick-start/idl/) +- 您可以继续使用 API 为应用添加更多微服务治理能力,但我们更推进您使用 [Dubbo Spring Boot 开发微服务应用](../../microservice/develop/) + + + + + diff --git a/content/zh-cn/overview/quickstart/rpc/nodejs.md b/content/zh-cn/overview/quickstart/rpc/nodejs.md new file mode 100644 index 000000000000..4e7ee0d02999 --- /dev/null +++ b/content/zh-cn/overview/quickstart/rpc/nodejs.md @@ -0,0 +1,186 @@ +--- +alias: + - /zh-cn/overview/quickstart/nodejs/ +description: 使用轻量 Node.js SDK 开发 RPC Server 和 Client +linkTitle: Node.js +title: 使用轻量 Node.js SDK 开发 RPC Server 和 Client +type: docs +weight: 3 +--- + +基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo Node.js SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 API 来发布或调用这些服务。 + +本示例演示了基于 Triple 协议的 RPC 通信模式,示例使用 Protocol Buffer 定义 RPC 服务,并演示了代码生成、服务发布和服务访问等过程。完整源码示例请参见 dubbo-js/node-example 。 + +## 前置条件 + +因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 `@bufbuild/protoc-gen-es`、`@bufbuild/protobuf`、`protoc-gen-apache-dubbo-es`、`apache-dubbo`。 + +```shell +npm install @bufbuild/protoc-gen-es @bufbuild/protobuf protoc-gen-apache-dubbo-es apache-dubbo +``` + +## 定义服务 + +现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。 + +创建目录,并生成文件 + +```Shell +mkdir -p proto && touch proto/example.proto +``` + +写入内容 + +```Protobuf +syntax = "proto3"; + +package apache.dubbo.demo.example.v1; + +message SayRequest { + string sentence = 1; +} + +message SayResponse { + string sentence = 1; +} + +service ExampleService { + rpc Say(SayRequest) returns (SayResponse) {} +} +``` + +这个文件声明了一个叫做 `ExampleService` 的服务,为这个服务定义了 `Say` 方法以及它的请求参数 `SayRequest` 和返回值 `SayResponse`。 + +## 生成代码 + +创建 gen 目录,做为生成文件放置的目标目录 + +``` +mkdir -p gen +``` + +运行以下命令,在 gen 目录下生成代码文件 + +``` +PATH=$PATH:$(pwd)/node_modules/.bin \ + protoc -I proto \ + --es_out gen \ + --es_opt target=ts \ + --dubbo-es_out gen \ + --dubbo-es_opt target=ts \ + example.proto +``` + +运行命令后,应该可以在目标目录中看到以下生成的文件: + +```Plain Text +├── gen +│ ├── example_dubbo.ts +│ └── example_pb.ts +├── proto +│ └── example.proto +``` + +## 实现服务 + +接下来我们就需要添加业务逻辑了,实现 ExampleService ,并将其注册到 DubboRouter 中。 + +创建 service.ts 文件 + +```typescript +import { DubboRouter } from "apache-dubbo"; +import { ExampleService } from "./gen/example_dubbo"; + +export default (router: DubboRouter) => + // registers apache.dubbo.demo.example.v1 + router.service(ExampleService, { + // implements rpc Say + async say(req) { + return { + sentence: `You said: ${req.sentence}`, + }; + }, + }); +``` + +## 启动 Server + +Dubbo 服务可以嵌入到普通的 Node.js 服务器、Next.js、Express 或 Fastify 中。 +在这里我们将使用 Fastify,所以让我们安装 Fastify 以及我们为 Fastify 准备的插件。 + +```Shell +npm install fastify apache-dubbo-fastify +``` + +创建 server.ts 文件,新建一个 Server,把上一步中实现的 `ExampleService` 注册给它。 +接下来就可以直接初始化和启动 Server 了,它将在指定的端口接收请求。 + +```typescript +import { fastify } from "fastify"; +import { fastifyDubboPlugin } from "apache-dubbo-fastify"; +import routes from "./connect"; + +async function main() { + const server = fastify(); + await server.register(fastifyDubboPlugin, { + routes, + }); + server.get("/", (_, reply) => { + reply.type("text/plain"); + reply.send("Hello World!"); + }); + await server.listen({ host: "localhost", port: 8080 }); + console.log("server is listening at", server.addresses()); +} + +void main(); +``` + +最后,运行代码启动服务 + +```Shell +npx tsx server.ts +``` + +## 访问服务 + +最简单方式是使用 HTTP/1.1 POST 请求访问服务,参数则作以标准 JSON 格式作为 HTTP 负载传递。如下是使用 cURL 命令的访问示例: + +```Shell +curl \ + --header 'Content-Type: application/json' \ + --data '{"sentence": "Hello World"}' \ + http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say +``` + +也可以使用标准的 Dubbo client 请求服务,我们首先需要从生成代码即 dubbo-node 包中获取服务代理,为它指定 server 地址并初始化,之后就可以发起起 RPC 调用了。 + +创建 client.ts 文件。 + +```typescript +import { createPromiseClient } from "apache-dubbo"; +import { ExampleService } from "./gen/example_dubbo"; +import { createDubboTransport } from "apache-dubbo-node"; + +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", + httpVersion: "1.1", +}); + +async function main() { + const client = createPromiseClient(ExampleService, transport); + const res = await client.say({ sentence: "Hello World" }); + console.log(res); +} +void main(); +``` + +运行客户端 + +```Shell +npx tsx client.ts +``` + +## 更多内容 +- 请查看 [Node.js 开发文档](/zh-cn/overview/mannual/nodejs-sdk) 了解更多使用方式。 \ No newline at end of file diff --git a/content/zh-cn/overview/quickstart/rust/_index.md b/content/zh-cn/overview/quickstart/rpc/rust.md old mode 100755 new mode 100644 similarity index 94% rename from content/zh-cn/overview/quickstart/rust/_index.md rename to content/zh-cn/overview/quickstart/rpc/rust.md index 27e8e6e9c7f1..2458034ed71a --- a/content/zh-cn/overview/quickstart/rust/_index.md +++ b/content/zh-cn/overview/quickstart/rpc/rust.md @@ -1,19 +1,14 @@ --- -aliases: - - /zh/overview/quickstart/rust/ -description: Rust 微服务开发入门 -hide: true +alias: + - /zh-cn/overview/quickstart/rust/ +description: 使用轻量的 Rust SDK 开发 RPC Server 和 Client linkTitle: Rust -no_list: true -title: Rust 微服务开发入门 +title: 使用轻量的 Rust SDK 开发 RPC Server 和 Client type: docs -weight: 3 +weight: 5 --- - - - -请在此查看完整 [示例](https://github.com/apache/dubbo-rust/tree/main/examples/greeter)。 +请在此查看完整 dubbo-rust/example。 ## 1 前置条件 - 安装 [Rust](https://rustup.rs/) 开发环境 diff --git a/content/zh-cn/overview/quickstart/rpc/web.md b/content/zh-cn/overview/quickstart/rpc/web.md new file mode 100644 index 000000000000..df907f78b8a4 --- /dev/null +++ b/content/zh-cn/overview/quickstart/rpc/web.md @@ -0,0 +1,256 @@ +--- +description: 基于 Dubbo Javascript 客户端,开发在浏览器中访问后端服务的 Web 页面 +linkTitle: Web +title: 基于 Dubbo Javascript 客户端,开发在浏览器中访问后端服务的 Web 页面 +type: docs +weight: 4 +--- + +基于 Dubbo 定义的 Triple 协议,你可以轻松编写浏览器、gRPC 兼容的 RPC 服务,并让这些服务同时运行在 HTTP/1 和 HTTP/2 上。Dubbo TypeScript SDK 支持使用 IDL 或编程语言特有的方式定义服务,并提供一套轻量的 APl 来发布或调用这些服务。 + +本示例演示了如何使用 dubbo-js 开发运行在浏览器上的 web 应用程序,web 页面将调用 dubbo node.js 开发的后端服务并生成页面内容。本示例演示基于 IDL 和非 IDL 两种编码模式,完整源码请查看 dubbo-js/web-example。 + +## IDL 模式 + +### 前置条件 + +首先,我们将使用 Vite 来生成我们的前端项目模板,它内置了我们稍后需要的所有功能支持。 + +```Shell +npm create vite@latest -- dubbo-web-example --template react-ts +cd dubbo-web-example +npm install +``` + +因为使用 Protocol Buffer 的原因,我们首先需要安装相关的代码生成工具,这包括 `@bufbuild/protoc-gen-es`、`@bufbuild/protobuf`、`protoc-gen-apache-dubbo-es`、`apache-dubbo`。 + +```Shell +npm install @bufbuild/protoc-gen-es @bufbuild/protobuf protoc-gen-apache-dubbo-es apache-dubbo +``` + +### 使用 Proto 定义服务 + +现在,使用 Protocol Buffer (IDL) 来定义一个 Dubbo 服务。 + +src 下创建 util/proto 目录,并生成文件 + +```Shell +mkdir -p src/util/proto && touch src/util/proto/example.proto +``` + +写入内容 + +```Protobuf +syntax = "proto3"; + +package apache.dubbo.demo.example.v1; + +message SayRequest { + string sentence = 1; +} + +message SayResponse { + string sentence = 1; +} + +service ExampleService { + rpc Say(SayRequest) returns (SayResponse) {} +} +``` + +这个文件声明了一个叫做 `ExampleService` 的服务,为这个服务定义了 `Say` 方法以及它的请求参数 `SayRequest` 和返回值 `SayResponse`。 + +### 生成代码 + +创建 gen 目录,作为生成文件放置的目标目录 + +```Shell +mkdir -p src/util/gen +``` + +运行以下命令,利用 `protoc-gen-es`、`protoc-gen-apache-dubbo-es` 等插件在 gen 目录下生成代码文件 + +```Shell +PATH=$PATH:$(pwd)/node_modules/.bin \ + protoc -I src/util/proto \ + --es_out src/util/gen \ + --es_opt target=ts \ + --dubbo-es_out src/util/gen \ + --dubbo-es_opt target=ts \ + example.proto +``` + +运行命令后,应该可以在目标目录中看到以下生成的文件: + +```Plain Text +├── src +│ ├── util +│ │ ├── gen +│ │ │ ├── example_dubbo.ts +│ │ │ └── example_pb.ts +│ │ └── proto +│ │ └── example.proto +``` + +### 创建 App + +需要先下载 `apache-dubbo-web` + +```shell +npm install apache-dubbo-web +``` + +现在我们可以从包中导入服务并设置一个客户端。在 App.tsx 中添加以下内容: + +```typescript +import { useState } from "react"; +import "./App.css"; + +import { createPromiseClient } from "apache-dubbo"; +import { createDubboTransport } from "apache-dubbo-web"; + +// Import service definition that you want to Dubbo to. +import { ExampleService } from "./util/gen/example_dubbo"; + +// The transport defines what type of endpoint we're hitting. +// In our example we'll be communicating with a Dubbo endpoint. +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", +}); + +// Here we make the client itself, combining the service +// definition with the transport. +const client = createPromiseClient(ExampleService, transport); + +function App() { + const [inputValue, setInputValue] = useState(""); + const [messages, setMessages] = useState< + { + fromMe: boolean; + message: string; + }[] + >([]); + return ( + <> +
    + {messages.map((msg, index) => ( +
  1. {`${msg.fromMe ? "ME:" : "Dubbo Server:"} ${msg.message}`}
  2. + ))} +
+
{ + e.preventDefault(); + // Clear inputValue since the user has submitted. + setInputValue(""); + // Store the inputValue in the chain of messages and + // mark this message as coming from "me" + setMessages((prev) => [ + ...prev, + { + fromMe: true, + message: inputValue, + }, + ]); + const response = await client.say({ + sentence: inputValue, + }); + setMessages((prev) => [ + ...prev, + { + fromMe: false, + message: response.sentence, + }, + ]); + }} + > + setInputValue(e.target.value)} /> + +
+ + ); +} + +export default App; +``` + +执行以下命令,即可得到样例页面 + +```Shell +npm run dev +``` + +### 启动 Server + +接下来我们需要启动 Server,这里我们采用 Dubbo 服务嵌入的 Node.js 服务器,具体可参考 [Node.js 开发 Dubbo 后端服务](../nodejs/)中的操作步骤。 + +不过需要注意,我们额外需要修改 Node.js 示例:引入 @fastify/cors 来解决前端请求的跨域问题 + +```Shell +npm install @fastify/cors +``` + +需要在 server.ts 文件下修改 +```typescript +... +import cors from "@fastify/cors"; + +... +async function main() { + const server = fastify(); + ... + await server.register(cors, { + origin: true, + }); + ... + await server.listen({ host: "localhost", port: 8080 }); + ... +} + +void main(); +``` + +最后,运行代码启动服务 + +```Shell +npx tsx server.ts +``` + +## 无 IDL 模式 + +同样需要先安装 `apache-dubbo`、`apache-dubbo-web` + +```shell +npm install apache-dubbo apache-dubbo-web +``` + +现在就可以一个启动一个客户端,并发起调用了。App.tsx 中的代码与 IDL 模式基本一致,区别点在于以下内容: + +```typescript +// ... +// set backend server to Dubbo +const transport = createDubboTransport({ + baseUrl: "http://localhost:8080", +}); +// init client +const client = createPromiseClient(transport); + +function App() { + // ... + // call remote Dubbo service + const response = await client.call( + "apache.dubbo.demo.example.v1.ExampleService", + "say", + { + sentence: inputValue, + }); +} +``` + +执行以下命令,即可得到样例页面 + +```Shell +npm run dev +``` + +## 更多内容 +- 请查看 [Dubbo Web 开发文档](/zh-cn/overview/mannual/web-sdk) 了解更多使用方式。 \ No newline at end of file diff --git a/content/zh-cn/overview/reference/Metrics/_index.md b/content/zh-cn/overview/reference/Metrics/_index.md deleted file mode 100644 index 20eaeea4f5f5..000000000000 --- a/content/zh-cn/overview/reference/Metrics/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -description: "" -linkTitle: Metrics -title: Metrics -type: docs -weight: 2 ---- diff --git a/content/zh-cn/overview/reference/_index.md b/content/zh-cn/overview/reference/_index.md index 86502e99e621..d0ec89c9d6a6 100755 --- a/content/zh-cn/overview/reference/_index.md +++ b/content/zh-cn/overview/reference/_index.md @@ -8,54 +8,3 @@ title: 其他 type: docs weight: 7 --- - -{{< blocks/section color="white" height="auto">}} -
-
-
-
-
-

- Dubbo Admin -

-

Dubbo Admin 使用指南

-
-
-
-
-
-
-

- Dubbo Metrics -

-

Dubbo Metrics 监控指标

-
-
-
-
-
-
-

- Dubbo Integrations -

-

Dubbo Integrations 使用指南

-
-
-
-
-
-
-

- Dubbo Proposals -

-

Dubbo 提案

-
-
-
- -
-
-
- -{{< /blocks/section >}} diff --git a/content/zh-cn/overview/reference/admin/_index.md b/content/zh-cn/overview/reference/admin/_index.md index fa89e7bc1fe0..53710e23a758 100644 --- a/content/zh-cn/overview/reference/admin/_index.md +++ b/content/zh-cn/overview/reference/admin/_index.md @@ -3,5 +3,5 @@ description: "" linkTitle: Admin title: Admin 控制台操作手册 type: docs -weight: 1 +weight: 2 --- diff --git a/content/zh-cn/overview/reference/dubboctl/_index.md b/content/zh-cn/overview/reference/dubboctl/_index.md new file mode 100644 index 000000000000..771989d66958 --- /dev/null +++ b/content/zh-cn/overview/reference/dubboctl/_index.md @@ -0,0 +1,7 @@ +--- +description: "" +linkTitle: dubboctl +title: dubboctl 操作手册 +type: docs +weight: 10 +--- diff --git a/content/zh-cn/overview/reference/dubboctl/tutorial.md b/content/zh-cn/overview/reference/dubboctl/tutorial.md new file mode 100644 index 000000000000..773c48066dfc --- /dev/null +++ b/content/zh-cn/overview/reference/dubboctl/tutorial.md @@ -0,0 +1,145 @@ +--- +description: dubboctl 快速开始 +linkTitle: 基本用法 +title: dubboctl 快速开始 +type: docs +weight: 1 +--- + +接下来,我们将跟随文档学习如何使用 dubboctl 完成: +1. 创建一个 Dubbo 应用 +2. 将应用打包为 Docker 镜像 +3. 部署应用镜像到 Kubernetes 集群 + +## 前置条件 +{{% alert title="注意" color="warning" %}} +我们会将应用部署到 Kubernetes,因此请确保您有一个本地环境可访问的 Kuberentes 集群。 +{{% /alert %}} + +Dubbo 提供了相应的工具和解决方案来简化整个微服务开发、打包与部署过程,所以开始前我们需要先安装 `dubboctl` 工具。 + +```sh +curl -L https://dubbo.apache.org/downloadKube.sh | sh - +``` + +```shell +cd dubbo-kube-$version +``` + +```sh +export PATH=$PWD/bin:$PATH +``` +## 快速创建 Dubbo 应用 +在任意目录,运行以下命令即可生成一个基本的 Dubbo 应用。 + +{{< tabpane >}} +{{< tab header="请选择开发语言:" disabled=true />}} +{{< tab header="Java" lang="shell" >}} +dubboctl create -l java dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Go" lang="shell" >}} +dubboctl create -l go dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Web" lang="shell" >}} +dubboctl create -l web dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Node.js" lang="shell" >}} +dubboctl create -l nodejs dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< tab header="Rust" lang="shell" >}} +dubboctl create -l rust dubbo-hello +cd dubbo-hello +{{< /tab >}} +{{< /tabpane >}} + +
+以 `java` 为例,项目目录结构如下: + +```Java +``` + +## 初始化微服务集群 +dubboctl 可以帮助我们快速的初始化微服务集群中需要的注册中心、监控系统、服务治理中心等组件,只需要运行以下命令: + +```sh +dubboctl manifest install --profile=demo +``` + +> 作为示例用途,以上命令会一键安装 Zookeeper、Console、Prometheus、Grafana、Zipkin、Ingress 等组件,关于 `--profile=demo` 更多解释及可选值请参见文档说明。 + +运行以下命令检查集群初始化准备就绪 + +```sh +kubectl get services -n dubbo-system +``` + +## 部署应用 +{{% alert title="注意" color="warning" %}} +为了快速体验应用部署过程,我们将跳过本地源码构建的过程,直接是使用官方预先构建好的 Docker 镜像进行部署。如果您想了解如何从源码构建镜像,请参考下一篇 [定制开发微服务应用](../customize)。 +{{% /alert %}} + +在刚刚创建的示例项目根目录,运行以下命令生成 Kubernetes 资源清单,其中,`--image` 指定了官方预先准备好的示例镜像(镜像与刚刚生成的示例应用源码完全相同)。 + +```sh +dubboctl deploy --image=docker.io/apache/dubbo-java-quickstart:latest +# 如果使用 go 语言项目模板,则请使用 dubbo-go-quickstart:latest,其他语言类推 +``` + +命令执行成功后,可以在当前目录看到生成的 `kube.yaml` 文件,其中包括 deployment、service 等 kubernetes 资源定义。 + +接下来,将应用部署到 Kubernetes 环境。 + +```shell +kubectl apply -f ./kube.yaml +``` + +检查部署状态 +```shell +kubectl get services +``` + +## 访问应用 +部署成功后,可以通过以下方式检查应用状态。 + +{{< tabpane text=true >}} +{{< tab header="请根据情况选择:" disabled=true />}} +{{% tab header="本地集群" lang="en" %}} +1. 如果使用的本地 Kubernetes 集群,请使用以下方式访问应用验证部署状态,执行以下命令: + + ```shell + dubboctl dashboard admin + ``` + +2. 以上命令会自动打开 admin 控制台,如果在您的环境下没有打开,请使用浏览器访问以下地址: + + http://localhost:38080/admin + +3. 通过 triple 协议,可以继续测试 Dubbo 服务,执行以下命令进行端口映射: + + ```shell + kubectl port-forward 50051:50051 + ``` + +4. 通过 curl 访问服务: + + ```shell + curl \ + --header "Content-Type: application/json" \ + --data '["Dubbo"]' \ + http://localhost:50051/com.example.demo.dubbo.api.DemoService/sayHello/ + ``` + +{{% /tab %}} + +{{% tab header="阿里云ACK" lang="zh-cn" %}} +对于云上托管的哦 Kubernetes 集群,可以使用以下方式验证,这里以阿里云 ACK 集群为例: + +ACK ingerss-controller 的访问方式...... + +{{% /tab %}} +{{< /tabpane >}} + diff --git a/content/zh-cn/overview/mannual/erlang-sdk/_index.md b/content/zh-cn/overview/reference/erlang-sdk/_index.md similarity index 76% rename from content/zh-cn/overview/mannual/erlang-sdk/_index.md rename to content/zh-cn/overview/reference/erlang-sdk/_index.md index fb1ec3e6297e..45802c44dee4 100755 --- a/content/zh-cn/overview/mannual/erlang-sdk/_index.md +++ b/content/zh-cn/overview/reference/erlang-sdk/_index.md @@ -2,9 +2,10 @@ aliases: - /zh/docs3-v2/erlang-sdk/ - /zh-cn/docs3-v2/erlang-sdk/ + - /zh-cn/overview/mannual/erlang-sdk/ description: Erlang 支持 linkTitle: Erlang SDK title: Erlang SDK 手册 type: docs -weight: 5 +weight: 8 --- diff --git a/content/zh-cn/overview/mannual/erlang-sdk/quick-start.md b/content/zh-cn/overview/reference/erlang-sdk/quick-start.md similarity index 97% rename from content/zh-cn/overview/mannual/erlang-sdk/quick-start.md rename to content/zh-cn/overview/reference/erlang-sdk/quick-start.md index 381e300195e0..45892132201a 100644 --- a/content/zh-cn/overview/mannual/erlang-sdk/quick-start.md +++ b/content/zh-cn/overview/reference/erlang-sdk/quick-start.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/erlang-sdk/quick-start/ - /zh-cn/docs3-v2/erlang-sdk/quick-start/ + - /zh-cn/overview/mannual/erlang-sdk/quick-start/ description: Erlang 快速开始 linkTitle: 快速开始 title: 快速开始 @@ -9,11 +10,6 @@ type: docs weight: 1 --- - - - - - 建议先使用 java 定义接口 jar,并使用 [erlanalysis](https://github.com/apache/dubbo-erlang/tree/master/tools/erlanalysis) 工具解析java接口至Erlang lib ## 导入依赖库 diff --git a/content/zh-cn/overview/mannual/erlang-sdk/reference.md b/content/zh-cn/overview/reference/erlang-sdk/reference.md similarity index 91% rename from content/zh-cn/overview/mannual/erlang-sdk/reference.md rename to content/zh-cn/overview/reference/erlang-sdk/reference.md index 411946130e84..c6a62bf1d36d 100644 --- a/content/zh-cn/overview/mannual/erlang-sdk/reference.md +++ b/content/zh-cn/overview/reference/erlang-sdk/reference.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/erlang-sdk/reference/ - /zh-cn/docs3-v2/erlang-sdk/reference/ + - /zh-cn/overview/mannual/erlang-sdk/reference/ description: 在 erlang 中配置消费者 linkTitle: 消费者配置 title: 消费者配置 diff --git a/content/zh-cn/overview/mannual/erlang-sdk/serialization.md b/content/zh-cn/overview/reference/erlang-sdk/serialization.md similarity index 92% rename from content/zh-cn/overview/mannual/erlang-sdk/serialization.md rename to content/zh-cn/overview/reference/erlang-sdk/serialization.md index 3cc9748e429d..42d2c6b75a81 100644 --- a/content/zh-cn/overview/mannual/erlang-sdk/serialization.md +++ b/content/zh-cn/overview/reference/erlang-sdk/serialization.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/erlang-sdk/serialization/ - /zh-cn/docs3-v2/erlang-sdk/serialization/ + - /zh-cn/overview/mannual/erlang-sdk/serialization/ description: 在 erlang 中配置序列化方式 linkTitle: 序列化配置项 title: 序列化配置项 diff --git a/content/zh-cn/overview/mannual/erlang-sdk/service.md b/content/zh-cn/overview/reference/erlang-sdk/service.md similarity index 94% rename from content/zh-cn/overview/mannual/erlang-sdk/service.md rename to content/zh-cn/overview/reference/erlang-sdk/service.md index f70fc88ee49f..e89e9af1d2d5 100644 --- a/content/zh-cn/overview/mannual/erlang-sdk/service.md +++ b/content/zh-cn/overview/reference/erlang-sdk/service.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/erlang-sdk/service/ - /zh-cn/docs3-v2/erlang-sdk/service/ + - /zh-cn/overview/mannual/erlang-sdk/service/ description: 在 erlang 中配置服务提供者 linkTitle: 提供者配置 title: 提供者配置 diff --git a/content/zh-cn/overview/reference/faq/faq.md b/content/zh-cn/overview/reference/faq/faq.md new file mode 100644 index 000000000000..79219ff203ed --- /dev/null +++ b/content/zh-cn/overview/reference/faq/faq.md @@ -0,0 +1,19 @@ +--- +description: "常见 Dubbo 问题解答 FAQ" +linkTitle: 常见问题解答 +title: 常见问题解答 +type: docs +weight: 1 +--- + + + +2. 老版本文档在哪里? +3. 如何平滑迁移到 Dubbo3? +4. 多语言体系建设如何? +5. 应该选用哪个协议? +6. 与各个框架和体系之间的关系 +7. 排查问题、观测集群状态 +8. 流量治理 +9. 自定义扩展 +10. Roadmap \ No newline at end of file diff --git a/content/zh-cn/overview/reference/pixiu/_index.md b/content/zh-cn/overview/reference/pixiu/_index.md new file mode 100755 index 000000000000..1ce75c5919f9 --- /dev/null +++ b/content/zh-cn/overview/reference/pixiu/_index.md @@ -0,0 +1,11 @@ +--- +aliases: + - /zh/docs3-v2/dubbo-go-pixiu/ + - /zh-cn/docs3-v2/dubbo-go-pixiu/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/ +description: Dubbo Go Pixiu 简介 +linkTitle: Pixiu gateway +title: Dubbo Go Pixiu 简介 +type: docs +weight: 8 +--- diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/_index.md b/content/zh-cn/overview/reference/pixiu/dev/_index.md similarity index 59% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/_index.md rename to content/zh-cn/overview/reference/pixiu/dev/_index.md index 498afec54a5d..d64766019b3f 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/_index.md +++ b/content/zh-cn/overview/reference/pixiu/dev/_index.md @@ -1,7 +1,6 @@ --- aliases: - - /zh/docs3-v2/dubbo-go-pixiu/dev/ - - /zh-cn/docs3-v2/dubbo-go-pixiu/dev/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/dev/ description: 开发者指南 linkTitle: 开发者指南 title: 开发者指南 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/dubbo-pilot.md b/content/zh-cn/overview/reference/pixiu/dev/dubbo-pilot.md similarity index 99% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/dubbo-pilot.md rename to content/zh-cn/overview/reference/pixiu/dev/dubbo-pilot.md index d58402f5ea4d..6a6c3863938e 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/dubbo-pilot.md +++ b/content/zh-cn/overview/reference/pixiu/dev/dubbo-pilot.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/dev/dubbo-pilot/ - /zh-cn/docs3-v2/dubbo-go-pixiu/dev/dubbo-pilot/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/dev/dubbo-pilot/ description: dubbo-pilot Control Plane 部署 linkTitle: dubbo-pilot Control Plane 部署 title: dubbo-pilot Control Plane 部署 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/filter-extension.md b/content/zh-cn/overview/reference/pixiu/dev/filter-extension.md similarity index 97% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/filter-extension.md rename to content/zh-cn/overview/reference/pixiu/dev/filter-extension.md index f6f857d5f16c..d26cfa842061 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/filter-extension.md +++ b/content/zh-cn/overview/reference/pixiu/dev/filter-extension.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/dev/filter-extension/ - /zh-cn/docs3-v2/dubbo-go-pixiu/dev/filter-extension/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/dev/filter-extension/ description: Pixiu Filter体系介绍 linkTitle: Pixiu Filter体系介绍 title: Pixiu Filter体系介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/trie.md b/content/zh-cn/overview/reference/pixiu/dev/trie.md similarity index 99% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/trie.md rename to content/zh-cn/overview/reference/pixiu/dev/trie.md index fa76be362cca..221a8947719e 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/dev/trie.md +++ b/content/zh-cn/overview/reference/pixiu/dev/trie.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/dev/trie/ - /zh-cn/docs3-v2/dubbo-go-pixiu/dev/trie/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/dev/trie/ description: Trie 前缀树介绍 linkTitle: Trie 前缀树介绍 title: Trie 前缀树介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/_index.md b/content/zh-cn/overview/reference/pixiu/overview/_index.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/_index.md rename to content/zh-cn/overview/reference/pixiu/overview/_index.md index 201ba51b761c..a4c884620654 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/_index.md +++ b/content/zh-cn/overview/reference/pixiu/overview/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/overview/ - /zh-cn/docs3-v2/dubbo-go-pixiu/overview/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/overview description: 入门概述 linkTitle: 入门概述 title: 入门概述 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/faq.md b/content/zh-cn/overview/reference/pixiu/overview/faq.md similarity index 91% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/faq.md rename to content/zh-cn/overview/reference/pixiu/overview/faq.md index fccd3c0142ad..d0fcb43ccb5a 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/faq.md +++ b/content/zh-cn/overview/reference/pixiu/overview/faq.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/overview/faq/ - /zh-cn/docs3-v2/dubbo-go-pixiu/overview/faq/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/overview/faq description: Pixiu 常见问题 linkTitle: Pixiu 常见问题 title: Pixiu 常见问题 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/terminology.md b/content/zh-cn/overview/reference/pixiu/overview/terminology.md similarity index 94% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/terminology.md rename to content/zh-cn/overview/reference/pixiu/overview/terminology.md index 20b040a906ca..618df1795710 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/terminology.md +++ b/content/zh-cn/overview/reference/pixiu/overview/terminology.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/overview/terminology/ - /zh-cn/docs3-v2/dubbo-go-pixiu/overview/terminology/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/overview/terminology/ description: Pixiu 术语 linkTitle: Pixiu 术语 title: Pixiu 术语 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/what-is-pixiu.md b/content/zh-cn/overview/reference/pixiu/overview/what-is-pixiu.md similarity index 97% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/what-is-pixiu.md rename to content/zh-cn/overview/reference/pixiu/overview/what-is-pixiu.md index 3c9de721b0dd..1ba36cc76a9b 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/overview/what-is-pixiu.md +++ b/content/zh-cn/overview/reference/pixiu/overview/what-is-pixiu.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/overview/what-is-pixiu/ - /zh-cn/docs3-v2/dubbo-go-pixiu/overview/what-is-pixiu/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/overview/what-is-pixiu/ description: Pixiu 是一款开源的 Dubbo 生态的 API 网关和 接入 dubbo 集群的语言解决方案。作为 API 网关形态。 linkTitle: Pixiu 是什么 title: Pixiu 是什么 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/_index.md b/content/zh-cn/overview/reference/pixiu/user/_index.md similarity index 79% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/_index.md rename to content/zh-cn/overview/reference/pixiu/user/_index.md index be140f46f130..68b935f3db46 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/ description: 用户文档 linkTitle: 用户文档 title: 用户文档 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/_index.md b/content/zh-cn/overview/reference/pixiu/user/adapter/_index.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/_index.md rename to content/zh-cn/overview/reference/pixiu/user/adapter/_index.md index 4ec10d599cd1..54cbfe59833e 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/adapter/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/adapter/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/adapter/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/ description: Adapter 介绍 linkTitle: Adapter 介绍 title: Adapter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/dubbo.md b/content/zh-cn/overview/reference/pixiu/user/adapter/dubbo.md similarity index 80% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/dubbo.md rename to content/zh-cn/overview/reference/pixiu/user/adapter/dubbo.md index 9f20c49fea76..24f6b301810d 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/dubbo.md +++ b/content/zh-cn/overview/reference/pixiu/user/adapter/dubbo.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/adapter/dubbo/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/adapter/dubbo/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/dubbo/ description: Dubbo 集群中心 Adapter linkTitle: Dubbo 集群中心 Adapter title: Dubbo 集群中心 Adapter diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/springcloud.md b/content/zh-cn/overview/reference/pixiu/user/adapter/springcloud.md similarity index 80% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/springcloud.md rename to content/zh-cn/overview/reference/pixiu/user/adapter/springcloud.md index 03e9bd52d100..0ece37fab6ca 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/springcloud.md +++ b/content/zh-cn/overview/reference/pixiu/user/adapter/springcloud.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/adapter/springcloud/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/adapter/springcloud/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/adapter/springcloud/ description: Spring Cloud 集群中心 Adapter linkTitle: Spring Cloud 集群中心 Adapter title: Spring Cloud 集群中心 Adapter diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/_index.md b/content/zh-cn/overview/reference/pixiu/user/appendix/_index.md similarity index 76% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/_index.md rename to content/zh-cn/overview/reference/pixiu/user/appendix/_index.md index fd47ce60c8a0..11bfd9738f56 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/appendix/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/appendix/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/appendix/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/ description: 附录 linkTitle: 附录 title: 附录 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety.md b/content/zh-cn/overview/reference/pixiu/user/appendix/http-to-dubbo-default-stragety.md similarity index 99% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety.md rename to content/zh-cn/overview/reference/pixiu/user/appendix/http-to-dubbo-default-stragety.md index 1c4e499619b4..8c5e98fcf0b1 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety.md +++ b/content/zh-cn/overview/reference/pixiu/user/appendix/http-to-dubbo-default-stragety.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/appendix/http-to-dubbo-default-stragety/ description: HTTP to Dubbo 默认转换协议 linkTitle: HTTP to Dubbo 默认转换协议 title: HTTP to Dubbo 默认转换协议 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/configurations.md b/content/zh-cn/overview/reference/pixiu/user/configurations.md similarity index 98% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/configurations.md rename to content/zh-cn/overview/reference/pixiu/user/configurations.md index b1996999e9fc..5bb23c21c4ed 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/configurations.md +++ b/content/zh-cn/overview/reference/pixiu/user/configurations.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/configurations/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/configurations/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/configurations/ description: 启动和配置 linkTitle: 启动和配置 title: 启动和配置 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/deployment.md b/content/zh-cn/overview/reference/pixiu/user/deployment.md similarity index 97% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/deployment.md rename to content/zh-cn/overview/reference/pixiu/user/deployment.md index 86095a98ad8c..fb447e2bc622 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/deployment.md +++ b/content/zh-cn/overview/reference/pixiu/user/deployment.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/deployment/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/deployment/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/deployment/ description: 部署操作 linkTitle: 部署操作 title: 部署操作 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/_index.md b/content/zh-cn/overview/reference/pixiu/user/httpfilter/_index.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/_index.md rename to content/zh-cn/overview/reference/pixiu/user/httpfilter/_index.md index 290ba4d38c3e..43d32631a81f 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/httpfilter/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/httpfilter/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/httpfilter/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/ description: Http Filter 介绍 linkTitle: Http Filter 介绍 title: Http Filter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/dubbo.md b/content/zh-cn/overview/reference/pixiu/user/httpfilter/dubbo.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/dubbo.md rename to content/zh-cn/overview/reference/pixiu/user/httpfilter/dubbo.md index 27027737ed8b..298e3dd69ac8 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/dubbo.md +++ b/content/zh-cn/overview/reference/pixiu/user/httpfilter/dubbo.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/httpfilter/dubbo/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/httpfilter/dubbo/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/dubbo/ description: Dubbo HttpFilter 介绍 linkTitle: Dubbo HttpFilter 介绍 title: Dubbo HttpFilter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/hystrix.md b/content/zh-cn/overview/reference/pixiu/user/httpfilter/hystrix.md similarity index 79% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/hystrix.md rename to content/zh-cn/overview/reference/pixiu/user/httpfilter/hystrix.md index 6326c35a0007..632197735d6e 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/hystrix.md +++ b/content/zh-cn/overview/reference/pixiu/user/httpfilter/hystrix.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/httpfilter/hystrix/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/httpfilter/hystrix/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/hystrix/ description: 断路器介绍 linkTitle: 断路器介绍 title: 断路器介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/ratelimit.md b/content/zh-cn/overview/reference/pixiu/user/httpfilter/ratelimit.md similarity index 80% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/ratelimit.md rename to content/zh-cn/overview/reference/pixiu/user/httpfilter/ratelimit.md index 0787544cd573..5778ba7a8dc6 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/ratelimit.md +++ b/content/zh-cn/overview/reference/pixiu/user/httpfilter/ratelimit.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/httpfilter/ratelimit/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/httpfilter/ratelimit/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/httpfilter/ratelimit/ description: RateLimiter 介绍 linkTitle: RateLimiter 介绍 title: RateLimiter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/_index.md b/content/zh-cn/overview/reference/pixiu/user/listener/_index.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/_index.md rename to content/zh-cn/overview/reference/pixiu/user/listener/_index.md index ca07556a9eb4..db3e4e8e1ccd 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/listener/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/listener/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/listener/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/ description: Listener 介绍 linkTitle: Listener 介绍 title: Listener 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http.md b/content/zh-cn/overview/reference/pixiu/user/listener/http.md similarity index 95% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http.md rename to content/zh-cn/overview/reference/pixiu/user/listener/http.md index b28e8dfaadb8..a3f6f7408871 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http.md +++ b/content/zh-cn/overview/reference/pixiu/user/listener/http.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/listener/http/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/listener/http/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http/ description: Http Listener 介绍 linkTitle: Http Listener 介绍 title: Http Listener 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http2.md b/content/zh-cn/overview/reference/pixiu/user/listener/http2.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http2.md rename to content/zh-cn/overview/reference/pixiu/user/listener/http2.md index cd7c82ba7d0d..858e3d880950 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http2.md +++ b/content/zh-cn/overview/reference/pixiu/user/listener/http2.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/listener/http2/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/listener/http2/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/http2/ description: Http2 Listener 介绍 linkTitle: Http2 Listener 介绍 title: Http2 Listener 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/tcp.md b/content/zh-cn/overview/reference/pixiu/user/listener/tcp.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/tcp.md rename to content/zh-cn/overview/reference/pixiu/user/listener/tcp.md index 6ebb172b27e5..8f92612956ad 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/tcp.md +++ b/content/zh-cn/overview/reference/pixiu/user/listener/tcp.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/listener/tcp/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/listener/tcp/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/tcp/ description: TCP Listener 介绍 linkTitle: TCP Listener 介绍 title: TCP Listener 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/triple.md b/content/zh-cn/overview/reference/pixiu/user/listener/triple.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/triple.md rename to content/zh-cn/overview/reference/pixiu/user/listener/triple.md index 051f6ef177f3..e22e5c910b8e 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/triple.md +++ b/content/zh-cn/overview/reference/pixiu/user/listener/triple.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/listener/triple/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/listener/triple/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/listener/triple/ description: Triple Listener 介绍 linkTitle: Triple Listener 介绍 title: Triple Listener 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/_index.md b/content/zh-cn/overview/reference/pixiu/user/networkfilter/_index.md similarity index 79% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/_index.md rename to content/zh-cn/overview/reference/pixiu/user/networkfilter/_index.md index f75123a0bcf3..fa6327769b7a 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/networkfilter/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/networkfilter/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/networkfilter/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/ description: Network Filter 介绍 linkTitle: Network Filter 介绍 title: Network Filter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/dubbo.md b/content/zh-cn/overview/reference/pixiu/user/networkfilter/dubbo.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/dubbo.md rename to content/zh-cn/overview/reference/pixiu/user/networkfilter/dubbo.md index 4dcfbca3dd00..bbd22fe400dd 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/dubbo.md +++ b/content/zh-cn/overview/reference/pixiu/user/networkfilter/dubbo.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/networkfilter/dubbo/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/networkfilter/dubbo/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/dubbo/ description: Dubbo NetWorkFilter 介绍 linkTitle: Dubbo NetWorkFilter 介绍 title: Dubbo NetWorkFilter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/grpc.md b/content/zh-cn/overview/reference/pixiu/user/networkfilter/grpc.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/grpc.md rename to content/zh-cn/overview/reference/pixiu/user/networkfilter/grpc.md index 66fcde677eac..a81a53a181ce 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/grpc.md +++ b/content/zh-cn/overview/reference/pixiu/user/networkfilter/grpc.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/networkfilter/grpc/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/networkfilter/grpc/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/grpc/ description: Grpc NetWorkFilter 介绍 linkTitle: Grpc NetWorkFilter 介绍 title: Grpc NetWorkFilter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/http.md b/content/zh-cn/overview/reference/pixiu/user/networkfilter/http.md similarity index 87% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/http.md rename to content/zh-cn/overview/reference/pixiu/user/networkfilter/http.md index c58aec4c004f..e003e86b6e04 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/http.md +++ b/content/zh-cn/overview/reference/pixiu/user/networkfilter/http.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/networkfilter/http/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/networkfilter/http/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/networkfilter/http/ description: Http NetWorkFilter 介绍 linkTitle: Http NetWorkFilter 介绍 title: Http NetWorkFilter 介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/_index.md b/content/zh-cn/overview/reference/pixiu/user/quality/_index.md similarity index 77% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/_index.md rename to content/zh-cn/overview/reference/pixiu/user/quality/_index.md index 8422e88acf82..dda1d5020693 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/quality/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/quality/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/quality/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/ description: 质量指标 linkTitle: 质量指标 title: 质量指标 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/performance.md b/content/zh-cn/overview/reference/pixiu/user/quality/performance.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/performance.md rename to content/zh-cn/overview/reference/pixiu/user/quality/performance.md index 082d8f901f80..2fafa0f54271 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/performance.md +++ b/content/zh-cn/overview/reference/pixiu/user/quality/performance.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/quality/performance/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/quality/performance/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/stability/ description: 性能 linkTitle: 性能 title: 性能 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/stability.md b/content/zh-cn/overview/reference/pixiu/user/quality/stability.md similarity index 78% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/stability.md rename to content/zh-cn/overview/reference/pixiu/user/quality/stability.md index 6687acf1657e..bb1eaae6b107 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/stability.md +++ b/content/zh-cn/overview/reference/pixiu/user/quality/stability.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/quality/stability/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/quality/stability/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/quality/stability/ description: 稳定性 linkTitle: 稳定性 title: 稳定性 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quickstart.md b/content/zh-cn/overview/reference/pixiu/user/quickstart.md similarity index 98% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quickstart.md rename to content/zh-cn/overview/reference/pixiu/user/quickstart.md index ca26ef40e2b0..98b7e06f470b 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/quickstart.md +++ b/content/zh-cn/overview/reference/pixiu/user/quickstart.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/quickstart/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/quickstart/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/quickstart/ description: 快速开始 linkTitle: 快速开始 title: 快速开始 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/_index.md b/content/zh-cn/overview/reference/pixiu/user/samples/_index.md similarity index 77% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/_index.md rename to content/zh-cn/overview/reference/pixiu/user/samples/_index.md index 24d2c344bdce..1f6eb6be4c59 100755 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/_index.md +++ b/content/zh-cn/overview/reference/pixiu/user/samples/_index.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/samples/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/samples/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/ description: 案例介绍 linkTitle: 案例介绍 title: 案例介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_proxy.md b/content/zh-cn/overview/reference/pixiu/user/samples/http_proxy.md similarity index 96% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_proxy.md rename to content/zh-cn/overview/reference/pixiu/user/samples/http_proxy.md index 5f9d091c1a47..938e0c2542b9 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_proxy.md +++ b/content/zh-cn/overview/reference/pixiu/user/samples/http_proxy.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/samples/http_proxy/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/samples/http_proxy/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_proxy/ description: Http Proxy 案例介绍 linkTitle: Http Proxy 案例介绍 title: Http Proxy 案例介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_to_dubbo.md b/content/zh-cn/overview/reference/pixiu/user/samples/http_to_dubbo.md similarity index 81% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_to_dubbo.md rename to content/zh-cn/overview/reference/pixiu/user/samples/http_to_dubbo.md index 9ee572397f62..a610d52a82e4 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_to_dubbo.md +++ b/content/zh-cn/overview/reference/pixiu/user/samples/http_to_dubbo.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/samples/http_to_dubbo/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/samples/http_to_dubbo/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/http_to_dubbo description: Http to Dubbo 案例介绍 linkTitle: Http to Dubbo 案例介绍 title: Http to Dubbo 案例介绍 diff --git a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/https.md b/content/zh-cn/overview/reference/pixiu/user/samples/https.md similarity index 80% rename from content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/https.md rename to content/zh-cn/overview/reference/pixiu/user/samples/https.md index 3d8a389a4c53..d7e25411bf31 100644 --- a/content/zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/https.md +++ b/content/zh-cn/overview/reference/pixiu/user/samples/https.md @@ -2,6 +2,7 @@ aliases: - /zh/docs3-v2/dubbo-go-pixiu/user/samples/https/ - /zh-cn/docs3-v2/dubbo-go-pixiu/user/samples/https/ + - /zh-cn/overview/mannual/dubbo-go-pixiu/user/samples/https/ description: Https 案例介绍 linkTitle: Https 案例介绍 title: Https 案例介绍 diff --git a/content/zh-cn/overview/reference/proposals/metrics.md b/content/zh-cn/overview/reference/proposals/metrics.md index 4724d9723575..75d6eb729c3e 100644 --- a/content/zh-cn/overview/reference/proposals/metrics.md +++ b/content/zh-cn/overview/reference/proposals/metrics.md @@ -3,9 +3,9 @@ aliases: - /zh/overview/reference/proposals/metrics/ author: Song Xiaosheng date: 2023-02-20T00:00:00Z -description: 指标埋点 +description: metrics 指标埋点 linkTitle: 指标埋点 -title: 指标埋点 +title: Metrics 指标埋点 type: docs weight: 4 --- diff --git a/content/zh-cn/overview/reference/Metrics/standard_metrics.md b/content/zh-cn/overview/reference/proposals/standard_metrics.md similarity index 99% rename from content/zh-cn/overview/reference/Metrics/standard_metrics.md rename to content/zh-cn/overview/reference/proposals/standard_metrics.md index 9c35f98c4054..3feb01484f51 100644 --- a/content/zh-cn/overview/reference/Metrics/standard_metrics.md +++ b/content/zh-cn/overview/reference/proposals/standard_metrics.md @@ -1,8 +1,8 @@ --- -linkTitle: 标准监控指标 -title: Dubbo 框架标准监控指标 +linkTitle: metrics 指标参考手册 +title: metrics 指标参考手册 type: docs -weight: 1 +weight: 4 description: | 描述了 Dubbo 中统计的一些标准监控指标。 --- diff --git a/content/zh-cn/overview/reference/protocols/http.md b/content/zh-cn/overview/reference/protocols/http.md deleted file mode 100644 index 3f4b2ac41b05..000000000000 --- a/content/zh-cn/overview/reference/protocols/http.md +++ /dev/null @@ -1,621 +0,0 @@ ---- -description: "HTTP Json 协议规范" -linkTitle: HTTP 协议规范 -title: HTTP 协议规范 -type: docs -weight: 3 -working_in_progress: true ---- - - -## 什么是 Dubbo Http -基于 spring web 和 resteasy 注解编码风格,通过http协议进行服务间调用互通,dubbo protocol扩展实现的协议 - -## 为什么选择Dubbo Http -- dubbo http 可以实现微服务与dubbo之间的互通 -- 多协议发布服务,可以实现服务协议的平滑迁移 -- http的通用性,解决跨语言互通 -- 最新版本的http 无需添加其他组件,更轻量 -- resteasy以及spring web的编码风格,上手更快 - -## 协议规范 -- Request - -相对于原生的http协议dubbo http 请求增加version和group两个header用于确定服务的唯一, -如果provider一端没有声明group和version,http请求时就不需要传递这连个header,反之必须要传递目标 -服务的group和version, 如果使用dubbo http的RestClient这两个header将会默认通过attachment传递 -为区别于其他的header,attachment将会增加rest-service-前缀,因此通过其他形式的http client调用 -dubbo http服务需要传递 rest-service-version 和 rest-service-group 两个header -```` -POST /test/path HTTP/1.1 -Host: localhost:8080 -Content-type: application/json -Accept: text/html -rest-service-version: 1.0.0 -rest-service-group: dubbo - -{"name":"dubbo","age":10,"address":"hangzhou"} - - -```` -- Response -```` -HTTP/1.1 200 -Content-Type: text/html -Content-Length: 4 -Date: Fri, 28 Apr 2023 14:16:42 GMT - -"success" -```` -- content-type支持 - - application/json - - application/x-www-form-urlencoded - - text/plain - - text/xml - -目前支持以上media,后面还会对type进行扩展 - -## 快速入门 -详细的依赖以及spring配置,可以参见dubbo 项目的duubo-demo-xml模块 -https://github.com/apache/dubbo/tree/3.2/dubbo-demo/dubbo-demo-xml - -- spring web 编码 -在使用dubbo http的spring web编码时,类注解我们要求必须出现@RequestMapping或者@Controller,以此来判断用户使用的编码风格,决定使用对应的SpringMvcServiceRestMetadataResolver -注解解析器进行元注解解析,Provider一侧我们允许用户使用实现类作为Dubbo Service(相比之前dubbo service export时service必须是接口的要求) - -API -````java -@RequestMapping("/spring/demo/service") -public interface SpringRestDemoService { - - @RequestMapping(method = RequestMethod.GET, value = "/hello") - Integer hello(@RequestParam("a") Integer a, @RequestParam("b") Integer b); - - @RequestMapping(method = RequestMethod.GET, value = "/error") - String error(); - - @RequestMapping(method = RequestMethod.POST, value = "/say") - String sayHello(@RequestBody String name); - - @RequestMapping(method = RequestMethod.POST, value = "/testFormBody", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) - Long testFormBody(@RequestBody Long number); - - @RequestMapping(method = RequestMethod.POST, value = "/testJavaBeanBody", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) - User testJavaBeanBody(@RequestBody User user); - - - @RequestMapping(method = RequestMethod.GET, value = "/primitive") - int primitiveInt(@RequestParam("a") int a, @RequestParam("b") int b); - - @RequestMapping(method = RequestMethod.GET, value = "/primitiveLong") - long primitiveLong(@RequestParam("a") long a, @RequestParam("b") Long b); - - @RequestMapping(method = RequestMethod.GET, value = "/primitiveByte") - long primitiveByte(@RequestParam("a") byte a, @RequestParam("b") Long b); - - - @RequestMapping(method = RequestMethod.POST, value = "/primitiveShort") - long primitiveShort(@RequestParam("a") short a, @RequestParam("b") Long b, @RequestBody int c); - - - @RequestMapping(method = RequestMethod.GET, value = "/testMapParam") - String testMapParam(@RequestParam Map params); - - @RequestMapping(method = RequestMethod.GET, value = "/testMapHeader") - String testMapHeader(@RequestHeader Map headers); - - @RequestMapping(method = RequestMethod.POST, value = "/testMapForm", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) - List testMapForm(MultiValueMap params); - - - @RequestMapping(method = RequestMethod.GET, value = "/headerInt") - int headerInt(@RequestHeader("header") int header); - - -} -```` - -Provider - -````java - @DubboService(interfaceClass = SpringRestDemoService.class ,protocol = "rest") -public class SpringRestDemoServiceImpl implements SpringRestDemoService { - - @Override - public String sayHello(String name) { - return "Hello, " + name; - } - - @Override - public Long testFormBody(Long number) { - return number; - } - - @Override - public User testJavaBeanBody(User user) { - return user; - } - - - @Override - public int primitiveInt(int a, int b) { - return a + b; - } - - @Override - public long primitiveLong(long a, Long b) { - return a + b; - } - - @Override - public long primitiveByte(byte a, Long b) { - return a + b; - } - - @Override - public long primitiveShort(short a, Long b, int c) { - return a + b; - } - - - @Override - public String testMapParam(Map params) { - return params.get("param"); - } - - @Override - public String testMapHeader(Map headers) { - return headers.get("header"); - } - - @Override - public List testMapForm(MultiValueMap params) { - return params.get("form"); - } - - - @Override - public int headerInt(int header) { - return header; - } - - - @Override - public Integer hello(Integer a, Integer b) { - return a + b; - } - - - @Override - public String error() { - throw new RuntimeException("test error"); - } - -} -```` -Consumer -````java -@Component -public class SpringRestDemoServiceConsumer { - @DubboReference(interfaceClass = SpringRestDemoService.class ) - SpringRestDemoService springRestDemoService; - - public void invoke(){ - String hello = springRestDemoService.sayHello("hello"); - assertEquals("Hello, hello", hello); - Integer result = springRestDemoService.primitiveInt(1, 2); - Long resultLong = springRestDemoService.primitiveLong(1, 2l); - long resultByte = springRestDemoService.primitiveByte((byte) 1, 2l); - long resultShort = springRestDemoService.primitiveShort((short) 1, 2l, 1); - - assertEquals(result, 3); - assertEquals(resultShort, 3l); - assertEquals(resultLong, 3l); - assertEquals(resultByte, 3l); - - assertEquals(Long.valueOf(1l), springRestDemoService.testFormBody(1l)); - - MultiValueMap forms = new LinkedMultiValueMap<>(); - forms.put("form", Arrays.asList("F1")); - - assertEquals(Arrays.asList("F1"), springRestDemoService.testMapForm(forms)); - assertEquals(User.getInstance(), springRestDemoService.testJavaBeanBody(User.getInstance())); - } - - private void assertEquals(Object returnStr, Object exception) { - boolean equal = returnStr != null && returnStr.equals(exception); - - if (equal) { - return; - } else { - throw new RuntimeException(); - } - } - - -} - -```` - -- JaxRs 编码 - JaxRs注解使用的时候我们要求service 类上必须使用@Path注解,来确定使用JAXRSServiceRestMetadataResolver - 注解解析器来解析注解元信息 - -API -````java -@Path("/jaxrs/demo/service") -public interface JaxRsRestDemoService { - @GET - @Path("/hello") - Integer hello(@QueryParam("a") Integer a, @QueryParam("b") Integer b); - - @GET - @Path("/error") - String error(); - - @POST - @Path("/say") - String sayHello(String name); - - - - - - @POST - @Path("/testFormBody") - Long testFormBody(@FormParam("number") Long number); - - @POST - @Path("/testJavaBeanBody") - @Consumes({MediaType.APPLICATION_JSON}) - User testJavaBeanBody(User user); - - - - @GET - @Path("/primitive") - int primitiveInt(@QueryParam("a") int a, @QueryParam("b") int b); - - @GET - @Path("/primitiveLong") - long primitiveLong(@QueryParam("a") long a, @QueryParam("b") Long b); - - @GET - @Path("/primitiveByte") - long primitiveByte(@QueryParam("a") byte a, @QueryParam("b") Long b); - - @POST - @Path("/primitiveShort") - long primitiveShort(@QueryParam("a") short a, @QueryParam("b") Long b, int c); - - @GET - @Path("testMapParam") - @Produces({MediaType.TEXT_PLAIN}) - @Consumes({MediaType.TEXT_PLAIN}) - String testMapParam(@QueryParam("test") Map params); - - @GET - @Path("testMapHeader") - @Produces({MediaType.TEXT_PLAIN}) - @Consumes({MediaType.TEXT_PLAIN}) - String testMapHeader(@HeaderParam("test") Map headers); - - @POST - @Path("testMapForm") - @Produces({MediaType.APPLICATION_JSON}) - @Consumes({MediaType.APPLICATION_FORM_URLENCODED}) - List testMapForm(MultivaluedMap params); - - @POST - @Path("/header") - @Consumes({MediaType.TEXT_PLAIN}) - String header(@HeaderParam("header") String header); - - @POST - @Path("/headerInt") - @Consumes({MediaType.TEXT_PLAIN}) - int headerInt(@HeaderParam("header") int header); - - -} -```` - -Provider -````java -@DubboService(interfaceClass =JaxRsRestDemoService.class ,protocol = "rest",version = "1.0.0",group = "test") -public class JaxRsRestDemoServiceImpl implements JaxRsRestDemoService { - - @Override - public String sayHello(String name) { - return "Hello, " + name; - } - - @Override - public Long testFormBody(Long number) { - return number; - } - - @Override - public User testJavaBeanBody(User user) { - return user; - } - - - @Override - public int primitiveInt(int a, int b) { - return a + b; - } - - @Override - public long primitiveLong(long a, Long b) { - return a + b; - } - - @Override - public long primitiveByte(byte a, Long b) { - return a + b; - } - - @Override - public long primitiveShort(short a, Long b, int c) { - return a + b; - } - - - - @Override - public String testMapParam(Map params) { - return params.get("param"); - } - - @Override - public String testMapHeader(Map headers) { - return headers.get("header"); - } - - @Override - public List testMapForm(MultivaluedMap params) { - return params.get("form"); - } - - @Override - public String header(String header) { - return header; - } - - @Override - public int headerInt(int header) { - return header; - } - - - @Override - public Integer hello(Integer a, Integer b) { - return a + b; - } - - - @Override - public String error() { - throw new RuntimeException("test error"); - } - -} -```` -Consumer -````java -@Component -public class JaxRsRestDemoService { - @DubboReference(interfaceClass = JaxRsRestDemoService.class) - JaxRsRestDemoService jaxRsRestDemoService; - - public void jaxRsRestDemoServiceTest(ClassPathXmlApplicationContext context) { - JaxRsRestDemoService jaxRsRestDemoService = context.getBean("jaxRsRestDemoService", JaxRsRestDemoService.class); - String hello = jaxRsRestDemoService.sayHello("hello"); - assertEquals("Hello, hello", hello); - Integer result = jaxRsRestDemoService.primitiveInt(1, 2); - Long resultLong = jaxRsRestDemoService.primitiveLong(1, 2l); - long resultByte = jaxRsRestDemoService.primitiveByte((byte) 1, 2l); - long resultShort = jaxRsRestDemoService.primitiveShort((short) 1, 2l, 1); - - assertEquals(result, 3); - assertEquals(resultShort, 3l); - assertEquals(resultLong, 3l); - assertEquals(resultByte, 3l); - - assertEquals(Long.valueOf(1l), jaxRsRestDemoService.testFormBody(1l)); - - MultivaluedMapImpl forms = new MultivaluedMapImpl<>(); - forms.put("form", Arrays.asList("F1")); - - assertEquals(Arrays.asList("F1"), jaxRsRestDemoService.testMapForm(forms)); - assertEquals(User.getInstance(), jaxRsRestDemoService.testJavaBeanBody(User.getInstance())); - } - -} -```` - - -## 使用场景 - - 因为dubbo http consumer一端实现http 调用的RestClient 实现有三种形式:httpclient,okhttp,URLConnection(jdk内置) - 默认请情况下采用okhttp,因此在使用dubbo http 去调用其他http服务时,需要添加引入的依赖有 - -````xml - - org.apache.dubbo - dubbo-rpc-rest - ${dubbo-rpc-rest_version} - - - - com.squareup.okhttp3 - mockwebserver - ${okhttp_version} - - 或 - - org.apache.httpcomponents - httpclient - ${httpclient_version} - -```` - -- 微服务服务调用dubbo http - -````java - -/** - * URL rest://localhost:8888/services - * rest: protocol - * localhost:8888: server address - * services: context path - */ -@DubboReference(interfaceClass = HttpService.class ,url = "rest://localhost:8888/services",version = "1.0.0",group = "test") - HttpService httpService; - - public void invokeHttpService() { - String http = httpService.http("Others Java Architecture Invoke Dubbo Rest"); - System.out.println(http); - } -```` - -- 跨语言调用 - - python - ```` - import requests - url = 'http://localhost:8888/services/curl' - headers = { - 'rest-service-group': 'test', - 'rest-service-version': '1.0.0' - } - response = requests.get(url, headers=headers) - ```` - - go - ```` - import ( - "fmt" - "net/http" - ) - - func main() { - url := "http://localhost:8888/services/curl" - req, err := http.NewRequest("GET", url, nil) - if err != nil { - fmt.Println("Error creating request:", err) - return - } - - req.Header.Set("rest-service-group", "test") - req.Header.Set("rest-service-version", "1.0.0") - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - fmt.Println("Error sending request:", err) - return - } - - defer resp.Body.Close() - - -- 多协议发布 - - dubbo 协议的代码使用http 进行数据请求测试 - - 服务协议迁移 - -````java -@DubboService(interfaceClass = HttpService.class, protocol = "rest,dubbo", version = "1.0.0", group = "test") -public class HttpServiceImpl implements HttpService { - - - @Override - public String http(String invokeType) { - return "Rest http request test success! by invokeType: " + invokeType; - } -} -```` - - - http client组件调用dubbo http(可以不引入 service api) - -````java -public class HttpClientInvoke { - - - private final String versionHeader = RestHeaderEnum.VERSION.getHeader(); - private final String groupHeader = RestHeaderEnum.GROUP.getHeader(); - /** - * contextPath services - */ - private final String url = "http://localhost:8888/services/http"; - - - public void httpServiceHttpClientInvoke() throws IOException { - CloseableHttpClient httpClient = createHttpClient(); - HttpRequestBase httpUriRequest = new HttpGet(url); - httpUriRequest.addHeader(versionHeader, "1.0.0"); - httpUriRequest.addHeader(RestConstant.ACCEPT, "text/plain"); - httpUriRequest.addHeader(groupHeader, "test"); - httpUriRequest.addHeader("type", "Http Client Invoke Dubbo Rest Service"); - CloseableHttpResponse response = httpClient.execute(httpUriRequest); - - RestResult restResult = parseResponse(response); - - System.out.println(new String(restResult.getBody())); - } - - private RestResult parseResponse(CloseableHttpResponse response) { - return new RestResult() { - @Override - public String getContentType() { - return response.getFirstHeader("Content-Type").getValue(); - } - - @Override - public byte[] getBody() throws IOException { - if (response.getEntity() == null) { - return new byte[0]; - } - return IOUtils.toByteArray(response.getEntity().getContent()); - } - - @Override - public Map> headers() { - return Arrays.stream(response.getAllHeaders()).collect(Collectors.toMap(Header::getName, h -> Collections.singletonList(h.getValue()))); - } - - @Override - public byte[] getErrorResponse() throws IOException { - return getBody(); - } - - @Override - public int getResponseCode() { - return response.getStatusLine().getStatusCode(); - } - - @Override - public String getMessage() throws IOException { - return appendErrorMessage(response.getStatusLine().getReasonPhrase(), - new String(getErrorResponse())); - } - }; - } - - - private CloseableHttpClient createHttpClient() { - PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); - return HttpClients.custom().setConnectionManager(connectionManager).build(); - } -} -```` - -## 3.2 与 3.0 HTTP 实现对比 - -因为 Dubbo Java 3.2 内部移除了原本 Resteasy 的实现,因此在对 Resteasy 内置的 Response,extend,ExceptionMapper 支持上将会有所变化 -ExceptionMapper 转换成了org.apache.dubbo.rpc.protocol.rest.exception.mapper.ExceptionHandler,Response后面也会做适配处理 - -| 版本 | JaxRs| j2ee | web容器(tomcat/jetty)|spring web| http client\(okhttp/httpclient/jdk URLConnnection ) -| ---- | ---- |--- |--- |--- |---| -| 3.0 | 依赖与resteasy的client和server |遵循j2ee规范|依赖常见web容器|不依赖|不依赖 -| 3.2 | 不依赖(仅需要JaxRs注解包) |不遵循|netty实现的http服务器|仅依赖spring web注解|内部实现RestClient依赖http client(默认为okhttp) diff --git a/content/zh-cn/overview/reference/protocols/tcp.md b/content/zh-cn/overview/reference/protocols/tcp.md index 8a19320ac51f..f65ce0e8d511 100644 --- a/content/zh-cn/overview/reference/protocols/tcp.md +++ b/content/zh-cn/overview/reference/protocols/tcp.md @@ -6,6 +6,8 @@ type: docs weight: 2 --- +Dubbo 协议是基于 TCP 传输层之上构建的私有 RPC 通信协议,协议采用单一长连接和 NIO 异步通讯模式,适合于小数据量大并发的服务调用,具有传输时延小、吞吐量高等特点。 + ![/dev-guide/images/dubbo_protocol_header.jpg](/imgs/dev/dubbo_protocol_header.png) ## 协议规范 Specification diff --git a/content/zh-cn/overview/tasks/protocols/_index.md b/content/zh-cn/overview/tasks/protocols/_index.md index 7bdb084d7b01..66480e989f69 100755 --- a/content/zh-cn/overview/tasks/protocols/_index.md +++ b/content/zh-cn/overview/tasks/protocols/_index.md @@ -10,7 +10,7 @@ type: docs weight: 6 --- - +在此,我们再介绍几种 {{< blocks/section color="white" height="auto">}}
@@ -26,16 +26,6 @@ weight: 6
-
-
-
-

- 使用 Dubbo 开发 Web 应用 -

-

演示使用 Dubbo 对外暴露 HTTP 接口,支持 Spring Web 标准开发方式。

-
-
-
@@ -50,9 +40,9 @@ weight: 6

- 单端口多协议发布服务 + 基于IDL开发

-

演示如何在一个应用内发布多个使用不同协议的服务,并通过唯一的一个端口对外发布。

+

演示 Dubbo 如何简化 gRPC 服务开发。

diff --git a/content/zh-cn/overview/tasks/protocols/dubbo.md b/content/zh-cn/overview/tasks/protocols/dubbo.md deleted file mode 100644 index 539f63c38998..000000000000 --- a/content/zh-cn/overview/tasks/protocols/dubbo.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -description: "使用 Dubbo 开发 TCP 通信协议服务" -linkTitle: 开发 Dubbo2 服务 -title: 使用 Dubbo 开发 TCP 通信协议服务 -type: docs -weight: 1 ---- - -文档编写中... \ No newline at end of file diff --git a/content/zh-cn/overview/tasks/protocols/grpc.md b/content/zh-cn/overview/tasks/protocols/grpc.md index a7eb9a05ec6c..7ff276266479 100644 --- a/content/zh-cn/overview/tasks/protocols/grpc.md +++ b/content/zh-cn/overview/tasks/protocols/grpc.md @@ -1,11 +1,53 @@ --- aliases: - /zh/overview/tasks/protocols/grpc/ -description: "使用 Dubbo 开发 gRPC 服务" -linkTitle: 开发 gRPC 服务 +description: "使用 Dubbo 开发与 gRPC 互通的服务" +linkTitle: 开发gRPC兼容的服务 title: 使用 Dubbo 开发 gRPC 服务 type: docs weight: 1 --- -文档编写中... \ No newline at end of file +这个示例演示了如何使用 Triple 协议实现 Dubbo 服务与标准 gRPC 服务的互相调用。 +> 本示例用 Java 语言编写。对于 Go、Node.js、Rust 等其他 Dubbo 语言实现,同样具备与 gRPC 协议互通的能力,具体请参见相应 sdk 文档。 + +其他相关示例: +* [基于 IDL 的 Triple 协议编码方式](../triple/) +* [无 IDL 的 Triple 协议编码方式](/zh-cn/overview/quickstart/rpc/java/) + +![triple-grpc.png](/imgs/v3/reference/protocol/triple-grpc.png) + +就像在 [Triple协议规范](https://dubbo.apache.org/zh-cn/overview/reference/protocols/triple/) 中所描述的,Triple 协议与 gRPC 协议保持 100% 兼容,同时在易用性方面有了非常大的提升(比如支持 cURL、浏览器直接访问等),可以说 Triple 是一个更好用的 gRPC 设计与实现。 + +## 作为标准的 gRPC Server +在这一部分,我们会发布一个 Dubbo Triple Server,然后启动一个标准的 gRPC 消费端(采用 grpc-java 编码)来调用 Triple 服务。示例源码在 [dubbo-samples-triple-grpc](https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-triple-grpc),请下载源码并依照以下命令体验。 + +### 启动 Dubbo server +Make sure you are in `dubbo-samples-triple-grpc` directory and then run the following command: + +```shell +$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.grpc.interop.server.TriOpServer" +``` + +### 使用标准 gRPC client 调用 Triple 服务 +Open a new terminal, enter `dubbo-samples-triple-grpc` directory and then run the following command: + +```shell +$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.grpc.interop.server.GrpcClient" +``` + +## 调用标准的 gRPC Server +This part showcases how Triple client written with Dubbo consumes gRPC service written with standard gRPC-java. + +### 启动标准 gRPC server +```shell +$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.grpc.interop.client.GrpcServer" +``` + +### 使用 Dubbo client 调用标准 gRPC 服务 +```shell +$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.grpc.interop.client.TriOpClient" +``` + + + diff --git a/content/zh-cn/overview/tasks/protocols/multi-protocols.md b/content/zh-cn/overview/tasks/protocols/multi-protocols.md deleted file mode 100644 index f8257244ea6d..000000000000 --- a/content/zh-cn/overview/tasks/protocols/multi-protocols.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -aliases: - - /zh/overview/tasks/protocols/multi-protocols/ -description: "" -linkTitle: 单端口多协议 -title: 发布使用不同协议的多个服务,通过单端口监听 -type: docs -weight: 4 ---- - - - -## 特性说明 -通过对protocol进行配置,dubbo3可以支持端口的协议复用。 -比如使用Triple协议启动端口复用后,可以在相同的端口上为服务增加 -Dubbo协议支持,以及Qos协议支持。这些协议的识别都是由一个统一的端口复用 -服务器进行处理的,可以用于服务的协议迁移,并且可以节约端口以及相关的资源,减少运维的复杂性。 - -![pu-server-image1](/imgs/blog/pu-server/pu-server-flow.png) - -- 在服务的创建阶段,通过从Config层获取到服务导出的协议配置从而创建不同的Protocol对象进行导出。在导出的过程 -中,如果不是第一次创建端口复用的Server,那么Exchanger会将Protcol层传递的数据保存到Server,用于后续处理该协议类型的消息。 - -- 当客户端的消息传递过来后,首先会通过Server传递给ProtocolDetector,如果完成了识别,那么就会标记该客户端为对应的协议。并通过WireProtocol配置对应的处理逻辑,最后交给ChannelOperator完成底层的IO框架和对应的Dubbo框架的处理逻辑的绑定。 - -- 以上的协议识别完成之后,Channel已经确定了如何处理远程的客户端消息,通过对应的ServerPipeline进行处理即可(在处理的过程中也会根据配置信息决定消息的处理线程)。 - -## 使用方式 -在同一主机上部署多个服务或需要通过负载均衡器访问多个服务。 - -## 参考用例 -[https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-port-unification](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-port-unification) - - -## 配置方式 - -关于Dubbo支持的配置方式,可以参考[配置说明](/zh-cn/overview/mannual/java-sdk/reference-manual/config/) - -### 服务多协议导出 - -ext-protocol参数支持配置多个不同的协议,协议之间通过","进行分隔。 - -#### xml 配置 - -```xml - - - - - - -``` - -#### API 配置 - -```java -ProtocolConfig config = new ProtocolConfig(CommonConstants.TRIPLE, -1); - -config.setExtProtocol(CommonConstants.DUBBO+","); -``` - -#### yaml 配置 - -``` yaml -dubbo: - application: - name: dubbo-springboot-demo-provider - protocol: - name: tri - port: -1 - ext-protocol: dubbo, -``` - -#### properties 配置 -```properties -dubbo.protocol.name=tri -dubbo.protocol.ext-protocol=dubbo, -dubbo.protocol.port=20880 -``` - -### Qos接入 - -#### Qos模块导入 - -```xml - - org.apache.dubbo - dubbo-qos - -``` - -完成Qos模块的导入之后,相关的配置项可参考[Qos操作手册](/zh-cn/overview/mannual/java-sdk/reference-manual/qos/overview/)进行配置。 - -默认情况下,基于端口复用的Qos服务在模块导入后是启动的。 - -## 使用方式 - -### Qos使用 - -将Qos协议接入到端口复用的场景下,需要在建立连接之后,客户端先向服务端发送消息,对比将Qos协议通过单个端口提供服务,端口复用版的Qos协议在处理telnet连接的情况下需要用户执行一些操作,完成协议识别(二选一)。 - -1. 直接调用命令 - - 直接调用telnet支持的命令也可以完成识别,在用户不熟悉的情况下可以调用help指令完成识别 - - ![pu-server-image2](/imgs/blog/pu-server/qos-telnet-directcall.png) - -2. 发送telnet命令识别 - - 通过telnet命令建立连接之后,执行以下几个步骤: - - 1. 使用 crtl + "]" 进入到telnet交互界面(telnet默认的escape character) - 2. 调用 "send ayt" 向服务端发送特殊识别字段(为telnet协议的一个特殊字段) - 3. 回车完成消息发送并进入到dubbo的交互界面 - - ![pu-server-imgs3](/imgs/blog/pu-server/qos-telnet-sendayt.png) - - -### 服务引用 - -以[dubbo-samples-port-unification](https://github.com/apache/dubbo-samples/tree/master/3-extensions/protocol/dubbo-samples-port-unification)中的例子作为基础, 引用不同协议的服务和非端口复用情况下的配置是一致的,下面通过Consumer端的InvokerListener输出调用过程中的URL信息。 - -```java -ReferenceConfig reference = new ReferenceConfig<>(); -reference.setInterface(GreetingService.class); -reference.setListener("consumer"); -reference.setProtocol(this.protocol); -// reference.setProtocol(CommonConstants.DUBBO); -// reference.setProtocol(CommonConstants.TRIPLE); -``` - -![pu-server-imgs4](/imgs/blog/pu-server/reference-service.png) diff --git a/content/zh-cn/overview/tasks/protocols/springcloud.md b/content/zh-cn/overview/tasks/protocols/springcloud.md index 50c39d526cea..3be50c7e75bd 100644 --- a/content/zh-cn/overview/tasks/protocols/springcloud.md +++ b/content/zh-cn/overview/tasks/protocols/springcloud.md @@ -2,11 +2,205 @@ aliases: - /zh/overview/tasks/protocols/springcloud/ description: "" -linkTitle: 调用 Spring Cloud +linkTitle: 调用Spring Cloud服务 title: 使用 Dubbo 作为消费端调用 Spring Cloud 服务 type: docs weight: 3 --- +> 本示例仅支持 Dubbo 3.3.0 及以上版本! +本示例使用 Nacos 作为注册中心,演示如何实现 Dubbo 与 Spring Cloud 体系的自动地址发现与服务调用。在注册中心方面,你也可以选用 Zookeeper、Consul 等两种体系都支持的注册中心。 -最新版本的 Dubbo3、Spring Cloud 体系互通方案已经设计完成,相关示例文档将在随后发布。 +![dubbo-springcloud](/imgs/v3/tasks/protocol/springcloud/http-usecase-1.png) + +借助 Dubbo3 内置的 rest 编程范式支持,可以做到基本不改动任何代码的情况下实现 Dubbo 与 Spring Cloud 体系的互相调用。 +* 关于这一部分的使用场景及理论阐述请参见这里的[博客文章](https://dubbo.apache.org/zh-cn/blog/2023/01/05/dubbo-%E8%BF%9E%E6%8E%A5%E5%BC%82%E6%9E%84%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%BD%93%E7%B3%BB-%E5%A4%9A%E5%8D%8F%E8%AE%AE%E5%A4%9A%E6%B3%A8%E5%86%8C%E4%B8%AD%E5%BF%83/)。 +* 关于 Dubbo rest 的更多配置方式请参见[rest 使用参考手册](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/rest/) + +## Dubbo 调用 Spring Cloud +设想你已经有一套 Spring Cloud 的微服务体系,现在我们将引入 Dubbo 框架,让 Dubbo 应用能够正常的调用到 Spring Cloud 发布的服务。本示例的相关源码在[samples/dubbo-call-sc](https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-springcloud/dubbo-call-sc)。 + +### 启动 Spring Cloud Server +示例中 Spring Cloud 应用的结构如下 + +![spring-cloud-server](/imgs/v3/tasks/protocol/springcloud/springcloud-server.png) + +应用配置文件如下: +```yaml +server: + port: 8099 +spring: + application: + name: spring-cloud-provider-for-dubbo + cloud: + nacos: + serverAddr: 127.0.0.1:8848 #注册中心 +``` + +以下是一个非常简单的 Controller 定义 + +```java +@RestController +@RequestMapping("/users") +public class UserController { + @GetMapping("/list") + public List getUser() { + return Collections.singletonList(new User(1L, "spring cloud server")); + } +} +``` + +启动 `SpringCloudApplication`,通过 `http://localhost:8099/users/list` 可以测试应用启动成功。 + +### 使用 Dubbo Client 调用服务 +Dubbo client 也是一个标准的 Dubbo 应用,项目基本结构如下: + +![dubbo-consumer](/imgs/v3/tasks/protocol/springcloud/dubbo-consumer.png) + +其中,一个比较关键的是如下接口定义,正常情况下,以下接口可以直接从原有的 Spring Cloud client 应用中原样拷贝过来即可,无需做任何修改。 +> 如果之前没有基于 OpenFeign 的 Spring Cloud 消费端应用,那么就需要自行定义一个接口,使用 Spring MVC 标准注解即可。 + +```java +@FeignClient(name = "spring-cloud-provider-for-dubbo") +public interface UserServiceFeign { + @RequestMapping(value="/users/list", method = RequestMethod.GET, produces = "application/json") + List users(); +} +``` + +通过 `DubboReference` 注解将 UserServiceFeign 注册为 Dubbo 服务 + +```java +@DubboReference +private UserServiceFeign userService; +``` + +接下来,我们就可以对服务发起调用了 + +```java +List users = userService.users(); +``` + +通过 `DubboConsumerApplication` 启动 Dubbo 应用,验证可以成功调用到 Spring Cloud 服务。 + +## Spring Cloud 调用 Dubbo +在接下来的示例中,我们将展示如何将 Dubbo server 发布的服务开放给 Spring Cloud client 调用。示例的相关源码在[samples/sc-call-dubbo](https://github.com/apache/dubbo-samples/tree/master/2-advanced/dubbo-samples-springcloud/sc-call-dubbo) + +### 启动 Dubbo Server +Dubbo server 应用的代码结构非常简单,是一个典型的 Dubbo 应用。 + +![dubbo-server](/imgs/v3/tasks/protocol/springcloud/dubbo-server.png) + +相比于普通的 Dubbo 服务定义,我们要在接口上加上如下标准 Spring MVC 注解: + +```java +@RestController +@RequestMapping("/users") +public interface UserService { + @GetMapping(value = "/list") + List getUsers(); +} +``` + +除了以上注解之外,其他服务发布等流程都一致,使用 `DubboService` 注解发布服务即可: + +```java +@DubboService +public class UserServiceImpl implements UserService { + @Override + public List getUsers() { + return Collections.singletonList(new User(1L, "Dubbo provider!")); + } +} +``` + +在服务配置上,特别注意我们需要将服务的协议配置为 rest `protocol: rest`,地址发现模式使用 `register-mode: instance`: + +```yaml +dubbo: + registry: + address: nacos://127.0.0.1:8848 + register-mode: instance + protocol: + name: rest + port: 8090 +``` + +启动 Dubbo 应用,此时访问以下地址可以验证服务运行正常:`http://localhost:8090/users/list` + +### 使用 Spring Cloud 调用 Dubbo +使用 OpenFeign 开发一个标准的 Spring Cloud 应用,即可调用以上发布的 Dubbo 服务,项目代码结构如下: + +![springcloud-consumer](/imgs/v3/tasks/protocol/springcloud/springcloud-consumer.png) + +其中,我们定义了一个 OpenFeign 接口,用于调用上面发布的 Dubbo rest 服务。 +```java +@FeignClient(name = "dubbo-provider-for-spring-cloud") +public interface UserServiceFeign { + @RequestMapping(value = "/users/list", method = RequestMethod.GET) + List getUsers(); +} +``` + +定义以下 controller 作为 OpenFeign 和 RestTemplate 测试入口。 + +```java +public class UserController { + + private final RestTemplate restTemplate; + private final UserServiceFeign userServiceFeign; + + public UserController(RestTemplate restTemplate, + UserServiceFeign userServiceFeign) { + this.restTemplate = restTemplate; + this.userServiceFeign = userServiceFeign; + } + + @RequestMapping("/rest/test1") + public String doRestAliveUsingEurekaAndRibbon() { + String url = "http://dubbo-provider-for-spring-cloud/users/list"; + System.out.println("url: " + url); + return restTemplate.getForObject(url, String.class); + } + + @RequestMapping("/rest/test2") + public List doRestAliveUsingFeign() { + return userServiceFeign.getUsers(); + } +} +``` + +可以分别访问以下地址进行验证: +* OpenFeign 方式:`http://localhost:8099/dubbo/rest/test1`、 +* RestTemplage 方式:`http://localhost:8099/dubbo/rest/test1` + +### 为 Dubbo Server 发布更多的服务 +我们可以利用 Dubbo 的多协议发布机制,为一些服务配置多协议发布。接下来,我们就为上面提到的 Dubbo server 服务增加 triple 协议发布,从而达到以下部署效果,让这个 Dubbo 应用同时服务 Dubbo 微服务体系和 Spring Cloud 微服务体系。 + + + +为了实现这个效果,我们只需要在配置中增加多协议配置即可: +```yaml +dubbo: + protocols: + - id: rest + name: rest + port: 8090 + - id: dubbo + name: dubbo + port: 50051 +``` + +服务注解中配置为多协议发布 + +```java +@DubboService(protocol="rest,dubbo") +public class UserServiceImpl implements UserService {} +``` + +这样,我们就成功的将 UserService 服务以 dubbo 和 rest 两种协议发布了出去(多端口多协议的方式),dubbo 协议为 Dubbo 体系服务,rest 协议为 Spring Cloud 体系服务。 + +> **注意:**Dubbo 为多协议发布提供了单端口、多端口两种方式,这样的灵活性对于不同部署环境下的服务会有比较大的帮助。在确定您需要的多协议发布方式前,请提仔细阅读以下 [多协议配置](/zh-cn/overview/mannual/java-sdk/advanced-features-and-usage/service/multi-protocols) 文档。 + +## 总结 +基于 Dubbo 的 rest 编程范式、多协议发布等特性,可以帮助你轻松的实现从 Dubbo 到 Spring Cloud 或者从 Spring Cloud 到 Dubbo 的平滑迁移(无改造成本),同时也可以实现 Dubbo 与 Spring Cloud 两套体系的共存。 diff --git a/content/zh-cn/overview/tasks/protocols/triple.md b/content/zh-cn/overview/tasks/protocols/triple.md index 84f49fdf76e3..26ea53ebb0d6 100644 --- a/content/zh-cn/overview/tasks/protocols/triple.md +++ b/content/zh-cn/overview/tasks/protocols/triple.md @@ -1,9 +1,261 @@ --- description: "使用 Dubbo 开发 Triple 协议通信服务" -linkTitle: 开发 Triple 服务 +linkTitle: 使用IDL开发Triple服务 title: 使用 Dubbo 开发 Triple 协议通信服务 type: docs weight: 1 --- -文档编写中... +本示例演示如何使用 Protocol Buffers 定义服务,并将其发布为对外可调用的 Triple 协议服务。示例采用 Java 语言编写,其他语言的 Triple 协议方式请参考快速开始部分,更多详细说明可参考多语言sdk。 + +* 考虑到对过往版本的兼容性,Dubbo 当前的各个发行版本均默认使用 `dubbo` 通信协议(基于 TCP 的高性能私有协议),老用户请参考文档了解[如何实现协议的平滑迁移](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/migration)。对于没有特殊诉求的新用户,建议在一开始就通过配置开启 `triple` 协议。 +* 更多 Triple 协议使用请参见 + * [流式通信 Streaming RPCs](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/streaming) + * [实现与标准 gRPC 协议互调](../grpc) + * [基于 Java Interface 的开发模式(无 IDL 模式)](/zh-cn/overview/mannual/java-sdk/reference-manual/protocol/triple/pojo) + * [如何在其他语言和浏览器上使用 Triple 协议](/zh-cn/overview/quickstart/rpc) + + +## 运行示例 +可在此查看[本示例的完整代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 + +首先可通过以下命令下载示例源码 +```shell +git clone https://github.com/apache/dubbo-samples.git +``` + +编译项目,由 IDL 生成代码 +```shell +cd dubbo-samples/1-basic/dubbo-samples-triple-unary +mvn clean compile +``` + +### 启动 Server +运行以下命令启动 server。 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryServer" +``` + +### 访问服务 +有两种方式可以访问 Triple 服务: +* 以标准 HTTP 工具访问 +* 以 Dubbo client sdk 访问 + +#### cURL 访问 + +```shell +curl \ + --header "Content-Type: application/json" \ + --data '[{"name": "Dubbo"}]' \ + http://localhost:50052/org.apache.dubbo.samples.tri.unary.Greeter/greet/ +``` + +#### Dubbo client 访问 +运行以下命令,启动 Dubbo client 并完成服务调用 +```shell +mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.samples.tri.unary.TriUnaryClient" +``` + +## 示例讲解 +可在此查看 [完整示例代码](https://github.com/apache/dubbo-samples/tree/master/1-basic/dubbo-samples-triple-unary)。 + +### 项目依赖 +由于使用 IDL 开发模式,因此要添加 dubbo、protobuf-java 等依赖,同时还要配置 protobuf-maven-plugin 等插件,用于生成桩代码。 + +```xml + + + + org.apache.dubbo + dubbo + ${dubbo.version} + + + com.google.protobuf + protobuf-java + 3.19.6 + + + org.apache.dubbo + dubbo-dependencies-zookeeper-curator5 + ${dubbo.version} + pom + + + + + + + kr.motd.maven + os-maven-plugin + 1.6.1 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier} + + + dubbo + org.apache.dubbo + dubbo-compiler + ${dubbo.version} + org.apache.dubbo.gen.tri.Dubbo3TripleGenerator + + + + + + + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${source.level} + ${target.level} + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.3.0 + + + generate-sources + + add-source + + + + target/generated-sources/protobuf/java + + + + + + + + +``` + +### 服务定义 +使用 Protocol Buffers 定义服务 + +```protobuf +syntax = "proto3"; + +option java_multiple_files = true; + +package org.apache.dubbo.samples.tri.unary; + +message GreeterRequest { + string name = 1; +} + +message GreeterReply { + string message = 1; +} + +service Greeter{ + rpc greet(GreeterRequest) returns (GreeterReply); +} +``` + +### 代码生成 +执行 `mvn clean compile` 后,生成代码如下 + +```text +└── org + └── apache + └── dubbo + └── samples + └── tri + └── unary + ├── DubboGreeterTriple.java + ├── Greeter.java + ├── GreeterOuterClass.java + ├── GreeterReply.java + ├── GreeterReplyOrBuilder.java + ├── GreeterRequest.java + └── GreeterRequestOrBuilder.java +``` + +### 服务实现 +继承生成的基础类 `DubboGreeterTriple.GreeterImplBase`,以下具体的业务逻辑实现。 + +```java +public class GreeterImpl extends DubboGreeterTriple.GreeterImplBase { + @Override + public GreeterReply greet(GreeterRequest request) { + LOGGER.info("Server {} received greet request {}", serverName, request); + return GreeterReply.newBuilder() + .setMessage("hello," + request.getName()) + .build(); + } +} +``` + +注册服务到 server,其中 protocol 设置为 tri 代表开启 triple 协议。 + +```java +public class TriUnaryServer { + public static void main(String[] args) throws IOException { + new EmbeddedZooKeeper(TriSampleConstants.ZK_PORT, false).start(); + ServiceConfig service = new ServiceConfig<>(); + service.setInterface(Greeter.class); + service.setRef(new GreeterImpl("tri-stub")); + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-server"); + applicationConfig.setQosEnable(false); + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + bootstrap.application(applicationConfig) + .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)) + .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT)) + .service(service) + .start(); + System.out.println("Dubbo triple unary server started, port=" + TriSampleConstants.SERVER_PORT); + } +} +``` + +### 编写 client 逻辑 +```java +public class TriUnaryClient { + private static final Logger LOGGER = LoggerFactory.getLogger(TriUnaryClient.class); + + public static void main(String[] args) throws IOException { + DubboBootstrap bootstrap = DubboBootstrap.getInstance(); + ReferenceConfig ref = new ReferenceConfig<>(); + ref.setInterface(Greeter.class); + ref.setProtocol(CommonConstants.TRIPLE); + ref.setProxy(CommonConstants.NATIVE_STUB); + ref.setTimeout(3000); + + ApplicationConfig applicationConfig = new ApplicationConfig("tri-stub-consumer"); + applicationConfig.setQosEnable(false); + bootstrap.application(applicationConfig).reference(ref).registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS)).start(); + Greeter greeter = ref.get(); + + //sync + unarySync(greeter); + } + + private static void unarySync(Greeter greeter) { + LOGGER.info("{} Start unary", "tri-unary-client"); + final GreeterReply reply = greeter.greet(GreeterRequest.newBuilder().setName("name").build()); + LOGGER.info("{} Unary reply <-{}", "tri-unary-client", reply); + } +} +``` + + + diff --git a/content/zh-cn/overview/tasks/protocols/web.md b/content/zh-cn/overview/tasks/protocols/web.md deleted file mode 100644 index 955210fc7020..000000000000 --- a/content/zh-cn/overview/tasks/protocols/web.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -aliases: - - /zh/overview/tasks/protocols/web/ -description: "" -linkTitle: 开发 Web 应用 -title: 使用 Dubbo 开发 Web 应用 -type: docs -weight: 2 ---- - -文档编写中... - -Dubbo3 HTTP 协议支持仍在建设中,目前最新的 3.3 开发分支已经有初版原型供体验。正式的生产可用版本预计会在 3.4/3.4 的某个正式版本发布。 - -以下是 Dubbo3 HTTP 协议与编程模式计划支持的几种业务场景: -* 调用 http 协议的微服务体系 -* 发布 http 协议的服务 -* 多协议发布,一个服务同时发布 http&dubbo 协议 - -## 调用 http 协议的微服务体系 -一个典型的应用场景是 Dubbo 调用 Spring Cloud 开发的微服务体系。 - -不同体系的互通,最关键的两点便是地址格式与编码协议的兼容,只要 Dubbo 能自动发现 SpringCloud 体系的地址并能基于 HTTP 协议进行通信即可。Dubbo3 可以做到: -* 支持 SpringCloud 体系的服务发现地址格式 -* 支持 HTTP+JSON 的数据传输格式 - -![img](/imgs/v3/tasks/protocol/http-usecase-1.png) - -基于以上分析,当我们需要调用 Spring Cloud 体系的服务时,只需要在 Dubbo 侧编写标准的 Dubbo Reference 服务引用就可以。同时,为了简化开发工作,**Dubbo 支持标准的 Spring Web 注解**,因此,如果你可以直接在 Dubbo 中复用 Spring Cloud 中的接口定义: - -Spring Cloud 侧的服务定义: -```java -interface SpringCloudRestService { - //xxx -} -``` - -在 Dubbo 侧唯一要做的工作就是定义 Dubbo Reference: - -```java -@DubboReference -private SpringCloudRestService restService; -``` - -## 发布 http 协议的服务 - - -## 多协议发布 - -![img](/imgs/v3/tasks/protocol/http-usecase-1.png) diff --git a/content/zh-cn/overview/tasks/traffic-management/_index.md b/content/zh-cn/overview/tasks/traffic-management/_index.md index 4c82de14e9ed..8ed4c8bd336f 100755 --- a/content/zh-cn/overview/tasks/traffic-management/_index.md +++ b/content/zh-cn/overview/tasks/traffic-management/_index.md @@ -9,8 +9,6 @@ type: docs weight: 3 --- - - 此任务基于一个简单的线上商城微服务系统演示了 Dubbo 的流量管控能力。 线上商城的架构图如下: diff --git a/content/zh-cn/overview/what/_index.md b/content/zh-cn/overview/what/_index.md index bc462548b785..6555d8619e85 100644 --- a/content/zh-cn/overview/what/_index.md +++ b/content/zh-cn/overview/what/_index.md @@ -1,7 +1,7 @@ --- aliases: - /zh/overview/what/ -description: "" +description: "Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力,利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。" hide_summary: true linkTitle: 介绍 no_list: true diff --git a/content/zh-cn/overview/what/advantages/governance.md b/content/zh-cn/overview/what/advantages/governance.md index 7f7a2d6d17bc..3cef3bbb36c1 100644 --- a/content/zh-cn/overview/what/advantages/governance.md +++ b/content/zh-cn/overview/what/advantages/governance.md @@ -1,7 +1,7 @@ --- aliases: - /zh/overview/what/advantages/governance/ -description: 服务治理 +description: "在地址发现和负载均衡机制之外,Dubbo 丰富的流量管控规则可以控制服务间的流量走向和 API 调用,基于这些规则可以实现在运行期动态的调整服务行为如超时时间、重试次数、限流参数等,通过控制流量分布可以实现 A/B 测试、金丝雀发布、多版本按比例流量分配、条件匹配路由、黑白名单等,提高系统稳定性。" linkTitle: 服务治理 title: 服务治理 type: docs diff --git a/content/zh-cn/overview/what/advantages/performance.md b/content/zh-cn/overview/what/advantages/performance.md index 0066495d2edd..56833878abde 100644 --- a/content/zh-cn/overview/what/advantages/performance.md +++ b/content/zh-cn/overview/what/advantages/performance.md @@ -1,7 +1,7 @@ --- aliases: - /zh/overview/what/advantages/performance/ -description: 超高性能 +description: "Dubbo 被设计用于解决阿里巴巴超大规模的电商微服务集群实践,并在各个行业头部企业经过多年的十万、百万规模的微服务实践检验,因此,Dubbo 在通信性能、稳定性方面具有无可比拟的优势,非常适合构建近乎无限水平伸缩的微服务集群,这也是 Dubbo 从实践层面优于业界很多同类的产品的巨大优势。" linkTitle: 超高性能 title: 超高性能 type: docs diff --git a/content/zh-cn/overview/what/advantages/production-ready.md b/content/zh-cn/overview/what/advantages/production-ready.md index 7cab89010be0..f20c37066320 100644 --- a/content/zh-cn/overview/what/advantages/production-ready.md +++ b/content/zh-cn/overview/what/advantages/production-ready.md @@ -1,7 +1,7 @@ --- aliases: - /zh/overview/what/advantages/production-ready/ -description: 生产环境验证 +description: "Apache Dubbo 是一款有着数以万计企业用户的国际化开源项目,经过了多年大规模集群生产环境的检验,影响了数百万开发者,带动了大量微服务开源生态发展。Dubbo 从企业实践中孵化并走向开源,又迅速在开源社区获得了成功,大量的生产实践用户是 Dubbo 长期保持先进性、稳定性和活跃度的核心驱动力。" linkTitle: 生产环境验证 title: 生产环境验证 type: docs diff --git a/content/zh-cn/overview/what/advantages/usability.md b/content/zh-cn/overview/what/advantages/usability.md index 822400230ad5..5fdcae53e9aa 100644 --- a/content/zh-cn/overview/what/advantages/usability.md +++ b/content/zh-cn/overview/what/advantages/usability.md @@ -1,7 +1,7 @@ --- aliases: - /zh/overview/what/advantages/usability/ -description: 快速易用 +description: "无论你是计划采用微服务架构开发一套全新的业务系统,还是准备将已有业务从单体架构迁移到微服务架构,Dubbo 框架都可以帮助到你。Dubbo 让微服务开发变得非常容易,它允许你选择多种编程语言、使用任意通信协议,并且它还提供了一系列针对微服务场景的开发、测试工具帮助提升研发效率" linkTitle: 快速易用 title: 快速易用 type: docs diff --git a/content/zh-cn/overview/what/xyz-difference.md b/content/zh-cn/overview/what/advantages/xyz-difference.md similarity index 95% rename from content/zh-cn/overview/what/xyz-difference.md rename to content/zh-cn/overview/what/advantages/xyz-difference.md index 1e12b8f08439..a5653f286205 100644 --- a/content/zh-cn/overview/what/xyz-difference.md +++ b/content/zh-cn/overview/what/advantages/xyz-difference.md @@ -1,11 +1,12 @@ --- aliases: - /zh/overview/what/xyz-difference/ -description: "" + - /zh-cn/overview/what/xyz-difference/ +description: "很多开发者经常会问到 Apache Dubbo 与 Spring Cloud、gRPC 以及一些 Service Mesh 项目如 Istio 的关系,要解释清楚它们的关系并不困难,你只需要跟随这篇文章和 Dubbo 文档做一些更深入的了解,但总的来说,它们之间有些能力是重合的,但在一些场景你可以把它们放在一起使用。" linkTitle: 与 gRPC、Spring Cloud、Istio 关系 title: 与 gRPC、Spring Cloud、Istio 的关系 type: docs -weight: 2 +weight: 5 --- diff --git a/content/zh-cn/overview/core-features/_index.md b/content/zh-cn/overview/what/core-features/_index.md similarity index 80% rename from content/zh-cn/overview/core-features/_index.md rename to content/zh-cn/overview/what/core-features/_index.md index 04b79971c1ae..39fca832de3b 100755 --- a/content/zh-cn/overview/core-features/_index.md +++ b/content/zh-cn/overview/what/core-features/_index.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/ + - /zh-cn/overview/core-features/ description: Dubbo 核心特性 linkTitle: 功能 title: Dubbo 核心特性 diff --git a/content/zh-cn/overview/core-features/ecosystem.md b/content/zh-cn/overview/what/core-features/ecosystem.md similarity index 96% rename from content/zh-cn/overview/core-features/ecosystem.md rename to content/zh-cn/overview/what/core-features/ecosystem.md index bbc0e7f8dbd7..644925a864b4 100644 --- a/content/zh-cn/overview/core-features/ecosystem.md +++ b/content/zh-cn/overview/what/core-features/ecosystem.md @@ -1,6 +1,7 @@ --- aliases: - /zh-cn/overview/what/ecosystem/ + - /zh-cn/overview/core-features/ecosystem/ description: 微服务生态 feature: description: | @@ -14,7 +15,7 @@ weight: 10 Dubbo 社区和众多优秀的开源项目一起围绕 Dubbo 建立了丰富的微服务生态支持,这让开发者从选型 Dubbo 作为开发框架的第一天,就无需担心后续的服务治理诉求,Dubbo 对每一个常见问题均提供了生产级的解决方案。 -以下表格为基于最新 Dubbo Java 3.2.x 版本统计的生态组件支持情况,后续将根据开发进展持续更新。同时每个语言支持的组件完善度会有一定差异,具体请参见各个 [语言参考手册](../../mannual/) 内的详细说明 +以下表格为基于最新 Dubbo Java 3.2.x 版本统计的生态组件支持情况,后续将根据开发进展持续更新。同时每个语言支持的组件完善度会有一定差异,具体请参见各个 [语言参考手册](/zh-cn/overview/mannual/) 内的详细说明 | 功能 | 组件列表 | 组件列表 | 组件列表 | 组件列表 | 组件列表 | | --- | --- | --- | --- | --- | --- | diff --git a/content/zh-cn/overview/core-features/extensibility.md b/content/zh-cn/overview/what/core-features/extensibility.md similarity index 99% rename from content/zh-cn/overview/core-features/extensibility.md rename to content/zh-cn/overview/what/core-features/extensibility.md index dd13e4cda213..38c1b3b9a5aa 100644 --- a/content/zh-cn/overview/core-features/extensibility.md +++ b/content/zh-cn/overview/what/core-features/extensibility.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/extensibility/ + - /zh-cn/overview/core-features/extensibility/ description: 扩展适配 feature: description: | diff --git a/content/zh-cn/overview/core-features/load-balance.md b/content/zh-cn/overview/what/core-features/load-balance.md similarity index 99% rename from content/zh-cn/overview/core-features/load-balance.md rename to content/zh-cn/overview/what/core-features/load-balance.md index 5392d2eb5aa8..fb888d68931c 100644 --- a/content/zh-cn/overview/core-features/load-balance.md +++ b/content/zh-cn/overview/what/core-features/load-balance.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/load-balance/ + - /zh-cn/overview/core-features/load-balance/ description: 负载均衡 linkTitle: 负载均衡 title: 负载均衡 diff --git a/content/zh-cn/overview/core-features/more.md b/content/zh-cn/overview/what/core-features/more.md similarity index 97% rename from content/zh-cn/overview/core-features/more.md rename to content/zh-cn/overview/what/core-features/more.md index b1bb6cfc01fa..17f44509b4e3 100644 --- a/content/zh-cn/overview/core-features/more.md +++ b/content/zh-cn/overview/what/core-features/more.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/more/ + - /zh-cn/overview/core-features/more/ description: 高级功能指南 linkTitle: 更多高级功能 title: 更多高级功能 diff --git a/content/zh-cn/overview/core-features/observability.md b/content/zh-cn/overview/what/core-features/observability.md similarity index 98% rename from content/zh-cn/overview/core-features/observability.md rename to content/zh-cn/overview/what/core-features/observability.md index c61cfe430ca9..230bae6d754e 100644 --- a/content/zh-cn/overview/core-features/observability.md +++ b/content/zh-cn/overview/what/core-features/observability.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/observability/ + - /zh-cn/overview/core-features/observability/ description: 观测服务 feature: description: | diff --git a/content/zh-cn/overview/core-features/protocols.md b/content/zh-cn/overview/what/core-features/protocols.md similarity index 99% rename from content/zh-cn/overview/core-features/protocols.md rename to content/zh-cn/overview/what/core-features/protocols.md index 9ea8d86242f6..169e6215f4e8 100644 --- a/content/zh-cn/overview/core-features/protocols.md +++ b/content/zh-cn/overview/what/core-features/protocols.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/protocols/ + - /zh-cn/overview/core-features/protocols/ description: 通信协议 feature: description: | diff --git a/content/zh-cn/overview/core-features/security.md b/content/zh-cn/overview/what/core-features/security.md similarity index 99% rename from content/zh-cn/overview/core-features/security.md rename to content/zh-cn/overview/what/core-features/security.md index dbc8052372e9..cc133bf260de 100644 --- a/content/zh-cn/overview/core-features/security.md +++ b/content/zh-cn/overview/what/core-features/security.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/security/ + - /zh-cn/overview/core-features/security/ description: 认证鉴权 feature: description: | diff --git a/content/zh-cn/overview/what/core-features/service-definition.md b/content/zh-cn/overview/what/core-features/service-definition.md new file mode 100644 index 000000000000..3ae68b82438b --- /dev/null +++ b/content/zh-cn/overview/what/core-features/service-definition.md @@ -0,0 +1,44 @@ +--- +aliases: + - /zh/overview/core-features/service-definition/ + - /zh-cn/overview/core-features/service-definition/ +description: 微服务开发 +linkTitle: 微服务开发 +title: 微服务开发 +type: docs +weight: 1 +--- + +## 使用在线脚手架创建项目 + +对于 Java 体系的微服务开发,Dubbo 提供了项目脚手架来方便项目开发。开发者可以使用脚手架在 1 分钟内创建一个基于 Dubbo Spring Boot Starter 的项目。 + +脚手架支持 在线 web 页面IntelliJ IDEA 插件 两种形式。 + +1. 在线 web 页面 + + ![脚手架示例图](/imgs/v3/advantages/initializer.png) + +2. IntelliJ IDEA 官方插件 + + ![脚手架示例图](/imgs/v3/advantages/initializer_idea.png) + +关于脚手架的具体操作讲解,请参见 [使用脚手架快速创建模板项目](/zh-cn/overview/tasks/develop/template/)。 + +## 使用 dubboctl 命令行创建项目 + +你也可以使用 dubboctl 来加速项目开发,dubboctl 支持 java、go、node.js、web、rust 等多种语言类型的项目模板创建。 + +1. 首先,使用以下命令下载并安装 `dubboctl` 工具。 + + ```shell + + ```` + +2. 执行以下命令即可快速创建项目 + + ```shell + dubboctl create -l go hello + ``` + +关于 dubboctl 的更多使用方式,请参考 [dubboctl 说明文档]()。 diff --git a/content/zh-cn/overview/core-features/service-discovery.md b/content/zh-cn/overview/what/core-features/service-discovery.md similarity index 99% rename from content/zh-cn/overview/core-features/service-discovery.md rename to content/zh-cn/overview/what/core-features/service-discovery.md index a5f904a24f91..1771284ad6d8 100644 --- a/content/zh-cn/overview/core-features/service-discovery.md +++ b/content/zh-cn/overview/what/core-features/service-discovery.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/service-discovery/ + - /zh-cn/overview/core-features/service-discovery/ - /zh-cn/overview/mannual/java-sdk/concepts-and-architecture/service-discovery/ description: 服务发现 feature: diff --git a/content/zh-cn/overview/core-features/service-mesh.md b/content/zh-cn/overview/what/core-features/service-mesh.md similarity index 99% rename from content/zh-cn/overview/core-features/service-mesh.md rename to content/zh-cn/overview/what/core-features/service-mesh.md index d92e94b4a1e7..dc7323023f9c 100644 --- a/content/zh-cn/overview/core-features/service-mesh.md +++ b/content/zh-cn/overview/what/core-features/service-mesh.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/service-mesh/ + - /zh-cn/overview/core-features/service-mesh/ - /zh-cn/overview/mannual/java-sdk/concepts-and-architecture/mesh/ description: 服务网格 feature: diff --git a/content/zh-cn/overview/core-features/traffic/_index.md b/content/zh-cn/overview/what/core-features/traffic/_index.md similarity index 99% rename from content/zh-cn/overview/core-features/traffic/_index.md rename to content/zh-cn/overview/what/core-features/traffic/_index.md index 9a35369dd502..5f8e84925c9d 100755 --- a/content/zh-cn/overview/core-features/traffic/_index.md +++ b/content/zh-cn/overview/what/core-features/traffic/_index.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/traffic/ + - /zh-cn/overview/core-features/traffic/ description: 流量管控 feature: description: | diff --git a/content/zh-cn/overview/core-features/traffic/circuit-breaking.md b/content/zh-cn/overview/what/core-features/traffic/circuit-breaking.md similarity index 98% rename from content/zh-cn/overview/core-features/traffic/circuit-breaking.md rename to content/zh-cn/overview/what/core-features/traffic/circuit-breaking.md index 4b1444cd9955..f5a2ba37971d 100644 --- a/content/zh-cn/overview/core-features/traffic/circuit-breaking.md +++ b/content/zh-cn/overview/what/core-features/traffic/circuit-breaking.md @@ -1,4 +1,6 @@ --- +aliases: + - /zh-cn/overview/core-features/traffic/circuit-breaking/ description: "" linkTitle: 限流 & 熔断 title: 限流 & 熔断 diff --git a/content/zh-cn/overview/core-features/traffic/condition-rule.md b/content/zh-cn/overview/what/core-features/traffic/condition-rule.md similarity index 99% rename from content/zh-cn/overview/core-features/traffic/condition-rule.md rename to content/zh-cn/overview/what/core-features/traffic/condition-rule.md index 618f0c09b4b5..8856c1c892fa 100644 --- a/content/zh-cn/overview/core-features/traffic/condition-rule.md +++ b/content/zh-cn/overview/what/core-features/traffic/condition-rule.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/traffic/condition-rule/ + - /zh-cn/overview/core-features/traffic/condition-rule/ description: "" linkTitle: 条件路由 title: 条件路由规则 diff --git a/content/zh-cn/overview/core-features/traffic/configuration-rule.md b/content/zh-cn/overview/what/core-features/traffic/configuration-rule.md similarity index 98% rename from content/zh-cn/overview/core-features/traffic/configuration-rule.md rename to content/zh-cn/overview/what/core-features/traffic/configuration-rule.md index dd58e2911b5a..0eec2d23e523 100644 --- a/content/zh-cn/overview/core-features/traffic/configuration-rule.md +++ b/content/zh-cn/overview/what/core-features/traffic/configuration-rule.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/traffic/configuration-rule/ + - /zh-cn/overview/core-features/traffic/configuration-rule/ description: "" linkTitle: 动态配置 title: 动态配置规则 diff --git a/content/zh-cn/overview/core-features/traffic/mesh-rule.md.bak b/content/zh-cn/overview/what/core-features/traffic/mesh-rule.md.bak similarity index 100% rename from content/zh-cn/overview/core-features/traffic/mesh-rule.md.bak rename to content/zh-cn/overview/what/core-features/traffic/mesh-rule.md.bak diff --git a/content/zh-cn/overview/core-features/traffic/script-rule.md b/content/zh-cn/overview/what/core-features/traffic/script-rule.md similarity index 97% rename from content/zh-cn/overview/core-features/traffic/script-rule.md rename to content/zh-cn/overview/what/core-features/traffic/script-rule.md index 63c43b48ccf7..96cf57f40340 100644 --- a/content/zh-cn/overview/core-features/traffic/script-rule.md +++ b/content/zh-cn/overview/what/core-features/traffic/script-rule.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/traffic/script-rule/ + - /zh-cn/overview/core-features/traffic/script-rule/ description: "" linkTitle: 脚本路由 title: 脚本路由规则 diff --git a/content/zh-cn/overview/core-features/traffic/tag-rule.md b/content/zh-cn/overview/what/core-features/traffic/tag-rule.md similarity index 98% rename from content/zh-cn/overview/core-features/traffic/tag-rule.md rename to content/zh-cn/overview/what/core-features/traffic/tag-rule.md index 8d36a5fbaf59..6e382f401106 100644 --- a/content/zh-cn/overview/core-features/traffic/tag-rule.md +++ b/content/zh-cn/overview/what/core-features/traffic/tag-rule.md @@ -1,6 +1,7 @@ --- aliases: - /zh/overview/core-features/traffic/tag-rule/ + - /zh-cn/overview/core-features/traffic/tag-rule/ description: "" linkTitle: 标签路由 title: 标签路由规则 diff --git a/content/zh-cn/overview/what/overview.md b/content/zh-cn/overview/what/overview.md index 15f5ace8782d..10227fe28090 100644 --- a/content/zh-cn/overview/what/overview.md +++ b/content/zh-cn/overview/what/overview.md @@ -4,7 +4,7 @@ aliases: - /zh/docs3-v2/java-sdk/concepts-and-architecture/overall-architecture/ - /zh-cn/docs3-v2/java-sdk/concepts-and-architecture/overall-architecture/ - /zh-cn/overview/mannual/java-sdk/concepts-and-architecture/overall-architecture/ -description: "" +description: "本文介绍了 Dubbo 的基本工作原理,涵盖了服务治理控制面、数据面、通信协议、服务发现、服务治理能力、流量管控等" linkTitle: 概念与架构 title: 了解 Dubbo 核心概念和架构 type: docs diff --git a/data/download/zh/1javaReleases.yaml b/data/download/zh/1javaReleases.yaml index b9930691236f..e54de0c5bf95 100644 --- a/data/download/zh/1javaReleases.yaml +++ b/data/download/zh/1javaReleases.yaml @@ -1,7 +1,8 @@ title: Java SDK Releases type: java -extra_message: -extra_link: +extra_message: > + 社区共发布有三个主要版本:3.x、2.7.x 和 2.6.x及以下。其中, 3.x 版本是当前社区长期稳定维护版本,2.7.x 目前处于维护状态只会进行 bugfix,而 2.6.x 及以下版本已经进入 EOL 并停止维护。由于 2.7.x 与 3.x 在设计上完全兼容,我们建议这部分用户直接升级到 3.x 的最新稳定版本;2.6.x 及以下是 Dubbo 捐献 Apache 之前的版本,因此升级 3.x 过程中要注意包名等潜在兼容性问题检查。 +extra_link: "https://dubbo.apache.org/zh-cn/overview/mannual/java-sdk/upgrades-and-compatibility/" list: - name: 3.2.4 description: > @@ -17,3 +18,11 @@ list: archive: https://www.apache.org/dyn/closer.lua/dubbo/3.1.11/apache-dubbo-3.1.11-src.zip hash: https://www.apache.org/dyn/closer.lua/dubbo/3.1.11/apache-dubbo-3.1.11-src.zip.sha512 signature: https://www.apache.org/dyn/closer.lua/dubbo/3.1.11/apache-dubbo-3.1.11-src.zip.asc + - name: 2.7.21 + description: > + 2.7.x 最新 bugfix 版本,短期计划停留在 2.7 版本的用户请直接升级到该版本。 + changelog: https://github.com/apache/dubbo/releases/tag/dubbo-2.7.21 + archive: https://www.apache.org/dyn/closer.lua/dubbo/2.7.21/apache-dubbo-2.7.21-src.zip + hash: https://www.apache.org/dyn/closer.lua/dubbo/2.7.21/apache-dubbo-2.7.21-src.zip.sha512 + signature: https://www.apache.org/dyn/closer.lua/dubbo/2.7.21/apache-dubbo-2.7.21-src.zip.asc + diff --git a/layouts/partials/navbar-version-selector.html b/layouts/partials/navbar-version-selector.html index 48424056950f..8dbca27a24b4 100755 --- a/layouts/partials/navbar-version-selector.html +++ b/layouts/partials/navbar-version-selector.html @@ -3,7 +3,7 @@