前言
什么是微服务
一、nacos 概述
1.1 nacos 简介
1.2 Nacos 核心特性
1.2.1 服务发现
1.2.2 服务健康监测
1.2.3 动态配置服务
1.2.4 动态DNS服务
1.2.5 服务及其元数据管理
1.3 组件介绍
1.4 nacos 的架构图
二、主流的配置中心
三、Nacos与其他注册中心的区别
3.1 Nacos和Eurek、apollo的区别
3.2 注册中心的原理
四、Nacos 搭建
4.1 nacos的结构图
4.2 nacos 单机部署
4.2.1 配置JDK环境
4.2.2 下载
4.2.2 将下载的文件上传到/usr/local/nacos文件下
?
4.2.3 进入文件后将nacos-mysql.sql文件保存下来或者复制一份,进入到MySQL中
?4.2.4 在Linux控制台
4.2.5 启动
4.3 访问测试
4.4 设置开机自启nacos
扩展:docker 安装
拉取镜像
启动容器
五、熟悉nacos server 控制台
5.1 服务管理
5.2 权限控制
5.3 命名空间
5.4 集群管理
小结:
什么是微服务
微服务架构就是把一个单体项目拆分为多个微小的服务,每个微服务可以在自己的进程中运行并与HTTP资源API进行通信。围绕业务功能进行构建,独立技术选型,独立开发,独立部署,独立运维,并且多个服务相互协调,相互配合,最终完成用户的价值;
微服务与单体项目的区别:
单体架构所有的模块全都耦合在一块,代码量大,维护困难,微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
单体架构所有的模块都共用一个数据库,存储方式比较单一,微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
单体架构所有的模块开发所使用的技术一样,微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
注:
微服务架构只是一个样式,一种风格;
可以将一个项目,拆分成多个模块去开发;
每一个模块都是单独运行在自己的容器中的;
每个模块需要相互通讯(HTTP、MQ);
每一个模块之间没有依赖关系,都是单独部署;
可以使用多种语言去开发不同模块;
一、nacos 概述
1.1 nacos 简介
Nacos的全称是Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。
Nacos是阿里旗下的一款开源产品,它主要是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案;简单来说 Nacos 就是注册中心 + 配置中心的组合,致力于帮助您发现、配置和管理微服务,提供简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
注:Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1.2 Nacos 核心特性
1.2.1 服务发现
nacos支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、openapi、或者一个独立的agent TODO注册service后,服务消费者可以使用DNS TODO或者HTTP&API查找和发现服务。
1.2.2 服务健康监测
nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。nacos支持传输层和应用层的健康检查,对于复杂的云环境和网络拓扑环境中服务的健康检查,nacos提供了agent上报模式和服务端主动检测2种健康模式。nacos还提供了统一的健康检查仪表盘,帮助您根据健康检查状态管理服务的可用性以及流量。
1.2.3 动态配置服务
动态配置服务可以以中心化、外部化和动态化的方式管理所所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变的更加高效和敏捷。
配置中心化管理让实现无状态服务变的更简单,让服务按需弹性扩展变得更加容易。
nacos提供了一个简洁易用的UI,帮助管理所有的服务和应用的配置。nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,更安全的在生产环境中管理配置变更和降低配置带来的风险。
1.2.4 动态DNS服务
nacos支持动态DNS服务支持权重路由、可以更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能更容易实现以DNS协议为基础的服务发现。
1.2.5 服务及其元数据管理
nacos能从微服务平台建设的视角管理数据中心的所有服务以及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由以及安全策略、服务的SLA以及最主要的metrics统计数据。
1.3 组件介绍
组件简介:
服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能
配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能
元数据管理:提供元数据CURD 和打标能力
插件机制:实现三个模块可分可合能力,实现扩展点SPI机制
事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑
日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档
回调机制:sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性
寻址模式:解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展
推送通道:解决server与存储、server间、server与sdk间推送性能问题
容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性
流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制
缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具
启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI
一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
存储模块:解决数据持久化、非持久化存储,解决数据分片问题
Nameserver:解决namespace到clusterid的路由问题,解决用户环境与nacos物理环境映射问题
CMDB:解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系
Metrics:暴露标准metrics数据,方便与三方监控系统打通
Trace:暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通
接入管理:相当于阿里云开通服务,分配身份、容量、权限过程
用户管理:解决用户管理,登录,sso等问题
权限管理:解决身份识别,访问控制,角色管理等问题
审计系统:扩展接口方便与不同公司审计系统打通
通知系统:核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更
OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成
Console:易用控制台,做服务管理、配置管理等操作
SDK:多语言sdk
Agent:dns-f类似模式,或者与mesh等方案集成
CLI:命令行对产品进行轻量化管理,像git一样好用
1.4 nacos 的架构图
Provider APP:服务提供者
Consumer APP:服务消费者
Name Server:通过VIP(Virtual IP)或DNS的方式实现Nacos高可用集群的服务路由
Nacos Server:Nacos服务提供者,里面包含的Open API是功能访问入口,Conig Service、Naming Service 是Nacos提供的配置服务、命名服务模块。Consitency Protocol是一致性协议,用来实现Nacos集群节点的数据同步,这里使用的是Raft算法(Etcd、Redis哨兵选举)
Nacos Console:控制台
二、主流的配置中心
主流的配置中心有Spring Cloud Config、Apollo(携程)、nacos(阿里)
对比项目 Spring Cloud Config Apollo Nacos
配置实时推送 支持Spring Cloud Bus 支持HTTP长轮询1S内 支持HTTP长轮询1S内
版本管理 支持 支持 支持
配置回滚 支持 支持 支持
灰度发布 支持 支持 不支持
权限管理 支持 支持 不支持
多集群 支持 支持 支持
多环境 支持 支持 支持
监听查询 支持 支持 支持
多语言 只支持java 主流语言,提供了OpenAPI 主流语言,提供了OpenAPI
配置格式校验 不支持 支持 支持
单机读QPS 7(限流所致) 9000 15000
单机写QPS 5 单机写QPS 1100 1800
Apollo支持最好,性能上nacos>Apollo>Spring Cloud Config.
三、Nacos与其他注册中心的区别
使用较多的注册中心有:Nacos、Eureka、Consult、Zookeeper
对比项目 Nacos Eureka Consult Zookeeper
一致性协议 支持AP和CP模型 AP模型 CP模型 CP模型
健康检查 TCP/HTTP/MYSQL/Client Bean Client Bean TCP/HTTP/gRPC/Cmd Keep Alived
负载均衡策略 权重/metadata/Selector Ribbon Fabio -
雪崩保护 有 有 无 无
自动注销实例 支持 支持 不支持 支持
访问协议 HTTP/DNS HTTP HTTP/DNS TCP
监听支持 支持 支持 支持 支持
多数据中心 支持 支持 支持 不支持
跨注册中心同步 支持 不支持 支持 不支持
SpringCloud集成 支持 支持 支持 不支持
Dubbo集成 支持 不支持 不支持 支持
k8s集成 支持 不支持 支持 不支持
3.1 Nacos和Eurek、apollo的区别
相比与Eureka
(1)Nacos具备服务优雅上下线和流量管理(API+后台管理页面),而Eureka的后台页面仅供展示,需要使用api操作上下线且不具备流量管理功能。
(2)从部署来看,Nacos整合了注册中心、配置中心功能,把原来两套集群整合成一套,简化了部署维护
(3)从长远来看,Eureka开源工作已停止,后续不再有更新和维护,而Nacos在以后的版本会支持SpringCLoud+Kubernetes的组合,填补 2 者的鸿沟,在两套体系下可以采用同一套服务发现和配置管理的解决方案,这将大大的简化使用和维护的成本。同时来说,Nacos 计划实现 Service Mesh,是未来微服务的趋势
(4)从伸缩性和扩展性来看Nacos支持跨注册中心同步,而Eureka不支持,且在伸缩扩容方面,Nacos比Eureka更优(nacos支持大数量级的集群)。
(5)Nacos具有分组隔离功能,一套Nacos集群可以支撑多项目、多环境。
相比于apollo
(1) Nacos部署简化,Nacos整合了注册中心、配置中心功能,且部署相比apollo简单,方便管理和监控。
(2) apollo容器化较困难,Nacos有官网的镜像可以直接部署,总体来说,Nacos比apollo更符合KISS原则
(3)性能方面,Nacos读写tps比apollo稍强一些
注:nacos与eureka的区别(简单介绍)
1)nacos和eureka的范围不同,Nacos的阈值是针对某个具体Service的,而不是针对所有服务的;但Eureka的自我保护阈值是针对所有服务的。nacos支持CP和AP两种;eureka只支持AP。nacos使用netty,是长连接; eureka是短连接,定时发送。
2)Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server. enab1e-self-preservation:false)
Nacos保护方式:当域名健康实例(Instance)占总服务实例(Instance)的比例小于阈值时,无论实例(Instance)是否健康,都会将这个实例(Instance)返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例(Instance)能正常工作。
3.2 注册中心的原理
服务实例在启动时注册到服务注册表,并在关闭时注销
服务消费者查询服务注册表,获得可用实例
服务注册中心需要调用服务实例的健康检查API来验证它是否能够处理请求
服务注册成功后,为了向 Nacos Server 报告自己的健康状态,客户端每5秒向 Nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。当然 Nacos server 也会向 client 主动发起健康检查,支持tcp/http检查。
如果15秒内无心跳且健康检查失败则会将该实例标记为不健康的状态,如果30秒内健康检查再次失败则会直接剔除实例。
服务消费者订阅成功后,如果服务提供者的实例不健康或者被剔除掉了,Nacos Server 会发送变更通知。
四、Nacos 搭建
Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑
4.1 nacos的结构图
4.2 nacos 单机部署
nacos支持三种部署
单机模式 - 用于测试和单机试用。
集群模式 - 用于生产环境,确保高可用。
多集群模式 - 用于多数据中心场景
单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
4.2.1 配置JDK环境
将jdk文件移动到/opt路径下
tar -zxvf jdk-8u191-linux-x64.tar.gz
将jdk文件移动到/usr/local/java路径下
mv jdk1.8.0_191 /usr/local/java
配置环境变量
vi /etc/profile
在文件末尾加入:
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export PATH=
J
A
V
A
H
O
M
E
/
b
i
n
:
JAVA_HOME/bin:
JAVAH?OME/bin:PATH
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAH?OME/lib/dt.jar:JAVA_HOME/lib/tools.jar
保存退出;
使profile生效
source /etc/profile
.验证jdk是否安装成功
java -version
4.2.2 将下载的文件上传到/usr/local/nacos文件下
mkdir /usr/local/nacos # 创建nacos文件夹,将上面下载的文件上传到此处
cd /usr/local/nacos # 进入文件
tar -zxvf nacos-server-2.1.0.tar.gz # 解压文件
cd nacos/conf/ # 进入解压后的conf文件中
4.2.3 进入文件后将nacos-mysql.sql文件保存下来或者复制一份,进入到MySQL中
create database nacos_mysql; # 创建数据库
use nacos_mysql; # 进入到此数据库
source /usr/local/nacos/nacos/conf/nacos-mysql.sql; # 执行sql文件,路径根据自己的文件所在绝对路径
create user ‘nacos’@‘%’ identified by ‘nacos’; # 创建用户
grant all on nacos_mysql.* to ‘nacos’@‘%’; # 分配权限
grant all on . to ‘nacos’@‘%’ identified by ‘nacos’; #设置远程终端连接mysql,并拥有所有权限
flush privileges; # 刷新
4.2.4 在Linux控制台
cd /usr/local/nacos/nacos/conf/ # 进入到配置文件夹
cp cluster.conf.example cluster.conf # 将集群文件复制一下
cp application.properties application.properties.bak
vim application.properties # 配置文件
vim cluster.conf # 配置集群
修改配置文件application.properties,属性使用vim的搜索功能找到然后解开注释或者修改参数
server.servlet.contextPath=/nacos
server.port=8848
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.111.20:3306/nacos_mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
nacos.core.auth.enabled=false # 关闭权限,可以打开使用
修改配置文件cluster.conf,将nacos的IP+端口写进去,端口为上面设置的
192.168.111.20:8848
4.2.5 启动
cd /usr/local/nacos/nacos/bin/
./startup.sh -m stanalone # 启动程序
4.3 访问测试
访问192.168.111.20:8848/nacos进入界面,账号nacos\密码nacos
在平台上添加一个配置
登录navicat 验证
4.4 设置开机自启nacos
1.默认是没有这个文件的,当 vim 命令的时候会创建这个文件,记得保存:(目前我所在的目录是/usr/local/nacos)
vim /lib/systemd/system/nacos.service
2. 添加以下代码:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
Environment=“JAVA_HOME=/usr/local/java/jdk1.8.0_191”
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
这里要注意路径,我的是 /usr/local/nacos等等。
3.进入nacos的bin目录下,修改启动文件里的jdk路径
cd /usr/local/nacos/bin/
修改文件
vi startup.sh
按a进入编辑模式,修改jdk路径
[ ! -e “$JAVA_HOME/bin/java” ] && JAVA_HOME=/usr/local/java/jdk1.8.0_191
按esc退出编辑,:wq保存并退出
systemctl daemon-reload
5. 设置开机启动
systemctl enable nacos.service
6. 查看开机启动状态
systemctl is-enabled nacos.service
扩展:docker 安装
docker run
–name nacos -d
-p 8848:8848
–privileged=true
–restart=always
-e JVM_XMS=256m // 配置jvm启动时分配的内存
-e JVM_XMX=256m // 配置jvm运行过程中分配的最大内存
-e MODE=standalone // 以单机模式启动
-e PREFER_HOST_MODE=hostname
-v /home/nacos/logs:/home/nacos/logs // 映射日志文件到本地文件夹
-v /home/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties // 映射配置文件到本地文件夹
nacos/nacos-server
五、熟悉nacos server 控制台
Nacos Server 运行成功后我们可以打开后台管理界面,查看其运行状态和管理信息。
本地访问地址:http://127.0.0.1:8848/nacos
登录成功后可以看到左侧的菜单栏,主要功能有:配置管理 、服务管理 、权限管理 、命名空间 、集群管理 。
5.1 服务管理
Nacos 的主要功能分为两块:配置管理 和服务管理 ,这次主要展开讲解服务管理。
展开菜单后,有服务列表 和订阅者列表 两块,服务列表会显示所有注册到 Nacos Server 的服务,包括实例数、实例健康状态等信息。
订阅者列表 会显示某个服务下有哪些客户端订阅了,以及包括客户端的版本信息等。
5.2 权限控制
权限控制主要的作用是维护管理后台系统的用户角色和权限,一般的系统都有这个功能,这里不再赘述了。
5.3 命名空间
命名空间比较好理解,比如同样一个服务ServiceA可能会在研发环境、集成测试环境、生产环境各自部署一套,那如何区分它们呢?命名空间可以起这个作用,在下图中,我新建了好几个命名空间,用于将服务的注册订阅信息在逻辑上隔离开来。
5.4 集群管理
Nacos Server可以是集群部署的也可以是单机部署,在实际生产环境中为了防止单点故障我们肯定不可能部署一个节点,为了方便测试演示,我在本地只启动了一个节点,下图中可以看到这个节点的ip、状态等信息。
小结:
Nacos 是阿里巴巴开源的一款中间件,常用于分布式微服务场景,主要功能包括两大块:服务注册发现、服务配置。
Nacos 分为 server 和 client,可以在官网下载安装包在本地运行,运行成功后通过后台管理界面对 Nacos Server 进行管理和维护;
Client 端的接入方式有 SDK 和 HTTP RESTful 两种方式,功能都是一样的。