1.spring Cloud是什么?
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式对话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。他们在任何分布式环境中都能很好的工作,包括开发人员自己的笔记本电脑、数据中心,托管平台。
Spring Cloud是由Spring提供的一套能够快速搭建微服务架构程序,解决分布式微服务框架中各种问题的框架集(每个框架都针对微服务中问题提供了解决方案)
框架集表示Spring Cloud不是一个框架,而是很多框架的集合。
1.1 Spring Cloud Alibaba
Spring Cloud Alibaba和Spring Cloud的关系。
spring cloud提供的是接口 alibaba是根据这套接口实现的功能
一站式解决方案的选型
1.2 阿里巴巴的组件
nacos:注册中心,基础,配置中心
dubbo:远程调用 rpc框架
sentinel:熔断限流
rocketMQ:异步通信,提升性能
1.3 Spring Cloud原生组件
spring cloud gateway:网关
2、Nacos介绍
Nacos致力于帮助您发现、配置和管理微服务,Nacos提供了一组简单易用的特性集,帮助您快速发现实现动态服务发现、服务配置、服务元数据以及流量管理。
Nacos在微服务架构中,实现使用的功能包括 服务治理,配置的管理
当前时长上任何一种微服务落地方案,都需要这种软件存在,即使不使用nacos,也需要别的相同功能的软件技术来带提(console eureka zookeeper)
2.1 核心功能
注册中心:
发现(抓取 查询)
注册(新增)
配置中心
Nacos启动脚本:尽量在没有中文以及空格的目录下启动
startup.cmd -m standalone
startup.cmd 是一个 Windows 平台下的脚本文件,用于执行一系列命令以启动应用程序。而-m standalone 参数指示应用程序以独立模式(standalone mode)启动。
停止关闭Nacos服务端
直接在cmd窗口 或者终端ctrl+c 看到提示符重新出现
2.2 页面介绍
配置管理:nacos作为配置保存管理的数据显示
服务管理:nacos作为注册中心保存的服务数据显示
权限管理:典型的用户 角色 权限管理的逻辑
命名空间:管理不同开发环境的配置和注册信息隔离的相关内容
集群管理:如果Nacos集群启动的,集群管理可以对集群中的nacos节点做管理操作,下线,查看状态
2.3 Nacos的客户端配置
2.3.1 客户端
Nacos是一个web应用绑定的组件,每个nacos客户端可以通过web应用的配置,和服务端进行逻辑交互,帮助web应用整合到微服务框架组件结构中.
2.3.2 Spring Boot整合Nacos
Spring Boot存在,任何经过整理优化的软件技术,可以通过非常简单的步骤完成
1、添加依赖
<!--引入nacos的依赖-->
<dependency>
<groupId>***.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、yaml配置
spring:
#spring 应用名称
#微服务中 服务名称
application:
name: luban-demo-cart
#微服务 nacos客户端配置属性
cloud:
nacos:
discovery:
# 提供给当前底层客户端nacos的服务端地址 域名:端口
server-addr: localhost:8848
3、做一些简单的代码配置或者注解的使用
2.4客户端和服务端交互基本原理
nacos服务端支持http协议的访问,可以将其当成一个支持http协议web服务
nacos客户端只要通过http协议访问nacos服务端暴露的接口,就可以实现和服务端交互
根据官网提示的信息
nacos客户端 具备一个接受post请求的接口地址
/nacos/v1/ns/instance
nacos客户端请求到这个地址,携带一些参数,可以在nacos服务生成注册信息(服务信息)
serviceName=luban-demo-stock&ip=20.18.7.10&port=8080
可以使用任何支持http请求的插件 实现在nacos服务端进行注册测试,比如postman
比如curl命令
curl支持http西医访问的插件命令,用法:
curl -X [METHOD] args目标地址
如果使用curl发送一个post请求
curl -X POST "http://localhost:8848/nacos/v1/ns/instance?serviceName=test-demo&ip=127.0.0.1&port=10010"
结论:客户端nacos进程已经组织好了所有交互代码逻辑,无需我们介入,我们只需要将这个客户端进程整合到web应用,自动和服务交互,注册当前服务实例信息,携带当前web应用中服务名称(spring.application.name),ip(自动获取),port(server.port)服务端会记录保存这个数据到内存。
nacos服务端除了提供注册的接口(新增)还提供了一个抓取的接口(查询)
接口地址:
/nacos/v1/ns/instance/list
通过这个接口,可以传递参数,获取某个服务的详细信息
serviceName=luban-demo-stock
通过curl命令来测试
curl -X GET "http://localhost:8848/nacos/v1/ns/instance/list?serviceName=luban-demo-cart-haha"
{
"hosts": [
{
"ip": "10.1.6.132",
"port": 10005,
"valid": true,
"healthy": true,
"marked": false,
"instanceId": "10.1.6.132#10005#DEFAULT#DEFAULT_GROUP@@luban-demo-cart-haha",
"metadata": {
"preserved.register.source": "SPRING_CLOUD"
},
"enabled": true,
"weight": 1.0,
"clusterName": "DEFAULT",
"serviceName": "luban-demo-cart-haha",
"ephemeral": true
}
],
"dom": "luban-demo-cart-haha",
"name": "DEFAULT_GROUP@@luban-demo-cart-haha",
"cacheMillis": 3000,
"lastRefTime": 1692176089735,
"checksum": "e12bd76eb3558f8f25b480393365ea08",
"useSpecifiedURL": false,
"clusters": "",
"env": "",
"metadata": {
}
}
nacos客户端进程 除了进行注册之外,还会根据自己的需求,对nacos客户端保存的注册信息进行抓取,隔一段时间进行更新
3、Nacos客户端yaml详解
3.1临时实例 永久实例
概念:服务 服务实例(每一个web应用进程)在一个服务中 服务实例多个
当前启动进程是永久实例还是临时实例true 表示临时实例 false表示永久实例
spring:
cloud:
nacos:
discovery:
ephemeral: true
永久实例:nacos永远不删除的注册信息,就是永久实例
临时实例:暂时为某些应用,环境准备的扩容实例,就是定义为临时实例
3.1.1为什么要区分永久实例和临时实例
淘宝每一个功能都是一个服务,而且具备多个实例,平日访问时固定流量,所以使用永久实例支持,如果双11来临,流量激增,需要增加临时实例,等待11完成,删除临时实例
3.2服务实例的ip地址
ip值时nacos客户端默认情况下根据寻求网卡的逻辑,自动从某一个网卡获取的ip地址
概念:服务器多网卡,每个网卡都有本机的一个ip地址网段,功能不一样,网络范围也不一样
如果ip地址时nacos自己选的,不一定能够选择正确的ip地址
正确的IP地址:在nacos注册的ip 如果被别人抓取到,能够正常访问服务实例的ip地址
spring:
cloud:
nacos:
discovery:
ip:
3.3命名空间
开发过程中,使用的开发,测试,上线环境时不同的,所以nacos提供隔离的环境
不同的环境 对应使用微服务框架的时候,nacos注册在不同的命名空间
nacos默认命名空间-public
nacos客户端配置的时候没有指定命名空间,默认使用public,可以在右上角创建命名空间,
nacos客户端指定注册命名空间,使用属性配置namespace
spring:
cloud:
nacos:
discovery:
namespace:
3.4 分组配置
nacos管理的注册信息,同一个命名空间下有多个服务,但是服务注册可以放到不同的分组
分组的主要目的是--灰度发布,同时在环境中 存在多个版本不同的服务端进程
通过nacos客户端属性配置,默认不填写group 叫做DEFUALT_GROUP
spring:
cloud:
nacos:
discovery:
group:
3.5 服务剔除
nacos实例,作为一个进程,内部包含了一个nacos客户端,在启动注册之后,需要和nacos服务端建立一个健康状态检测机制
永久实例:nacos服务端会进行下探,主动询问,如果下探发现没有相应,记录健康状态为false,下探不会停止
临时实例:临时实例自己,主动上报(心跳检测)nacos服务端记录每次上报的时间戳
服务端会根据时间戳的值,判断是否健康,是否剔除
spring:
cloud:
nacos:
discovery:
heart-beat-interval: 5
ip-delete-timeout: 20
heart-beat-interval: 5
指定服务实例向 Nacos 服务器发送心跳的间隔时间。默认值为 30 秒。上述配置中将其设置为 5 秒,即每 5 秒就会向 Nacos 服务器发送一次心跳。较短的心跳间隔可以更快地检测出故障实例并进行替换。
ip-delete-timeout: 20
指定 Nacos 服务器删除服务实例的超时时间。默认值为 30 秒。如果一个服务实例在这个时间内没有发送心跳,则将被认为已经下线。上述配置中将其设置为 20 秒,即如果一个服务实例在 20 秒内没有发送心跳,则将被从 Nacos 服务器中删除。
时间具体设置的值,取决于什么因素
1、超过时间不能小于 间隔时间
2、取决于网络因素
网络畅通,抖动没有:时间缩小5 10
网络经常抖动 放大 10 60
4 nacos配置中心
4.1应用场景
开发学习一个微服务架构,其中会有很多的服务,每个服务又有很多的实例
每个服务开发过程中,需要编辑配置大量的web文件,比如yaml,json,html,xml...
这么多配置文本,是不方便统一管理的,特点:重复,同时变动...
在多团队和多人员开发的场景中,一般这种文件都需要交给配置中心管理、
4.2实现nacos配置客户端整合
1、依赖nacos config 客户端
<!--引入nacos依赖-配置中心客户端依赖-->
<dependency>
<groupId>***.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--为属性配置yaml准备的一个依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2、yaml属性 告诉nacos到那个服务端读取哪些文件
在项目中引入一个bootstrap.yaml配置文件
如果当前spring boot版本是2.3.x或更早,不需要引用依赖spring-cloud-starter-bootstrap
但是如果springboot高于2.3.x就需要引用
引入新的配置文件,和application.yaml配置文件区别是什么?
bootstrap.yaml先于application.yaml加载
bootstrap.yaml应该只需要支持nacosConfig客户端链接远程配置中心即可
配置bootstrap的格式
1、如果不区分开发环境,和application.yaml没区别
spring:
application:
# 连接配置中心的时候需要配置客户端提供的参数
name: luban-demo-cart
# 微服务配置管理
cloud:
nacos:
config:
server-addr: localhost:8848
区分开发环境,和application配置稍有区别
spring:
profiles:
active: dev
---
spring:
application:
# 连接配置中心的时候需要配置客户端提供的参数
name: luban-demo-cart
# 微服务配置管理
cloud:
nacos:
config:
server-addr: localhost:8848
config:
activate:
on-profile: dev
---
spring:
application:
# 连接配置中心的时候需要配置客户端提供的参数
name: luban-demo-cart
# 微服务配置管理
cloud:
nacos:
config:
server-addr: 100.99.11.11:8848
config:
activate:
on-profile: prod
4.3配置远程文件
默认情况下,没有指定远程文件名称(dataId),当前nacosConfig客户端也会在启动后读取
文件名称都是基于在bootstrap.yaml配置文件里指定属性值
spring.application.name=luban-demo-cart
file-extension 没给默认值 properties
spring.profiles.active=dev
4.4本地配置远程化
保证能够读取到远程1个或者多个文件的前提下,可以将本地公用配置
spring.datasource从本地移除,放在远程文件
由于默认读取的文件,不一定满足文件后缀,格式的要求,而且,不能实现多个服务的共性化读取,所以我们需要指定让当前项目读取某一个,某几个文件
yaml属性 bootstrap
spring:
profiles:
active: dev
---
spring:
application:
name: luban-demo-cart
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
shared-configs:
- data-id: datasource.yaml
refresh: true
- data-id: mybatis.yaml
refresh: true
- data-id: nacos-registry.yaml
refresh: true
config:
activate:
on-profile: dev
bootstrap.yaml配置内容如上:
-
帮助nacosconfig客户端提前连接nacosconfig服务端读取指定文件
-
如果没指定文件 没有配置shared-configs,会根据spring.applicaiton.name 和spring.profiles.active,和spring.cloud.nacos.config.file-extensions属性值,读取默认的三个文件.
-
通过shared-configs配置指定文件,可以实现公用文件的读取. 指定读取三个文件 datasource.yaml(spring.datasource.url) nacos-registry.yaml(spring.cloud.nacos.discovery.server-addr),mybatis.yaml(mybatis.configuration.**)