当前位置: 首页 > news >正文

你已经应用了哪种服务注册和发现的模式呢?

前面历史文章中我们有说过关于微服务的注册和发现,并以 etcd 作为简单例子简单阐述了关于服务注册和发现的应用

那么日常工作中,你已经使用了服务注册和发现的哪些模式呢?

服务注册和发现的作用

首先,简单说明一下服务注册和发现的作用

他可以屏蔽和解耦多个服务之间的依赖,还可以让我们对微服务进行动态管理

怎么理解呢?🧐🧐🧐

还记得一开始我们都是在开发单体应用的时候,一个应用包含了多个功能,他们耦合在一起,例如有订单管理,租户管理,账户管理等

演变到微服务的时候,这些专一的功能就单独拎出来,成为一个微服务,有自己独立的数据库,自己的一套系统,这个时候就有订单微服务,租户微服务,账户管理微服务

那么,以前是一个单体应用,咱们内部干啥都方便,需要啥直接说就好,反正我们都生活在一起

可是,演进到微服务的时候,每一个专一的功能都是一个独立的个体,可能是生活在同一个区域的不同单元楼了

多个服务之间自然需要进行通信,这个时候就需要用到服务的注册和发现,这里存放动态的每一个服务的应用名对应的地址和端口

我们知道,一个服务去与另外一个服务进行通信的时候,需要知道对方的 ip 和 端口 以及沟通好对应的协议

微服务之间通信,我们通常使用 RPC 进行通信,golang 通常用 gRPC 来进行处理

例如有 3 个服务,服务 A,服务 B,服务 C

服务 A 如果将 服务 B 的 ip 地址和端口写到自己服务代码里面

那么有一天,服务 B 的环境发生了变化,那么 服务 A 岂不是依赖服务 B 的功能就不可用了,这也太死了

因此引入服务注册和发现中心之后,服务 A 完全无需关心服务 B 的地址和端口,只需要通过服务名去找服务注册和发现中心获取即可,哪怕服务 B 的地址如何变幻,服务 A 总能请求到正确的服务 B

服务注册和发现的模式,一般有两种

客户端模式

客户端模式,又叫直连模式

见名知意,直连,自然是点到点的直连

服务 A 直接通过 ip 和 port 去请求服务 B,只不过服务 A 需要去一个叫做服务注册和发现中心的地方去获取服务 B 的地址信息,再进行建立连接

例如,我们可以理解为是这样的流程

可以看到,像这种直连的方式

服务 A 需要在代码中去编写代码与服务注册和发现中心交互, 且需要自写算法来进行负载均衡到节点的任意一个服务 B 上(咱们初期一般是对每个服务部署了 3 个应用在环境中)🤣🤣

对于技术栈是一样的团队中,可以将该部分提取抽象出来,做成一个公共库,提供给各个团队使用即可,相当于,对于各个团队来说,直接调用公共库中的方法,传入具体的应用名即可按照算法获取到应用对应的地址,简单高效,项目初期,我们使用的就是客户端模式的服务注册和发现

当然,这种方式,如果切换到别的技术栈,别的编程语言的话,就不适用了,因此从这里我们可以看到,客户端模式是需要修改咱们仓库代码的,也就是说对代码有侵入性,对于跨平台的话不太友好,例如 golang 的公共库,java 没有办法使用,这个应该很容易理解

服务端模式

服务端模式,又叫做代理模式

同理,见名知意,既然是代理,那么自然是要通过代理隐藏某些信息

此处是否会想到正向代理和反向代理呢?如果想了解和确认他们都是啥,可以查看文末的文章链接

对于代理模式来说,还是服务 A 去请求 服务 B 的情况,这个种模式就不需要我们去修改代码了😁😁😁

服务 A 只需要去请求一个统一的域名,自然域名会被 DNS 解析成具体的 ip,请求到代理服务后,代理服务根据我们请求的内容,去进行分发到不同的服务上,如果这个代理服务后面的服务 B 有多个实例的话,那么就可以在代理服务上设置对于每一个实例的权重进行分发,来达到负载均衡的目的

看到这里,有没有看上去好像是在说 nginx 反向代理一样?

没错,此处的代理可以理解成一个反向代理,他是隐藏了关于服务端的细节的(此处 服务 A 属于客户端,服务 B 输出服务端)

此处,我们就可以看到这种模式实际上对于跨平台就非常友好了,不管你的应用是什么语言写的,只要能进行网络通信那么问题不大😀😀😀

