当前位置: 首页 > 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:返回响应内容 …...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...