一起进阶学习JAVA:Spring Cloud Alibaba:Nacos

一起进阶学习JAVA:Spring Cloud Alibaba:Nacos

  • Nacos 服务注册和配置中⼼
    • Nacos功能特性
    • Nacos 数据模型(领域模型)
    • 单实例Nacos部署
    • 整合Nacos注册中心
    • Nacos控制台服务模块
    • 负载均衡
    • Nacos Server 数据持久化
    • Nacos Server 集群
    • Nacos 配置中⼼

第⼀代 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(服务注册中⼼、配置中⼼)
  • Sentinel哨兵(服务的熔断、限流等)
  • Dubbo RPC/LB
  • Seata分布式事务解决⽅案

Nacos 服务注册和配置中⼼

Nacos (Dynamic Naming and Configuration Service)是阿⾥巴巴开源的⼀个针对微服务架构中服务发现、配置管理和服务管理平台。

官⽹:https://nacos.io 下载地址:https://github.com/alibaba/Nacos

Nacos功能特性

  • 服务发现与健康检查
  • 动态配置管理
  • 动态DNS服务
  • 服务和元数据管理(管理平台的⻆度,nacos也有⼀个ui⻚⾯,可以看到注册的服务及其实例信息(元数据信息)等),动态的服务权重调整、动态服务优雅下线,都可以去做

Nacos 数据模型(领域模型)

Namespace命名空间、Group分组、集群这些都是为了进⾏归类管理,把服务和配置⽂件进⾏归类,归类之后就可以实现⼀定的效果,⽐如隔离

⽐如,对于服务来说,不同命名空间中的服务不能够互相访问调⽤
一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第1张图片

  • Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境、测试环境和⽣产环境
  • Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组,通常习惯⼀个系统归为⼀个组
  • Service:某⼀个服务
  • DataId:配置集或者可以认为是⼀个配置⽂件

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配置⽂件

一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第2张图片

单实例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)
    一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第3张图片

整合Nacos注册中心

  1. 在⽗pom中引⼊SCA依赖
<dependencyManagement>
	 <dependencies>
	 
		 <dependency>
			 <groupId>com.alibaba.cloudgroupId>
			 <artifactId>spring-cloud-alibaba-dependenciesartifactId>
			 <version>2.1.0.RELEASEversion>
			 <type>pomtype>
			 <scope>importscope>
		 dependency>
	dependencies>
	 
dependencyManagement>
  1. 在服务提供者⼯程中引⼊nacos客户端依赖
<dependency>
	 <groupId>com.alibaba.cloudgroupId>
	 <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
  1. application.yml中,添加nacos配置信息
spring:
 	cloud:
 		nacos:
 			discovery:
 				################ 配置nacos server地址
 				server-addr: 127.0.0.1:8848

Nacos控制台服务模块

一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第4张图片

  1. 服务名:微服务项目名,对应微服务spring.application.name

  2. 分组:代表某项⽬,可自定义,默认DEFAULT_GROUP

  3. 保护阈值:可以设置为0-1之间的浮点数,它其实是⼀个⽐例值(当前服务健康实例数/当前服务总实例数)

    ⼀般流程下,nacos是服务注册中⼼,服务消费者要从nacos获取某⼀个服务的可⽤实例信息,对于服务实例有健康/不健康状态之分,nacos在返回给消费者实例信息的时候,会返回健康实例。这个时候在⼀些⾼并发、⼤流量场景下会存在⼀定的问题

    如果服务A有100个实例,98个实例都不健康了,只有2个实例是健康的,如果nacos只返回这两个健康实例的信息的话,那么后续消费者的请求将全部被分配到这两个实例,流量洪峰到来,2个健康的实例也扛不住了,整个服务A 就扛不住,上游的微服务也会导致崩溃,产⽣雪崩效应。

  4. 元数据:类似于eureka元数据

  5. 服务路由类型:常规使用,保持默认即可,进一步主要用于多数据中心的就近访问

负载均衡

Nacos客户端引⼊的时候,会关联引⼊Ribbon的依赖包,我们使⽤OpenFiegn的时候也会引⼊Ribbon的依赖,Ribbon包括Hystrix都按原来⽅式进⾏配置即可

Nacos Server 数据持久化

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

Nacos Server 集群

  • 安装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
    

Nacos 配置中⼼

一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第5张图片

  1. 去Nacos server中添加配置信息
    一起进阶学习JAVA:Spring Cloud Alibaba:Nacos_第6张图片
    Data ID:代表配置文件名称

  2. 改造微服务,添加依赖

    <dependency>
    	 <groupId>com.alibaba.cloudgroupId>
    	 <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
  3. 微服务中如何锁定 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 来配置。⽬前只⽀持 propertiesyaml类型。

      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
      
  4. 通过 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;
 	 }
}
  1. 多data-Id配置
# 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越⼤优先级越⾼)

你可能感兴趣的:(Spring,Cloud,微服务,java,分布式,spring,boot,后端,spring)