diff --git a/README.md b/README.md
index cdda5d9d..cf164c66 100644
--- a/README.md
+++ b/README.md
@@ -123,7 +123,7 @@
# Spring Cloud Alibaba 专栏
* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01)
-* 《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》
+* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02)
* 《芋道 Spring Cloud 声明式调用 OpenFeign 入门》
* 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》
* 《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》
@@ -145,7 +145,7 @@
## 服务调用
* 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》
-* 《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》
+* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02)
* 《芋道 Spring Cloud 声明式调用 OpenFeign 入门》
## 服务容错
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml
new file mode 100644
index 00000000..a971b609
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-01
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-01-sca-nacos-discovery-demo02-consumer
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java
new file mode 100644
index 00000000..aa3b7d63
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java
@@ -0,0 +1,69 @@
+package cn.iocoder.springcloudalibaba.labx01.nacosdemo.consumer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+
+@SpringBootApplication
+// @EnableDiscoveryClient
+public class DemoConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoConsumerApplication.class, args);
+ }
+
+ @Configuration
+ public class RestTemplateConfiguration {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+ }
+
+ @RestController
+ static class TestController {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private LoadBalancerClient loadBalancerClient;
+
+ @GetMapping("/hello")
+ public String hello(String name) {
+ // 获得服务 `demo-provider` 的一个实例
+ ServiceInstance instance;
+ if (true) {
+ // 获取服务 `demo-provider` 对应的实例列表
+ List instances = discoveryClient.getInstances("demo-provider");
+ // 选择第一个
+ instance = instances.size() > 0 ? instances.get(0) : null;
+ } else {
+ instance = loadBalancerClient.choose("demo-provider");
+ }
+ // 发起调用
+ if (instance == null) {
+ throw new IllegalStateException("获取不到实例");
+ }
+ String targetUrl = instance.getUri() + "/echo?name=" + name;
+ String response = restTemplate.getForObject(targetUrl, String.class);
+ // 返回结果
+ return "consumer:" + response;
+ }
+
+ }
+
+}
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..e09ff671
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml
@@ -0,0 +1,7 @@
+spring:
+ cloud:
+ nacos:
+ # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+ namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # Nacos 命名空间 dev 的编号
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml
new file mode 100644
index 00000000..bb1b405c
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml
@@ -0,0 +1,7 @@
+spring:
+ cloud:
+ nacos:
+ # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+ namespace: bc8c8c2d-bd85-42bb-ada3-1a8f940ceb20 # Nacos 命名空间 uat 的编号
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml
new file mode 100644
index 00000000..7f96276e
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml
@@ -0,0 +1,6 @@
+spring:
+ application:
+ name: demo-consumer # Spring 应用名
+
+server:
+ port: 28080 # 服务器端口。默认为 8080
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml
index 229e3265..726d27ac 100644
--- a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml
+++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml
@@ -1,6 +1,6 @@
- spring:
- application:
- name: demo-provider # Spring 应用名
+spring:
+ application:
+ name: demo-provider # Spring 应用名
- server:
- port: 18080 # 服务器端口。默认为 8080
+server:
+ port: 18080 # 服务器端口。默认为 8080
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml
new file mode 100644
index 00000000..01f6cd70
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml
@@ -0,0 +1,70 @@
+
+
+
+ labx-01
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-01-sca-nacos-discovery-demo03-consumer
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java
new file mode 100644
index 00000000..aa3b7d63
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java
@@ -0,0 +1,69 @@
+package cn.iocoder.springcloudalibaba.labx01.nacosdemo.consumer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+
+@SpringBootApplication
+// @EnableDiscoveryClient
+public class DemoConsumerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoConsumerApplication.class, args);
+ }
+
+ @Configuration
+ public class RestTemplateConfiguration {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+ }
+
+ @RestController
+ static class TestController {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+ @Autowired
+ private RestTemplate restTemplate;
+ @Autowired
+ private LoadBalancerClient loadBalancerClient;
+
+ @GetMapping("/hello")
+ public String hello(String name) {
+ // 获得服务 `demo-provider` 的一个实例
+ ServiceInstance instance;
+ if (true) {
+ // 获取服务 `demo-provider` 对应的实例列表
+ List instances = discoveryClient.getInstances("demo-provider");
+ // 选择第一个
+ instance = instances.size() > 0 ? instances.get(0) : null;
+ } else {
+ instance = loadBalancerClient.choose("demo-provider");
+ }
+ // 发起调用
+ if (instance == null) {
+ throw new IllegalStateException("获取不到实例");
+ }
+ String targetUrl = instance.getUri() + "/echo?name=" + name;
+ String response = restTemplate.getForObject(targetUrl, String.class);
+ // 返回结果
+ return "consumer:" + response;
+ }
+
+ }
+
+}
diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml
new file mode 100644
index 00000000..587e50db
--- /dev/null
+++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml
@@ -0,0 +1,23 @@
+spring:
+ application:
+ name: demo-consumer # Spring 应用名
+ cloud:
+ nacos:
+ # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+ service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。
+
+server:
+ port: 28080 # 服务器端口。默认为 8080
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+ endpoint:
+ # Health 端点配置项,对应 HealthProperties 配置类
+ health:
+ enabled: true # 是否开启。默认为 true 开启。
+ show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。
diff --git a/labx-01/pom.xml b/labx-01/pom.xml
index df6cedac..e00750f2 100644
--- a/labx-01/pom.xml
+++ b/labx-01/pom.xml
@@ -16,6 +16,9 @@
labx-01-sca-nacos-discovery-demo01-consumer
labx-01-sca-nacos-discovery-demo02-provider
+ labx-01-sca-nacos-discovery-demo02-consumer
+
+ labx-01-sca-nacos-discovery-demo03-consumer