Nacos 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序。
借助 Spring Cloud Alibaba Nacos Discovery,您可以快速访问基于 Spring Cloud 编程模型的 Nacos 服务注册功能。
服务发现是微服务架构中的关键组件之一。在这样的架构中,手动为每个客户端配置服务列表可能是一项艰巨的任务,并且使动态扩展变得极其困难。Nacos Discovery 帮助您将服务自动注册到 Nacos 服务器,Nacos 服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery 将服务实例的一些元数据,如主机、端口、健康检查 URL、主页等注册到 Nacos。关于如何下载和启动 Nacos,请参考Nacos 官网。
请使用组 ID 为com.alibaba.cloud
和工件 ID 为的启动器spring-cloud-starter-alibaba-nacos-discovery
。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
Nacos Discovery 与 Netflix Ribbon 集成,RestTemplate 或 OpenFeign 可用于服务到服务调用。
关于如何下载和启动 Nacos,请参考Nacos 官网。
Nacos Server启动后,到http://ip:8848查看控制台(默认账号名/密码为nacos/nacos):
图 1. Nacos 仪表板
更多 Nacos Server 版本,您可以从发布页面下载最新版本。
以下示例说明了如何向 Nacos 注册服务。
pom.xml
<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">
<modelVersion>4.0.0modelVersion>
<groupId>open.source.testgroupId>
<artifactId>nacos-discovery-testartifactId>
<version>1.0-SNAPSHOTversion>
<name>nacos-discovery-testname>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>${spring.boot.version}version>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>${spring.cloud.alibaba.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
应用程序属性
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
如果不想使用 Nacos 进行服务注册和发现,可以设置spring.cloud.nacos.discovery
为false
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
现在您可以在 Nacos 控制台上看到已注册的服务。
它可能不像启动提供者应用程序那么容易,因为消费者需要调用提供者的 RESTful 服务。在本例中,我们将使用最原始的方式,即显式结合 LoadBalanceClient 和 RestTemolate 来访问 RESTful 服务。pom.xml 和 application.properties 的配置可以参考 1.2 节。以下是启动消费者应用程序的示例代码。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);
}
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
在这个例子中,我们注入了一个 LoadBalancerClient 实例,并手动实例化了一个 RestTemplate。同时,我们将 的配置值注入spring.application.name
到应用程序中,以便在调用提供者的服务时可以显示当前的应用程序名称。
接下来,访问http://ip:port/echo/app-name
消费者提供的接口。这里我们启动了8082的端口,访问结果如下图:
地址:http://127.0.0.1:8082/echo/app-name
访问结果: 你好 Nacos Discovery nacos-consumer
Nacos Discovery 在内部提供了一个 Endpoint,对应的端点 id 为nacos-discovery
.
端点暴露的 json 包含两个属性:
以下显示了服务实例如何访问 Endpoint:
{
"subscribe": [
{
"jsonFromServer": "",
"name": "nacos-provider",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "30.5.124.156#8081#DEFAULT#nacos-provider",
"ip": "30.5.124.156",
"port": 8081,
"weight": 1.0,
"healthy": true,
"enabled": true,
"cluster": {
"serviceName": null,
"name": null,
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {
}
},
"service": null,
"metadata": {
}
}
],
"lastRefTime": 1541755293119,
"checksum": "e5a699c9201f5328241c178e804657e11541755293119",
"allIPs": false,
"key": "nacos-provider",
"valid": true
}
],
"NacosDiscoveryProperties": {
"serverAddr": "127.0.0.1:8848",
"endpoint": "",
"namespace": "",
"logName": "",
"service": "nacos-provider",
"weight": 1.0,
"clusterName": "DEFAULT",
"metadata": {
},
"registerEnabled": true,
"ip": "30.5.124.201",
"networkInterface": "",
"port": 8082,
"secure": false,
"accessKey": "",
"secretKey": ""
}
}
下面是 Nacos Discovery 的 starter 的其他配置:
配置 | 钥匙 | 默认值 | 描述 |
---|---|---|---|
服务器地址 | spring.cloud.nacos.discovery.server-addr |
Nacos Server监听的IP和端口 | |
服务名称 | spring.cloud.nacos.discovery.service |
${spring.application.name} |
命名当前服务 |
重量 | spring.cloud.nacos.discovery.weight |
1 |
取值范围:1~100,数值越大,权重越大 |
网卡名称 | spring.cloud.nacos.discovery.network-interface |
如果不指定IP地址,则注册的IP地址为网卡的IP地址。如果也没有指定,则默认使用第一块网卡的 IP 地址。 | |
注册IP地址 | spring.cloud.nacos.discovery.ip |
最高优先级 | |
注册端口 | spring.cloud.nacos.discovery.port |
-1 |
默认会自动检测。不需要配置。 |
命名空间 | spring.cloud.nacos.discovery.namespace |
一个典型的场景是隔离不同环境的服务注册,例如测试和生产环境之间的资源(配置、服务等)隔离 | |
访问密钥 | spring.cloud.nacos.discovery.access-key |
阿里云账号accesskey | |
密钥 | spring.cloud.nacos.discovery.secret-key |
阿里云账号秘钥 | |
元数据 | spring.cloud.nacos.discovery.metadata |
您可以以 Map 格式为您的服务定义一些元数据 | |
日志文件名 | spring.cloud.nacos.discovery.log-name |
||
集群名称 | spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
Nacos的集群名称 |
端点 | spring.cloud.nacos.discovery.endpoint |
特定区域中某项服务的域名。您可以使用此域名动态检索服务器地址 | |
是否集成 Ribbon | ribbon.nacos.enabled |
true |
在大多数情况下设置为 true |
启用 Nacos Watch | spring.cloud.nacos.discovery.watch.enabled |
true |
设置为 false 关闭手表 |