SpringCloud-学习笔记(四)nacos基本使用

什么是nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,使用java语言进行开发。Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。

nacos的安装

nacos有window和linux版本的,这里使用windos版本进行安装。
GitHub的Release下载页

下载完成后解压即可使用。

默认使用端口是8848,也可以自己修改conf中的配置文件进行修改端口。
在这里插入图片描述
使用命令startup.cmd -m standalone进行启动
在这里插入图片描述
访问打印出来的地址即可,用户名密码均是nacos。
登录之后页面如下
在这里插入图片描述
无论是eureka还是nacos都实现了springcloud中约定的接口
在这里插入图片描述

nacos的使用

首先需要在父工程中引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后在子工程中引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置nacos的地址

spring:
  cloud:
    nacos:
      server-addr: localhost:8848

nacos服务分级存储模型

  • 第一级是服务
  • 第二级是集群
  • 第三级是实例

我们可以配置服务所属的集群,这样我们就可以通过配置实现同一个集群里的服务间的调用就会首先调用同一个集群的服务,缩短响应的时间。

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: DM # 集群名称

修改负载均衡的规则,实现同一个集群里的服务间的调用首先调用同一个集群的服务。

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 ,优先本地集群,本地集群的多个服务之间随机,本地集群找不到就会去其他集群寻找

尽管如此,但是有的时候同一个集群中的服务器也有性能的差异,因此我们想要同一个集群中的服务器中性能好的服务器实例接收请求的次数多一些,其他的服务器接收请求的次数少一些,这就需要nacos服务实例的权重了。我们可以直接在nacos的控制台配置即可。

macos命名空间namespace

namespace可以用来做环境隔离, nacos默认会有一个public的命名空间,我们也可以在控制台新建命名空间,这个时候命名空间中是没有任何服务的,如果我们想要将publlic中的服务移动到新创建的命名空间中,就需要将服务中的配置文件进行修改,服务中的application.yml文件需要添加nacos的namespace,这个namespace的值就是我们新创建的命名空间的id。然后重新启动项目即可。

不同命名空间中的服务不能进行相互间的调用。

nacos注册中心的原理

服务提供者会想nacos注册中心注册自己,服务消费者会定时从注册中心拉取服务并进行缓存。
对于服务提供者中的临时实例会向注册中心发送心跳包,nacos会采用心跳检测的方式检测,如果不存在了就会直接将这个实例从注册中心中剔除。
对于服务提供者中的非临时实例,nacos会主动检测实例是否存活,如果不存活,并不会从实例列表中剔除,而是标记为不健康,等待它恢复健康。

nacos注册中心会主动推送注册中心中服务实例的变更,不像eureka中只是定时拉去注册中心中的服务列表。

我们可以修改配置文件的方式选择注册实例是临时实例或非临时实例。方式如下

spring:
  cloud:
      nacos:
            discovery:
                   ephemeral: false # 设置为非临时实例,临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会

Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式.

Ncoa的统一配置管理

微服务通过读取注册中心的配置管理服务获取向配置的参数,并且可以实现服务的热更新。

我们可以直接在nacos的控制台实现配置文件的管理。

我们服务启动的时候会读取nacos的配置文件没然后才会读取本地的application,yaml,然后创建spring容器,加载bean。
因此我们首先需要知道nacos配置文件的地址,这个就需要在bootstrap.yaml中进行配置,因为这个配置文件的读取是比application.yaml更早。

实现步骤:

  • 首先在nacos管理界面创建一个配置
  • 在服务中引入nacos的配置管理客户端的依赖
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  • 在微服务的resource目录下创建一个bootstrap.yml文件,引导文件,优先级高于application.yaml文件。这里的服务名称,开发环境和文件后缀就是我们心增加配置文件的时候选择的配置文件的DataID:userservice-dev.yaml,这样加上nacos的地址我们就可以找到配置文件的地址了。
spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

如果想要实现配置的热更新,只需要在Controller层上加上注解@RefreshScope即可。
如果使用了@ConfiguractionProperties注解获取配置文件的内容,就不用使用上面的注解,自动就实现了自动刷新。

使用nacos实现多个微服务的统一配置管理。微服务会从nacos读取的配置文件:

  • [服务名]-[spring.profile.active].yaml,环境配置
  • [服务名].yaml,默认配置,多环境共享

因此想要实现共享,我们只需要在共享的配置写在服务吗.yaml里面即可。

如果我们多个环境中配置了互相冲突的属性,以哪个配置文件为标准呢?

优先级:
[服务名]-[环境].yaml >[服务名].yaml > 本地配置

猜你喜欢

转载自blog.csdn.net/qq_45401910/article/details/128823507