SpringCloud - 服务注册与配置中心Nacos使用详解3(服务的注册、发现与消费)
同 Eureka 一样,如果在 SpringCloud 项目中接入 Nacos 作为注册中心,它同样完全兼容 Spring Cloud 的 Ribbon、Hystrix、OpenFeign 等组件。即使原先项目使用的是 Eureka 作为注册中心,想要切换成 Nacos 只需要改个依赖,加个配置就可以了,十分简单。
(3) 接着编辑 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
(4)接下来步骤就跟原先使用 Eureka 时是一样的,在主类上添加 @EnableDiscoveryClient 注解,激活 Nacos 中的 DiscoveryClient 实现:
(5)最后创建一个 Controller,提供个测试接口供后面消费者调用:
(6)启动 HanggeProviderApplication,访问 Nacos 的控制台页面,可以看到 hangge-provider 服务的注册信息:
(2)这些依赖如果创建时候没有勾选,也可等创建完毕后手动编辑 pom.xml 文件进行添加:
(3)模块创建完毕后,编辑该模块的 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
(4)接下来步骤就跟原先使用 Eureka 时是一样的,主类上添加 @EnableDiscoveryClient 注解,让该应用注册为 Nacos 客户端应用,以获得服务发现的能力。同时,在该主类中创建 RestTemplate 的 Spring Bean 实例,并通过 @LoadBalanced 注解开启客户端负载均衡。
(5)创建一个 ConsumerController并实现 /hello-consumer 接口。在该接口中,通过前面定义的 RestTemplate 来实现对 hangge-provider 服务提供的 /hello 接口进行调用:
(6)启动 HanggeConsumerApplication,再次访问 Nacos 控制台,可以看到 hangge-consumer 服务的注册信息:
(7)而使用浏览器访问 http://localhost:9000/hello-consumer 则显示如下内容,说明消费者调用服务提供者接口成功:
下面通过一个服务的发现与消费样例进行演示,样例包含三个服务实例:服务注册中心 nacos-server、服务提供者 hangge-provider、服务消费者 hangge-consumer。同时消费者通过 RestTemplate + Ribbon 的方式来进行服务调用的。
三、服务的注册、发现与消费
1,准备服务注册中心(nacos-server)
首先我们要部署好 Nacos 服务注册中心,具体步骤可以参考我之前写的文章:
2,创建服务提供者(hangge-provider)
(1)首先我们创建一个 Spring Initializr 工程,并且创建时勾选上 Spring Web 以及 Nacos Service Discovery 依赖:
(2)这些依赖如果创建时候没有勾选,也可等创建完毕后手动编辑 pom.xml 文件进行添加:
<properties> <java.version>1.8</java.version> <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
(3) 接着编辑 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
#为服务命名
spring.application.name=hangge-provider
#指定服务注册中心的地址
spring.cloud.nacos.discovery.server-addr=192.168.60.133:8848
(4)接下来步骤就跟原先使用 Eureka 时是一样的,在主类上添加 @EnableDiscoveryClient 注解,激活 Nacos 中的 DiscoveryClient 实现:
@SpringBootApplication @EnableDiscoveryClient public class HanggeProviderApplication { public static void main(String[] args) { SpringApplication.run(HanggeProviderApplication.class, args); } }
@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "欢迎访问 hangge.com"; } }
(6)启动 HanggeProviderApplication,访问 Nacos 的控制台页面,可以看到 hangge-provider 服务的注册信息:
3,创建服务消费者(hangge-consumer)
(1)同样创建一个 Spring Initializr 模块工程,名为 hangge-consumer。创建时除了勾选上 Spring Web 和 Nacos Service Discovery 依赖,还需勾选上 Ribbon 依赖:
<properties> <java.version>1.8</java.version> <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
(3)模块创建完毕后,编辑该模块的 application.properites 文件,添加如下配置为服务命名,并指定服务注册中心的地址:
#设置端口,防止冲突
server.port=9000
#为服务命名
spring.application.name=hangge-consumer
#指定服务注册中心的地址
spring.cloud.nacos.discovery.server-addr=192.168.60.133:8848
(4)接下来步骤就跟原先使用 Eureka 时是一样的,主类上添加 @EnableDiscoveryClient 注解,让该应用注册为 Nacos 客户端应用,以获得服务发现的能力。同时,在该主类中创建 RestTemplate 的 Spring Bean 实例,并通过 @LoadBalanced 注解开启客户端负载均衡。
@SpringBootApplication @EnableDiscoveryClient public class HanggeConsumerApplication { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(HanggeConsumerApplication.class, args); } }
(5)创建一个 ConsumerController并实现 /hello-consumer 接口。在该接口中,通过前面定义的 RestTemplate 来实现对 hangge-provider 服务提供的 /hello 接口进行调用:
@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @GetMapping("/hello-consumer") public String helloConsumer() { // 通过服务名调用服务提供者的接口 return restTemplate.getForEntity("http://hangge-provider/hello", String.class).getBody(); } }
(6)启动 HanggeConsumerApplication,再次访问 Nacos 控制台,可以看到 hangge-consumer 服务的注册信息: