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

前言

在聊服务注册中心时,便提到了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";// 目标配置集DataIdString 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.mzph.cn/news/35207.shtml

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

相关文章

win10在vmware15中安装macos10.13系统

第一步、安装vmware版本信息如下 第二步、下载unlocker-main和darwin.iso放到安装文件夹 第三步、管理员身份运行win-install.cmd 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS 10.13并选择语言 第六步、选择磁盘工具抹掉磁盘 第七步、格式化完成后退出磁盘工…

数据结构:交换排序

冒泡排序 起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。 算法步骤 比较相邻的元素。如果第一个元素大于第二个元素,就交换它们。对每一对相邻…

Python-OpenCV中的图像处理-图像金字塔

Python-OpenCV中的图像处理-图像金字塔 图像金字塔高斯金字塔拉普拉斯金字塔 金字塔图像融合 图像金字塔 同一图像的不同分辨率的子图集合,如果把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。cv2…

小程序发布注意事项

1、使用HBuildx的 发布 功能发布小程序,因为编译完的代码目录不是同一个 如果使用 运行 到小程序,最后发布的版本会显示”无法连接本地服务器“ 2、使用unicloud的云服务 uniCloud发行 | uni-app官网 阿里云的unicloud的话,使用request域名…

电脑开机出现Boot Device怎么办?

开机出现Boot Device这个问题很常见,有时还会出现No Boot Device的问题,虽然多了一个单词,但意思是相同的,这些问题说明你的系统盘出现了问题,或者是引导出现了问题。这该如何解决呢? 方法1. 检查主板或硬盘…

【算法——双指针】LeetCode 283 移动零

题目描述: 思路: (双指针) O(n)O(n)O(n) 给定一个数组 nums,要求我们将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序。 如图所示,数组nums [0,1,0,3,12],移动完成后变成nums [1,3,12,0,0] &am…

若依vue -【 100 ~ 更 ~ 110 】

100 主子表代码生成详解 1 新建数据库表结构(主子表) -- ---------------------------- -- 客户表 -- ---------------------------- drop table if exists sys_customer; create table sys_customer (customer_id bigint(20) not null…

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…

谈谈语音助手

目录 1.什么是语音助手 2.语音助手的发展过程 3.现在有哪些成熟的语音助手 4.语音助手对人类发展的影响 1.什么是语音助手 语音助手是一种能够通过语音交互与用户进行沟通和执行任务的虚拟助手。它基于人工智能和自然语言处理技术,能够理解用户的语音指令&#x…

数据结构-队列的实现(C语言版)

前言 队列是一种特殊的线性表,它只允许在一端对数据进行插入操作,在另一端对数据进行删除操作的特殊线性表,队列具有先进先出的(FIFO)的 特性,进行插入操作的一端称为队尾,进行删除操作的一端称…

JZ37序列化二叉树

题目地址:序列化二叉树_牛客题霸_牛客网 题目回顾: 解题思路: 首先,序列化就是将二叉树的节点值放入一个字符串中,这里可以按照前序遍历的思路来进行操作,谦虚遍历是:根左右的情况,…

什么是React?React与VU的优缺点有哪些?

什么是React?什么是VUE? 维基百科上的概念解释,Vue.js是一个用于创建用户界面的开源MVVM前端JavaScript框架,也是一个创建单页应用的Web应用框架。Vue.js由尤雨溪(Evan You)创建,由他和其他活跃…

微信小程序 地图map(电子围栏圆形和多边形)

正常情况下是没有手机上画电子围栏的,公共平台上我也没找到,所以走了一个歪点子,就是给地图添加点击事件,记录点的位置,在画到电子围栏上就是添加电子围栏了,如果只是显示电子围栏就简单了 一、多边形电子…

2023.8.12号论文阅读

文章目录 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法实验结果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法实验结果 TriFormer: A Multi-mod…

macos搭建python3虚拟环境

我们知道macos自带的python版本是Python2.7, 这个版本比较老而且往往和我们的工程不兼容,所以就得需要我们升级Python版本, 我们不建议直接升级macos自带的本地Python2.7, 因为macos有一些基础软件是依赖于Python2.7的,如果动了遇到问题想再…

日志框架及其使用方法

log4j和logBack,同一个人写的,logBack为log4j的升级版,SpringBoot中默认集成logBack 作用:记录软件发布后的一些bug,以及数据是怎样被操作的 传统开发弊端: 1.日志直接输出在控制台,关闭控制台后,日志消…

Netty:在一个ByteBuf中寻找另外一个ByteBuf出现的位置

说明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函数可以在haystack中寻找needle出现的位置。如果没有找到,返回-1。 示例 在一个ByteBuf 中找到了另外一个ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

Linux: network: tools: tcpdump,抓取vlan包需要注意的事情;不然会出现LLC协议

https://bugzilla.redhat.com/show_bug.cgi?id498981#c4 https://serverfault.com/questions/544651/vlan-tags-not-shown-in-packet-capture-linux-via-tcpdump 如果不加-e参数,抓取不到 vlan信息,会导致wireshark解析出现问题。因为,抓到…

AirServer是什么软件,手机屏幕投屏电脑神器

什么是 AirServer? AirServer 是适用于 Mac 和 PC 的先进的屏幕镜像接收器。 它允许您接收 AirPlay 和 Google Cast 流,类似于 Apple TV 或 Chromecast 设备。AirServer 可以将一个简单的大屏幕或投影仪变成一个通用的屏幕镜像接收器 ,是一款…

PDF Expert 3.3 for mac

PDF Expert是一款专业的PDF编辑和阅读工具。它可以帮助用户在Mac、iPad和iPhone等设备上查看、注释、编辑、填写和签署PDF文档。 以下是PDF Expert的特点: PDF编辑:PDF Expert提供了丰富的PDF编辑功能,包括添加、删除、移动、旋转、缩放、裁…