目 录CONTENT

文章目录

Nacos 服务注册与发现

zhouzz
2024-10-06 / 0 评论 / 0 点赞 / 5 阅读 / 16635 字
温馨提示:
本文最后更新于 2024-10-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.Nacos简介

阿⾥ Nacos 宣布开源,并快速成为国内最受关注开源产品.作为 Eureka 的替代, Nacos 已经成为了国内开发者的⾸选。

在最初开源时,Nacos 选择进⾏内部三个产品合并统⼀开源( Configserver ⾮持久注册中⼼,VIPServer 持久化注册中⼼,Diamond 配置中⼼). 定位为:⼀个更易于构建云原⽣应⽤的动态服务发现,配置管理和服务管理平台.所以 Nacos 是⼀个注册中⼼组件,但它⼜不仅仅是注册中⼼组件. 截⾄⽬前, Nacos ⼏乎⽀持了所有的主流语⾔,⽐如 Java, Go, C++, Nodejs, Python, Scala等

官⽹:https://nacos.io/

仓库: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 服务下线

当某⼀个节点上接⼝的性能较差时,我们可以第⼀时间对该节点进⾏下线.

操作步骤:找到对应的服务名称,点击详情

20241007001821.png

找到出现问题的机器,点击下线(下线以后通过 RestTemplate 发来的请求就不会被发送到该机器)

20241007002019.png

也可以在同样的位置点击上线,机器就会恢复能接收到请求

3.4.2 权重配置

除了下线之外,我们也可以配置这个节点的流量权重

操作步骤: 找到对应节点 -> 编辑 -> 在弹出的窗⼝修改权重值

20241007003917.png

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 环境隔离

企业开发中,⼀个服务会分为开发环境,测试环境和⽣产环境.

  1. 开发环境:开发⼈员⽤于开发的服务器,是最基础的环境.⼀般⽇志级别设置较低,可能会开启⼀些 调试信息.
  2. 测试环境:测试⼈员⽤来进⾏测试的服务器,是开发环境到⽣产环境的过渡环境.
  3. ⽣产环境:正式提供对外服务的环境,通常关掉调试信息.通常情况下,这⼏个环境是不能互相通信的.Nacos 提供了namespace(命名空间)来实现环境的隔离.不同的 namaspace 的服务不可⻅.

3.6.1 创建 Namespace

默认情况下,所有服务都在同⼀个 namespace ,名为 public

点击命名空间 - > 新建命名空间 -> 设置命名空间的属性

20241007004803.png

3.6.2 配置 namespace

namespace 创建完成后,对服务进⾏配置,将服务添加到相应的环境。

spring:
 cloud:
  nacos:
   discovery:
    namespace: 命名空间ID

此时服务会被添加到另一个环境中,无法使用其他环境的服务。

4.Nacos配置中心

除了注册中⼼和负载均衡之外,Nacos 还是⼀个配置中⼼,具备配置管理的功能. Namespace 的常⽤场景之⼀是不同环境的配置区分隔离.例如开发测试环境和⽣产环境的配置隔离.

为什么需要配置中心?

当前项⽬的配置都在代码中,会存在以下问题:

  1. 配置⽂件修改时,服务需要重新部署.微服务架构中,⼀个服务可能有成百个实例,挨个部署⽐较⿇烦,且容易出错.
  2. 多⼈开发时,配置⽂件可能需要经常修改,使⽤同⼀个配置⽂件容易冲突.

配置中⼼就是对这些配置项进⾏统⼀管理.通过配置中⼼,可以集中查看,修改和删除配置,⽆需再逐个修改配置⽂件.提⾼效率的同时,也降低了出错的⻛险.

  1. 服务启动时,从配置中⼼读取配置项的内容,进⾏初始化.
  2. 配置项修改时,通知微服务,实现配置的更新加载.

4.1 快速上⼿

通过以下操作,我们来感受下 Nacos 配置中⼼的使⽤

在 Nacos 控制台添加配置项

20241007010951.png

注意:配置管理的命名空间和服务列表的命名空间是隔离的,两个是分别设置的.默认是 public 也就是服务管理命名空间配置 ≠ 配置管理的命名空间

4.1.1 新建配置项

20241007010952.png

说明:

  1. Data ID设置为项⽬名称
  2. 配置内容的数据格式,⽬前只⽀持 properties 和 yaml 类型
  3. 设置配置内容

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 读取多个配置⽂件:

  1. ${prefix}-${spring.profiles.active}.${file-extension} 如: product-service-dev.properties

  2. ${prefix}.${file-extension} ,如: product-service.properties

  3. ${prefix}product-service

三个⽂件的优先级为: product-service-dev.properties > product-service.properties >product-service

0

评论区