Nacos实战一:架构及部署
2018年,阿里巴巴开源 Nacos,由此成为继
Eureka、Consul、Apollo
等服务注册发现&配置的又一开源框架,到如今2021年,Nacos 已经历了0.01->1.4.2/2.0.1
版本的迭代,社区也非常的活跃,Github 上拥有超过18k
的star
和7k
的fork
;使用 Nacos 作为服务管理平台的公司也越来越多,包括阿里、爱奇艺、平安、虎牙、贝壳
等互联网公司,业内也对 Nacos 越来越认可,Spring Could、Spring Could Alibaba
等开源框架也越来越多的支持了 Nacos,所以我们也需要学习并使用 Nacos;本文将从 Nacos 的理念和架构开始,详细描述 Nacos 的组成及部署,让读者更好的理解和使用 Nacos。
1.什么是 Nacos?
官方描述:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
愿景:Nacos 通过提供简单易用的动态服务发现、服务配置、服务共享与管理等服务基础设施,帮助用户在云原生时代,在私有云、混合云或者公有云等所有云环境中,更好的构建、交付、管理自己的微服务平台,更快的复用和组合业务服务,更快的交付商业创新的价值,从而为用户赢得市场。
2.功能有哪些?
动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
动态DNS服务
通过支持权重路由,动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
3.特性有哪些?
易于使用
动态配置管理、服务发现和动态的一站式解决方案20多种开箱即用的以服务为中心的架构特性基本符合生产要求的轻量级
更适应云架构
无缝支持Kubernetes和Spring Cloud在主流公共云上更容易部署和运行(例如阿里云和AWS)多租户和多环境支持
生产等级
脱胎于历经阿里巴巴10年生产验证的内部产品支持具有数百万服务的大规模场景具备企业级SLA的开源产品
丰富的应用场景
支持限流、大促销预案和异地多活直接支持或稍作扩展即可支持大量有用的互联网应用场景流量调度和服务治理
4.Nacos 地图
- 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
- 架构大图:通过清晰架构,让您快速进入 Nacos 世界
- 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
- 生态大图:系统梳理 Nacos 和主流技术生态的关系
- 优势大图:展示 Nacos 核心竞争力
- 战略大图:要从战略到战术层面讲 Nacos 的宏观优势
5.Nacos 生态图
如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如
- Spring Cloud
- Apache Dubbo and Dubbo Mesh
- Kubernetes and CNCF。
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
关于如何在这些生态中使用 Nacos,请参考官方文档:什么是 Nacos
6.Nacos 概念
可以通过如下官方文档的描述,先行了解 Nacos 的概念:
https://nacos.io/zh-cn/docs/concepts.html
PS: 以上概念非常重要,需要认真看一下,否则会对 Nacos 理解产生很多阻碍
下面我抽出几个单独讲一下:
- 命名空间:常用于生产环境隔离,比如
dev/test/beta/prod
等 - 配置:应用的配置文件,常用
yml/json
格式存储,一个应用服务可以配置多个配置文件,需要设置扩展,配置ID唯一,常用表现形式=应用名/应用名+Profile(举个栗子:mall-test.yml
) - 配置管理:可以对配置文件进行管理,配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动
- 配置项:
key/value
形式的配置内容,应用application.yml/bootstrap.yml
等文件的内容项 - 服务:服务名称=应用名称,服务分组=一组服务的聚合,服务集群=同分组同应用名多个实例服务聚合,服务权重=加权,权重越大,流量越大
- 元信息:Nacos数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label),从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。
7.Nacos 架构
https://nacos.io/zh-cn/docs/architecture.html
以上为官方对于 Nacos 架构的解释,同学们可以认真看一下,下面我简单讲一下常用到的一些组件和配置。
数据存储
Nacos的数据存储可以分为两种,一种是内存,一种是DB,常用的都是存储在 MySQL 中,将数据持久化,避免数据丢失;官方也提供了默认的初始化SQL,需要在 Github 上面去下载,地址:初始化SQL。
控制台
Nacos也提供了一个便于用户使用的后台页面,通过链接 http://localhost:8848/naocs
就能访问,密码也是 nacos/nacos,控制台提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。控制台样例
服务管理
服务管理包括了对服务的CRUD、负载转发策略、健康检查等,包含了一整套服务注册、发现的管理。
服务配置
服务配置包括了对配置的CRUD、版本控制、监听管理、推送轨迹、数据聚合等功能。
用户、角色、权限
和普通的系统一样,Nacos 提供了一套用户-角色-权限的基础系统,解决了注册-登陆-权限控制的问题。
两种启动模式
Nacos 支持将注册中心(Service Registry)与配置中心(Config Center) 在一个进程合并部署或者将2者分离部署的两种模式。
8.Nacos 部署
https://nacos.io/zh-cn/docs/quick-start.html
本地模式
基础的配置,可以根据以上链接中官方文档描述来实现,这里将详细解释几个注意事项。
- 版本:当前最新稳定版
v1.4.2
,尽量用最新版本,官方会不断修复问题,新版的支持会更好,尽量暂时不用v2.0.1
版本,这个版本还有待验证,尽量避免踩坑,稳定以后再尝试 - 环境:同学一定要注意官方对于环境的要求,64位jdk1.8+、64位linux/windows、maven3.2+
- 安装包:如果没有特殊情况,尽量使用官方编译后的压缩包,避免下载官方Git后自己打包出现的问题,需要二次开发或者自定义配置的除外
- 配置:启动配置,官方默认启动使用了内嵌数据库的形式,这里作者推荐使用MySQL外部数据库方式,如果使用MySQL方式,那么需要修改
conf/application.properties
配置文件,如下:
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=xxx
db.password.0=xxx
这时候,如果不知道 Nacos MySQL 初始化脚本的同学,可以通过 初始化SQL 下载脚本,或者通过 conf/nacos-mysql.sql
配置脚本。
如果机器的内存不够充足的,启动前一定要修改 bin/startup.sh
的启动配置,如下:
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
PS:启动命令(-m standalone
代表着单机模式运行,如果不加这个参数则代表使用集群模式运行)
Docker 模式
Docker 和普通模式差不多,也是需要设置配置文件和启动参数,具体的配置和启动方式,我放在了 Github 的实例项目中,有需求的同学可以看一下,如下:
https://github.com/YClimb/docker-compose/tree/main/nacos
默认使用 standalone-mysql-5.7.yaml
配置来启动 Nacos,详细描述见以上链接项目。
管理后台
服务启动以后,如果是本地或者外网服务器,就可以通过 http://IP:8848/nacos
访问控制台,账号密码:nacos/nacos
。
9.权限及运维
通过以上实例,一个基础的 Nacos 配置就完成了,如果我们还需要 Nacos 的权限配置和运维相关操作,那么可以继续往下看;
权限配置
首先,需要查看 Nacos 的系统参数介绍:Nacos 系统参数介绍,看完以后,了解 conf/application.properties
参数含义;
然后,可以开始配置权限:鉴权,通过官方文档的描述,可以修改配置完成鉴权的开启,需要注意的是,对于不同版本来说,开启服务身份识别功能不太一样,这里需要同学认真查看,尽量用最新稳定版本,否则版本问题的坑可能在不经意间就会遇到。
运维问题
上面所有讲到的部署都是单机版本,如果有同学需要集群版本,可以查看以下官方文档:
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
对于集群版本来说,默认是通过 [ip/域名 -> nginx -> 实例] 的方式实现的,这里有几个问题需要注意:
- 环境:64位Linux、64位JDK1.8+、Maven3.2+、3个节点及以上(重要,否则无法选举成功)
- 安装包:推荐使用安装包模式,tar.gz,这里需要注意,集群版本和单机版本不一样,官方推荐的集群版本是1.3.0,一定要看好,否则会报错
- 集群配置:配置文件
conf/cluster.conf
,配置3+节点 - 数据源:使用MySQL数据库
- 启动:
sh startup.sh
启动即可,默认使用外置数据源 - 域名:通过域名来使用时,不可设置压缩 gzip 模式,否则应用服务获取配置时会有乱码问题;
10.总结
本篇文章总体来说是对于 Nacos 的一个总结,希望同学读完这边文章,能对 Nacos 有一个基础的了解,也可以动手去实现一个基础的 Nacos 服务,这样这篇文章的目的就达到了;
对于 Nacos 的服务注册、服务配置相关内容的讲解,放在了下一篇文章,有兴趣的同学可以先行查看作者的 Github 项目地址,里面对于 Nacos 注册发现/服务配置/服务调用 等都有涉及,地址如下:
https://github.com/YClimb/spring-cloud-learning
感谢大家的阅读,下一篇文章见。