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

本文共 4129 字,大约阅读时间需要 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: false
    server:
    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: false
    server:
    port: 58080

    3.3 开启 OpenFeign

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

    @SpringBootApplication
    @EnableFeignClients
    public 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 实现服务调用

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

    @RestController
    public 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/

    你可能感兴趣的文章
    No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
    查看>>
    No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
    查看>>
    No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
    查看>>
    No module named 'crispy_forms'等使用pycharm开发
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
    查看>>
    No new migrations found. Your system is up-to-date.
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    no session found for current thread
    查看>>
    No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
    查看>>
    NO.23 ZenTaoPHP目录结构
    查看>>
    no1
    查看>>
    NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
    查看>>
    NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
    查看>>
    NoClassDefFoundError: org/springframework/boot/context/properties/ConfigurationBeanFactoryMetadata
    查看>>
    node exporter完整版
    查看>>
    Node JS: < 一> 初识Node JS
    查看>>