Nacos学习记录
Nacos介绍
概览
Nacos是Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了一组简单易用的特性集,快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos关机关键特性
-
服务发现和服务健康检测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,根据健康状态管理服务的可用性及流量。
-
动态配置服务
动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的 UI 管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态DNS服务
动态 DNS 服务支持权重路由,更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能更容易地实现以 DNS 协议为基础的服务发现,以消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 管理服务的关联域名和可用的 IP:PORT 列表.
-
服务及其元数据管理
Nacos 能从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos部署
Nacos有两种部署方式:单机部署、集群部署。
Nacos单机部署示例
- 无论是集群部署还是单机部署。首先都需要创建nacos的数据库,nacos下载解压后的conf文件夹中提供了数据库初始化的sql文件。
- 修改conf文件夹中application.properties中关于数据库的配置。
- nacos默认以集群模式启动,因此单机部署时需要将其启动模式修改为standalone.
Nacos集群部署示例
数据库的创建以及数据库配置同单机部署一致。
序言
-
在实际生产环境中,必须保证Nacos高可用,否则一旦Nacos宕机,整个平台都会无法运行。
-
在此方案中部署三个节点Nacos,服务注册通过Nginx负载均衡。
集群搭建
- 首先将第一个环境中nacos中的cluster.conf.example重命名为cluster.conf,并在其中添加集群节点;
- 在要部署的多个环境上重复步骤1;
- 启动各节点nacos;
nginx负载均衡
- 修改nginx配置文件并启动;
- 访问nacos,查看节点
Nacos的使用
主要针对客户端(项目中)和nacos管理界面的使用介绍。服务端在部署部分进行了说明。
在springcloud中集成nacos
导入依赖
父pom
<groupId>com.luozheng</groupId>
<artifactId>NacosTest</artifactId>
<version>1.0.0.RELEASE</version>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--Spring-->
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR7</spring.cloud.version>
<spring.platform.version>Cairo-SR7</spring.platform.version>
<spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
</properties>
<modules>
<module>nacosTest1</module>
<module>nacosTest2</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>${spring.platform.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos 服务注册发现 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
子模块pom
<parent>
<artifactId>NacosTest</artifactId>
<groupId>com.luozheng</groupId>
<version>1.0.0.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacosTest1</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
添加bootstrap.yml文件
spring:
cloud:
nacos:
server-addr: 192.168.122.3:8848
discovery:
enabled: true
namespace: public
config:
group: DEFAULT_GROUP
shared-configs:
- data-id: nacosTest1.properties # 配置文件名-Data Id
group: DEFAULT_GROUP # 默认为DEFAULT_GROUP
refresh: true # 是否动态刷新,默认为false
注意
- nacos客户端的版本一定要和服务端nacos版本进行对应,否则可能会出现异常。版本的对应可以访问该链接查看: nacos组件版本关系。
- 项目启动nacos报错Request nacos server failed:或者Client not connected,current status:STARTING的原因是nacos2过后新增了grpc远程通信端口,项目启动会尝试连接,连不上就报这两个错,解决办法:服务器放行9848端口即可。
Nacos管理界面使用介绍
使用
通过上面步骤后,我们就可以在项目中使用nacos的服务发现和配置中心了。
-
在项目启动后默认以spring.application.name属性的值作为服务名,注册到nacos的服务列表中。
-
可以在配置管理的配置列表新建配置文件。这里涉及到nacos的分区概念:
- namespace:相当于环境,开发环境 测试环境 生产环境 ,每个空间里面的配置是独立的。默认的namespace是public, namespace可以进行资源隔离,是一个粗粒度的区分。
- group:在namespace下更加细粒度的区分。例如我们在同一项目下还可分为dev、test等不同场景。
Nacos原理
其它相关
nacos配置文件详解
#
# Copyright 1999-2018 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#*************** Spring Boot Related Configurations ***************#
### Default web context path:
# 访问路径
server.servlet.contextPath=/nacos
### Default web server port:
# 服务端口
server.port=8848
#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# 从cluster.conf配置文件中获取IP(集群模式)
# nacos.inetutils.prefer-hostname-over-ip=false
### Specify local server's IP:
# 设置nacos的ip
# nacos.inetutils.ip-address=
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
# 数据库类型
# spring.datasource.platform=mysql
### Count of DB:
# 数据库数量
# db.num=1
### Connect URL of DB:
# 数据库连接URL
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# 数据库用户
# db.user=nacos
# 数据库密码
# db.password=nacos
#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds:
# 同步任务生成的周期,单位为毫秒
# nacos.naming.distro.taskDispatchPeriod=200
### Data count of batch sync task:
# 同步任务每批的key的数目
# nacos.naming.distro.batchSyncKeyCount=1000
### Retry delay in milliseconds if sync task failed:
# 同步任务失败的重试间隔,单位为毫秒
# nacos.naming.distro.syncRetryDelay=5000
### If enable data warmup. If set to false, the server would accept request without local data preparation:
# 是否在Server启动时进行数据预热
# nacos.naming.data.warmup=true
### If enable the instance auto expiration, kind like of health check of instance:
# 是否自动摘除临时实例
# nacos.naming.expireInstance=true
#是否自动清理不在线服务
nacos.naming.empty-service.auto-clean=true
# 清理延迟时间
nacos.naming.empty-service.clean.initial-delay-ms=50000
# 清理间隔时间
nacos.naming.empty-service.clean.period-time-ms=30000
#*************** CMDB Module Related Configurations ***************#
### The interval to dump external CMDB in seconds:
# 全量dump的间隔,单位为秒
# nacos.cmdb.dumpTaskInterval=3600
### The interval of polling data change event in seconds:
# 变更事件的拉取间隔,单位为秒
# nacos.cmdb.eventTaskInterval=10
### The interval of loading labels in seconds:
# 标签集合的拉取间隔,单位为秒
# nacos.cmdb.labelTaskInterval=300
### If turn on data loading task:
# 是否打开CMDB
# nacos.cmdb.loadDataAtStart=false
#*************** Metrics Related Configurations ***************#
### Metrics for prometheus
# 监控端点
#management.endpoints.web.exposure.include=*
### Metrics for elastic search
# 是否导出监控数据到ES
management.metrics.export.elastic.enabled=false
# ES地址
#management.metrics.export.elastic.host=http://localhost:9200
### Metrics for influx
# 是否导出监控数据到influxdb(一款时序数据库)
management.metrics.export.influx.enabled=false
# 数据库名
#management.metrics.export.influx.db=springboot
# 数据库地址
#management.metrics.export.influx.uri=http://localhost:8086
# 是否自动创建数据库
#management.metrics.export.influx.auto-create-db=true
# 为每个点编写一致性
#management.metrics.export.influx.consistency=one
# 是否启用发布到Influx的指标批次的GZIP压缩
#management.metrics.export.influx.compressed=true
#*************** Access Log Related Configurations ***************#
### If turn on the access log:
# 是否打印access日志
server.tomcat.accesslog.enabled=true
### The access log pattern:
# 日志打印格式
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i
### The directory of access log:
# 日志存储目录
server.tomcat.basedir=
#*************** Access Control Related Configurations ***************#
### If enable spring security, this option is deprecated in 1.2.0:
# 开启security框架访问控制
#spring.security.enabled=false
### The ignore urls of auth, is deprecated in 1.2.0:
# 配置security放行路径
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
### The auth system to use, currently only 'nacos' is supported:
# 系统授权认证类型
nacos.core.auth.system.type=nacos
### If turn on auth system:
# 是否开启授权
nacos.core.auth.enabled=false
### The token expiration in seconds:
# 令牌失效时间
nacos.core.auth.default.token.expire.seconds=18000
### The default token:
# 默认访问密钥
nacos.core.auth.default.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
# 更新授权信息后的延迟时间
nacos.core.auth.caching.enabled=true
#*************** Istio Related Configurations ***************#
### If turn on the MCP server:
# 是否开启MCP
nacos.istio.mcp.server.enabled=false
###*************** Add from 1.3.0 ***************###
#*************** Core Related Configurations ***************#
### set the WorkerID manually
# 数据的主键雪花ID
# nacos.core.snowflake.worker-id=
### Member-MetaData
# nacos.core.member.meta.site=
# nacos.core.member.meta.adweight=
# nacos.core.member.meta.weight=
### MemberLookup
### Addressing pattern category, If set, the priority is highest
# 寻址模式类型
# nacos.core.member.lookup.type=[file,address-server,discovery]
## Set the cluster list with a configuration file or command-line argument
# 使用配置文件或命令行参数设置群集列表
# nacos.member.list=192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809
## for DiscoveryMemberLookup
# If you want to use cluster node self-discovery, turn this parameter on
# 自动寻址
# nacos.member.discovery=false
## for AddressServerMemberLookup
# Maximum number of retries to query the address server upon initialization
# 初始化时查询地址服务器的最大重试次数
# nacos.core.address-server.retry=5
#*************** JRaft Related Configurations ***************#
### Sets the Raft cluster election timeout, default value is 5 second
# 选举超时时间
# nacos.core.protocol.raft.data.election_timeout_ms=5000
### Sets the amount of time the Raft snapshot will execute periodically, default is 30 minute
# 集群以中性数据快照间隔时间
# nacos.core.protocol.raft.data.snapshot_interval_secs=30
### Requested retries, default value is 1
# 请求失败尝试次数
# nacos.core.protocol.raft.data.request_failoverRetries=1
### raft internal worker threads
# 线程个数
# nacos.core.protocol.raft.data.core_thread_num=8
### Number of threads required for raft business request processing
# 客户端线程请求数
# nacos.core.protocol.raft.data.cli_service_thread_num=4
### raft linear read strategy, defaults to index
# 一致性线性读策略
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
### rpc request timeout, default 5 seconds
# RPC 请求超时时间
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000