但是弊端也是非常明显的,因为我们微服务之间的通信不是直连的,而是通过了一个代理服务,那这个代理服务自然会成为通信过程中影响性能的一环

从主机环境迁移到 k8s 环境中,如何使用服务注册和发现?

上述服务注册和发现的两种模式,你们使用哪种模式更多呢?

以前我们使用的是客户端模式,现在我们直接使用 k8s 自身的能力

我们知道,在 k8s 中,咱们部署一个服务,咱们自然是会给这个服务部署一个 Service,既然是 Service 我们就会给他指定 Port

对于一个 Deploy 咱们部署 多个 pod 的时候,当外部请求到该 Service 的时候,k8s 中自身的负载均衡算法就会将请求转到具体的 endpoint 上,最后流量也就会达到一个具体的 pod 上

那么问题来了?外部是如何请求到服务内部的?

目前简单做法是外部请求一个指定的域名,请求到 k8s 环境之后,通过 ingressRoute 匹配具体的路由,进而转发到对应的 Service,最终请求到具体的 pod

对于 ingressRoute 的用法还有很多,此处就不赘述了

当然,这个是对外提供域名的情况,可以这样做,那么微服务之间内部通信的话,如何进行服务注册和发现呢?

目前的做法还比较 low,部署服务的时候,其中我们会部署一个 ConifgMap,暂时记录叫做 discovery 吧 ,对于服务来说,就是一个配置文件,里面存放的就是每一个服务名和自己的 Service 和端口 的对应关系

那么微服务之间通信的话,直接去读取这个 ConfigMap 就可以能够与服务名对应的 Service 来进行通信了

可以看出这个时候有一个弊端的,如果某个服务的端口发生了变化,没有及时去更新这个 discovery COnfigMap 的话,就会出现功能异常的情况

这一点弊端其实暂时也是可以避免和接受的

其实关于在 k8s 中环境中,对于服务的注册和发现会有更好的选择,例如之后,我们可以将这件事件放到 NACOS 里面处理,当然,关于 NACOS 的内容,就不在这里过多赘述了

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 服务注册与发现之ETCD
  • 简单理解正向代理和反向代理
  • 【k8s 系列】k8s 学习二十七 - 6,k8s 自身原理之 Service
  • 【k8s 系列】k8s 学习十九,service 2 暴露服务的 3种 方式
  • 【k8s 系列】k8s 学习十三,Service 基础
  • 【k8s 系列】k8s 学习二十五-2,Deployment 升级应用
  • 【k8s 系列】k8s 学习二十五-3,Deployment 升级应用2

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

相关文章:

你已经应用了哪种服务注册和发现的模式呢?

前面历史文章中我们有说过关于微服务的注册和发现,并以 etcd 作为简单例子简单阐述了关于服务注册和发现的应用 那么日常工作中,你已经使用了服务注册和发现的哪些模式呢? 服务注册和发现的作用 首先,简单说明一下服务注册和发…...

Python爬虫技术在SEO优化中的关键应用和最佳实践

大家好!今天我要和大家分享一个关于SEO优化的秘密武器:Python爬虫技术。在这篇文章中,我们将探讨Python爬虫在SEO优化中的关键应用和最佳实践。无论您是一名SEO专家、网站管理员,还是对优化网站曝光度感兴趣的初学者,都…...

基于支持向量机的试剂条图像识别,基于SVM的图像识别,SVM的详细原理,Libsvm工具箱使用注意事项

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 代码下载链接: 基于支持向量机SVM的试剂条图像自动识别,基于SVM的试剂条图像自动读取资源-CSDN文库 https://download.csdn.net/download/abc991835105/88215944 SVM应用实例…...

PbootCMS在搭建网站

1、打开网站 https://www.pbootcms.com/ 2、点击 “本站” 下载最新的网站代码 3、在本地laragon/www下创建目录(hejuwuye),并将代码放进去 4、创建本地数据库,数据库名称为: hejuwuye,然后将static/bac…...

C语言经典100例题(56-60)--画圆;画方;画线

目录 【程序56】题目:画图,学用circle画圆形 【程序57】题目:画图,学用line画直线。 【程序58】题目:画图,学用rectangle画方形。 【程序59】题目:画图,综合例子。 【程序60】题…...

linux相关知识以及有关指令3

在linux的世界中我们首先要有万物皆文件的概念,那么在系统中有那么多的文件,我们该怎么区分呢?文章目录 1. 文件分类2. 文件的权限1). 拥有者和所属组以及other2). 文件的权限3). 粘滞位4). 对于权限修改的拓展知识点a.修改权限b.修改拥有者所…...

