【探索SpringCloud】服务发现-Nacos使用

news2024/11/24 3:23:38

前言

在聊服务注册中心时,便提到了Nacos。这次便来认识一下。当然,这自然没有官方介绍那般详尽,权当是学习了解Nacos原理的一个过程吧。

Nacos简介

Nacos,全名:dynamic Naming And Configuration Service. 而这个名字则强调了Nacos的两大基石: Naming Service 和 Config Service。

  1. Config Service
    自然是负责提供配置管理服务。Nacos作为配置中心时,主要使用的便是该服务

  2. Naming Service
    想必不用多说,也能猜到就是负责提供服务注册中心能力的扛把子。不过官方关于该服务的描述很有意思:

    提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务。服务发现和 DNS 就是名字服务的2大场景

    简而言之,就是映射服务。通过一个名字找到相关分布式组件的元数据/元信息。这不就是服务注册中心的本质吗?嘿嘿。

架构图

Nacos入门使用

Nacos服务的搭建

Nacos服务的搭建可以参考官网的Quick-Start,可通过源码编译打包部署,也可以通过docker部署。这里给大家提醒一下我搭建过程中遇到过的问题:

  1. Nacos2.x为了提高性能,增加了grpc通信方式,因此需要开放对应的端口,默认为9848.
  2. Nacos2.x的表结构与Nacos1.x也有所区别,如果表结构错误则会导致Nacos启动失败的。
  3. Nacos2.x需要使用对应的Nacos2.x的客户端,否则客户端连接服务端会失败。

附上

Nacos2.0兼容性说明
Nacos 2.0.0部署及升级文档

Nacos配置服务 - 配置中心

  1. 先在Nacos控制台新建一个命名空间

新建命名空间

命名空间,这个概念官方的解释比较容易理解,用于隔离不同环境。例如:开发环境、测试环境、生产环境。
这里我们等于是新建了一个开发环境的命名空间。

  1. 新建一个配置集

新建一个配置集

  1. 配置集——DataID,这里就是指代我们常说的配置文件。从我们使用的角度来理解官网上的这些概念就容易许多了。我们一个配置文件里面本身就是包含了很多配置项,从配置服务的管理角度看,就是一个配置集。这也就不难理解官方定义所说的:“一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。”从使用的角度说,就是一个系统可以有多个配置文件。

  2. 配置分组。对于单体系统,这个概念显得比较鸡肋。对于微服务系统,则比较有意思。“不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。”。理解一下这句话:以MQ为例,意味着有一个生产者服务和一个消费者服务,当生产者更改MQ配置(例如Topic),那么消费者也需要同时更改。这时,不妨把MQ的配置单独作为一个配置集,设置一个特定的分组,生产者跟消费者都是这个配置即可。至于分组名,取一个跟这两服务确切相关的即可。
    不过,从这我们也可以发现,我们可以发布多个相同配置文件,分组不同的配置集。这可以用在相同的组件但业务不同的场景下。

  3. 在java客户端获取配置
    我们从控制台就可以拿到读取该配置集(配置文件)的示例代码:

        // Nacos服务的地址
        String serverAddr = "localhost:8848";
		// 配置所属的命名空间:开发环境
        String namespace = "b7984b05-f2fe-4213-8fdf-47ef799315a5";
        // 目标配置集DataId
		String dataId = "nacos-config-example.yaml";
        // 目标配置集分组
		String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        properties.put(PropertyKeyConst.NAMESPACE, namespace);
		ConfigService configService = NacosFactory.createConfigService(properties);
		String content = configService.getConfig(dataId, group, 5000);
		System.out.println(content);

这就是配置服务的简单使用,以及我们在使用的时候需要关注的相关概念了。如果大家在官网看相关概念,需要注意,只有《配置管理》这里面的东西才是配置服务相关的概念

Nacos映射管理服务 - 注册中心

与其他注册中心类似,只需要启动注册中心即可注册。先看看Java客户端怎么注册的。

        Properties properties = new Properties();
        // 指定 Nacos 地址
        properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1:8848");
        // 默认命名空间是空,可以不填写
        properties.put(PropertyKeyConst.NAMESPACE, "b7984b05-f2fe-4213-8fdf-47ef799315a5");
