1.概述
Nacos是Spring Cloud Alibaba中的核心组件之一,它提供了服务发现、服务配置和服务管理等功能,可以作为注册中心和配置中心使用。注册中心是微服务架构体系中的核心组件之一,Nacos比Eureka有着更强大的功能,它们都能提供服务注册和服务拉取、支持服务提供者以心跳的方式来健康监测。Nacos支持服务列表变更的消息推送模式,服务更新更及时;Nacos服务端会主动监测客户端状态(临时实例采用心跳模式、非临时实例采取主动监测方式)。本文将详细说明nacos的使用以及部分注意事项。
2.使用与分析
2.1 Nacos使用
注册中心一般包含三个角色:服务提供者(Server)、服务消费者(Client)、注册中心(Registry),一个服务可以同时是提供者和消费者。Nacos包括服务端安装包和服务依赖包,具体使用如下:
2.1.1 服务端包安装
本文以centos7系统作为服务端安装环境,下载地址。我这里选择1.4.2版本,下载并上传到服务器,如下:
解压后的目录如下:
conf文件夹下存放了nacos的配置文件,可根据需要自行修改。接下来就可启动nacos,nacos单机版启动指令如下:
startup.sh -m standalone
进入bin文件夹下,执行上述指令,得到结果如下(前提是jdk安装完成并能正常运行,默认jdk地址是/usr/local/java,可在配置文件中指定):
启动成功之后,可以通过ip+端口号访问web页面(ip+端口号+/nacos/index.html),如下所示:
2.1.2 spingboot整合nacos
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
上述依赖中,前三个分别是spring-boot、spring-cloud、spring-cloud-alibaba的依赖,若要引入nacos的服务发现包,同时还需要引入spring-boot-starter-web包,要不然会报错。
2.启动文件添加@EnableDiscoveryClient注解
@Slf4j
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
log.info("这是新的OrderApplication");
SpringApplication.run(OrderApplication.class, args);
}
}
3.添加配置文件
#服务端口号
server.port=8082
#服务名称
spring.application.name=order-service
#注册中心地址
spring.cloud.nacos.discovery.server-addr=http://localhost:8848
4.启动服务
通过nacos的图形化界面查看,若在服务列表中能够查看到服务,则表明注册成功。
2.2 核心配置分析
2.2.1 Nacos分级存储模型
Nacos服务发现的设计模型如下所示:
传统服务发现(Consul、Eureka等)的模型一般是Service下面直接关联的是Instance,而nacos在这里增加了集群(Cluster)的概念。增加Cluster的目的也是为了提高访问效率、隔绝异常服务,例如以地域划分集群,上海机房内的服务都注册到SH集群,杭州机房内的服务都注册到HZ集群,上海机房内的服务优先调用上海集群内的其它服务,杭州机房内的服务优先调用杭州集群内的其它服务,只有当上海集群内所有被调用服务发生异常时,才有可能去杭州集群调用服务。
按照Nacos的设计模型,服务隔离主要有Cluster、Group、Namespace。解释如下:
Cluster (集群隔离):服务下挂载的机器分属不同的环境,希望能够在某些情况下将某个环境的流量全部切走,这样可以通过集群隔离,来做到一次性切流。
Group (分组隔离):参考Dubbo 的服务隔离策略,需要注意的一点是:Dubbo 注册三元组(接口名+分组+版本)时,其中 Dubbo 的分组是包含在 Nacos 的服务名中的,并不是映射成了 Nacos 的分组,一般 Nacos 注册的服务是默认注册到 DEFAULT_GROUP 分组的。
Namespace (命名空间隔离):在实际场景中使用也比较普遍,一般用于多个环境的隔离,例如 daily,dev,test,uat,prod 等环境的隔离。特别是当环境非常多时,使用命名空间做逻辑隔离是一个比较节约成本的策略。
1.配置cluster
通过下述配置可以指定服务集群,
spring.cloud.nacos.discovery.cluster-name=beijing
2.配置group
spring.cloud.nacos.discovery.group=AAA
3.配置namespace
在nacos的web端添加命名空间,如下所示:
添加完成后在命名空间菜单栏下可以进行查看:
在配置文件中配置namespace,如下:
spring.cloud.nacos.discovery.namespace=a6a062e0-085d-4eb0-936d-ad9f9bbc0d74
namespace是生成的唯一id或指定值,启动服务,注册成功后可以得到如下结果:
namespace环境隔离,注意事项如下:
1.每个namespace都有唯一id;
2.不同namespace下的服务不可见。
2.2.2 Nacos与Eureka的区别
1.Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式;
2.临时实例心跳不正常会被剔除,非临时实例则不会被剔除;
3.Nacos支持服务列表变更的消息推送模式,服务列表更新更及时;
4.Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式。
3.小结
1.nacos可以用作注册中心和配置中心;
2.nacos作为注册中心,可以提高比consul和eureka更加全面的注册发现功能、隔离功能;
3.cluster·、group、namespace的服务隔离模型,以及对推拉模型的支持,nacos可以快速被微服务框架集成。
4.参考文献
1.https://zhuanlan.zhihu.com/p/364527885
2.https://www.bilibili.com/video/BV1LQ4y127n4