微服务的学习--Nacos

5 篇文章 0 订阅
1 篇文章 0 订阅

认识学习

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

这样便实现了服务的远程配置

配置热更新

两种方式:

  1. 通过@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));
    }
}
  1. 通过@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,默认配置,多环境共享

优先级:①>②>本地配置

集群搭建

参考Nacos官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值