Naocs介绍
官网文档地址: https://nacos.io/zh-cn/docs/quick-start.html
Naocs缩写就是 Naming Configuration service,本身nacos就是一个service服务,这个服务的功能包括命名管理、服务注册发现、配置管理。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。 和spring cloud原生组件eureka是非常类似的,所以在eureka停更之后,nacos的活跃度非常高,无论从应用还是性能都是首选替代品。
Nacos功能
- 服务治理
- 注册功能
- 发现功能
- 配置管理
环境准备运行
配置JDK环境变量
进入到nacos家目录中bin文件夹下,打开cmd
需要一个集群环境,一个进程跑不起来
运行命令,添加一个选项,单机运行
bin> startup.cmd -m standalone
运行之后,访问地址:localhost:8848/nacos。通过登录用户名密码:nacos nacos。服务端。
idea配置nacos启动项
1、启动项配置界面
2、添加新的配置项shell script
3、填充启动配置
4、启动脚本启动项
Nacos服务注册发现配置
nacos作为服务治理的组件,可以提供服务的协调管理功能包括服务注册和服务发现。
Nacos服务注册
模拟服务注册
CURL简介
该命令可以在系统中发送一个自定义的http请求,命令格式
curl -X [请求方式] [请求路径]
访问百度
curl -X GET https://www.baidu.com
访问nacos注册
curl -X POST "http://localhost:8848/nacos/v1/ns/instance?serviceName=first-service&ip=127.0.0.1&port=8080"
Nacos运行架构
nacos-server是一个服务进程,运行在web容器中,可以接收外界发起的请求,比如我们模拟post请求在nacos进行数据的注册。
配置注册
服务端客户端
整合nacos-client
1、项目中引入nacos服务治理客户端依赖
<!-- nacos-注册抓取-client -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、yaml配置
#微服务配置
#在微服务架构中,表示微服务名字
#不同的名字表示功能不一样,相同的名字,功能接口都相同
spring:
application:
name: csmall-business
#微服务cloud配置
cloud:
#微服务cloud中组件nacos
nacos:
#nacos中注册发现的功能
discovery:
#填写nacos的服务端地址
server-addr: localhost:8848
3、在nacos控制台出现注册信息
配置管理:了解学习nacos配置中心功能。
服务管理:微服务架构中的服务治理功能,在控制台可以看到注册信息,服务状态实例的个数等。
权限控制:用户访问的权限管理,默认使用nacos/nacos。
命名空间:管理不同开发环境的配置隔离。
集群管理:nacos可以配置集群。
yaml详细配置
临时实例永久实例
同一个服务,可以启动多个实例,形成一个服务集群。
当前启动进程是永久实例还是临时实例取决于此配置的值,true 表示临时实例false表示永久实例。
#默认值为true
spring.cloud.nacos.discovery.ephemeral=fasle
永久实例:nacos永远不删除的注册信息,就是永久实例。
临时实例:暂时为某些应用,环境准备的扩容实例,就是定义为临时实例。
例如: 淘宝每一个功能都是一个服务,而且具备多个实例,平日访问是固定流量,所以使用永久实例支持,如果双11来临,流量激增,需要增加临时实例,等待11完成,删除临时实例。
客户端实例的ip地址
服务器ip地址有多个,因为配置多个网卡,有的网卡是外部访问的,有的网卡是局域网网卡,所以客户端web实例在nacos注册希望被别人访问调用一般会考虑是内部调用还是外部调用。
为了防止springboot自动读取的ip地址未必满足实例相互调用的需求,一般情况下,认为确定到底是哪个ip地址,填充到这个属性,携带到nacos。
spring.cloud.nacos.discovery.ip=10.6.15.126
命名空间
开发过程中,使用的开发、测试、上线环境是不同。所以nacos提供隔离环境。默认情况下,只有public公用命名空间。
可以在nacos服务端自定义创建命名空间。
在yaml中配置需要的命名空间
#命名空间配置
spring.cloud.nacos.discovery.namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
创建完新的命名空间,可以在服务列表中看到隔离的注册信息。
分组配置
#分组
spring.cloud.nacos.discovery.group: 1.0
在同一个命名空间注册的服务实例,可以进行分组操作。主要功能之一:灰度发布。
灰度发布:程序有新版本发布,未更新的老版本也是可以使用的。开发项目,项目发布的特点两个 一个是持续发布,一个是版本发布。持续发布特点中,有灰度发布的概念。此配置为了解决灰度发布的新老版本互相调用,产生版本兼容问题,而做的分组隔离。
服务心跳检测
服务实例启动后,会在nacos注册一个信息。后续服务实例和nacos服务端会保持一个心跳检测的机制。如果心跳检测结果失败,nacos就会认为这个实例不健康,会剔除实例或者保存不健康状态。
永久实例:故障或宕机不会在心跳检测时,保持健康状态,但是不会剔除。
临时实例:故障或宕机,就会在一段时间之后,进行剔除。
服务心跳检测配置
#临时和永久实例检测不同,秒为单位
#心跳检测间隔时间,更新时间戳
spring.cloud.nacos.discovery.heart-beat-interval=5
#超时心跳删除时间
spring.cloud.nacos.discovery.ip-delete-timeout=20
临时实例:主动发送心跳请求,每次请求都会更新nacos服务端记录的这个实例的时间戳。每隔5秒发送一次。如果nacos服务端发现有某个时间点,应该心跳,但是没有更新时间戳,记录当前实例不健康,如果心跳更新时间超时20秒没更新,则剔除了。
永久实例:心跳不是主动上传的,而是nacos向下探测。
注册信息在nacos中的内存状态
多实例注册
需求目的: 使用idea的配置启动项,启动3个服务,同时注册nacos。一个服务多个实例,才能形成一个分布式集群,应对高并发、高请求量的场景。
Nacos服务发现(抓取)
nacos提供了接口访问,进行数据的注册/心跳上传。注册的数据是为了让别的服务发现,从而使用其中的ip:port进行远程调用,所以nacos还提供了发现的接口。
模拟服务发现
curl -X GET "http://localhost:8848/nacos/v1/ns/instance/list?serviceName=csmall-business"
总结nacos的服务注册发现机制
- nacos结构:
- 角色2个: 服务端(nacos-server进程)、客户端(spring cloud整合到web应用组件)
- nacos功能:
- 服务注册:在微服务中,服务注册目的是为了让别的服务发现,获取当前服务信息。
- 服务发现:为了调用别的服务,从而在nacos进行信息的抓取。
Nacos服务配置中心
应用场景
在微服务开发过程中,yaml文件、json文件、properties文件等,非常多的冗余重复的内容,不方便统一管理。
例如: 开发环境连接的redis 110.99.88.77:8999,20多个服务全部在开发环境指向这个redis,突然有一天服务器宕机,redis环境换了 111.99.88.77:8999,这时候每个服务都需要改一遍,就会造成一些麻烦。
需求: 将重复的配置,提取到通用的管理平台-nacos
配置中心运行结构
远程配置案例
1、在本地进程添加config依赖和bootstrap依赖
<!-- client config nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--springboot版本大于2.3.X,需要引入这个依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2、需要引入一个bootstrap.yaml文件
上面的bootstrap依赖,就是为了让springboot启动的时候加载这个bootstrap.yaml文件的。bootstrap.yaml能够被springboot加载,并且先于application.yaml文件加载的。application.yaml配置启动进程的参数配置;bootstrap.yaml收集环境信息的参数配置;读取到远程文件配置内容,放回application.yaml使用。
如果远程读的数据和application.yaml冲突的,application.yaml会覆盖远程读取的。
spring:
profiles:
#开启不同环境配置
active: dev
#bootstrap定义不同环境,在同一个文件bootstrap.yaml
#---区分,每个环境中定义名称
---
spring:
config:
activate:
on-profile: dev
#告诉bootstrap 远程配置中心nacos地址 和我们要读取的配置文件(先读默认的)
application:
#所有的application.name都是服务名称
name: csmall-stock
cloud:
nacos:
config:
#必须配置的值
server-addr: localhost:8848
#文件类型 后缀 默认是properties txt json yaml xml html
file-extension: yaml
---
spring:
config:
activate:
on-profile: test
通过bootstrap+nacosconfig配置,默认读取的文件格式:
{spring.application.name}-{spring.profiles.active}.{file-extension} 服务名称-环境名称.文件后缀扩展
当前根据bootstrap.yaml的属性,要求默认读取的3个文件:只有服务名称、服务名称.后缀名、服务名称-环境名称.后缀名,任何一个都可以使用。
配置步骤,填写配置的基本信息以及所需内容。提取共用重复参数配置,例如:nacos参数配置、mysql连接配置、mybatis配置等等,编辑到配置内容栏里。注意配置名称的填写
bootstrap配置nacos读取远程其他属性
spring:
cloud:
nacos:
config:
#必须配置的值
server-addr: localhost:8848
#文件类型 后缀 默认是properties txt json yaml xml html
file-extension: yaml
#前缀,默认是服务名称,不想使用默认值,可以自定义
prefix: sdlaslkdfjsdlj
#多环境运行的 namespace 命名空间的id
namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
#持续发布中,保证灰度发布 分组
group: 1.0
#是否支持刷新.远程配置一旦修改,本地进程内存数据是否刷新,如果刷新,true,不需要重启
#false 重启,内存才变动 默认也是true
refresh-enabled: true
#读取指定的文件
shared-configs:
- data-id: redis.yaml
group: 1.0
refresh-enable: true
- data-id: datasource.yaml
group: 1.0
refresh-enable: true
- data-id: es.yaml
group: 1.0
refresh-enable: true