第⼀代 Spring Cloud (主要是 SCN)很多组件已经进⼊停更维护模式。
Spring Cloud:Netflix,Spring官⽅,SCA-Spring Cloud Alibaba(被Spring官⽅认可)
Alibaba 更进⼀步,搞出了Spring Cloud Alibaba(SCA),SCA 是由⼀些阿⾥巴巴的开源组件和云产品组成的,2018年,Spring Cloud Alibaba 正式⼊住了 Spring Cloud 官⽅孵化器。
SCA(Spring Cloud Alibaba)主要有以下几个服务:
Nacos (Dynamic Naming and Configuration Service)是阿⾥巴巴开源的⼀个针对微服务架构中服务发现、配置管理和服务管理平台。
官⽹:https://nacos.io 下载地址:https://github.com/alibaba/Nacos
Namespace命名空间、Group分组、集群这些都是为了进⾏归类管理,把服务和配置⽂件进⾏归类,归类之后就可以实现⼀定的效果,⽐如隔离
Namespace + Group + Service 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,⼆这⾥是为了锁定服务
Namespace + Group + DataId 如同 Maven 中的GAV坐标,GAV坐标是为了锁定Jar,⼆这⾥是为了锁定配置⽂件
Nacos抽象出了Namespace、Group、Service、DataId等概念,具体代表什么取决于怎么⽤(⾮常灵活),推荐⽤法如下
概念 | 描述 |
---|---|
Namespace | 代表不同的环境,如开发dev、测试test、⽣产环境prod |
Group | 代表某项⽬ |
Service | 某个项⽬中具体xxx服务 |
DataId | 某个项⽬中具体的xxx配置⽂件 |
下载解压安装包,执⾏命令启动。
linux/mac:sh startup.sh -m standalone
windows:cmd startup.cmd
访问nacos管理界⾯:http://127.0.0.1:8848/nacos/#/login(默认端⼝8848,账号和密码nacos/nacos)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.1.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
spring:
cloud:
nacos:
discovery:
################ 配置nacos server地址
server-addr: 127.0.0.1:8848
服务名:微服务项目名,对应微服务spring.application.name
分组:代表某项⽬,可自定义,默认DEFAULT_GROUP
保护阈值:可以设置为0-1之间的浮点数,它其实是⼀个⽐例值(当前服务健康实例数/当前服务总实例数)
⼀般流程下,nacos是服务注册中⼼,服务消费者要从nacos获取某⼀个服务的可⽤实例信息,对于服务实例有健康/不健康状态之分,nacos在返回给消费者实例信息的时候,会返回健康实例。这个时候在⼀些⾼并发、⼤流量场景下会存在⼀定的问题
如果服务A有100个实例,98个实例都不健康了,只有2个实例是健康的,如果nacos只返回这两个健康实例的信息的话,那么后续消费者的请求将全部被分配到这两个实例,流量洪峰到来,2个健康的实例也扛不住了,整个服务A 就扛不住,上游的微服务也会导致崩溃,产⽣雪崩效应。
元数据:类似于eureka元数据
服务路由类型:常规使用,保持默认即可,进一步主要用于多数据中心的就近访问
Nacos客户端引⼊的时候,会关联引⼊Ribbon的依赖包,我们使⽤OpenFiegn的时候也会引⼊Ribbon的依赖,Ribbon包括Hystrix都按原来⽅式进⾏配置即可
Nacos 默认使⽤嵌⼊式数据库进⾏数据存储,它⽀持改为外部Mysql存储
${nacoshome}/conf/application.properties(Nacos配置文件)
,增加Mysql数据源配置spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
安装3个或3个以上的Nacos
修改application.properties
配置文件,给当前实例绑定IP,如果是在同机器上,则每台Nacos需要修改port端口
nacos.inetutils.ip-address=127.0.0.1
复制⼀份conf/cluster.conf.example
⽂件,命名为cluster.conf
在配置⽂件中设置集群中每⼀个节点的信息
# 集群节点配置
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
分别启动每⼀个实例(可以批处理脚本完成)
sh startup.sh -m cluster
改造微服务,添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
微服务中如何锁定 Nacos Server 中的配置⽂件(dataId)
通过 Namespace + Group + dataId 来锁定配置⽂件,Namespace不指定就默认public,Group不指定
就默认 DEFAULT_GROUP
dataId 的完整格式如下
${prefix}-${spring.profile.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。
spring.profile.active
即为当前环境对应的 profile
。 注意:当 spring.profile.active
为空时,对应的连接符 - 也将不存在,dataId
的拼接格式变成 ${prefix}.${fileextension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。⽬前只⽀持 properties
和 yaml
类型。
cloud:
nacos:
discovery:
# 集群中各节点信息都配置在这⾥(域名-VIP-绑定映射到各个实例的地址信息)
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
group: DEFAULT_GROUP
file-extension: yaml
通过 Spring Cloud 原⽣注解 @RefreshScope 实现配置⾃动更新
/**
* 该类⽤于模拟,我们要使⽤共享的那些配置信息做⼀些事情
*/
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
// 和取本地配置信息⼀样
@Value("${message}")
private String message;
@Value("${mysql.url}")
private String mysqlUrl;
// 内存级别的配置信息
// 数据库,redis配置信息
@GetMapping("/viewconfig")
public String viewconfig() {
return "Message==>" + message + " mysqlUrl=>" + mysqlUrl;
}
}
# nacos配置
cloud:
nacos:
discovery:
# 集群中各节点信息都配置在这⾥(域名-VIP-绑定映射到各个实例的地址信息)
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
# nacos config 配置
config:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
# 锁定server端的配置⽂件(读取它的配置项)
namespace: 07137f0a-bf66-424b-b910-20ece612395a # 命名空间id
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使⽤默认分组可以不配置
file-extension: yaml #默认properties
ext-config[0]:
data-id: abc.yaml
group: DEFAULT_GROUP
refresh: true #开启扩展dataId的动态刷新
ext-config[1]:
data-id: def.yaml
group: DEFAULT_GROUP
refresh: true #开启扩展dataId的动态刷新
优先级:根据规则⽣成的dataId > 扩展的dataId(对于扩展的dataId,[n] n越⼤优先级越⾼)