1.Nacos简介
阿⾥ Nacos 宣布开源,并快速成为国内最受关注开源产品.作为 Eureka 的替代, Nacos 已经成为了国内开发者的⾸选。
在最初开源时,Nacos 选择进⾏内部三个产品合并统⼀开源( Configserver ⾮持久注册中⼼,VIPServer 持久化注册中⼼,Diamond 配置中⼼). 定位为:⼀个更易于构建云原⽣应⽤的动态服务发现,配置管理和服务管理平台.所以 Nacos 是⼀个注册中⼼组件,但它⼜不仅仅是注册中⼼组件. 截⾄⽬前, Nacos ⼏乎⽀持了所有的主流语⾔,⽐如 Java, Go, C++, Nodejs, Python, Scala等
仓库:https://github.com/alibaba/nacos
2.Nacos 安装
学习阶段采⽤单机安装即可.以下内容都是单机版
2.1 下载安装包
⽬前官⽅推荐的稳定版本为 2.3.0
下载地址:https://github.com/alibaba/nacos/releases/tag/2.3.0
2.2 安装
请参考本博客的源码安装与docker安装即可。
2.3 数据库连接
在上面下载的安装包 nacos-server-2.3.0.zip
,解压可以看到 nacos\conf
里有 mysql-schema.sql
文件。
创建对应的数据库,即可。
3.Nacos 快速上手
3.1 引入 spring-cloud-alibaba 的依赖
在⽗⼯程的 pom ⽂件中的 <dependencyManagement>
中引⼊ Spring Cloud Alibaba 的依赖:
springboot 版本是 2.7.18
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring-cloud依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud ablibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.2 引入 Nacos 相关的依赖
在 order-service 和 product-service 中引⼊ nacos 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3 服务注册和发现
因为 order-service 和 product-service 需要将服务注册到 Nacos 上,并且要在 Nacos 上查找服务,所以需要在 order-service 和 product-service 的配置文件中要配置 Nacos 注册中心的地址
application.yml
# 设置服务名称
spring:
application:
name: product-service
# 设置 nacos 服务器地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
给 order-service 和 product-service 服务配置了 nacos 的服务器地址以及服务名称后,启动项目,便自动的将服务注册到了 nacos 服务器上。(前提是要启动了 nacos 服务器)
3.4 Nacos 负载均衡
⽣产环境相对是⽐较恶劣的,我们需要对服务的流量进⾏更加精细的控制.Nacos ⽀持多种负载均衡策略,包括权重,同机房,同地域,同环境等.
3.4.1 服务下线
当某⼀个节点上接⼝的性能较差时,我们可以第⼀时间对该节点进⾏下线.
操作步骤:找到对应的服务名称,点击详情
找到出现问题的机器,点击下线(下线以后通过 RestTemplate 发来的请求就不会被发送到该机器)
也可以在同样的位置点击上线,机器就会恢复能接收到请求
3.4.2 权重配置
除了下线之外,我们也可以配置这个节点的流量权重
操作步骤: 找到对应节点 -> 编辑 -> 在弹出的窗⼝修改权重值
3.4.3 同集群优先访问
给实例配置集群名称(分配实例到集群)
为服务配置集群名称
spring:
cloud:
nacos:
discovery:
cluster-name: SH #集群名称: 上海集群
重启服务:观察 Nacos 控制台, SH 集群下多了⼀个实例
3.5 Nacos 健康检查
两种健康检查机制
Nacos 作为注册中⼼,需要感知服务的健康状态,才能为服务调⽤⽅提供良好的服务.Nacos 中提供了两种健康检查机制:
客户端主动上报机制
• 客户端通过⼼跳上报⽅式告知服务端(nacos注册中⼼)健康状态,默认⼼跳间隔5秒;
• nacos 会在超过15秒未收到⼼跳后将实例设置为不健康状态,超过30秒将实例删除服务器端
反向探测机制
• nacos 主动探知客户端健康状态,默认间隔为20秒.
• 健康检查失败后实例会被标记为不健康,不会被⽴即删除.
Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的.
3.6 Nacos 环境隔离
企业开发中,⼀个服务会分为开发环境,测试环境和⽣产环境.
- 开发环境:开发⼈员⽤于开发的服务器,是最基础的环境.⼀般⽇志级别设置较低,可能会开启⼀些 调试信息.
- 测试环境:测试⼈员⽤来进⾏测试的服务器,是开发环境到⽣产环境的过渡环境.
- ⽣产环境:正式提供对外服务的环境,通常关掉调试信息.通常情况下,这⼏个环境是不能互相通信的.Nacos 提供了namespace(命名空间)来实现环境的隔离.不同的 namaspace 的服务不可⻅.
3.6.1 创建 Namespace
默认情况下,所有服务都在同⼀个 namespace ,名为 public
点击命名空间
- > 新建命名空间
-> 设置命名空间的属性
3.6.2 配置 namespace
namespace 创建完成后,对服务进⾏配置,将服务添加到相应的环境。
spring:
cloud:
nacos:
discovery:
namespace: 命名空间ID
此时服务会被添加到另一个环境中,无法使用其他环境的服务。
4.Nacos配置中心
除了注册中⼼和负载均衡之外,Nacos 还是⼀个配置中⼼,具备配置管理的功能. Namespace 的常⽤场景之⼀是不同环境的配置区分隔离.例如开发测试环境和⽣产环境的配置隔离.
为什么需要配置中心?
当前项⽬的配置都在代码中,会存在以下问题:
- 配置⽂件修改时,服务需要重新部署.微服务架构中,⼀个服务可能有成百个实例,挨个部署⽐较⿇烦,且容易出错.
- 多⼈开发时,配置⽂件可能需要经常修改,使⽤同⼀个配置⽂件容易冲突.
配置中⼼就是对这些配置项进⾏统⼀管理.通过配置中⼼,可以集中查看,修改和删除配置,⽆需再逐个修改配置⽂件.提⾼效率的同时,也降低了出错的⻛险.
- 服务启动时,从配置中⼼读取配置项的内容,进⾏初始化.
- 配置项修改时,通知微服务,实现配置的更新加载.
4.1 快速上⼿
通过以下操作,我们来感受下 Nacos 配置中⼼的使⽤
在 Nacos 控制台添加配置项
注意:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的.默认是 public 也就是服务管理命名空间配置 ≠ 配置管理的命名空间
4.1.1 新建配置项
说明:
- Data ID设置为项⽬名称
- 配置内容的数据格式,⽬前只⽀持 properties 和 yaml 类型
- 设置配置内容
4.1.2 获取配置
引⼊ Nacos Config 依赖(bootstrap)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置 bootstrap.properties
(告诉服务,配置中心所在的位置)(因为配置中心和服务的注册和发现的位置可能不同,所以是分别配置的,并且配置中心所在的位置必须在 bootstrap.properties 配置文件中设置)
# 配置的 ID
spring.application.name=product-service
# 配置的 IP 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name 需要和 nacos 配置管理的 Data ID⼀致 spring.cloud.nacos.config.server-addr 为 Nacos Server 的地址
配置中⼼和注册中⼼的配置是隔离的
Nacos 配置中⼼: spring.cloud.nacos.config.server-addr
Nacos 注册中⼼: spring.cloud.nacos.discovery.server-addr
配置完以后通过代码从配置中心获取配置:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
// 配置进⾏热更新(配置中心的配置改了以后,能够自动更新为新配置)
@RefreshScope
public class NacosController {
//通过 Value 从配置中心获取配置
@Value("${nacos.test.num}")
private Integer num;
@RequestMapping("/getNum")
public String getNum(){
return "从 nacos 配置中心获取到配置项 nacos.test.num:"+num;
}
}
第二种方式推荐:
首先定义一个配置类:
@Data
@Component
@ConfigurationProperties(prefix = "nacos.test")
@RefreshScope
public class DataProperties {
private Integer num;
}
使用:
@RestController
// 配置进⾏热更新(配置中心的配置改了以后,能够自动更新为新配置)
@RefreshScope
public class NacosController {
@Autowired
private DataProperties dataProperties;
@RequestMapping("/getNum")
public String getNum(){
return "从 nacos 配置中心获取到配置项 nacos.test.num:"+ dataProperties.getNum();
}
}
4.2 Data Id
在 Nacos Spring Cloud 中, dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
• prefix 默认为 spring.application.name 的值, 也可以通过配置项 spring.cloud.nacos.config.prefix 来配置.
• spring.profiles.active 即为当前环境对应的 profile.当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
• file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。⽬前只⽀持 properties 和 yaml 类型.默认为 properties
微服务启动时,会从 Nacos 读取多个配置⽂件:
-
${prefix}-${spring.profiles.active}.${file-extension}
如:product-service-dev.properties
-
${prefix}.${file-extension}
,如:product-service.properties
-
${prefix}
如product-service
三个⽂件的优先级为: product-service-dev.properties
> product-service.properties
>product-service
评论区