Nacos是Dynamic Naming and Configuration Service的首字母简称,一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于发现、配置和管理微服务。提供了一组简单的易用的特性集,实现动态服务发现、服务配置、服务元数据及流量管理。(用来实现配置中心和服务注册中心)
Nacos 配置中心简介, Nacos 是什么 | Nacos 官网
1、Nacos的优点
- 服务发现和服务健康监测:Nacos支持基于DNS和基于RPC的服务发现。Nacos提供对服务的实时的健康检查,阻止向不健康的主机或者服务实例发送请求。Nacos支持传输层和应用层的健康检查。对于复杂的云环境和网络拓扑环境中服务的健康检查,Nacos提供了agent上报模式和服务端主动检测两种模式。Nacos还提供了统一的健康仪表盘,帮助您根据健康状态管理服务的可用性及流量。
- 动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
- 动态DNS服务:动态DNS服务支持权重路由,使得更容易实现中间层负载均衡、灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
- 服务及其元数据管理:Nacos能让你从微服务平台的视角管理数据中心的所有服务及元数据,包括管理服务描述、生命周期、服务的静态以来分析、服务的健康状态。
2、什么是服务发现
在微服务架构中一个业务流程需要多个微服务通过网络接口调用完成业务处理,服务消费方从服务注册中心获取服务提供方的地址,从而进行远程调用,这个过程叫做服务发现。
2.1 服务实现的问题
由于在微服务架构中,整个系统会按职责划分多个服务,通过服务之间协作来实现业务目标。服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务生成方的网络位置(IP地址和端口号)。微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。每个服务一般也会有多个实例来做负载均衡,由于党纪或者升级,服务实例网络地址经常会动态改变。每个服务也可能对临时访问压力增加新的服务节点。
所以如何找到对应的服务提供方地址呢?
2.2 服务发现的流程
服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端。
- 在每个服务启动时会向服务发现中心上报自己的网络位置。在服务发现中心内部会形成一个服务注册表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。
- 服务发现客户端会定期从服务发现中心同步服务注册表,并缓存在客户端。
- 当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。
3、使用Nacos
简单的 Java 应用如何使用 Nacos 进行服务发现和配置管理。
3.1 添加依赖
首先添加依赖到项目中
<!-- Maven 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
修改配置文件
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
下面就可以使用nacos的服务发现和服务配置
3.2 服务发现实例
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
public class ServiceDiscoveryController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/services")
public List<String> getServices() {
return discoveryClient.getServices();
}
}
@Autowired
:这个注解将DiscoveryClient
类型的Bean自动注入到这个字段中。DiscoveryClient
是Spring Cloud用来发现服务的核心接口之一。@GetMapping("/services")
:这个注解将HTTP GET请求映射到/services
路径上,当收到这个请求时,Spring将调用getServices()
方法。public List<String> getServices()
:这个方法通过discoveryClient
调用getServices()
方法来获取所有注册在服务发现中心的服务列表,并将其返回。
3.3 配置管理实例
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
@RestController
public class ConfigController {
@Value("${my.config}")
private String myConfig;
@GetMapping("/config")
public String getConfig() {
return myConfig;
}
}
@Value("${my.config}")
:这个注解将application.properties
或application.yml
文件中my.config
的值注入到myConfig
字段中。@GetMapping("/config")
:这个注解将HTTP GET请求映射到/config
路径上,当收到这个请求时,Spring将调用getConfig()
方法。public String getConfig()
:这个方法直接返回了myConfig
字段的值,即从配置文件中读取的值。