博客
关于我
Nacos-注册中心
阅读量:803 次
发布时间:2023-02-13

本文共 4056 字,大约阅读时间需要 13 分钟。

Nacos 注册中心核心实现与优化指南

一、注册中心的交互流程

Nacos 注册中心是一个基于服务发现与负载均衡的动态注册系统,主要服务于分布式系统中的微服务架构。其核心交互流程涉及两类角色:服务提供者(生产者)服务消费者(消费者)

服务提供者(生产者)

生产者通常是提供核心服务的微服务实例,其主要职责是向注册中心注册自身信息,以便其他服务能够发现并调用它。具体实现步骤如下:

  • 添加 Nacos-Discovery 框架支持:通过依赖 spring-cloud-starter-alibaba-nacos-discovery 实现服务注册与发现功能。
  • 配置 Nacos 服务器端信息:在应用程序的配置文件中设置 Nacos 服务器地址、用户名、密码等必要信息。
  • 编写调用接口:开发需要外露的 RESTful 接口,供其他服务调用。
  • 服务消费者(消费者)

    消费者则是依赖其他服务的应用程序,它需要通过注册中心发现所需服务并进行远程调用。实现步骤如下:

  • 添加必要依赖:在项目依赖中添加 spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-loadbalancerspring-cloud-starter-openfeign 等相关组件。
  • 配置 Nacos 信息:在应用程序中设置 Nacos 服务器地址、用户名、密码等信息,并决定是否将实例注册至注册中心。
  • 开启 OpenFeign 支持:通过 @EnableFeignClients 开启 OpenFeign 功能,实现基于声明式的 RESTful 调用。
  • 定义服务接口:使用 @FeignClient 注解定义需要调用的服务接口,并配置必要的负载均衡策略。
  • 实现服务调用:通过 OpenFeign 或 RestTemplate 实现与服务提供者的通信,获取所需数据或服务。
  • 二、生产者实现详解

    2.1 创建多模块项目

    为实现模块化管理,建议采用 Spring Boot 多模块项目结构。具体操作如下:

  • 创建父模块
    • 初始化一个空的 Maven 工程目录。
    • pom.xml 中添加必要的依赖项,并删除其他模块的相关文件。
  • 创建子模块
    • 在父模块下新建子目录,每个子目录代表一个独立的服务模块。
    • 在每个子模块下创建 pom.xml 文件,声明其依赖项目。
    • 在父模块的 pom.xml 中添加子模块的依赖声明,并指定打包顺序。
  • 2.2 配置 Nacos 服务器端信息

    在应用程序的配置文件中,添加以下 Nacos 配置:

    spring:  application:    name: nacos-discovery-demo  cloud:    nacos:      discovery:        server-addr: localhost:8848        username: nacos        password: nacos        group: SIT_GROUP        ephemeral: falseserver:  port: 0

    此外,还需设置注册保护阈值、服务路由类型等高级参数。

    2.3 编写接口代码

    在生产者模块中,开发以下接口:

    @RestController@RequestMapping("/user")public class UserController {    @Autowired    private ServletWebServerApplicationContext context;    @RequestMapping("/getnamebyid")    public String getUserByID(@RequestParam("id") int id) {        return "provider-name:" + id + " | server-port:" + context.getWebServer().getPort();    }}

    此接口主要用于向外暴露服务信息,供消费者调用。

    三、消费者实现

    3.1 添加框架支持

    在消费者模块中,除了父模块已经配置的依赖外,子模块需要额外添加以下依赖:

    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery
    org.springframework.cloud
    spring-cloud-starter-loadbalancer
    org.springframework.cloud
    spring-cloud-starter-openfeign

    3.2 配置 Nacos 信息

    在消费者模块的配置文件中,添加以下内容:

    spring:  application:    name: nacos-consumer-demo  cloud:    nacos:      discovery:        username: nacos        password: nacos        server-addr: localhost:8848        register-enabled: falseserver:  port: 58080

    3.3 开启 OpenFeign

    在消费者主类中,添加以下注解:

    @SpringBootApplication@EnableFeignClientspublic class ConsumerApplication {    public static void main(String[] args) {        SpringApplication.run(ConsumerApplication.class, args);    }}

    3.4 声明 OpenFeign 式服务

    定义服务接口:

    @Service@FeignClient("nacos-discovery-demo")public interface UserService {    @RequestMapping("/user/getnamebyid")    public String getNameById(@RequestParam("id") int id);}

    3.5 实现服务调用

    在业务控制器中实现具体的调用逻辑:

    @RestControllerpublic class BusinessController {    @Autowired    private UserService userService;    @RequestMapping("/getnamebyid")    public String getNameById(@RequestParam("id") Integer id) {        return userService.getNameById(id);    }}

    四、注册中心参数说明

    服务名

    服务名由应用程序在配置文件中设置,如:

    spring:  application:    name: nacos-discovery-demo

    分组

    默认分组为 DEFAULT_GROUP,可自定义为其他组名:

    spring:  cloud:    nacos:      discovery:        group: prod-test

    保护阈值

    保护阈值用于防止流量集中到少量健康实例,设置范围为 0 到 1:

    spring:  cloud:    nacos:      discovery:        protect-threshold: 0.8

    服务路由类型

    支持多种路由策略,如 none(默认路由)和 label(标签路由):

    spring:  cloud:    nacos:      discovery:        routing-type: label

    临时实例

    配置为临时实例时,服务停止后会自动下线:

    spring:  cloud:    nacos:      discovery:        ephemeral: true

    权重

    用于负载均衡,数值越大,权重越高:

    spring:  cloud:    nacos:      discovery:        weight: 8000

    标签路由实现

    标签路由通过服务标签进行流量分配,确保不同标签之间的服务实例互不影响。

    临时实例健康检测

    临时实例通过心跳机制维持在线状态,服务器端和客户端均有健康检测机制。

    五、Nacos底层原理

    5.1 配置自动刷新原理

    Nacos 配置中心采用长轮询+事件驱动模式实现配置自动刷新:

  • 客户端通过 Listener 监听特定配置项。
  • 服务端检测到配置变更后,立即推送通知至客户端。
  • 客户端接收到通知后,拉取最新配置列表进行更新。
  • 5.2 注册中心底层实现

    注册中心主要包含服务注册和服务发现两个核心组件:

  • 服务注册:服务实例向注册中心提交注册信息,注册中心存储服务实例元数据。
  • 服务发现:消费者通过服务名称或标签查询注册表,获取实例列表。
  • 5.3 高性能实现

    通过异步任务和内存队列实现高效处理:

  • 服务实例注册后,先存入内存队列,异步写入注册表。
  • 异步任务负责将实例信息批量写入注册表,避免 IO 消耗过大。
  • 这种设计使得注册中心能够支持百万级别的服务注册和发现,具备高并发处理能力。

    转载地址:http://ordfk.baihongyu.com/

    你可能感兴趣的文章
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
    查看>>
    NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
    查看>>
    NIFI集群_内存溢出_CPU占用100%修复_GC overhead limit exceeded_NIFI: out of memory error ---大数据之Nifi工作笔记0017
    查看>>
    NIH发布包含10600张CT图像数据库 为AI算法测试铺路
    查看>>
    Nim游戏
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>