Nacos
认识学习
Nacos是一个开源的服务注册和配置中心,由阿里巴巴集团开发和维护。它提供了服务注册、服务发现和动态配置管理等功能,是微服务架构中非常常用的基础设施组件之一。
通过Nacos,可以轻松地将微服务注册到注册中心,并且其他服务能够通过注册中心发现和调用这些服务。此外,Nacos还提供了动态配置管理的能力,允许在运行时动态修改配置参数,而不需要重启应用程序。
Nacos支持多种语言和框架,具有良好的可扩展性和高可用性。可以与Spring Cloud、Dubbo等常见的微服务框架集成,提供了简单易用的API和控制台界面来管理服务注册和配置信息。
本地搭建
官网下载地址
在window环境下我们只需要下载zip包
- 解压到非中文路径下后,进入到我们的bin目录执行cmd打开命令行窗口
这里启动单机模式运行
startup.cmd -m standalone
在Linux环境下下载tar.gz包
- 解压
这里依然是单机模式运行
sh startup.sh -m standalone
启动完成后我们只需要通过提示的http地址即可访问Nacos
使用 --服务发现与注册
Nacos的实现方式与Eureka类似
1、首先我们需要在父模块的pom文件中引入
<!-- springCloudAlibaba这个用来管理我们之后导入的模块依赖的版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2、在子模块中引入Nacos依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3、配置application文件
spring:
cloud:
nacos:
server-addr: localhost:8848
启动服务后即可在我们的nacos服务列表中找到
Nacos服务分级存储模型
为了防止单点故障的出现,提升系统的高并发处理以及扩展性,我们就会通过集群来实现
① 一级是服务,就是我们的service
② 二级是集群,就是分布在不同地区的机房
③ 三级是实例,是我们机房中某台部署了该服务的服务器
设置实例的集群属性我们只需要在原有的application.yml的配置中添加cluster-name的属性值即可
服务集群
spring:
cloud:
nacos:
server-addr: localhost:8848
# 配置我们的集群名称
discovery:
cluster-name: CN
通过不同的cluster-name的值即可实现不同地区集群的搭建
注意!!!
上面只是简单集群实例的搭建,如果要想真正实现集群的对应访问,我们还需要修改服务的访问规则
userservice:
ribbon:
# 先集群后随机,本地没有跨集群
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
这样便实现了针对于集群的访问
当我们的同集群下的所有实例出现问题时,才会出现跨集群的访问情况,并会出现警告来方便人员维护
权重访问–服务集群
小Tips
当我们想要进行服务升级迭代是可以通过将某一实例的权重变化为0,之后慢慢提高权重,来实现服务整体的平滑升级
环境隔离-namespace
Nacos通过namespace进行环境隔离的核心,各个命名空间相互独立,避免了不同环境之间的相互干扰以及不同环境之间的冲突和故障传递,更好保障了各个环境之间的独立和稳定性。
环境隔离配置方式
1、在nacos页面新建命名空间
2、修改对应服务的application文件,重新启动该服务,之后我们会发现该服务会处于定义的命名空间之中
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HK
# 将之前生成的ID复制过来
namespace: e5783e71-2fb2-4ce3-bcaf-0b94144b7a99
3、在调用不同命名空间的服务时会返回500,并报错没有可用实例
以上实例说明了namespace可以实现不同命名空间下的服务隔离
临时实例和非临时实例
Nacos默认为临时实例,针对临时实例,Nacos采用心跳机制。
针对非临时实例,Nacos会主动询问,速度快于心跳检测,但会增加服务器负担。
在服务的application文件中,通过配置可以进行设置
spring:
application:
name: orderservice
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HK
namespace: e5783e71-2fb2-4ce3-bcaf-0b94144b7a99
# 这个ephemeral默认值为true即为临时实例
ephemeral: false
临时实例在出现问题时,nacos会在服务列表中主动删除,而非临时实例失效,nacos会保存该服务,直到该服务恢复
配置中心
如果希望实现配置中心的功能,因为我们希望在远程获取配置,但是配置又在application.yml文件中,所以我们用到bootstrap.yml文件,该配置在项目启动时优先于application.yml
实现方法
1、在服务中添加依赖
<!-- nacos配置中心管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、在Nacos页面添加配置
默认规则采用${spring.application.name}-${profile}.${file-extension:properties}
即服务名称-环境.文件后缀
3、因为我们想要加载该配置文件就需要提前知道配置的地址,所以就需要在加载application.yml文件之前找到nacos的地址,正好bootstrap.yml文件满足条件,加载在application之前。
# 通过配置bootstrap文件实现nacos服务中的配置获取
spring:
application:
name: userservice
profiles:
active: dev
cloud:
nacos:
server-addr: localhost:8848
config:
file-extension: yaml
这样便实现了服务的远程配置
配置热更新
两种方式:
- 通过@Value注解注入,结合@RefreshScope来进行刷新
@Slf4j
@RestController
@RequestMapping("/user")
// 2. 实现热更新开启
@RefreshScope
public class UserController {
@Autowired
private UserService userService;
// 1. 注解注入,读取配置文件中的属性值
@Value("${pattern.dateformat}")
private String dateformat;
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
}
- 通过@ConfigurationProperties注入,自动刷新
①首先创建配置对象
@Data
@Component
// 读取配置文件中的属性值,按照prefix拼接dateformat来进行读取
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
②修改Controller类注入配置类来读取
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties properties;
@GetMapping("now")
public String now() {
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));
}
环境共享
微服务会从nacos中读取多个配置文件
①[服务名]-[spring.profile.active].yaml,环境配置
②[服务名].yaml,默认配置,多环境共享
优先级:①>②>本地配置