• 微服务实战 01 Nacos 入门


    参考《Spring Cloud Alibaba 微服务原理与实战》

    什么是Nacos

    Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
    Nacos 致力于解决微服务中的统一配置,它提供了一组简单易用的特性及,囊住开发者快速实现动态服务发现、服务配置、服务元数据及流量管理

    Nacos 的关键特性

    服务发现和服务健康检测:

    Nacous支持基于 DNS和基于RPC的服务发现,服务提供者使用原生SDK,OpenApi或一个独立的AgentTODO注册Service后,服务消费者可以使用DNS或HTTP&API查找和发现服务

    Nacos提供对服务实时的健康检查,阻止像不见看的主机或者服务实例发送请求

    动态配置服务

    Nacos 提供了一个简洁易用的UI帮助用户管理所有服务的配置。Nacos还提供了包括配置版本跟踪、金丝雀发布、一键回滚配置及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助用户更安全地在生产环境中管理配置变更,降低配置变更带来的风险。

    动态DNS服务

    动态DNS支持权重路由,让开发者更容易地实现中间层负载均衡、更灵活的路由策略、流量控制,以及数据中心内网的简单DNS解析服务。

    服务及其元数据管理

    Nacos 可以使开发者从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析,服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA及重要的metrics统计数据。

    Nacos 的使用

    Nacos 的安装

    1. 下载Nacos发布版本下载链接
    2. 解压进入 \nacos\conf 根据sql文件创建数据库
    3. 进入 \nacos\conf 目录下 更改 application.properties 中数据库连接地址
    4. 进入bin目录下命令行执行 startup.cmd 文件
    5. 之后访问 http://localhost:8848/nacos/index.html

    Nacos 实现服务的注册与发现

    1. 新建 springBoot 项目
    2. 添加Maven依赖
     
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 增加配置
      在 bootstrap.yml 文件中增加如下配值
    # Spring
    spring: 
      application:
        # 应用名称
        name: zcct-discovery
      profiles:
        # 环境配置
        active: dev
      cloud:
        nacos:
          discovery:
            # 服务注册地址
            server-addr: 127.0.0.1:8848
          config:
            # 配置中心地址
            server-addr: 127.0.0.1:8848
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 启动程序
      在这里插入图片描述

    Nacos 实现统一的配置管理

    1. 在项目中导入
      <!--Nacos Config-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 在配置文件中增加如下配置
    # Spring
    spring: 
      application:
        # 应用名称
        name: zcct-discovery
      profiles:
        # 环境配置
        active: dev
      cloud:
        nacos:
          discovery:
            # 服务注册地址
            server-addr: 127.0.0.1:8848
          config:
            # 配置中心地址
            server-addr: 127.0.0.1:8848
            # 配置文件格式
            file-extension: yml
            # 共享配置
            shared-configs:
              - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    1. 增加如下代码
    @Component
    public class TestService {
        @Value("${myName}")
        String MyName;
    
        public String getMyName() {
            return MyName;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
      public static void main(String[] args) {
    
            ConfigurableApplicationContext run = SpringApplication.run(ZcctDiscoveryApplication.class, args);
            TestService testService = (TestService)run.getBean("testService");
            System.out.printf(testService.getMyName());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 运行打印结果
      在这里插入图片描述

    动态更新配置

    也就是修改在配置中心上的值之后,应用程序需要感知值的变化,

    1. 更改如下代码
     ConfigurableApplicationContext run = SpringApplication.run(ZcctDiscoveryApplication.class, args);
           // TestService testService = (TestService)run.getBean("testService");
            while (true) {
                System.out.println(run.getEnvironment().getProperty("myName"));
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 可以看出 配置的值已经动态改变
      在这里插入图片描述

    自定义 Namespace 和Group

    在前面使用的配置中心都在用默认的Namespace:public 和 Group:DFFAULT_GROUP,Nacos的数据模型Key室友三元组来进行唯一确认的,其中 Namespace 解决了多环境及多租户数据隔离问题,Group时Nacos中用来实现Data ID 分组管理机制,它可以实现不用的Service/dataid的隔离
    在这里插入图片描述
    在程序中的配置
    在这里插入图片描述
    在 Nacos 中的配置
    在这里插入图片描述
    在这里插入图片描述

    Nacos 的高可用部署

    Nacos 提供了集群架构,防止单点故障,包含一个leader节点和多个Foower节点。,他的数据一致性算法采用的是 Ralf,同样采用了该算法的中间件有 , Redis Sentinel 的Leader 选举

    在这里插入图片描述

    1. 修改 cluster.conf 文件的 配置信息
    2. 修改 application.properties中的数据库地址
    3. 启动 nacos,访问Nacos控制台

    Nacos 实现原理

    Nacos 机构图
    在这里插入图片描述

    • provider APP : 服务提供者
    • Consumer APP:服务消费者
    • Name Server:通过 Vritual IP 或者DNS 的方式实现Nacos高可用集群的服务路由
    • Nacos Server:包含 Open Api 是功能的访问入口,Config Service 、 Naming Service 是Nacos 提供的配置服务、名字服务模块。 Consistency Protocol 是一致性协议,用来实现Nacos集群节点的数据同步
    • Nacos Console : Nacos 控制台

    注册中心原理

    服务注册的功能只要体现在:

    • 服务实例在启动时注册到服务注册表,并在关闭时注销
    • 服务小否者查询服务注册表,获得可用实例
    • 服务注册中心需要调用服务 实例的健康检查API来验证他是否能够处理请求

    在这里插入图片描述

    Nacos Config 实现原理

    Nacos Config,其实就是提供了配置的集中式管理功能,然后对外提供了CRUD的访问接口,是得系统可以完成配置的基本操作
    在这里插入图片描述

    动态监听

    当配置发生变化时,需要让相关的应用程序感知到配置的变化进而感知应用变化,

    • Pull 表示客户端从服务端主动拉取数据
    • Push 表示服务端主动把数据推送到客户端

    pull 模式下,需要定时拉取数据,不能够保证数据的实时性,并且数据没有变化时会做很多无效的pull
    push模式下,服务端和客户端需要维持长连接,如果客户端比较多,服务端要耗费大量的内存来维护连接,并且为了检测连接的有效性,还需要心跳机制来维持每个连接的状态

    Nacos 是采用Pull模式,它采用长轮询机制,他结合Push和pull两者的优势。

    在这里插入图片描述

    1. client 发送请求获取数据
    2. nacos 收到请求之后,先检查配置是否发生变化了变更,若发生变化直接返回
    3. 如果没有,设置一个定时任务,延期 29.5s 执行,并且把当前客户端长轮询连接加入 allSubs队列
    4. 触发返回连接结果
      • 在等待 29.5s 后触发自动检查,这是不管配置是否发生变化,都会把结果返回给客户端
      • 在 29.5s 中任意时刻对配置进行了修改,则遍历allSubs队列找到相应的 ClientLongPolling 任务,将变更的数据通过该任务中的连接进行返回。
  • 相关阅读:
    C语言、C++操作符优先级
    Calendar日历类
    JZ38 字符串的排列
    【Python零基础入门篇 · 36】:greenlet协程模块的使用、gevent模块的使用、程序打补丁、总结
    day09渗透简单测试流程以及PKI实验
    c++智能指针[ shared_ptr / unique_ptr / weak_ptr ]介绍与使用
    uni-app 5小时快速入门 14 uni-app语法(上)
    互联网医院|互联网医疗模式已从概念走向实体建设阶段
    Codeforces Round #818 (Div. 2)
    取证初级案例操作大纲
  • 原文地址:https://blog.csdn.net/qq_44808472/article/details/126323257