Nacos通关文牒
一 下载安装及启动
1.下载安装
在Nacos官网下载自己需要的版本,根据官方教程启动Nacos。
Nacos下载地址:Nacos Server 下载 | Nacos 官网
Nacos文档地址:Nacos 概览 | Nacos 官网
我这里使用的是2.5.1版本,这是最后一个支持JDK1.8的稳定版本。这里以windows
版本为例。
2.启动
1.将下载的压缩包解压出来,然后进入到 conf
目录下,找到mysql-schema.sql
文件。
2.创建一个名为 nacos 的数据库,然后运行mysql-schema.sql
文件,运行成功后数据库中会出现以下数据表。(其他名称也可以,这里的nacos数据库为nacos配置文件中的默认名称)
3.在conf
目录下,找到application.properties
文件,该文件是Nacos的配置文件,可以配置端口,鉴权,数据库等相关内容。
Nacos默认使用内置的derby数据库,官方推荐使用Mysql,以下数据库配置内容。默认全都是注释的,我们打开,然后将关键信息修改为我们实际信息即可。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
spring.datasource.platform=mysql
spring.sql.init.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=123456
4.开启鉴权:开启鉴权后,不论是登录Nacos控制台,还是在项目中启用服务发现,都需要账号密码才可以,这将很好的提升安全性,这里推荐开启。
# 开启鉴权
nacos.core.auth.caching.enabled=true
# 这两个属性是身份验证的白名单,由其他服务器的身份验证请求使用。
nacos.core.auth.server.identity.key=shawn
nacos.core.auth.server.identity.value=shawnisgoodman
# 开启token的缓存以及缓存时间
nacos.core.auth.plugin.nacos.token.cache.enable=true
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
# token秘钥,这里我使用OpenSSL随便生成了一个
nacos.core.auth.plugin.nacos.token.secret.key=tyoaJ9QoKuHE/baxDs89XiOxDw2C0lm0okBMK1huCxU=
5.做完以上准备工作后,再切换到bin
目录下,打开cmd
,输入启动命令启动即可。
Nacos共有三种启动模式,我们先以单机模式
启动,单机模式主要用于开发和调试,线上推荐集群模式
,这样可以保证高可用,大型项目推荐多集群模式
。
# standalone 表示单机模式
startup.cmd -m standalone
启动成功后,在浏览器输入日志中给出的地址即可打开Nacos控制台,Nacos默认使用8848端口,如果该端口被占用,记得在application.properties
配置文件中进行修改。
6.登录控制台,出现以下界面时,说明我们的Nacos已经完全运行成功。开启Nacos鉴权后,Nacos第一次启动时会在数据库中添加一个账号密码均为nacos的超级管理员用于登录,使用该账号密码(nacos/nacos
)登录即可。
二 服务注册
1.基础服务注册
1.我们新创建一个springboot项目,然后将Nacos整合进来。可以在创建项目时直接勾选上,也可以等创建完了再手动添加nacos依赖。
手动添加依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>x.x.x.x</version>
</dependency>
这边建议直接勾选,因为勾选时会在项目中引入spring-cloud-alibaba-dependencies
依赖,这个依赖会把和当前Springboot版本适配的依赖包都整合了进来,可以有效避免因为版本不兼容引起的冲突问题。
2.修改配置文件,在application.yml
文件中编辑以下内容,运行即可。如果使用properties
格式的配置文件,则按照properties
格式编写即可。
server:
port: 8088
spring:
application:
name: payServer # 应用名,即服务名,这里假设为payServer
cloud:
nacos:
discovery:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
编辑完成后还需要再启动类上增加 @EnableDiscoveryClient
注解,用于启动服务注册。
@SpringBootApplication
@EnableDiscoveryClient
public class PayServerApplication {
public static void main(String[] args) {
SpringApplication.run(PayServerApplication.class, args);
}
}
然后运行项目即可,项目运行成功后,即可在Nacos控制台的服务列表模块找到我们刚才注册的payServer服务。
至此,Nacos的服务注册功能完成。
2.永久服务注册配置
前边我们向Nacos注册的payServer服务,其实是一个临时服务。临时服务的特点在于:当服务关掉时将会被Nacos直接剔除,直接从服务列表消失。
这样就存在一个问题,当有很多服务时,我们无法一眼知道那些服务出现了问题。这种情况下,将服务注册为永久实例是一个很好的办法。
我们在配置文件中增加 ephemeral
配置,并且赋值为 false
,这样就可以将该实例注册为永久实例,配置之后重启该服务,它就会一直存在于服务列表中。
spring:
application:
name: payServer # 应用名,即服务名
cloud:
nacos:
discovery:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
ephemeral: false # 是否为临时实例
当永久实例出现问题时,服务列表会给与红色警示,以方便我们知道那些服务出现了问题。
注意:如果在重启时报错,可能是因为临时实例还没有被Nacos剔除出去导致的,这需要一点时间。我们可以在列表查询时关闭"隐藏空服务"选项,然后手动删除掉再重启。
需要解释一下,当一个服务的所有实例全部停掉后,该服务在服务列表中才会爆红。
特别注意:当一个服务被注册为永久服务后,它对应的实例将无法被直接删除,如果删除,则必须通过Nacos提供的API来删除。
3.保护阈值
保护阈值是一个百分比值
,健康实例数
的占比小于保护阈值
时才会触发,并且会在服务列表中以true
显示来提示我们。
例如userServer有3个服务实例,我将它的保护阈值调整为0.5,这意味着至少有两个服务实例出现问题时才会触发保护阈值。
以下是几种状态的对比图,需要关注的地方,我已经进行了标注。
关闭一个服务实例:
关闭两个服务实例:
全部关闭后:
我们进入到服务详情里,也可以清晰的看到各个服务的详细状态,红色表示出现问题,绿色表示健康。
4.权重值
权重值可以是小数,也可以是整数。在负载均衡的过程中,权重值较小的服务实例,被实际访问到的比例也较小。
这一点在配置不同的服务器上显得尤为有用。对于性能好的服务器,我们可以调大它的权重值,让它承担更多的工作量,反之亦然。
另一方面,如果我们新修改了部分代码,希望放一部分用户进来测试一下,也可以调小它的权重,确认没问题了再调到正常值。
需要注意:在服务拥有多个实例时权重才有用,如果只有一个实例,那么权重值将不会产生任何作用。另外当权重值为0时,即便该服务实例正常,它也不会被访问。
如上图,三个实例被访问到的比例为2:1:0.5 。
5.集群
集群是一个范围上的概念,在实际中可以将它运用到区域或机房上面。
比如有两个机房,一个在西安,一个北京。我们希望西安的服务在调用其他服务时,优先调用西安的。那么我们就可以通过简单设置来实现这一需求。
Nacos内置了优先同集群调用的功能,我们只需要开启即可。
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
ephemeral: false # 是否为临时实例
cluster-name: XIAN # 集群名称
loadbalancer:
# 开启nacos负载均衡
nacos:
enabled: true
关键点:我这里使用的spring-cloud-alibaba 2021.0.5.0版本, 已经舍弃了Ribbon
,改用 Spring Cloud LoadBalancer
作为负载均衡中间件。
Spring Cloud LoadBalancer
默认的负载均衡策略是轮询机制
,它不像Ribbon那样经过简单配置即可,需要自定义去实现。
如果你使用的是RestTemplate
,那么需要注册一个Bean对象来实现负载均衡,并且需要使用@LoadBalanced
注解。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
如果使用OpenFeign
,则需要在启动类上添加@EnableFeignClients
注解。
配置好服务的集群属性,并且开启同集群优先访问后,就可以重启服务了。
可以看到,我们的服务实例已经按照集群分成了两部分。这时候一个西安的服务需要要用上边的该服务,它就会优先调用西安集群下的。
6.命名空间
1.命名空间也是一个范围上的概念,它的范围包含了集群范围,并且不同命名空间下的服务实例相互隔离,不能相互访问。
命名空间常被用来做环境隔离,比如常用的开发环境,测试环境,正式环境等。
Nacos默认提供了一个保留关键字(public)环境,我们可以根据需求来创建不同的命名空间。
2.在Nacos的命名空间模块下,可以轻松地创建我们需要的命名空间。然后在服务列表中查看。
服务注册时,不设置命名空间,我们的服务实例会被默认注册到public
空间下,假设我们想将服务注册到指定的空间(例如dev)下,则需要在项目的配置文件中添加namespace
属性,并且填写 dev 空间的ID。
3.在服务列表模块下,切换到 dev 空间,然后点击红框标记出来的复制按钮,即可复制该命名空间的ID。当然,也可以直接在命名空间模块复制。
复制完成后,在项目的application.yml
文件中进行配置,然后重启服务,就会发现我们的服务已经被注册到dev空间下了。
请注意,我这里为防止内容过多,删除了一些配置信息。
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 # 命名空间ID
对于命名空间,只需要记住各个命名空间之间是完全隔离
的即可。
7.删除服务实例接口
DELETE /nacos/v1/ns/instance
请求参数及说明:
名称 | 位置 | 类型 | 必选 | 说明 |
---|---|---|---|---|
namespaceId | query | string | 否 | 命名空间 |
serviceName | query | string | 是 | 服务名称 |
groupName | query | string | 否 | 分组名称 |
clusterName | query | string | 否 | 集群名称 |
ip | query | string | 是 | 服务IP |
port | query | integer | 是 | IP端口 |
ephemeral | query | boolean | 是 | 是否临时实例 |
accessToken | query | string | 是 | 鉴权Token |
请求示例:
DELETE http://localhost:8848/nacos/v1/ns/instance?namespaceId=public&serviceName&groupName=DEFAULT_GROUP&clusterName=DEFAULT&ip&port&ephemeral&accessToken=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc0OTU1MjgyOH0.Jiy2SZKUyfLrCtAscxiaOQ5tis8RFP5eEfeqZNZHofk
更多API接口请参考官方文档。
三 配置管理
配置管理允许我们从Nacos控制台创建配置文件,然后在项目中远程调用,并且支持热更新。
1.创建配置文件
1.首先配置文件也受命名空间的管理,即项目调用的Nacos配置文件必须和项目在同一个命名空间下。
配置文件的名称格式,一般是 服务名-环境名-文件格式名。例如下图中的 orderServer-dev.yaml
,这里的yaml不能简写为yml。
2.配置文件支持多格式,不过本人还是习惯yaml格式,我们为之前创建的payServer创建一个配置文件,并且填写一些内容。
填写完成后保存发布,然后在项目中进行其他配置。
2.引入关键依赖
1.首选需要引入spring-cloud-dependencies
依赖,这是SpringCloud的重要依赖,我这里使用的是2021.0.6
版本,可以与SpringCloud Alibab
很好的兼容。注意它被引入到了 dependencyManagement
节点下
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后再继续引入我们需要的真正依赖。
<!--启用bootstrap.yml配置文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--允许从Nacos加载配置,包括但不限于数据库,或其他配置信息-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.引入依赖完成后,需要创建一个bootstrap.yml
文件,这个文件的加载时间早于application.yml
,Nacos就是利用这一点实现了远程配置管理。
以下是一个简单的启动流程图。
3.修改项目配置
1.在项目的resources
目录下,创建一个bootstrap.yml
文件,由于项目启动时先加载bootstrap.yml
文件,我们可以把application.yml
的一部分配置信息移动到bootstrap.yml
中来。
以下是application.yml
文件内容:
server:
port: 8088
2.以下是bootstrap.yml
文件内容,nacos.config节点下就是配置中心的相关参数。
需要注意的地方两个地方:
- 增加了
profiles.active
节点,并且赋值为 dev。 nacos.config
节点下的大部分配置与discovery
节点一样,主要就是多了一个file-extension
属性,并且赋值为 yaml。
spring:
profiles:
active: dev
application:
name: payServer # 应用名,即服务名
cloud:
nacos:
discovery:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
ephemeral: false # 是否为临时实例
cluster-name: XIAN # 集群名称
namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 # 命名空间
config:
server-addr: 192.168.16.192:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: 123456 # Nacos 密码
namespace: 8cfaa93a-a864-4d68-bbbd-6f95c65e21f5 # 命名空间
file-extension: yaml # 配置文件格式,默认为properties
refresh-enabled: true # 热更新,默认为true
3.解释说明:项目读取Nacos配置中心的配置文件时,是按照一定规则来读的。具体规则为:
服务名-环境名.配置文件后缀名
我们可以从日志中看到一些信息。
从日志中可以看到,它默认会读取两个与服务名称
相同的配置文件。第一个无后缀名,第二个是我们配置的yaml后缀名。而读取到的payServer-dev.yaml则是我们真正配置的文件,并且 dev 是我们当前项目的环境名。
最主要的,项目启动完成后,会持续监听这三个文件,因为这个热更新功能,默认是开启的。
当我们修改了Nacos远程配置文件时,项目的控制台也会给出日志提示。
从以上我们可以推断出,不带环境名和后缀名的Nacos配置文件,在同一个服务下是共享的,事实上也的确是这样。我们可以利用这一点,将一些公共配置信息
放在以服务名命名的配置文件中,这样可以让实际开发和部署调试都变得更加轻松。
4.远程拉取配置信息
拉取配置信息有两种办法,一种是通过@Value注解注解读取某一个字段,另一种则是通过@ConfigurationProperties
注解,将配置信息读取到对象中。
1.通过@Value读取
我们写一个简单的API接口,演示一下如何读取。
不过想要实现热更新,还需要在使用Nacos配置中心的地方加上@RefreshScope
注解。这样一来,在Nacos配置中心修改配置文件后无需重启服务即可实现配置文件的更新。
@RestController
@RequestMapping("/pay")
@RefreshScope
public class PayController {
// 通过@Value注解来读取配置内容
@Value("${production.author}")
private String name;
@GetMapping("/info")
public String info() {
return name;
}
}
编辑完成后,在浏览器访问:
2.通过@ConfigurationProperties读取
使用这种办法,需要创建一个字段和配置文件一致的类,并且设置读取的节点。根据payServer的配置文件,我们从production
节点开始读取即可。
@ConfigurationProperties(prefix = "production")
@Component
@Data
public class ProductionConfig {
private String name;
private String version;
private String remark;
}
然后修改控制器代码如下:
@RestController
@RequestMapping("/pay")
public class PayController {
@Resource
private ProductionConfig productionConfig;
@GetMapping("/info")
public String info() {
return JSON.toJSONString(productionConfig);
}
}
再次运行后在浏览器访问:
注意细节:使用@ConfigurationProperties
读取Nacos远程配置信息时,不需要在使用的类上使用@RefreshScope
注解,就可以实现热更新。
四 Nacos集群
单机模式的Nacos在开发调试阶段是很有用的,但是如果到了生产环境,单机模式的Nacos如果出现问题,那将带来灾难性的后果,所以在生产环境实现Nacos集群是一件非常重要的事情。
以下是Nacos集群的基本逻辑实例。数据库的主从集群不在这里演示。
1.基本配置
Nacos已经提供在配置集群需要的相关文件,我们只需要打开它然后修改即可。
进入到Nacos的conf
目录,找到cluster.conf.example
文件,然后复制一份,将名称修改为cluster.conf
,这就是Nacos提供的用来配置集群的关键性文件。
2.配置服务器IP及端口
打开cluster.conf
配置文件,将集群中所有的服务器地址及IP都放到集群列表中去。
由于我这里是本地,所以就复制了三份,然后用端口来区分。实际部署使用真实的服务IP和端口即可。
配置完成之后使用 startup.cmd
启动就行,这次不需要任何参数。
留意观察,集群部署的Nacos和单机模式略有区别,它会把节点列表都罗列出来。
全部启动后即可进行下一步。
3.配置Nginx
全部启动完成后,利用Nginx的负载均衡功能做代理转发,即可完成Nacos的集群部署。
Nginx的配置内容:
http {
upstream nacos-server {
least_conn;
server 192.168.16.192:8844;
server 192.168.16.192:8846;
server 192.168.16.192:8848;
}
server {
listen 1234;
server_name localhost;
location / {
proxy_pass http://nacos-server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
}
}
}
然后启动Ngxin,在浏览器访问http://localhost:1234/nacos,完成登录后,可以在Nacos控制台的集群管理中看到各节点的状态。
五 Nacos配置参数大全
以下是Nacos各项配置的默认值及备注说明,仅供参考。
spring:
application:
name: your-application-name # 应用名称,用于注册到Nacos的服务名及匹配对应的Data ID
cloud:
nacos:
# 🔹 配置中心 Config Management
config:
server-addr: 127.0.0.1:8848 # Nacos Server地址(必填)
file-extension: yaml # 配置文件格式,可选:properties/yaml/json,默认properties
group: DEFAULT_GROUP # 配置分组,默认DEFAULT_GROUP
namespace: # 命名空间ID,用于多环境隔离(如 dev/test/prod),留空则为public命名空间
timeout: 3000 # 读取超时时间,单位毫秒,默认3000ms
username: nacos # 访问Nacos配置中心的用户名(如果开启了认证)
password: nacos # 密码(如果开启了认证)
refresh: true # 是否启用自动刷新配置(推荐开启)
extension-configs: # 加载多个DataId的配置文件(数组形式)
- data-id: common.yaml # 要加载的额外Data ID
group: DEFAULT_GROUP # 对应的分组
refresh: true # 是否动态刷新该配置
shared-configs: # 共享配置(类似extension-configs,但优先级更低)
- data-id: shared.yaml
group: DEFAULT_GROUP
refresh: true
# 🔹 服务发现 Service Discovery
discovery:
server-addr: 127.0.0.1:8848 # Nacos Server地址(必填)
service: ${spring.application.name} # 注册的服务名,默认为spring.application.name
weight: 1 # 权重值,范围是0~1,数值越高优先级越高
cluster-name: DEFAULT # 集群名称,默认DEFAULT
group: DEFAULT_GROUP # 分组,默认DEFAULT_GROUP
namespace: # 命名空间ID,用于多环境隔离
username: nacos # 登录Nacos用户名(如果启用了认证)
password: nacos # 登录密码
metadata: # 自定义元数据(键值对)
version: 1.0.0
heartbeat: true # 是否启用心跳机制,默认true
enabled: true # 是否启用服务注册发现功能,默认true
register-enabled: true # 是否注册本服务到Nacos,默认true
fetch-enabled: true # 是否从Nacos获取服务列表,默认true
fail-fast: true # 启动失败是否抛异常,默认true
ip: 127.0.0.1 # 自定义注册IP,默认自动识别
port: 8080 # 自定义注册端口,默认当前服务端口
secure: false # 是否启用HTTPS,默认false
ephemeral: true # 是否临时节点(非持久化),默认true
health-check-type: TCP # 健康检查方式,可选TCP/HTTP/MYSQL,默认TCP
heart-beat-interval: 5000 # 心跳间隔时间(毫秒),默认5000
service-heart-beat-timeout: 15000 # 心跳超时时间,超过这个时间未收到心跳则标记为不健康
service-renewal-period: 10000 # 客户端续约周期(毫秒),默认10000
完结撒花!!!