//         如果在云上开启鉴权可以传入应用身份
        // properties.put("ramRoleName", "$ramRoleName");
//        properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");
//        properties.put(PropertyKeyConst.SECRET_KEY, "${secretKey}");

        NamingService serviceRegistry = NacosFactory.createNamingService(properties);

        // 分组  可用于区分数据中心,同个数据中心的服务互相调用,提高效率
        String groupName = "DataCenter-DongGuang";
        // 京东商城服务 —— Service:微服务;系统
        String serviceName = "JingDong-Mall";

        Instance instance = new Instance();
        instance.setIp("192.168.1.125");
        instance.setPort(8080);
        instance.setWeight(1.0);
        // 订单服务集群
        instance.setClusterName("order-service");
        instance.setInstanceId("1");
//        instance.setEphemeral(false);

        serviceRegistry.registerInstance(serviceName, groupName, instance);

        // 死循环,为了不让服务关停,方便在nacos控制台观测状况
        while(true);

注册成功之后,控制台看看

服务列表

服务详情

在demo中也涉及了一些关于Nacos的注册中心的相关概念。再从官网捞了两张图帮助大家理解。

nacos-data-model.jpeg
nacos-service-storage-model.jpeg

  1. 命名空间Namespace:使用场景是区分不同环境,因此没有异议。
  2. 服务分组Group:不同的服务可以归类到同一分组。
  3. 服务Service:通过预定义接口网络访问的提供给客户端的软件功能。
  4. 虚拟集群Cluster: 同一个服务下的所有服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群。

关于以上定义,我的解读如下:

  • 服务,这个比较有意思。网络可以访问的软件。可以是一个大型的微服务系统,也可以是一个小的自治服务。
  • 服务分组,这个也有意思。不过从其实现来说,同一个分组的服务才能互相发现。
  • 虚拟集群,关键词:虚拟。可以被进一步划分!如果是大型微服务系统,按照定义其所有的实力都归属于一个集群。但进一步划分后,又可以按照各微服务划分小集群。

从demo而言,算是对分组的一种应用。可以方便同一个数据中心的服务互相调用,提高调用效率。这里提示一下,Nacos算是一个平台,能装很多Service。
不过这种应用也有其弊端,如果数据中心的某个机房的某些机器损坏导致部分服务需要访问其他数据中心时是无法做到的。

据《Nacos架构与原理》,这些都是为了实现不同程度的隔离。分组和服务,可以实现接口级别的隔离。而从控制台的UI,我们也可以发现namespace是需要选择才切换的,而分组与实例则是直接展示的。
而接口级别的隔离,个人觉得就取决于你如何应用了。

有人说可以通过分组来区分环境,个人不是很支持,因为不便于在控制台管理。
一般情况下,使用命名空间来区分环境,至于分组则都没有使用(即默认分组:DEFAULT_GROUP).
不过,与注册中心不同,作为配置中心时配置分组倒是可以用来区分应用/组件。当然,你也可以通过dataID增加特定的服务名前缀来区分。

后记

本来想把数据结构也聊一聊的,但感觉篇幅又太长了。其次,要想讲清楚,就不得不深入到源码中。因此决定分开说,这次聊的是使用。下次,咱深入源码,聊聊设计和数据结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态网页和动态网页区别

1,静态网页和动态网页有何区别 1) 更新和维护 静态网页内容一经发布到网站服务器上,无论是否有用户访问,这些网页内容都是保存在网站服务器上的。如果要修改网页的内容,就必须修改其源文件,然后重新上传到服务器上。…

SpringBoot框架

一、SpringBoot概述 1. 简介 springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,…

【算法训练营】队列合集(2) 2073. 买票需要的时间 || 面试题 03.04. 化栈为队 ||

📍前言 本篇将学习queue的OJ题,每一题的标题都是超链接哦,我会将queue的基础知识放到最后供你参考~ 🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:&am…

【LVS-NAT配置】

配置 node1:128(客户端) node2:135(调度器) RS: node3:130 node4:132 node2添加网络适配器(仅主机模式) [rootnode2 ~]# nmtui[rootnode2 ~]#…

棒球在国际上的流行·棒球1号位

