微服务中的重要模块

为什么要有微服务?

微服务提高开发效能,避免业务的重复理解,代码重复开发,增加开发效能和代码复用性。

  在实际的工作中许多不同的业务有着共同的功能需求,如果我们每遇到一次这种需求就重新去理解构建一次的话会花费大量的时间。但是如果我们把这些共同的需求变为一个个小的模块,在需要使用对应功能时直接去调用这些模块能大大节省时间。避免了业务重复理解,代码重复开发,增加开发效能和代码复用性。

微服务的数量很多,有着几万到几十万的微服务。

微服务的七大模块

  • 中央管理平台
  • 生产者
  • 消费者
  • 权限管理
  • 流量管理
  • 自定义传输协议
  • 序列化与反序列化

微服务概述

  微服务中有提供服务的生产者,也存在使用服务的消费者,而存在着一个中央管理平台去管理这些生产者和消费者。一个微服务既可以是生产者也可以是消费者

  生产者要先进行注册,包含名字,功能,所属部门,接口有哪些,接口说明,联系人,生产者ip地址等信息。

  消费者也要先进行注册:名字,目的,所属部门,联系人,IP地址等信息。消费者可以调用多个生产者,消费者想要调用生产者要先申请。申请包括:调用原因,所属业务,所属部门,联系人,调用那些接口,某个接口每分钟调用的上限次数等信息。

  中央管理平台要进行权限控制(消费者可以调用生产者的哪些接口)和流量控制(这里的流量是指访问量)。服务发现,服务治理。当某些服务的服务器出现问题了,中央管理平台也要及时的察觉出来。所以这些服务器socket(包含生产者和消费者)每隔几秒就向管理平台发送一次心跳(轮询),证明自己还活着。如果管理平台没有收到某个服务器的心跳,那么就会报出异常,向对应管理者发送信息。

   一旦消费者的对某个生产者发送请求失败就要将请求分配到其他服务器上去。如果生产者新增了服务器,要让消费者也知道新增服务器的存在,让请求也能打到这些服务器上。

  内网为了传输更快,要重新规定一个协议,自己研发一套。不能使用原有的http协议。

生产者

生产者注册后,会生成一个唯一标识。生产者程序,需要引入微服务相关的jar包,在一个固定的文件夹中会生成一个此服务对应的一个秘钥,那么当程序启动时,jar包就会把这个秘钥发送到中央管理平台,就能够找到对应的注册的生产者,还会把主机ip等信息也上传到中央管理平台对应的生产者,每秒钟服务器会向中央管理平台每隔几秒发送一次心跳,来证明服务器运行正常,如果中央管理平台没有收到心跳,那么就会标记异常。

在生产者压力较大时,生产者会新增服务器,通过新增生产者服务器的心跳,就能够将自己的信息通知到中央管理平台。

生产者的实现原理类似于Tomcat+springboot

消费者

消费者和生产者一样,也会需要注册,生成一个id,消费者服务器也有对应的秘钥,这样就无需手动去统计,消费者有哪些服务器了。

生产者会拥有若干个接口,消费者在申请的时候可能并不会申请全部的接口,每个申请的接口,都需要提交调用次数等信息。

微服务及其注重性能,消费者在首次调用的时候需要向中央管理平台询问,知道生产者服务器有哪些ip,然后缓存到消费者服务器本地,下次再调用就不需要再经过中央管理平台了,而是直接访问生产者服务器。

在访问的时候需要判定消费者对生产者的接口有没有访问权限,如果消费者想要越界调用某些没有权限的接口,需要消费者自己去拦截,由消费者的jar包去实现拦截。

消费者对生产者的访问权限存储在消费者的本地中,由于消费者申请接口的数量可能变化,所以每隔几分钟消费者会去中央管理平台去同步一下自己的访问权限,更新到本地。

当生产者新增了服务器后,消费者通过分钟级的轮询中央管理平台也能够发现这些新增的服务器并使用。

