引言
Nacos是阿里巴巴中间件部门开源的一款用于服务发现和配置管理的产品,Nacos 控制台主要旨在于增强对于服务列表、健康状态管理、服务治理、分布式配置管理等方面的管控能力,以便进一步帮助用户降低管理微服务应用架构的成本。
一、访问 Nacos 控制台
1.1 登录管理
Nacos Server 运行成功后我们可以打开后台管理界面,查看其运行状态和管理信息。在浏览器访问 http://ip:8848/nacos
,默认会跳转到以下登录页面,默认的账号和密码都为:nacos。
登录后可以看到如下界面,默认进入nacos管理中心,此时还没有服务注册进来,所以服务列表是空的。右上角的内容就是一些超链接,能够跳转到 Nacos 的官网等地方
由于部分公司自己开发控制台,不希望被nacos的安全filter拦截。因此nacos支持定制关闭登录功能找到配置文件 application.properties
, 替换以下内容即可。
## spring security config
### turn off security
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**
# nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**
注意:默认会话保持时间为30分钟,30分钟后需要重新登录认证,暂时不支持修改该默认时间。
1.2 功能菜单
登录成功后可以看到左侧的菜单栏,主要功能有:配置管理、服务管理、权限管理、命名空间、集群管理,如下表所示:
一级菜单 | 二级菜单 | 说明 |
---|---|---|
配置管理 | 主要是管理配置中心的所有配置文件 | |
配置列表 | 查询、添加、修改配置数据 | |
历史版本 | ||
监听查询 | ||
服务管理 | ||
服务列表 | 用于展示已经注册到 Nacos Server的服务列表以及服务的基本信息 | |
订阅者列表 | 服务消费方以及包括客户端的版本信息等 | |
权限控制 | 用于维护管理后台系统的用户角色和权限,一般的系统都有这个功能 | |
用户列表 | 用于查询、修改、删除、添加用户 | |
角色管理 | 用于查询、修改、删除、添加角色 | |
权限管理 | ||
命名空间 | 用于将服务的注册订阅信息在逻辑上隔离开来 | |
集群管理 | ||
节点列表 | 用于查看集群节点、查看节点元数据、下线节点 |
二、配置管理
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。如果服务中配置都放在代码中或者项目里的配置文件中,那么我们想要修改配置,就不得不修改代码,提交上线、重启服务。但若是我们使用统一配置管理,就可以在服务启动的时候从配置管理服务读取配置,启动后,修改配置后,也会主动通知我们的服务。Nacos 提供了动态配置服务,支持基于 Namespace 和 Group 的配置分组管理,以便更灵活的根据自己的需要,实时进行服务应用的配置变更,让配置管理变得更加高效和快捷。
它基于 key/value 方式存储应用配置和其他元数据信息,为分布式系统中的外部化配置提供服务器端和客户端支持,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务以及Spring的大量配置。在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。
2.1 配置列表
点击Nacos控制台的【配置管理 -> 配置列表】,即可看到以下图所示。界面中展示了不同 namespace 下的配置集列表,可以点击左上角的不同 namespace 进行切换,右上角“+"号或点击某配置集后的编辑按钮可进入配置集编辑器。
在 nacos 服务端默认是没有任何配置的,我们可以在配置列表页面新增一个配。在命名空间public中点击右边+号来新建配置或点击某配置集后的编辑按钮,如下图所示。
Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式在线编辑、语法高亮、格式校验,帮助用户高效编辑的同时大幅降低格式错误带来的风险。Nacos支持配置标签的能力,帮助用户更好、更灵活的做到基于标签的配置分类及管理。同时支持用户对配置及其变更进行描述,方面多人或者跨团队协作管理配置。
当我们在修改配置文件的时候,最容易出现的就是误修改某些内容,好在Nacos支持编辑DIFF能力,帮助用户校验修改内容,降低改错带来的风险。
Nacos 提供示例代码能力,能够让新手快速使用客户端编程消费该配置,大幅降低新手使用门槛。
注意: 在 Mac 上进行同样的操作,会发现提示: "导入失败! 未读取到合法数据,请检查导入的数据文件。"这个是由于mac系统自带的
.DS_store
文件,Nacos 读取的时候会出现异常,所以需要清除.DS_store
文件。
2.2 历史版本
Nacos 通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置管理上的一定会遇到的可用性风险。Nacos中,修改配置点击发布后会创建一个对应的历史版本快照,我们可以在Nacos控制台的历史版本列表中找到这些快照,点击回滚按钮即可将配置恢复到指定的版本。
2.3 监听查询
Nacos 提供配置订阅者即监听者查询能力,可以查看配置是否推动更新成功。同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配置变更是否推送到 Client 端,如下图所示:
三、服务管理
开发者或者运维人员往往需要在服务注册后,通过友好的界面来查看服务的注册情况,包括当前系统注册的所有服务和每个服务的详情。并在有权限控制的情况下,进行服务的一些配置的编辑操作。Nacos 控制台的服务发现部分,主要就是提供用户一个基本的运维页面,能够查看、编辑当前注册的服务。
3.1 服务列表
3.1.1 服务列表页面
服务列表页面主要展示已经在Nacos注册的服务列表以及服务的基本信息等,整体界面布局是左上角有一个支持根据服务名搜索服务的搜索框和搜索按钮,页面中央是服务列表的展示。服务列表主要展示服务名、集群数目、实例数目、健康实例数目和详情按钮五部分,如下图所示。我们可以按照服务名称进行搜索,后面的隐藏空服务意思是我们可以创建一个空服务,这个空服务暂时没有任意一个实例,它就只是创建了,占了一个位置等待Nacos Client来进行注册。
3.1.2 创建服务页面
我们可以点击创建服务的按钮来进行创建空服务,然后输入服务名和保护阀值,如下图所示,点击确定后的服务列表就会显示出刚刚创建的服务。
其中,服务名⼀般用于描述该服务提供了某种功能或能力,服务名作为服务唯⼀标示,需要确保在使用中能够唯⼀定位到该服务,在项目中可以通过 spring.application.name
来指定,如下所示:
spring.application.name=spring-cloud-nacos-producer
服务实例分为健康的实例和不健康的实例,默认在5秒之后Nacos注册中心还没有收到某个实例的心跳就认为这是一个不健康的实例,当30秒还没有收到心跳就把这个服务实例剔除掉。再上图中提到保护阈值,我们可以设置一个0~1之间的数,来进行雪崩保护。如果不设置,默认是0,也就是不开启雪崩保护,当 健康的实例数 / 总实例数 < 保护阀值
就会触发雪崩保护。我们一般也不会设置保护阀值,因为后面一般会结合sentinel服务熔断降级来完成雪崩保护,Nacos 主要还是做注册中心的工作。
上图中提到分组,这是 Nacos 中次于命名空间的⼀种隔离概念,区别于命名空间的强制隔离属性,分组属于⼀个弱隔离概念,主要用于逻辑区分⼀些服务使用场景或不同应用的同名服务,最常用的情况主要是同⼀个服务的测试分组和生产分组,或者将应用名作为分组以防止不同应用提供的服务重名。分组名默认为 DEFAULT_GROUP
,在项目中可通过 spring.cloud.nacos.discovery.group
来设置,如下所示:
# 指定 nacos 中的分组名
spring.cloud.nacos.discovery.group=DEV_GROUP
此项可省略,省略时的默认值为 DEFAULT_GROUP。 分组名可以直接在项目中使用,无需像命名空间那样,在使用前还要在控制台中新建,设定了分组名之后,刷新服务列表就可以看到新的分组名称了。
3.1.3 服务详情页面
在服务列表页面点击“详情”按钮,就会进入服务详情页面。服务详情页面展示的是一个服务的所有关键信息,包括服务的配置和元数据、集群列表和示例列表,以及一些操作的按钮,如下图所示:
在该页面的上方,是服务的配置和元信息,目前包含服务名、保护阈值、健康检查模式以及元数据metadata。右上方是编辑服务按钮,点击后会有对话框弹出,可以对服务的配置进行编辑。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:version=1.0,env=prod。
服务详情的下方,是集群列表和集群下的实例列表。实例列表将会分页展示该集群下注册的所有实例,展示的信息有IP、端口、权重、是否健康、元信息和对应的编辑及下线按钮。Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮。下线按钮点击后,该实例将不会返回给订阅端,无论该实例是否健康。“下线”文本会改成“上线”,用于对应的实例上线操作。
3.2 订阅者列表
这里能够查询的服务提供者的访问记录,很简单,没有什么需要说的,略过。
四、权限控制
4.1 用户列表
Nacos 开启权限控制后,多了权限控制模块,可以给不同的用户分配不同的角色,给不同的角色分配不同资源的不同的权限。点击“用户列表”,进入用户管理页面,可以进行用户的创建、修改和删除。
4.2 角色管理
因为 Nacos 的自带的权限是基于角色来进行分配的,因此需要给创建好的用户绑定一些角色。
4.3 权限管理
角色创建好以后,就可以给这个角色赋予特定的权限了。在“添加权限”对话框里,可以选择绑定的角色、命名空间资源以及对应的动作类型。例如,可以给角色 test 绑定命名空间test的读写权限。然后又因为刚刚我们是将用户 test 绑定到了角色 test 上,那么 test 这个用户就可以对 test 这个命名空间的资源进行读写操作了。
点击控制台右上角,退出 admin 账号,然后用刚才创建的 test 进行登录。首先是左侧的权限管理菜单消失了,因为当前用户不是管理员。其次是会弹出一个鉴权失败的提示框。不用担心,这个提示框意思是 test 没有 public 命名空间的读权限,所以会弹出,但是不影响我们将命名空间切换到 test。
五、命名空间
5.1 隔离设计
Nacos 服务中最顶层、也是包含范围最广的概念,命名空间的作用其实就是可以进行多租户的分割,Nacos 基于Namespace 帮助用户逻辑隔离多个命名空间,这可以帮助用户更好的管理测试、预发、生产等多环境服务和配置,让每个环境的同一个配置(如数据库数据源)可以定义不同的值。其中,Namespace 代表不同的环境,如开发,测试,生产等;Group 代表项目,如 xxx 安全项目、xxx 电商项目等;每个项目往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件,如下图所示:
从一个租户(用户)的角度来看,如果有多套不同的环境,那么这个时候可以根据指定的环境来创建不同的namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不同的环境,那么使用一套nacos 集群可以分别建以下三个不同的 namespace。如下图所示:
从多个租户(用户)的角度来看,每个租户(用户)可能会有自己的 namespace,每个租户(用户)的配置数据以及注册的服务数据都会归属到自己的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三个租户,分别为张三、李四和王五。分配好了之后,各租户用自己的账户名和密码登录后,创建自己的命名空间。如下图所示:
5.2 命名空间管理
在管理界面创建命名空间的方法如下,点击【命名空间–>新建命名空间】,然后输入名称和描述,如下图所示,点击保存之后在列表这里就可以看到刚刚创建的命名空间了,同时在服务列表中也能看到命名空间的身影。
命名空间默认为 public,在项目开发中,如果不指定命名空间,那么会使用默认值 public。官方推荐使用运行环境来定义命名空间,例如: 开发环境(dev)、测试环境(test)、验收测试环境(uat)、生成环境(prod)等,用于将服务的注册订阅信息在逻辑上隔离开来。
在项目开发中,在Nacos Client 配置的时候其实就通过 spring.cloud.nacos.discovery.namespace
来指定命令空间了,如下所示:
spring:
application:
name: order-service # 指定应用名称,Nacos会将该名称当做服务名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # 指定Nacos服务的地址,默认值是localhost:8848
discovery:
# 指定Nacos 管理界面登录用户名和密码,默认值是nacos
username: nacos
password: nacos
namespace: public # 指定命名空间,可以隔离不同的服务实例。这里填的是命名空间的id,默认是public
注意:如果在控制台没有新建命名空间,直接在项目中使用的话,是不能将服务成功的注册到 Nacos 中的。
六、集群管理
6.1 Nacos 服务存储模型
Nacos Server可以是集群部署的也可以是单机部署,在实际生产环境中,为了防止单点故障我们肯定不可能部署一个节点。Nacos服务分级存储模型:一级是服务;二级是集群,比如可以按区域机房划分集群,北京集群、上海集群、广州集群等等;三级是实例,例如北京机房的某台服务器部署的某服务。
6.2 Nacos 服务配置集群
在 Nacos 注册的服务,如果没有配置集群的话,默认是没有集群的,也就是在一个名为 DEFAULT 的集群下,如下:
我们可以在 Nacos 服务的配置文件中通过配置指定该服务的集群,只需在配置文件比如 application.yml 中添加 spring.cloud.nacos.discovery.cluster-name 属性即可,如下:
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: http://localhost:8848 # nacos服务地址
discovery:
cluster-name: HZ # 配置集群名称,例如:HZ,代指杭州集群
此时,注册在 Nacos 中的服务可以看到它的集群名称就是我们配置的集群名称,如下:
在服务互相调用时我们应该尽可能地去选择本地集群,即同一集群的服务,因为跨集群调用延迟较高,只有当本地集群的需调用的服务不可访问时,再去访问其它集群。如下所示:
但是使用 Spring Cloud 在 Nacos 中注册的服务,默认的负载均衡策略是轮询,也就是会轮询各个服务,不会区别是否同一集群。我们可以通过配置负载均衡策略来使得调用服务时优先选择同一集群的服务。假设 order-service 和 user-service 两种服务在各个集群中都有实例存在,而我们想要配置在 order-service 中调用 user-service 服务的接口时,优先选择同一集群的服务,只需在 order-service 服务中设置负载均衡的 IRule 为 NacosRule ,如下
userservice: #指定给某个目标服务发起请求时的负载均衡规则,这里是目标服务的服务名称
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则
NacosRule 负载均衡策略会优先寻找与自己在同一集群的服务,只有在同一集群中找不到服务提供者,才去其它集群寻找,并且当使用了其他集群的服务时,服务消费者中会提示警告信息。如果一个集群中的服务提供者有多个实例,则会使用随机调用的策略。
6.3 配置实例的权重
当配置了优先访问同一集群内的服务时,在同一集群内如果有多个服务提供者实例的话,此时会使用随机访问的策略。当有时候,服务器设备之间的性能是有差异,部分实例所在的机器性能较好,另一些较差,我们可能会希望性能好的机器能承担更多的用户请求,而 Nacos 也提供了权重配置来让我们控制实例的访问频率,权重越大则访问频率越高。
我们可以在 Nacos 的控制台中设置实例的权重值,点击实例后面的编辑按钮,弹出窗口可以设置权重值,如下图所示。所有的实例的权重值默认都是1,我们可以将将权重值设置为 0~1,权重越低,被访问到的概率就越低,为 0 时则完全不会被访问到。
七、小结
把今天最好的表现当作明天最新的起点..~