第二代 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 standalonewindows: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: 8082spring:application:name: lagou-service-resumedatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf8username: rootpassword: 123456jpa:database: MySQLshow-sql: truehibernate: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:8850management: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: 8097spring:application:name: lagou-service-autodelivercloud:nacos:discovery:server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850management: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=truedb.user=rootdb.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:8848127.0.0.1:8849127.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 # 命名空间idgroup: 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")@RefreshScopepublic 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 # 命名空间idgroup: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置file-extension: yaml #默认properties# 根据规则拼接出来的dataId效果:lagou-service-resume.yamlext-config[0]:data-id: abc.yamlgroup: DEFAULT_GROUPrefresh: true #开启扩展dataId的动态刷新ext-config[1]:data-id: def.yamlgroup: DEFAULT_GROUPrefresh: true #开启扩展dataId的动态刷新
优先级:根据规则生成的dataId > 扩展的dataId(对于扩展的dataId,[n] n越高优 先级越高)