怎样解决生产者崩溃问题

当一个生产者者服务器出现故障后,中央管理平台有5-6次没有收到某台生产者服务器的心跳时,才能判定该服务器出故障了,这会导致一个较长的延迟。所以如果这期间会有许多的请求过来,这时如果一个消费者请求这个服务器失败了,会再try catch一次,如果还请求失败,就会更换一个服务器进行请求。并将该故障消费者服务器上报给中央管理平台,中央管理平台接到消费者对生产者的故障报告后会立刻查询有哪些消费者正在调用该台故障的生产者服务器,并且立刻向他们更新消息,告诉他们这台服务器故障了。这样的处理是毫秒级别的。

如果一共有三台消费者服务器,而这三台消费者对生产者总访问量限制为每分钟一千次,该如何进行流量控制?

1.方案一:在众多消费者服务器中,会选择一台服务器负责进行访问次数统计,到了每分钟允许访问的总次数吧就告诉大家不要访问了。这种方法,统计不精确,有延迟。

2.方案二:把这些任务去平均分给这三台服务器,一旦某个消费者服务器的请求量达到了1000,就阻止该消费者服务器继续访问。

ps:3000的访问要求并不一定要非常精确,超过几十次访问是没有影响的。

自定义传输协议

如果使用http协议,那么任意一个项目都可以作为生产者,像servlet,spring,springboot都可以,只需要引入相关jar包即可。但是为了内部传输速率的加快,通常使用自定义协议,那么这时servlet,spring,springboot就都不可以了,所以就需要架构师自己写一套类tomcat的东西,但是和tomact的区别是,tomcat识别http协议,自己写的识别自定义协议。

http协议在外网,环境比较复杂。所以规定了许多字段。但是在内网使用的时候,通常会基于http协议/tcp协议进行缩减。自定义协议定义了每个字段的范围,如何发送,怎样解析。

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

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

相关文章

【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵,网络攻击,流量异常【3】

之前用NSL-KDD数据集做入侵检测的项目是: 【1】https://qq742971636.blog.csdn.net/article/details/137082925 【2】https://qq742971636.blog.csdn.net/article/details/137170933 有人问我是不是可以改代码,我说可以。 训练 我将NSL_KDD_Final_1.i…

Day42:动态规划 LeedCode 01背包 416. 分割等和子集

01背包 1.确定dp数组以及下标的含义 dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 那么可以有两个方向推出来dp[i][j] 2.确定递推公式 不放物品i:由dp[i - 1][j]推出,即背…

十大排序——9.桶排序

这篇文章我们来介绍一下桶排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 桶排序和计数排序一样,都不是基于比较进行排序的。 下面通过一个例子来理解一下桶排序吧。 首先,给你一个无序数组[ 20,18,28,66,25,31,67,30 ],然后&#…

Maven POM元素解析(二)

一、parent <parent>元素包含定位此项目将从中继承的父项目所需的信息。注意&#xff1a;此元素的子元素不是插值的&#xff0c;必须作为文字值给定。 ElementTypeDescriptiongroupIdString要从中继承的父项目的组id。artifactIdString要从中继承的父项目的项目id。ver…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

高分二号卫星(GF-2):中国遥感科技的新高度

​高分二号卫星&#xff08;GF-2&#xff09;是中国在高分辨率地球观测领域的重要成就&#xff0c;其引入了先进的成像技术和灵活的数据获取模式&#xff0c;为地球资源监测、环境保护、城市规划等领域提供了强大的数据支持。本文将深入介绍高分二号卫星的技术特点、成像能力以…

Day 27 39. 组合总和 40.组合总和II 131.分割回文串

组合总和 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明&#xff1a; 所有数字&#xff08;包括 target&#xff09;都是正整数。解集不能…

自定义类型: 结构体 (详解)

