Nacos 提供了 SDK 及 Open API 的方式来完成服务注册与发现等操作。
Nacos 为 Spring,Spring Boot,Spring Cloud 集成提供了相应的 JAR 包和示例。
Nacos官网,Spring Cloud > Spring Cloud Alibaba,Github > Spring Cloud Alibaba,Github > Spring Cloud Alibaba Wiki,Github > Spring Cloud Alibaba Wiki > Nacos discovery,Github > Nacos。
服务注册与发现
Nacos 提供了 SDK 及 Open API 的方式来完成服务注册与发现等操作,Open API 是 REST 接口,所以 SDK 本质上是对 HTTP 请求的封装。下面是 Open API 演示服务注册与发现。
服务注册
注册一个服务实例到Nacos 服务,上报实例的服务名、IP地址、端口号,这三个参数是必须;上传还可以包括命名空间ID,权重,是否上线,是否健康,扩展信息,集群名,分组名,是否临时实例。
请求:
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
返回:
ok
服务发现
请求:
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
返回:
{
"name": "DEFAULT_GROUP@@nacos.naming.serviceName",
"groupName": "DEFAULT_GROUP",
"clusters": "",
"cacheMillis": 10000,
"hosts": [
{
"instanceId": "192.168.0.120#8080#DEFAULT#DEFAULT_GROUP@@nacos.naming.serviceName",
"ip": "192.168.0.120",
"port": 8080,
"weight": 1.0,
"healthy": true,
"enabled": true,
"ephemeral": true,
"clusterName": "DEFAULT",
"serviceName": "DEFAULT_GROUP@@nacos.naming.serviceName",
"metadata": {},
"instanceHeartBeatInterval": 5000,
"instanceIdGenerator": "simple",
"instanceHeartBeatTimeOut": 15000,
"ipDeleteTimeout": 30000
}
],
"lastRefTime": 1618117076330,
"checksum": "",
"allIPs": false,
"reachProtectionThreshold": false,
"valid": true
}
发布配置
请求:
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
返回:
true
获取配置
请求:
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
返回:
HelloWorld
Nacos Spring
Nacos 为 Spring 集成提供了 nacos-spring-context
包。提供了注解的方式很方便地实现服务注册与发现。
官方文档 > Nacos Spring,完整示列代码请参考:nacos-spring-config-example。
Nacos Spring Boot
Nacos 为 Spring Boot 集成提供了 starter 包:nacos-config-spring-boot-starter
。
通过自动配置以及其他 Spring 编程模型的习惯用法为 Spring Boot 应用程序在服务注册与发现方面提供和 Nacos 的无缝集成。 通过一些简单的注解,就可以快速注册一个服务。
完整示例代码可参考:nacos-spring-boot-discovery-example。
添加依赖
创建 Spring Boot 应用,添加 nacos-discovery-spring-boot-starter
依赖。
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
注意:版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。
配置Nacos服务
在 application.properties
中配置 Nacos server 的地址。
nacos.discovery.server-addr=127.0.0.1:8848
注册服务
通过调用 Nacos Open API 向 Nacos server 注册一个名称为 example
服务
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'
服务发现
使用 @NacosInjected
注入 Nacos 的 NamingService
实例:
@Controller
@RequestMapping("discovery")
public class DiscoveryController {
@NacosInjected
private NamingService namingService;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
// 发现服务
return namingService.getAllInstances(serviceName);
}
}
@SpringBootApplication
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}
启动 Spring Boot 应用,调用 curl http://localhost:8080/discovery/get?serviceName=example
,返回内容为:
[
{
"instanceId": "127.0.0.1-8080-DEFAULT-example",
"ip": "127.0.0.1",
"port": 8080,
"weight": 1.0,
"healthy": true,
"cluster": {
"serviceName": null,
"name": "",
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {}
},
"service": null,
"metadata": {}
}
]
如果没有注册服,返回的是一个为空 JSON 数组[]
。
Nacos Spring Cloud
注意:本文归作者所有,未经作者允许,不得转载