关于Synchronized

Synchronized用于实现线程间的同步。它可以被用于方法或代码块上,确保同一时间只有一个线程可以访问被 synchronized 修饰的代码,也就是常说的锁,synchronized有三点作用 1)实现线程安全:通过使用 synchronized&#x…...

深度学习(Python)学习笔记2

第二章 感知机 2.1 感知机是什么 感知机接收多个输入信号,输出一个信号。 感知机的信号会形成流,向前方输送信息。 感知机的信号只有“流/不流”(1/0)两种取值。 本学习笔记中,0对应“不传递信号”,1对应“传递信号”。 图中、是输入信号,是输出信号,、是权重。图…...

gitlab操作

1. 配置ssh 点击访问 2. 创建新分支与切换新分支 git branch 新分支名 // 创建 git checkout 新分支名 // 切换到新分支3. 查看当前分支 git branch*所指的就是当前所在分支 4. 本地删除文件后与远程git同步 git add -A git commit -m "del" git push...

docker day04

Dockerfile: - FORM: 1.指定基础镜像,可以起别名,也可以指定多个FROM指令,用于多阶段构建; 2.加载触发器,加载ONBUILD指令; 3.不指定基础镜像,声明当前镜像不依赖任何镜像,官方…...

任意区域的色彩一致性处理方法

影像任意感兴趣区域的色彩一致性处理方法,主要是针对掩膜后的影像,类似下图,对非背景区域的像素进行处理 其中非黑色部分我们叫待匀色区域。 这种处理 对于wallis 和直方图匹配 很容易实现,但是颜色转移就相对而言 困难点。 颜…...

听GPT 讲Istio源代码--pilot

File: istio/operator/pkg/translate/translate.go 在Istio项目中,istio/operator/pkg/translate/translate.go文件的作用是处理Istio Operator的配置信息和Kubernetes的资源对象之间的翻译和转换。 首先,scope和componentToAutoScaleEnabledPath是用于记…...

pdfjs解决ie浏览器预览pdf问题

pdfjs是一个js库,可以将pdf文件用canvas重新绘制,从而无需借助pdf读取插件就可以直接预览。 目前chrome内核的浏览器已内置pdf读取插件,但ie浏览器还没有。而我们最近在做的一个项目使用对象是医院,使用的浏览器竟然还是ie。所以我…...

千里共婵娟 | 结合微信公众号用JavaScript完整开发实现换中秋头像的功能

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…...

pt26django教程

admin 后台数据库管理 django 提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用 django 会搜集所有已注册的模型类,为这些模型类提拱数据管理界面,供开发者使用 创建后台管理帐号: [rootvm mysite2]# python3 manage.…...

javabasic

计算机基础 一、学前知识 1. 计算机组成 2. 进制的概念 (1)二进制的存储 计算机不管是内存还是硬盘,都是以二进制的形式存储。如同一张巨大的表格,里面都是由0和1组成。 二进制:逢2进1 基数为2,数值部分…...

电子词典项目

目录 目录 头文件&#xff1a;dict.h: 源文件&#xff1a;dict.c: 服务器测试文件&#xff1a;serDict.c: 客户端测试文件&#xff1a;cliDict.c: 头文件&#xff1a;dict.h: #ifndef __DICT_H__ #define __DICT_H__ #include<myhead.h> #include<sqlite3.h>#de…...

SQL12 高级操作符练习(2)

描述 题目&#xff1a;现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研&#xff0c;请你取出相关数据&#xff08;使用OR实现&#xff09; 示例&#xff1a;user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.03…...

python写代码过程中的坑230915

1.解释代码IndentationError: expected an indented block 这个错误通常是由于代码缩进错误导致的。 在Python中,代码块(如循环、条件语句、函数等)通常使用缩进来表示。因此,如果你在期望缩进的位置没有正确缩进代码,就会出现"IndentationError: expected an inden…...

SpringBoot课堂笔记20230913

本篇文章为SpringBoot学习笔记&#xff0c;方便自己再复习。 Maven&#xff1a;jar包管理工具 注解&#xff1a; Controller:处理http请求&#xff0c;返回的视图 RestController: 相当于ResponseBody和Controller一起用&#xff0c;返回的是json ResponseBody:返回响应内容 …...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

Appium下载安装配置保姆教程(图文详解)

目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...