2018年,阿里巴巴开源 Nacos,由此成为继 Eureka、Consul、Apollo 等服务注册发现&配置的又一开源框架,到如今2021年,Nacos 已经历了 0.01->1.4.2/2.0.1 版本的迭代,社区也非常的活跃,Github 上拥有超过 18kstar7kfork;使用 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

感谢大家的阅读,下一篇文章见。

Nacos实战一:架构及部署的更多相关文章

  1. 【k8s实战一】Jenkins 部署应用到 Kubernetes

    [k8s实战一]Jenkins 部署应用到 Kubernetes 01 本文主旨 目标是演示整个Jenkins从源码构建镜像到部署镜像到Kubernetes集群过程. 为了简化流程与容易重现文中效果, ...

  2. 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker

    Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...

  3. miniFTP项目实战一

    项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...

  4. 【转】Delphi+Halcon实战一:两行代码识别QR二维码

    Delphi+Halcon实战一:两行代码识别QR二维码 感谢网友:绝代双椒( QQ号应原作者要求隐藏了:xxxx6348)的支持 本文是绝代双椒的作品,因为最近在忙zw量化培训,和ziwang.co ...

  5. C蛮的全栈之路-node篇(二) 实战一:自动发博客

    目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 ---------------- 我是分割线 ---- ...

  6. .NET Core 微服务架构-Docker部署

    本文主要介绍通过Docker来部署通过.NET Core开发的微服务架构,部署的微服务主要包括统一网关(使用Ocelot开发).统一认证(IdentityServer4).应用服务(ASP.NET C ...

  7. 机器学习实战一:kNN手写识别系统

    实战一:kNN手写识别系统 本文将一步步地构造使用K-近邻分类器的手写识别系统.由于能力有限,这里构造的系统只能识别0-9.需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:32像素*3 ...

  8. zookeeper curator ( 实战一)

    目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...

  9. Netty聊天器(实战一):从0开始实战100w级流量应用

    Java 聊天程序(百万级流量实战一):系统介绍 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之14 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在前面 ...

随机推荐

  1. teprunner测试平台定时任务这次终于稳了

    teprunner测试平台已经有一个多月没有更新了,主要原因是定时任务不够稳定,经过反复试错,找到了解决办法,这次终于稳定了. 本文开发内容 作为测试平台而言,定时任务算是必备要素了,只有跑起来的自动 ...

  2. C# HTTP请求对外接口、第三方接口公用类

    /// <summary> /// 网络数据请求公共函数 /// </summary> public class HttpWebRequestCommon { #region ...

  3. CVPR2020:视觉导航的神经拓扑SLAM

    CVPR2020:视觉导航的神经拓扑SLAM Neural Topological SLAM for Visual Navigation 论文地址: http://openaccess.thecvf. ...

  4. 如何安装/导入Arduino库文件及库文件的不同位置与区别(以eFLL中嵌入式模糊逻辑库为例)

    网上有数百个可在Aruduino中使用的库,这些代码集使得我们无需从0-1地搭建我们所需功能,这使得学习和使用Arduino变得更加方便简单.除此之外,平时直接从网上download下的代码也很有可能 ...

  5. 04:CSS(02)

    溢出属性 p { height: 100px; width: 50px; border: 3px solid red; /*overflow: visible; !*默认就是可见 溢出还是展示*!*/ ...

  6. java笔试题(二)

    1.写出一维数组初始化的两种方式 int[] arr={1,2,3}; String[] str=new String[2]; str[1]="23"; 2.写出二维数组初始化的两 ...

  7. Python使用websocket调用语音识别,语音转文字

    @ 目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音识别websocket接口,实现语音转文字 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1 ...

  8. JAVA并行程序基础二

    JAVA并行程序基础二 线程组 当一个系统中,如果线程较多并且功能分配比较明确,可以将相同功能的线程放入同一个线程组里. activeCount()可获得活动线程的总数,由于线程是动态的只能获取一个估 ...

  9. 关于kubernetes的十七个实验(一)

    实验综述 Kubernetes用来管理云平台上的容器化应用,这里从 https://www.katacoda.com/courses/kubernetes 学习Kubernetes的使用,对Kuber ...

  10. DOS命令行(3)——Windows运行窗口打开特定功能

    cmd 开启命令解释权或启用Windows中的某程序 cmd /c 执行完命令后关闭命令窗口 cmd /k 执行完命令后不关闭命令窗口   winver 查看Windows版本信息版权信息授权信息   ...