SpringCloud Alibaba 微服务组件 Nacos
一、什么是 Nacos
官方: 一个更易于构建云原生应用的动态服务发现(Nacos Discovery)、服务配置(Nacos Config)和服务管理平台。
集 注册中心 + 配置中心 + 服务管理 平台
Nacos 的特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
二、Nacos 注册中心
管理所有微服务、解决微服务之间调用关系错综复杂、难以 维护的问题
2.1、注册中心演变及其设计思想
直接通过 RestTemplate 对其它服务进行调用,但是服务多了之后,IP 不好维护,每次 IP 改变,都要进行服务的修改与重新部署。
手动维一份服务注册表,可以保存到数据库中。
但是当服务进行水平扩展后如何进行负载均衡,其中一个服务宕机,下次不能调用等问题如何处理
将所有的配置配置在 nginx.conf 中,问题是配置十分繁琐,并且其中一个服务宕机如何处理。
使用注册中心,很好解决了上述问题,但是如何多服务中有服务宕机了如何处理。
注册中心引入了心跳机制,每个服务本地会维护一个定时任务,每隔一段时间会发送一个心跳到注册中心。注册中心如果在一段时间内没有接收到服务的心跳,认为服务已经宕机,修改服务的状态,如果更长时间没有收到心跳,直接将服务剔除掉。如果将服务停止掉,服务会调用注销接口,同样会将服务剔除掉。服务调用接口也会有心跳机制,实时的拉取调用接口的服务状态,将服务以缓存的形式保存起来。不再使用 nginx 服务端的负载均衡,而使用客户端的负载均衡,即微服务端的负载均衡。
2.2、Nacos 注册中心架构
2.3、核心功能
服务注册: Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、 端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳:在服务注册后,Nacos Client会维护一个 定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务同步: Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。leader raft
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST诗求给 Nacos Server, 获取上面注册的服务清单,并且缓存在Nacos Client 本地,同时会在 Nacos Client本地开
启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
服务健康检查: Nacos Server会开启- -个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthly属性 置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
主流的注册中心区别
Nacos 支持 CP + AP,默认使用的是 AP
三、Nacos Server 部署
版本对应关系如下
$ tar -zxvf nacos-server-1.4.2.tar.gz -C /opt/
$ cd /opt/nacos
$ vim /nacos/bin/startup.sh
# 单机启动nacos,执行命令
$ bin/startup.sh -m standalone
# 或者将 cluster,改为 standalone,单机启动
# 全局配置文件目录 nacos/conf/application.properties
可以修改数据源,端口,登录用户名密码等信息。
启动后日志路径为 nacos/logs
访问 nacos 的管理端: http://127.0.0.1:8848/nacos
,默认用户名密码是 nacos/nacos
四、Nacos Client 服务搭建
项目模块准备
复制两份服务,修改服务的 artifactId,在父 pom 文件中进行关联
<modules>
<module>order-nacos</module>
<module>stock-nacos</module>
</modules>
如果发现服务是灰色的,在设置中找到 Ignored Files,取消勾选即可
4.1、引入依赖
父 pom 中支持 spring cloud & spring cloud alibaba,引入依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud 的版本管理器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
项目引入依赖
<!-- nacos 服务注册与发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改 application.yml 文件
server:
port: 8020
# 应用名称(nacos 会自动将该名称当作服务名称)
spring:
application:
name: order-server
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
# 命名环境用来隔离服务
namespace: public
server:
port: 8021
# 应用名称(nacos 会自动将该名称当作服务名称)
spring:
application:
name: stock-server
cloud:
nacos:
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
# 命名环境用来隔离服务
namespace: public
启动服务,可以看到控制台打印的日志,服务已经注册到 Nacos 上了,打开页面,可以看到服务已经注册到 Nacos 上了。
现在如果想要调用其它服务的接口,不需要再指定 IP,直接指定服务名即可。
但是此时访问 http://127.0.0.1:8020/order/add 接口,发现报错,没有找到实例,但是服务确实已经注册了 Nacos。这是因为还要配置负载均衡器。此时调用接口成功!
负载均衡测试
默认的负载均衡类似于轮询,再配置一个stock-server 服务,端口为 8022,并且在调用的地方加上 ip 打印。
访问接口测试
Nacos 默认使用的是 ribbon 的负载均衡机制。
拓展
当然 Nacos 不仅仅可以在微服务中使用,Nacos 还提供了 restful 接口供开发者使用 open-api 指南
本作品采用《CC 协议》,转载必须注明作者和本文链接