一、什么是Nacos
官方地址:
https://nacos.io/zh-cn/docs/v2/what-is-nacos.html
概念:
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。即集注册中心+配置中心+服务管理的一个平台
Nacos 的关键特性包括:
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
二、Nacos注册中心
注册中心演变和设计思想
(1)刚开始分布式远程调用(地址在代码中)。
存在的问题:地址发生改变需修改代码和版本发布。
(2)进一步演化为:手动维护一份注册表,将服务信息、服务名称维护到注册表。一共服务去调用另外一个服务时,根据服务名称去注册表中获取进行调用。
存在的问题:服务水平扩容,涉及到负载均衡的问题以及某个服务宕机了,我不知道。
(3)进一步引入Nginx:将所有的服务配置到nginx,通过nginx调用服务。
存在的问题:服务太多以及nginx配置文件变得复杂,服务健康检查不健全。
(4)进一步演变:mysql存储的注册中心,有一个注册表,存储服务列表(包括服务名、IP、端口、健康状态等)。
服务启动时,注册一条信息到注册表。
服务要调用其他服务时,去注册中心获取服务信息,就是去表中查询。
根据查询出的服务信息,选择服务进行远程调用。
存在的问题:服务挂了,注册中心不知道。
(5)最终实现:在上面基础上,引入心跳机制,在服务注册和服务调用都有该机制。
服务注册:服务会在本地维护一个定时任务,一段时间5s发送一个心跳到注册中心,注册中心超过5s没收到服务的心跳机制,则认为这个服务挂了,把服务状态修改为down。如果超过30s没收到心跳,则把该服务从注册中心剔除。
服务调用:调用也会有一个定时任务,实时去注册表中调用获取最新健康的服务列表,然后进行缓存,客户端从直接从缓存获取到接口进行使用。
注册中心是一个单独的Nacos服务,需要单独下载部署。
三、服务发现
https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
服务注册发现: Nacos Discovery Starter
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等-注册到 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没有收到客户满心跳的实例会将它的heathy属性置为false(客户端服务发现时不会被查询到),如果某实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
五、主流的注册中心
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错(Partition-tolerance)。在一个分布式系统中三个要素不可同时具有,只能选择其中两个。
C: 一致性,所有的数据备份在同一时刻具有同样的值,强一致性;
A:可用性,保证无论请求成功或失败,系统都会给出响应;
P:分区容错性,指的是系统任意信息的丢失都不会影响系统的继续运行,或任意节点的丢失,都不影响其他节点的继续运行。
因为在分布式系统中分区容错性必须保证,放弃P则不是分布式系统。则只有CP和AP组合。
CAP原理详解
六、Nacos单机部署
1、下载地址:https://github.com/alibaba/nacos/releases/tag/1.4.2
根据cloud Alibaba下载对应版本,我们下载1.4.2版本。
2、下载后解压:
windows下运行使用cmd后缀,linux使用sh后缀。
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
3、默认为集群。standalone可以在启动文件的配置文件中修改。修改为单机模式,直接双击启动即可。
4、启动。
配置文件配置,我们本地默认单机启动,不用修改,直接运行startup.cmd启动。
可以在nacos\conf\application.properties中配置。
了解配置文件信息-如图:
启动成功提示:
5、登录
然后根据上面提示访问即可,我的: http://192.168.1.4:8848/nacos/index.html
账号和密码都是nacos,登录后界面如图:
6、nacos和服务结合
下面将我们的服务和nacos结合, 在maven中引入nacos,然后注册到nacos。
重新复制一份,起名为nacos的微服务,如图,并且在父maven中引入子模块。
可能会出现复制的模块不是一个工程,如何搞定?
Ignored files中取消勾选,有时候maven会把它进行排除。
在order-nacos和stock-nacos的pom中引入nacos的服务与发现,配置信息:
<!--nacos的服务注册与发现,无需写版本,spring-cloud-alibaba-dependencies会自动维护-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
如图:
然后修改order-nacos 8815端口和stock-naco 8816端口的配置文件,修改端口和加入nacos的相关配置。
server:
port: 8815
#应用名称,nacos会将该名称当做服务名称
spring:
application:
name: order-service
cloud:
nacos:
#nacos地址
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
#命名空间,可以根据空间进行一个隔离
namespace: public
然后启动这两个服务。会在日志界面看到c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP order-service 192.168.1.4:8815 register finished这样一条日志,说明已经注册到nacos。
启动成功后,在nacos界面查看验证一下,会在nacos服务列表界面看到两个服务已经注册进来。
后台停止stock-naco服务,观察服务列表的变化。主要是和上面的理论调用过程相结合。
(1)15s左右,变成红色,不可用。
(2)30s之后,这条服务列表就会被删除。
服务调用的演示:
因nacos需负载均衡发现对应的服务地址,需在RestTemplate中添加一个LoadBalanced注解,相当于一个负载均衡。
测试:
访问:http://localhost:8815/order/addNacos
7、模拟负载均衡轮询机制。
(1)复制一个stock服务。
(2)修改StockController接口,把端口给返回去,页面接口请求,观察端口情况。
(3)结果:8817和8816循环请求。
说明:nacos默认采用Ribbon的负载均衡。
七、nacos管理界面介绍
1、命名空间
服务详情页面
八、nacos的配置说明
server:
port: 8815
#应用名称,nacos会将该名称当做服务名称
spring:
application:
#默认为${spring.application.name},也可以通过该选项配置
name: order-service
cloud:
nacos:
#nacos地址
server-addr: 127.0.0.1:8848
discovery:
username: nacos
password: nacos
#命名空间,可以根据空间进行一个隔离
namespace: public
#设置为永久实例,实例挂了还会存在。默认true为临时实例
ephemeral: false
#默认为 DEFAULT_GROUP,更细的相同特征的服务分组管理
group: DEFAULT_GROUP
#通常结合安装权重的负载均衡策略,权重越高流量越大
weight: 1
#可以根据结合元数据做扩展
metadata:
九、nacos的集群搭建
官方地址:https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
步骤:
-
复制三个nacos文件包,重命名为nacos8849、nacos8850、nacos8851。
-
分别修改三个文件包中conf\application.properties的配置文件为mysql,同时修改为对应的三个端口。
案例修改nacos8849的配置文件: -
执行conf\nacos-mysql.sql中的SQL进行建表。建表后如图:
-
将cluster.conf.example文件中改为cluster.conf,添加节点配置。
-
如何出现内存不足可以修改启动的JVM参数。
set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
- 分别启动nacos8849、nacos8850、nacos8851服务。注意启动脚本设置为set MODE=“cluster”。如果是windows环境启动路径不能带有中文路径。
可以先启动一个进行测试再配置其他的。页面访问测试。 9. 修改nginx配置,如下:
server {
listen 8847;
location /nacos/ {
proxy_pass http://nacoscluster/nacos/;
}
}
upstream nacoscluster{
server 127.0.0.1:8849;
server 127.0.0.1:8850;
server 127.0.0.1:8851;
}
最后用代理端口8847访问测试。
http://localhost:8847/nacos
然后修改代码中配置文件地址为8847端口即可。
至此,nacos集群配置完成。