You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2024/04/24 03:55:13 UTC
(servicecomb-docs) branch master updated: update first example using api first (#327)
This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-docs.git
The following commit(s) were added to refs/heads/master by this push:
new 791eea1 update first example using api first (#327)
791eea1 is described below
commit 791eea12963376eb9185d0208a5b0f75f6804308
Author: liubao68 <bi...@qq.com>
AuthorDate: Wed Apr 24 11:55:07 2024 +0800
update first example using api first (#327)
---
.../docs/featured-topics/secrets/zookeeper.md | 9 ++--
.../zh_CN/docs/start/first-sample.md | 60 +++++++++++++---------
2 files changed, 40 insertions(+), 29 deletions(-)
diff --git a/java-chassis-reference/zh_CN/docs/featured-topics/secrets/zookeeper.md b/java-chassis-reference/zh_CN/docs/featured-topics/secrets/zookeeper.md
index a90c355..751dd4c 100644
--- a/java-chassis-reference/zh_CN/docs/featured-topics/secrets/zookeeper.md
+++ b/java-chassis-reference/zh_CN/docs/featured-topics/secrets/zookeeper.md
@@ -61,7 +61,7 @@ ZooKeeper自身被设计为一个高可靠的中间件,Java Chassis 3进一步
有观点认为, ZooKeeper不适合作为注册中心,一般的,CP系统都不适合作为注册中心,而AP作为注册中心才是最佳选择。 个人觉得这样的观点是片面而且非常不恰当的。
-从[ZooKeeper 并不适合做注册中心](https://blog.csdn.net/looook/article/details/109168239?spm=1001.2014.3001.5501) 和 [为什么我们要把服务注册发现改为阿里巴巴的Nacos而不用 ZooKeeper?](zoo-nacos) 摘取了几个核心观点:
+从[ZooKeeper 并不适合做注册中心](https://blog.csdn.net/looook/article/details/109168239?spm=1001.2014.3001.5501) 和 [为什么我们要把服务注册发现改为阿里巴巴的Nacos而不用 ZooKeeper?](https://blog.csdn.net/u012921921/article/details/106521181/?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1--blog-109168239.235^v43^pc_blog_bottom_relevance_base3&spm=1001.2101.3001.4242.) 摘取了几个核心观点(后面简称“观点文章”):
* 网络分区隔离情况下,ZooKeeper会导致服务间调用错误,也会导致新的服务无法注册,不适合作为注册中心。
* ZooKeeper所有写操作都在Leader进行,无法支持大规模微服务实例,不适合作为注册中心。
@@ -70,9 +70,9 @@ ZooKeeper自身被设计为一个高可靠的中间件,Java Chassis 3进一步
### 关于网络分区隔离
-网络分区隔离的场景比较多,在[Java Chassis 3技术解密:注册中心分区隔离](zone-isolation.md)描述的场景下,Java Chassis能够保证服务之间的调用不受影响。在[为什么我们要把服务注册发现改为阿里巴巴的Nacos而不用 ZooKeeper?](zoo-nacos)提到的场景中,Java Chassis也能够保证服务之间的调用不受影响,但是服务无法注册。网络分区隔离场景下,核心需要讨论的问题变成是否需要允许服务进行注册/扩容?尽管可能存在争议,但我们的观点是系统出现部分故障的情况下,系统不应该扩容,而是尽可能维持处理能力不变,这样会使得故障恢复更加可控,从而减少系统恢复时间。
+网络分区隔离的场景比较多,在[Java Chassis 3技术解密:注册中心分区隔离](zone-isolation.md)描述的场景下,Java Chassis能够保证服务之间的调用不受影响。在观点文章提到的场景中,Java Chassis也能够保证服务之间的调用不受影响,但是服务无法注册。网络分区隔离场景下,核心需要讨论的问题变成是否需要允许服务进行注册/扩容?尽管可能存在争议,但我们的观点是系统出现部分故障的情况下,系统不应该扩容,而是尽可能维持处理能力不变,这样会使得故障恢复更加可控,从而减少系统恢复时间。
-[为什么我们要把服务注册发现改为阿里巴巴的Nacos而不用 ZooKeeper?](zoo-nacos)提到的场景相对于实际部署场景还过于简单,我们把它扩展到实际场景:
+观点文章提到的场景相对于实际部署场景还过于简单,我们把它扩展到实际场景:
![](zookeeper-scale.png)
@@ -90,6 +90,3 @@ ZooKeeper只有Leader可以写入,通过扩容Learner(Follower/Observer)提升
Java Chassis 3使用ZooKeeper作为注册中心是非常好的选择,ZooKeeper可以在应用系统中同时扮演注册、配置和选举等功能,能够极大的简化应用部署和服务依赖。CP一致性也使得常见故障场景下应用程序的行为具备更好的预测性。大规模系统可以采用微服务网关来提升系统韧性,降低系统爆炸半径。
-
-zoo-nacos: https://blog.csdn.net/u012921921/article/details/106521181/?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1--blog-109168239.235^v43^pc_blog_bottom_relevance_base3&spm=1001.2101.3001.4242.
-
diff --git a/java-chassis-reference/zh_CN/docs/start/first-sample.md b/java-chassis-reference/zh_CN/docs/start/first-sample.md
index 8e60e02..f73c2e6 100644
--- a/java-chassis-reference/zh_CN/docs/start/first-sample.md
+++ b/java-chassis-reference/zh_CN/docs/start/first-sample.md
@@ -142,14 +142,26 @@ public class ProviderApplication {
```
### 编写服务
+本例子采用契约优先的开发方法。
-在工程中添加一个REST接口类用于接收请求:
+首先定义服务接口:
```java
+@RequestMapping(path = "/provider")
+public interface ProviderService {
+ @GetMapping("/sayHello")
+ String sayHello(@RequestParam("name") String name);
+
+ @GetMapping("/exampleConfig")
+ String exampleConfig();
+}
+```
+
+在工程中添加一个REST接口类用于接收请求:
-@RestSchema(schemaId = "ProviderController")
-@RequestMapping(path = "/")
-public class ProviderController {
+```java
+@RestSchema(schemaId = "ProviderController", schemaInterface = ProviderService.class)
+public class ProviderController implements ProviderService {
private DynamicProperties dynamicProperties;
private String example;
@@ -161,13 +173,12 @@ public class ProviderController {
value -> this.example = value, "not set");
}
- // a very simple service to echo the request parameter
- @GetMapping("/sayHello")
- public String sayHello(@RequestParam("name") String name) {
+ @Override
+ public String sayHello(String name) {
return "Hello " + name;
}
- @GetMapping("/exampleConfig")
+ @Override
public String exampleConfig() {
return example;
}
@@ -198,33 +209,36 @@ public class ProviderController {
### 调用服务
-在 Consumer 里面,演示了如何调用 Provider 的服务。 首先声明一个 PRC 接口, 该接口的方法名称、参数名称需要和服务端保持一致。
+在 Consumer 里面,演示了如何调用 Provider 的服务。 首先声明一个 PRC 接口的 Bean。
```java
-public interface ProviderService {
- String sayHello(String name);
-
- String exampleConfig();
+@Configuration
+public class ProviderServiceConfiguration {
+ @Bean
+ public ProviderService providerService() {
+ return Invoker.createProxy("provider", "ProviderController", ProviderService.class);
+ }
}
```
-使用 @RpcReference 声明 RPC 接口的远程引用, 然后可以像调用本地方法一样,访问 Provider 的服务。
+使用 @Autowired 声明 RPC 接口的远程引用, 然后可以像调用本地方法一样,访问 Provider 的服务。
```java
-
-@RestSchema(schemaId = "ConsumerController")
-@RequestMapping(path = "/")
-public class ConsumerController {
- @RpcReference(schemaId = "ProviderController", microserviceName = "provider")
+@RestSchema(schemaId = "ConsumerController", schemaInterface = ConsumerService.class)
+public class ConsumerController implements ConsumerService {
private ProviderService providerService;
- // consumer service which delegate the implementation to provider service.
- @GetMapping("/sayHello")
- public String sayHello(@RequestParam("name") String name) {
+ @Autowired
+ public void setProviderService(ProviderService providerService) {
+ this.providerService = providerService;
+ }
+
+ @Override
+ public String sayHello(String name) {
return providerService.sayHello(name);
}
- @GetMapping("/exampleConfig")
+ @Override
public String exampleConfig() {
return providerService.exampleConfig();
}