Spring Cloud 使用 Nacos 注册中心
Nacos Discovery
服务注册发现
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。
Nacos Discovery Starter 可以帮助我们将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。
除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息,例如 host,port,健康检查URL,主页等注册到 Nacos 。
如何引入
如果要在项目中使用 Nacos 来实现服务发现,使用 group ID 为 com.alibaba.cloud
和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery
的 starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
服务提供者
基于上一篇GoboyCloud
的基础上进行开发。其中,GoboyCloud
作为父项目,服务提供者nacos-provider
作为子项目。
添加依赖
添加nacos-provider
项目的pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Spring Cloud Nacos Provider</description>
<packaging>jar</packaging>
<dependencies>
<!-- 引入nacos 注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中,依赖 spring-cloud-starter-alibaba-nacos-discovery
是用于连接 Nacos Server 注册中心。
添加YML
bootstrap.yml
配置 Nacos Server 地址,以及服务名称:
server:
port: 9088
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:9001
group: goboy
spring.application.name
是服务名称,这个名称会在 Nacos 控制台服务列表上展示。
添加启动类
在 Spring Boot 启动主类添加@EnableDiscoveryClient
注解,开启服务注册功能。
package com.cloud.goboy.provider;
import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
添加Controller
package com.cloud.goboy.provider.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
private static final Logger logger = LoggerFactory.getLogger(ProviderController.class);
@GetMapping("/provider/{str}")
public String provider(@PathVariable String str) {
logger.info("服务提供者...... {}", str);
return str;
}
}
服务消费者
添加依赖
添加服务消费者nacos-consumer
的依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>goboycloud</artifactId>
<groupId>com.cloud.goboy</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-consumer</name>
<description>Spring Cloud Nacos Consumer</description>
<packaging>jar</packaging>
<dependencies>
<!-- 引入nacos 注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--远程客户端调用服务Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中,依赖 spring-cloud-starter-openfeign
用于使用 feign 客户端调用服务接口。
添加YML
nacos-consumer
的 bootstrap.yml
配置。
server:
port: 9044
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:9001
group: goboy
其中,服务名称为 nacos-consumer
。
添加启动类
在启动主类添加 @EnableFeignClients
注解启用 feign 客户端的使用。
添加 @EnableDiscoveryClient
注解开启服务注册功能。
package com.cloud.goboy.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
使用注解@FeignClient
定义 feign 客户端,将远程服务http://nacos-provider/provider
映射为本地方法调用。
package com.cloud.goboy.consumer.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("nacos-provider")
public interface ProviderClient {
@GetMapping(value = "/provider/{str}")
String provider(@PathVariable String str);
}
Feign 客户端能将服务名称 nacos-provider
映射为 nacos-provider
的地址。
这是由于 nacos-consumer
和 nacos-provider
都已经注册到了 Nacos Server 的注册中心。
nacos-consumer
可以从注册中心获取 nacos-provider
的 ip 及端口好。
nacos-consumer
提供 Controller 接口,可以调用 nacos-provider
接口。
添加Controller
package com.cloud.goboy.consumer.controller;
import com.cloud.goboy.consumer.service.ProviderClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConsumerController {
private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class);
@Autowired
private ProviderClient providerClient;
@GetMapping("/consumer/{str}")
public String consumer(@PathVariable String str) {
logger.info("服务消费者...... {}", str);
return providerClient.provider(str);
}
}
通过 @Autowired
注解注入,使用ProviderClient
定义的 feign 客户端。通过 feign 客户端进行远程服务接口调用。
启动服务发现
通过实现一个简单的 service
接口,演示如何在 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:
启动 nacos-consumer
和 nacos-provider
后,可以在 Nacos 控制台的服务列表中显示出两个服务
测试验证
调用接口 http://localhost:9044/consumer/hello
返回
hello
FAQ
关于 Nacos Starter 更多的配置项信息
更多关于 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置项如下所示:
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 |
服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 |
网卡名 | spring.cloud.nacos.discovery.network-interface | 无 | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 |
注册的IP地址 | spring.cloud.nacos.discovery.ip | 无 | 优先级最高 |
注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 |
AccessKey | spring.cloud.nacos.discovery.access-key | 无 | 云账号名 |
SecretKey | spring.cloud.nacos.discovery.secret-key | 无 | 云账号密码 |
Metadata | spring.cloud.nacos.discovery.metadata | 无 | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 |
日志文件名 | spring.cloud.nacos.discovery.log-name | 无 | |
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 |
接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
注册的IP地址类型 | spring.cloud.nacos.discovery.ip-type | IPv4 | 可以配置IPv4和IPv6两种类型 |