第二代 Spring Cloud 核心组件 (SCA)
Nacos(服务注册中心、配置中心)
Sentinel哨兵(服务的熔断、限流等)
Dubbo RPC/LB Seata分布式事务解决方案
Nacos是针对微服务架构中服务发现、配置管理和服务管理平台 。 Nacos就是注册中心+配置中心的组合(Nacos=Eureka+Config+Bus)
Nacos功能特性
1、服务发现与健康检查
2、动态配置管理
3、动态DNS服务
4、服务和元数据管理(管理平台的⻆度,nacos也有一个ui页面,可以看到注册的服务及其实例信息(元数据信息)等),动态的服务权重调整、动态服务优雅下线,都可以去做
Nacos 单例服务部署
1、 下载解压安装包,执行命令启动
,或者直接双击启动
linux/mac:sh startup.sh -m standalone
windows:cmd startup.cmd
2、 访问nacos管理界面
http://127.0.0.1:8848/nacos/#/login(默认端口8848, 账号和密码 nacos/nacos)
Nacos 服务注册中心
A、服务提供者注册到Nacos
(将改造简历微服务)
1、在父pom中引入整个SCA大环境依赖
<dependencyManagement>
<dependencies>
<!--SCA 依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SCA -->
</dependencies>
</dependencyManagement>
2、在业务微服务工程引入nacos客户端
(要将原来的eureka客户端全注释掉,改用nacos了的依赖)
<!--nacos service discovery client依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
完整配置如下:
3、application.yml文件添加nacos配置信息
server:
port: 8082
spring:
application:
name: lagou-service-resume
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
jpa:
database: MySQL
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免将驼峰命名转换为下划线命名
# nacos配置
cloud:
nacos:
discovery:
# 集群中各节点信息都配置在这里(域名-VIP-绑定映射到各个实例的地址信息)
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
management:
endpoints:
web:
exposure:
include: "*"
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 这个是将微服务注册到nacos集群上了
4、启动简历微服务并观察nacos控制台
B、服务消费者从Nacos获取服务
(改造自动投递微服务)
1、在服务消费者工程引入nacos客户端
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、application.yml文件添加nacos配置信息
server:
port: 8097
spring:
application:
name: lagou-service-autodeliver
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
management:
endpoints:
web:
exposure:
include: "*"
# 暴露健康接口的细节
endpoint:
health:
show-details: always
server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 这个是将微服务注册到nacos集群上了
3、 测试
通过访问服务消费者,看nacos页面上信息的变化
C、负载均衡
Nacos客户端引入的时候,会关联引入Ribbon的依赖包,我们使用OpenFiegn的时 候也会引入Ribbon的依赖,Ribbon包括Hystrix都按原来方式进行配置即可,此处,我们将简历微服务,又启动了一个8083端口,注册到Nacos上,便于测试负载均衡,我们通过后台也可以看出。 (可以优雅的下线,而且通过轮询自动切换的)
Nacos 数据模型(领域模型)
Namespace命名空间、Group分组、集群这些都是为了进行归类管理,把服务和配 置文件进行归类,归类之后就可以实现一定的效果,比如隔离。比如,对于服务来说,不同命名空间中的服务不能够互相访问调用
Namespace:命名空间,对不同的环境进行隔离,比如隔离开发环境、测试环境和 生产环境
Group:分组,将若干个服务或者若干个配置集归为一组,通常习惯一个系统归为一个组
Service:某一个服务,比如简历微服务
DataId:配置集或者可以认为是一个配置文件
Namespace+Group+Service 如同 Maven中的GAV坐标,GAV坐标是为了锁定 Jar,而这里是为了锁定服务 Namespace+Group+ ataId 如同 Maven中的GAV坐标,GAV坐标是为了锁定 Jar,而这里是是为了锁定配置文件
最佳实践
Nacos抽象出了Namespace、Group、Service、DataId等概念,具体代表什么取决 于怎么用(非常灵活),推荐用法如下(无非就是分类管理、实现了隔离)
Nacos服务的分级模型
命名空间不同是会被隔离的,服务的分组,从而实现服务的隔离
Nacos Server 数据持久化
nacos可以实现高可用的。复制多份,修改端口,重新启动
1、新建数据库
新建nacos_config数据库,数据库初始化脚本文件
${nacoshome}/conf/nacos-mysql.sql
2、配置文件增加Mysql数据源配置
修改${nacoshome}/conf/application.properties,增加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
Nacos Server 集群
1、安装3个或3个以上的Nacos
复制解压后的nacos文件夹,分别命名为nacos-01、nacos-02、nacos-03
2、 修改配置文件
A、同一台机器模拟,将上述三个文件夹中application.properties中的 server.port分别改为 8848、8849、8850 同时给当前实例节点绑定ip,因为服务器可能绑定多个ip
nacos.inetutils.ip-address=127.0.0.1
B、复制一份conf/cluster.conf.example文件
命名为cluster.conf 在配置文件中设置集群中每一个节点的信息
# 集群节点配置
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
C、 分别启动每一个实例(可以批处理脚本完成)
Windows则直接双击也可以
sh startup.sh -m cluster
D、直接将服务注册到nacos集群中
127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
Nacos 配置中心
(使用nacos时配置信息直接配置在Nacos server中, Bus也不需要了(依然可 以完成动态刷新)
操作步骤如下:
1、去Nacos server中添加配置信息
2、改造具体的微服务,使其成为Nacos Config Client,能够从Nacos Server中获取到配置信息
Nacos 服务端已经搭建完毕,那么我们可以在我们的微服务中开启 Nacos 配置管理
1、添加依赖
那么如何从nacos配置中获取信息呢,对简历提供者改造。(对服务提供者改造)
<!--nacos config client 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
完整配置如下:()
2、修改yml文件让其锁定NacosServer中的配置文件
discovery是服务注册&发现的,那么服务配置呢,用的就是config
# 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
(要保持和nacos上面的一致)
微服务中是如何锁定 Nacos Server 中的配置文件(dataId)
在nacos中是通过配置文件进行管理,实现隔离的。
通过 Namespace + Group + dataId 来锁定配置文件,Namespace不指定就默认 public,Group不指定就默认 DEFAULT_GROUP ,那么 dataId 是如何定义的呢?具体如下
dataId 的完整格式如下
${prefix}-${spring.profile.active}.${file-extension}
1、prefix 默认为spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置
2、spring.profile.active 即为当前环境对应的profile。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
3、file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型
3、新增一个ConfigController配置类调用
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新 ,所以必须要添加这个注解
/**
* 该类用于模拟,我们要使用共享的那些配置信息做一些事情
*/
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
// 和取本地配置信息一样
@Value("${lagou.message}")
private String lagouMessage;
@Value("${mysql.url}")
private String mysqlUrl;
@Value("${abc.test}")
private String abctest;
@Value("${def.test}")
private String deftest;
@Value("${java.first}")
private String javafirst;
// 内存级别的配置信息
// 数据库,redis配置信息
@GetMapping("/viewconfig")
public String viewconfig() {
return "lagouMessage==>" + lagouMessage + " mysqlUrl=>" + mysqlUrl
+ " abctest=>" + abctest + " deftest=>" + deftest + " javafirst=>" + javafirst;
}
}
思考:一个微服务希望从配置中心Nacos server中获取多个dataId的配置信息,可以的,扩展多个dataId
# 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
# 根据规则拼接出来的dataId效果:lagou-service-resume.yaml
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越高优 先级越高)