棒球在国际上的流行 1. 棒球的起源与历史 棒球的起源源于美国。19世纪中叶,由于美国领土的扩张,当时的美国殖民地的印第安人将棒球类游戏,带到了当时的弗吉尼亚州的奥克兰。后来,棒球运动流传到了加利福尼亚州的圣迭戈。早期的棒…

Pyqt5使QTextEdit或QLabel等框框背景透明

设置:textEdit->setStyleSheet(“background-color: rgb(255, 255, 255, 60);”);

登录验证两种方案:token和cookie以及对比

cookie HTTP无状态,每次请求都要携带cookie,以帮助识别用户身份; 服务端也可以向客户端set-cookie,cookie大小限制为4kb; cookie默认有跨域限制,不跨域共享和传递,例如: 现代浏览…

7.4.tensorRT高级(2)-使用RAII接口模式对代码进行有效封装

目录 前言1. RAII接口模式2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-使用 RAII 接口模式对…

实战:ros机器人运行不稳定,也许是use_sim_time没有设置对

搞机环境,ubuntu 20.04 ros2 版本 foxy ros机器人搞了很久了,但是有一个初学者很容易忽略的参数:use_sim_time,设置不对,会让程序出跑起来有莫名其妙的问题。 use_sim_time :直白翻译: 用_仿…

一文读懂HTML

文章目录 HTML的历史HTML的作用HTML的基本语言 HTML的历史 HTML(HyperText Markup Language)的历史可以追溯到20世纪90年代早期,它是互联网发展的重要里程碑之一。以下是HTML的历史概述: 早期阶段(1980年代末 - 1990年…

如何撰写一份清晰有效的说明文档

如何撰写一份清晰有效的说明文档 文章目录 导语1.明确读者群体:2.明确文档目的:3.提供清晰的结构:4.使用简洁明了的语言:5.提供具体的示例:6.注意文档格式和风格:7.接受反馈并更新文档:结语 导语…

JZ39 数组中出现次数超过一半的数字

目录 一、题目 二、代码 一、题目 数组中出现次数超过一半的数字_牛客题霸_牛客网 二、代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * param numbers int整型vector * return int…

Spring Boot单元测试与Mybatis单表增删改查

目录 1. Spring Boot单元测试 1.1 什么是单元测试? 1.2 单元测试有哪些好处? 1.3 Spring Boot 单元测试使用 单元测试的实现步骤 1. 生成单元测试类 2. 添加单元测试代码 简单的断言说明 2. Mybatis 单表增删改查 2.1 单表查询 2.2 参数占位符 ${} 和 #{} ${} 和 …

LeetCode 周赛上分之旅 #39 结合中心扩展的单调栈贪心问题

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

赴日IT培训 国内的程序员去日本做IT容易吗?

去日本当程序员的两大要素就是技术和日语。所以说容易也容易,如果学历过关(统招大专以上),再加上在国内有经验,所以技术方面问题不大。要说难也难,你要克服语言关,去本本工作对日语的要求比较高…

NeuralNLP-NeuralClassifier的使用记录(一),训练预测自己的【英文文本多分类】

NeuralNLP-NeuralClassifier的使用记录,训练预测自己的英文文本多分类 NeuralNLP-NeuralClassifier是腾讯开发的一个多层多分类应用工具,支持的任务包括,文本分类中的二分类、多分类、多标签,以及层次多标签分类。支持的文本编码…

运维工程师常见面试题

1、http常见返回码 2、mysql的同步方式 1)异步复制 MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了&a…

207、仿真-51单片机脉搏心率与血氧报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

Docker部署rabbitmq遇到的问题 Stats in management UI are disabled on this node

1. Stats in management UI are disabled on this node #进入rabbitmq容器 docker exec -it {rabbitmq容器名称或者id} /bin/bash#进入容器后,cd到以下路径 cd /etc/rabbitmq/conf.d/#修改 management_agent.disable_metrics_collector false echo management_age…

ArcGIS Maps SDK for JavaScript系列之二:认识Map和MapView

目录 Map创建一个 Map 对象的示例代码:Map的常用属性Map的常用方法 MapViewMapView的常用属性MapView的常用方法 在 ArcGIS Maps SDK for JavaScript 中,Map 和 MapView 是两个重要的概念,用于创建和展示地图应用程序。 Map Map 表示一个地图…