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