在了解Nacos注册配置中心之前,先了解一下Spring Cloud的相关基础组件有那些
服务发现——Netflix Eureka (Nacos)
服务调用——Netflix Feign
熔断器——Netflix Hystrix
服务网关——Spring Cloud GateWay
分布式配置——Spring Cloud Config (Nacos)
消息总线 —— Spring Cloud Bus (Nacos)
相关介绍
Eureka:个服务启动时,Eureka会将服务注册到EurekaService,并且EurakeClient还可以返回过来从EurekaService拉去注册表,从而知道服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon服务做到负载均衡,从一个服务的对台机器中选择一台
Feign:基于fegin的动态代理机制,根据注解和选择机器,拼接Url地址,发起请求
Hystrix:发起的请求是通过Hystrix的线程池来走,不同的服走不同的线程池,实现了不同的服务调度隔离,避免服务雪崩的问题
Zuul/GateWay :如果前端后端移动端调用后台系统,统一走zull网关进入,有zull网关转发请求给对应的服务
一 、nacso概念
英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心作者。Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1.1 Nacos结构图
1.2 nacos介绍
1.3 nacos服务领域模型
1.4 Nacos主要提供以下四大功能
Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。
Nacos主要提供以下四大功能:
-
服务发现和服务健康监测:
-
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
-
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
-
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
-
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
-
服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
-
-
动态配置服务
-
动态DNS服务
-
服务及其元数据管理
1.5 注册中心选型
二、注册中心
2.1 注册中心原理
服务注册方法:以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。
当服务提供者启动时,它会自动向 Nacos 注册中心注册自己的元信息,包括服务名、IP 地址、端口号等。
2.2 注册中心的概念和作用
注册中心是微服务架构中的关键组件之一,它用于存储和维护服务的元信息,如服务的地址、端口、版本、健康状态等。当服务提供者启动时,它会将自身的元信息注册到注册中心,同时服务消费者可以从注册中心获取服务的元信息,以便找到并调用服务。此外,注册中心还负责处理服务的上下线、健康检查、负载均衡等任务。
在微服务架构中,使用注册中心的优点是:
- 实现服务的动态发现和调用,提高系统的灵活性和伸缩性。
- 简化服务间的通信,降低系统的耦合度。
- 提供服务的健康检查和负载均衡功能,增强系统的可用性。
2.3 服务提供者的注册
当服务提供者启动时,它会自动向 Nacos 注册中心注册自己的元信息,包括服务名、IP 地址、端口号等。
注册的过程一般如下:
- 服务提供者启动后,会向 Nacos 发送注册请求,请求中包含服务的元信息。
- Nacos 接收到请求后,会将服务的元信息存储在内存数据库中。
- 服务提供者会定期向 Nacos 发送心跳,告知其依然处于活动状态。
三、 配置中心原理
四、 高可用性
4.1 持久化和同步
Nacos 注册中心的数据通常保存在内存中,以实现高效的查询。但为了防止数据丢失,Nacos 也会将数据持久化到磁盘中。
此外,如果使用了 Nacos 集群,则每个 Nacos 实例都会持有一份数据的副本。当一个 Nacos 实例接收到服务的注册或注销请求时,它会将数据变更同步到其他所有的 Nacos 实例,以保证数据的一致性。
以上就是 Nacos 服务注册流程的详细介绍,从服务提供者的注册到服务消费者的发现,以及数据的持久化和同步,Nacos 都提供了一套完整的解决方案。在下一节中,我们将通过一个实例来演示 Nacos 的服务注册与发现功能。
4.2 集群
五、高级特性
5.1 服务健康检查
Nacos 提供了健康检查的机制,以确保服务的可用性和健壮性。以下是一些主要点:
健康状态: Nacos 可以自动检测服务实例的健康状态,若实例出现问题,则会从服务列表中剔除。
自定义检查: 可以通过配置自定义的健康检查逻辑,以适应特殊需求。在 Spring Cloud 中,可以通过实现 HealthIndicator 接口来自定义服务的健康检查逻辑。
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 自定义健康检查逻辑
return Health.up().withDetail("Custom Check", "OK").build();
}
}
心跳机制: 服务提供者会定期向 Nacos 发送心跳,确认其健康状态。
5.2 服务分组和命名空间
Nacos 支持通过分组和命名空间进行服务管理,主要有以下优势:
分组管理: 可以将具有相同属性或属于同一业务线的服务组织在一起。在 Nacos 中,可以在注册服务时指定分组。
nacos.discovery.group=DEFAULT_GROUP
命名空间: 通过不同的命名空间可以隔离不同的环境和项目,如开发、测试和生产环境。可以通过 Nacos 控制台创建和管理命名空间,并在配置中指定。
nacos.discovery.namespace=my-namespace-id
5.3 负载均衡策略
Nacos 提供了丰富的负载均衡策略,有助于实现请求的均匀分配:
轮询策略: 按照顺序依次选择服务实例。
随机策略: 随机选择服务实例。
权重策略: 根据设置的权重选择服务实例。在 Nacos 控制台中,可以为服务实例设置权重,然后消费者会根据权重来选择服务实例。
nacos.discovery.weight=80
自定义策略: 可以实现自定义的负载均衡逻辑。
5.4 元数据和扩展属性
Nacos 允许为服务实例添加元数据和扩展属性,使得服务管理更为灵活:
元数据: 可以存储关于服务实例的额外信息,如版本、地域等。可以为服务实例添加元数据,如下所示:
nacos.discovery.metadata.version=v1.0
在消费者端,可以基于元数据进行服务调用,例如使用特定版本的服务实例。
@FeignClient(name = "product-service", contextId = "v1", qualifier = "v1", path = "/v1")
public interface V1ProductService {
@GetMapping("/product/{id}")
Product findById(@PathVariable("id") Long id);
}
扩展属性: 可以用于实现自定义的服务管理逻辑。
例如,通过元数据可以实现版本控制,确保不同版本的服务实例能够正确协同工作。
这些高级特性使 Nacos 在复杂的微服务环境中能够提供更为强大和灵活的支持。通过了解和掌握这些特性,可以使 Nacos 在实际项目中发挥更大的作用。
六. 常见问题和最佳实践
6.1 常见问题解析
在使用 Nacos 进行服务注册与发现的过程中,可能会遇到一些常见问题。以下是解析及解决方法的示例:
问题1:服务无法注册
解析: 这可能是因为 Nacos 服务器不可达或配置错误造成的。
解决方法:
检查 Nacos 服务器地址和端口配置
bash nacos.server-addr=127.0.0.1:8848
问题2:服务持续剔除
解析: 这可能是由于服务健康检查失败造成的。
解决方法:
// 修复健康检查逻辑或确保服务实例可正常访问
1
问题3:负载均衡不均匀
解析: 这可能是由于权重配置不当或其他因素造成的。
解决方法:
调整权重配置或采用合适的负载均衡策略 nacos.discovery.weight=50
6.2 最佳实践和推荐配置
在使用 Nacos 时,遵循一些最佳实践和推荐配置可以提高系统的稳定性和可维护性。
最佳实践1:合理设置权重
在进行负载均衡时,合理设置权重可以使系统更加稳定。
根据实际需求合理分配权重 nacos.discovery.weight=60
最佳实践2:使用命名空间隔离环境
通过不同的命名空间隔离开发、测试和生产环境,有助于管理复杂度。
使用专门的命名空间隔离生产环境 nacos.discovery.namespace=production
推荐配置1:设置适当的心跳间隔
适当的心跳间隔可以确保健康检查的准确性,同时不给服务带来过大的负担。
根据实际情况设置合适的心跳间隔 nacos.discovery.heartbeatInterval=5
通过遵循以上常见问题的解决方法和最佳实践,可以使 Nacos 在实际项目中的使用更加流畅和高效,也有助于构建更健壮、可维护的微服务架构。
七、nacos注册中心配置参数
Nacos作为服务注册和配置中心,有许多可配置的参数。以下是一些常见的配置参数及其用途:
spring.cloud.nacos.discovery.server-addr:指定Nacos服务器地址。
spring.cloud.nacos.discovery.namespace:指定命名空间,用于隔离不同环境的服务。
spring.cloud.nacos.discovery.group:指定服务所属分组,默认是DEFAULT_GROUP。
spring.cloud.nacos.discovery.cluster-name:指定服务部署的集群名。
spring.cloud.nacos.config.server-addr:指定Nacos配置中心服务器地址。
spring.cloud.nacos.config.namespace:指定配置所属的命名空间。
spring.cloud.nacos.config.group:指定配置所属的分组,默认是DEFAULT_GROUP。
spring.cloud.nacos.config.extension-configs[0].data-id:指定配置文件的dataId。
spring.cloud.nacos.config.extension-configs[0].group:指定配置文件的分组。
spring.cloud.nacos.config.extension-configs[0].refresh:指定是否动态刷新配
八、Nacos系列之服务注册与发现API和SDK讲解
Nacos自身提供了SDK和API来完成服务注册与发现等操作,SDK本质上就是针对HTTP请求的一层封装,因为服务端只提供了REST接口,那么我们带着规范,去了解一下nacos的核心接口:
8.1、注册实例
官方openAP接口 https://nacos.io/zh-cn/docs/open-api.html
8.1、注册实例SDK
1、作用:将服务地址信息注册到Nacos Server中
2、API:/nacos/v1/ns/instance (POST)
void registerInstance(String serviceName , String ip , int port) throws NacosException;
void registerInstance(String serviceName, String ip,int port,String clusterName) throws NacosException;
void registerInstance(String serviceName,Instance instance) throws NacosException;
4、讲解:
serviceName:服务名称,相当于配置文件中的spring.application.name
- ip:服务实例ip
- port:服务实例port
- clusterName:集群名称,标识当前服务实例属于哪个集群
- instance:实例属性,其实就是把上面的参数封装成一个对象
5、调用方式
NamingService naming=NamingFactory.createNamingService(System.getProperty("serveAddr"));
naming.registerInstance("nacos_name","192.168.80.1",8080,"DEFAULT");
8.2、获取全部实例
1、作用:根据服务名称从Nacos注册中心上获取所有服务的实例集合
2、API: /nacos/v1/ns/instance/list (GET)
3、SDK:
List<Instance> getAllInstances(String serviceName) throws NacosException;
List<Instance> getAllInstances(String serviceName,List<String> cluster) throws NacosException;
4、讲解:
- serviceName:服务名称
- cluster:集群列表,入参是一个String集合
5、调用方式:
NamingService naming=NamingFactory.createNamingService(System.getProperty("serveAddr"));
System.out.println(naming.getAllInstances("nacos_name),true);
8.3、服务监控
- 1、作用:为了实时让客户端感知到服务提供者实例的变化,相当于Eureka中的心跳机制
- 2、API:/nacos/v1/ns/instance/list (GET)
- 3、SDK:
void subscribe(String serviceName,EventListener listener) throws NacosException;
void subscribe(String serviceName,List<String> clusters,EventListener listener) throw NacosException;
4、讲解:
EventListener:当提供者服务实例出现异常,比如上下限时,会调用一个事件回调监听有两种方式:
- 第一种:客户端调用/nacos/v1/ns/instance/list进行定时轮询
- 第二种:基于DatagramSocket的UDP协议,实现服务端的主动推送