微服务架构就是把一个单体项目拆分为多个微小的服务,每个微服务可以在自己的进程中运行并与HTTP资源API进行通信。围绕业务功能进行构建,独立技术选型,独立开发,独立部署,独立运维,并且多个服务相互协调,相互配合,最终完成用户的价值
微服务与单体项目的区别:
. | 单体项目 | 微服务 |
---|---|---|
代码量 | 单体架构所有的模块全都耦合在一块,代码量大,维护困难。 | 微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。 |
数据库 | 单体架构所有的模块都共用一个数据库,存储方式比较单一。 | 微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。 |
技术 | 单体架构所有的模块开发所使用的技术一样。 | 微服务每个模块都可以使用不同的开发技术,开发模式更灵活。 |
ps:
Nacos的全称是Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。
Nacos是阿里旗下的一款开源产品,它主要是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案;简单来说 Nacos 就是注册中心 + 配置中心的组合,致力于帮助您发现、配置和管理微服务,提供简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
注:Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
nacos支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、openapi、或者一个独立的agent TODO注册service后,服务消费者可以使用DNS TODO或者HTTP&API查找和发现服务。
nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。nacos支持传输层和应用层的健康检查,对于复杂的云环境和网络拓扑环境中服务的健康检查,nacos提供了agent上报模式和服务端主动检测2种健康模式。nacos还提供了统一的健康检查仪表盘,帮助您根据健康检查状态管理服务的可用性以及流量。
动态配置服务可以以中心化、外部化和动态化的方式管理所所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变的更加高效和敏捷。
配置中心化管理让实现无状态服务变的更简单,让服务按需弹性扩展变得更加容易。
nacos提供了一个简洁易用的UI,帮助管理所有的服务和应用的配置。nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,更安全的在生产环境中管理配置变更和降低配置带来的风险。
nacos支持动态DNS服务支持权重路由、可以更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能更容易实现以DNS协议为基础的服务发现。
nacos能从微服务平台建设的视角管理数据中心的所有服务以及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由以及安全策略、服务的SLA以及最主要的metrics统计数据。
组件简介:
服务管理:实现服务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一样好用
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、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集成 | 支持 | 不支持 | 支持 | 不支持 |
相比与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)能正常工作。
服务实例在启动时注册到服务注册表,并在关闭时注销
服务消费者查询服务注册表,获得可用实例
服务注册中心需要调用服务实例的健康检查API来验证它是否能够处理请求
服务注册成功后,为了向 Nacos Server 报告自己的健康状态,客户端每5秒向 Nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。当然 Nacos server 也会向 client 主动发起健康检查,支持tcp/http检查。
如果15秒内无心跳且健康检查失败则会将该实例标记为不健康的状态,如果30秒内健康检查再次失败则会直接剔除实例。
服务消费者订阅成功后,如果服务提供者的实例不健康或者被剔除掉了,Nacos Server 会发送变更通知。
Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑
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、用户名和密码。
将jdk文件移动到/opt路径下
tar -zxvf jdk-8u191-linux-x64.tar.gz
将jdk文件移动到/usr/local/java路径下
mv jdk1.8.0_191 /usr/local/java
或在解压时直接指定目录
tar -zxvf jdk-8u191-linux-x64.tar.gz -C /usr/local/java
配置环境变量
vim /etc/profile
在文件末尾加入:
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存退出;
使profile生效
source /etc/profile
验证jdk是否安装成功
java -version
官方下载
mkdir /usr/local/nacos # 创建nacos文件夹,将上面下载的文件上传到此处
cd /usr/local/nacos # 进入文件
tar -zxvf nacos-server-2.1.0.tar.gz # 解压文件
cd nacos/conf/ # 进入解压后的conf文件中
注:此时直接跳到下面启动步骤即可,mysql数据库低于5.6.5+下面过程可省略
cd /usr/local/nacos/nacos/conf/ # 进入到配置文件夹
cp cluster.conf.example cluster.conf # 将集群文件复制一下
cp application.properties application.properties.bak
vim application.properties # 配置文件
vim cluster.conf # 配置集群
注:mysql数据库版本低于5.6.5+是不能成功的!!!
修改配置文件application.properties,属性使用vim的搜索功能找到然后解开注释或者修改参数
server.servlet.contextPath=/nacos
server.port=8848
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.137.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 # 关闭权限,可以打开使用
cd /usr/local/nacos/nacos/bin/
./shutdown.sh #先关闭程序
./startup.sh -m stanalone # 启动程序
访问192.168.48.16:8848/nacos进入界面,账号nacos\密码nacos
默认端口是8848,如果要修改的话,需要修改conf/application.properties文件;
开启防火墙,添加规则
[root@loaclhost nacos]# firewall-cmd --add-port=8848/tcp --permanent
Success
[root@loaclhost nacos]# firewall-cmd --reload
Success
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/
修改文件
vim startup.sh
按a进入编辑模式,修改jdk路径
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/java/jdk1.8.0_191
按esc退出编辑,:wq保存并退出
4.、重载所有服务
systemctl daemon-reload
5、设置开机启动
systemctl enable nacos.service
6、查看开机启动状态
systemctl is-enabled nacos.service
docker pull nacos/nacos-server
启动脚本:
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 运行成功后我们可以打开后台管理界面,查看其运行状态和管理信息。
本地访问地址:http://127.0.0.1:8848/nacos
登录成功后可以看到左侧的菜单栏,主要功能有:配置管理 、服务管理 、权限管理 、命名空间 、集群管理 。
Nacos 的主要功能分为两块:配置管理 和服务管理,这次主要展开讲解服务管理
展开菜单后,有服务列表 和订阅者列表 两块,服务列表会显示所有注册到 Nacos Server 的服务,包括实例数、实例健康状态等信息。
订阅者列表 会显示某个服务下有哪些客户端订阅了,以及包括客户端的版本信息等
权限控制主要的作用是维护管理后台系统的用户角色和权限,一般的系统都有这个功能,这里不再赘述了
命名空间比较好理解,比如同样一个服务ServiceA可能会在研发环境、集成测试环境、生产环境各自部署一套,那如何区分它们呢?命名空间可以起这个作用,在下图中,我新建了好几个命名空间,用于将服务的注册订阅信息在逻辑上隔离开来
Nacos Server可以是集群部署的也可以是单机部署,在实际生产环境中为了防止单点故障我们肯定不可能部署一个节点,为了方便测试演示,我在本地只启动了一个节点,下图中可以看到这个节点的ip、状态等信息
七:总结
Nacos 是阿里巴巴开源的一款中间件,常用于分布式微服务场景,主要功能包括两大块:服务注册发现、服务配置。
Nacos 分为 server 和 client,可以在官网下载安装包在本地运行,运行成功后通过后台管理界面对 Nacos Server 进行管理和维护;
Client 端的接入方式有 SDK 和 HTTP RESTful 两种方式,功能都是一样的