本文索引 一. 结构体类型的声明1. 结构体的声明和初始化2. 结构体的特殊声明3. 结构体的自引用 二. 结构体内存对齐1. 对齐规则2. 为啥存在对齐?3. 修改默认对齐值 三. 结构体传参四. 结构体实现位段1. 什么是位段?2. 位段的内存分配3. 位段的应用4. 位段的注意事项 ​ 前言:…

什么是上位机?入门指南

什么是上位机&#xff1f; 上位机&#xff08;SCADA&#xff0c;Supervisory Control and Data Acquisition&#xff09;是一种软件系统&#xff0c;用于监控和控制工业过程中的设备。它通常与传感器、执行器和其他自动化设备一起工作&#xff0c;以实时地监视过程状态、收集数…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…

Token2049主办方遭遇假门票风波,韩国罗马基金会Charles Lee损失50万美元

加密货币——遍地黄金&#xff1f;还是遍地陷阱&#xff1f; 尽管伊朗空袭以色列导致中东局势愈发紧张&#xff0c;但加密社区对当地市场的热情丝毫没有受到影响&#xff0c;不出意外的话&#xff0c;Token 2049这场全球最受瞩目的加密货币盛会将于4月18至19日在迪拜如期举行&…

Buck变换电路

Buck变换电路 Buck变换电路是最基本的DC/DC拓扑电路&#xff0c;属于非隔离型直流变换器&#xff0c;其输出电压小于输入电压。Buck变换电路具有效率高、输出稳定、控制简单和成本低的优点&#xff0c;广泛应用于稳压电源、光伏发电、LED驱动和能量回收系统。 电路原理 Buck变…

PyCharm 2024.1 发布:全面升级,助力高效编程!

PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01; 文章目录 PyCharm 2024.1 发布&#xff1a;全面升级&#xff0c;助力高效编程&#xff01;摘要引言 Hugging Face&#xff1a;模型和数据集的快速文档预览针对 JavaScript 和 TypeScript 的全行代…

力扣101. 对称二叉树(java)

思路&#xff1a; 一、验证 左右子树是否可翻转对称的&#xff1f; 二、分析左右子树情况&#xff1a; 1&#xff09;左右都也空 对称 2&#xff09;左右有一个为空 不对称 3&#xff09;左右都不为空&#xff0c;但数字不同 不对称 4&#xff09;左右都不为空&#xff0c;且数…

C++从入门到精通——类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

实验一: 分析ARP解析过程

1.实验环境 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连 2.需求描述 主机A和主机B连接到交换机&#xff0c;并与一台路由器互连主机A和主机B设置为同一网段&#xff0c;网关设置为路由接口地址查看ARP相关信息&#xff0c;熟悉在PC和Cisco设备上的常用命令 3.推…

LeetCode 113—— 路径总和 II

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 看到树的问题一般我们先考虑一下是否能用递归来做。 假设 root 节点的值为 value&#xff0c;如果根节点的左子树有一个路径总和等于 targetSum - value&#xff0c;那么只需要将根节点的值插入到这个路径列表中…

全球首个AI女团Sorai.ai出道:定档4月19日北京电影节出道首秀

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【C++】开始使用stack 与 queue

送给大家一句话&#xff1a; 忍受现实给予我们的苦难和幸福&#xff0c;无聊和平庸。 – 余华 《活着》 开始使用queue 与 stack 1 前言2 stack与queue2.1 stack 栈2.2 queue 队列2.3 使用手册 3 开始使用Leetcode 155.最小栈牛客 JZ31 栈的弹出压入序列Leetcode 150.逆波兰表达…

go work模块与go mod包管理是的注意事项

如下图所示目录结构 cmd中是服务的包&#xff0c;显然auth,dbtables,pkg都是为cmd服务的。 首先需要需要将auth,dbtables,pkg定义到go.work中&#xff0c;如下&#xff1a; 在这样在各个单独的go mod管理的模块就可以互相调用了。一般情况下这些都是IDE自动进行的&#xff0c;…