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();
   }