博客
关于我
Nacos-注册中心
阅读量:790 次
发布时间: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/

    你可能感兴趣的文章
    Mysql InnoDB存储引擎 —— 数据页
    查看>>
    Mysql InnoDB存储引擎中的checkpoint技术
    查看>>
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>
    MySQL InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    Mysql order by与limit混用陷阱
    查看>>
    mysql order by多个字段排序
    查看>>
    MySQL Order By实现原理分析和Filesort优化
    查看>>
    mysql problems
    查看>>
    mysql replace first,MySQL中处理各种重复的一些方法
    查看>>
    MySQL replace函数替换字符串语句的用法(mysql字符串替换)
    查看>>
    mysql replace用法
    查看>>
    Mysql Row_Format 参数讲解
    查看>>