微服务(rpc)

微服务(rpc)

  • 微服务必备的模块
    • 生产者
    • 消费者
    • 管理平台
    • 流量控制
      • 集群情况下如何做到流量监控
    • 负载均衡
    • 服务发现和治理
    • 序列化传输
      • 序列化和反序列化

微服务是一种架构风格,将一个应用程序拆分为一组小型、独立的服务,每个服务都可以独立开发、部署和扩展。每个服务都有自己的业务逻辑和数据存储,并通过轻量级的通信机制来进行互相通信。

微服务必备的模块

生产者

生产者的实现原理参考了Tomcat

消费者

消费者的实现原理参考了mybatis

管理平台

消费者和生产者在管理平台上注册信息,便于管理。每一个信息都要加上详细说明。管理平台中还应该有调用关系,说明谁调用了谁。

流量控制

当超过限制的流量访问微服务时,会造成瘫痪,此时造成的损失应由生产者承担。当设置流量控制后,超过流量的访问将会被禁止。

流量控制由消费者去做,当消费者发送请求后自己进行计数,当发现流量达到一定程度时,消费者自己就会进行拦截

集群情况下如何做到流量监控

假设有两台消费者访问四台生产者,一分钟不能超过一万次的流量,那么如何安排两台消费者的访问流量

负载均衡

不是用nigx做的,微服务属于内网调用,不对外网公布。内网之间的调用没有那么复杂,例如不会使用http协议。会使用自定义协议,在这种条件下,Tomcat和nigx不能够正常使用。(dobbo使用的就是自定义协议)

服务发现和治理

当生产者的服务器发生变化时(宕机或者有新服务器增加)

服务器增加:生产者和消费者就会自动向管理平台注册信息,为了区分不同的生产者和消费者,所以在申请时,会在平台上自动生成唯一的标记,同时标记会被存放放到指定的位置上,当生产者和消费者在次发送请求时,管理平台就可以根据标记来区分不同的生产消费者

服务器宕机:每台服务器都会定时向管理平台发送信息让管理平台确认自己的运行状态是否正常,当连续多次不在管理平台发送信息时,管理平台就可以及时发现服务器不能正常使用并及时进行销毁

当服务器发生变动后,管理平台会向所有调用变动生产者的消费者发送通知,以确保消费者可以及时了解生产者的消息。

由于存在延迟,当一台服务器多次不在向管理平台发送心跳期间,若有大量消费者的请求涌入,会造成损失。所以当消费者在第一次得不到生产者的回应后,会尝试第二次访问,当再次得不到回应时,消费者会及时将生产者IP进行上报并及时切换其他生产者进行请求。当管理平台接收到消费者的故障请求时,就会向其他消费者发送通知告知生产者故障

当消费者首次调用生产者IP时,会询问管理平台生产者的IP并以hashmap的方式存入缓存中存储到缓存中,下次直接进行访问,也正是因为这样,使得得知生产者故障的IP较晚。当消费者得知生产者故障时,会及时更新自己的缓存

序列化传输

通常情况下,序列化和反序列化会用到反射机制,而序列化传输使用的是probuffer,全程没用使用到任何反射机制,极大提高了效率。

springcloud性能比较慢,但是许多核心模块都是现成的,不需要自己进行开发

dobbo传输性能特别快,核心为生产者和消费者,其他模块内容需要自己去手写一份。

序列化和反序列化

序列化就是把对象转成流的形式,反序列化就是把流转为对象。序列化和反序列是毫秒级别的操作,之所以慢是因为应用到了反射,反射需要将内存都遍历一遍,导致速递很慢。

在序列化传输中,序列化和反序列化追求的都是无反射。

我们定义两个类,那么这两个类进行传输时,需要通过反射来遍历一遍类中的内容,那么如何做到无反射呢。

首先我们在WW类中加入注解标记他为需要特殊处理的类,给类中字段加入注解标记顺位和最大长度。那么这个类就进行了进化,生成了伴生类,但是在使用时是不会受到任何影响的。

​​​​在这里插入图片描述

我们如果要发送一个XX对象,消费者会有一个负责发送的send方法,里面包含了参数的url,类型等数据。也就是说,通过多态直接调用send中的data就可以完成发送。只有在启动生成伴生类时使用了反射,其他时候就不在使用反射。

反射类继承了多态,消费者调用send方法通过socket进行发送,生产者就会接收到,同时创建一个对象来储存接收到的信息,生产者对数据进行处理后返回给消费者。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ChagKUHC-1692870508702)(C:\Users\沧翎\AppData\Roaming\Typora\typora-user-images\image-20230824164549223.png)]

这使得整个过程不存在反射,极大提高了速度。

附上原图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9XWQdLg-1692870508703)(C:\Users\沧翎\Documents\Tencent Files\3139086691\FileRecv\未命名文件.png)]

缺陷:

  • 字符串的存储我们需要自己写一个常量池

  • 在嵌套的情况下,我们需要知道嵌套的类有多大,所以不建议嵌套原生的类,最好是嵌套同样带注解的类。
    缺陷:

  • 字符串的存储我们需要自己写一个常量池

  • 在嵌套的情况下,我们需要知道嵌套的类有多大,所以不建议嵌套原生的类,最好是嵌套同样带注解的类。

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

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

相关文章

C++二叉搜索树

C二叉搜索树 二叉搜索树概念二叉搜索树操作结点类的实现中序遍历实现二叉搜索树的插入非递归实现递归实现 二叉搜索树的查找非递归实现递归实现 二叉搜索树的删除非递归实现递归实现 构造函数拷贝构造函数析构函数赋值运算符重载 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索…

一键快速还原修复人脸,CodeFormer 助力人脸图像修复

今天在查资料的时候无意间看到了一个很有意思的工具,就是CodeFormer ,作者给出来的说明是用于人脸修复任务的,觉得很有意思就拿来实践了一下,这里记录分享一下。 首先对人脸修复任务进行简单的回顾总结: 人脸修复是指…

【Docker】01-Centos安装、简单使用

参考教程: https://www.bilibili.com/video/BV1Qa4y1t7YH/?p5&spm_id_frompageDriver&vd_source4964ba5015a16eb57d0ac13401b0fe77 什么是Docker? Docker是一种开源的容器化平台,用于构建、打包、部署和运行应用程序。它通过使用容…

冠达管理 :主升浪前最后一次洗盘?

随着科技的不断发展,人们关于金融商场的了解也越来越深入。在股市中,洗盘是一个非常重要的概念。洗盘是指许多的股票被清洗出某个价位上的持有者,从而拉低该价位上的股票价格,为后续上涨做出铺垫。而在股市中,主升浪前…

算法工程题(非递减顺序 排列)

* 题意说明: * 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n , * 分别表示 nums1 和 nums2 中的元素数目。 * 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。…

Flutter(九)Flutter动画和自定义组件

目录 1.动画简介2.动画实现和监听3. 自定义路由切换动画4. Hero动画5.交织动画6.动画切换7.Flutter预置的动画过渡组件自定义组件1.简介2.组合组件3.CustomPaint 和 RenderObject 1.动画简介 Animation、Curve、Controller、Tween这四个角色,它们一起配合来完成一个…

2023年高教社杯 国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

maven推包The environment variable JAVA_HOME is not correctly set

解决办法: 打开idea查看jdk安装位置 1.在/etc下面创建(如果存在就是更新)launchd.conf。里面添加一行: setenv JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/Home #JAVA_HOME后面是我的java安装路径…

Python正则表达式简单教程

当涉及到处理文本数据时,正则表达式是一个非常有用的工具。它可以用于在字符串中进行模式匹配、搜索、替换等操作。以下是一个简单的Python正则表达式教程,从基础开始介绍如何使用正则表达式。 什么是正则表达式? 正则表达式(Re…

【跟小嘉学 Rust 编程】二十、进阶扩展

系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…

windows安装新openssl后依然显示旧版本

1、Windows环境下安装升级新版本openssl后,通过指令openssl version -a查看版本号:如下 这个版本号还是是以前的老版本,看来得把原先的老版本删除掉才可以生效,但是不知道在哪里。 2、网上找了老半天也没找到答案,最后…

JS三座大山 —— 原型和原型链

系列文章目录 内容链接2023前端面试笔记HTML52023前端面试笔记CSS3 文章目录 系列文章目录前言一、原型是什么?二、原型链是什么?2.1 原型链全方面解析2.2 为什么构造函数也有原型? 总结 前言 理解原型和原型链可以帮助我们更好地理解 Java…

后台管理系统:项目路由搭建与品牌管理

路由的搭建 先删除一些不需要的界面 然后发现跑不起来,我们需要去配置 删减成这样,然后自己新建需要的路由组件 改成这样,这里要注意。我们是在layout这个大的组件下面的,meta 中的title就是我们侧边栏的标题,icon可…

积分游戏小程序模板源码

积分游戏小程序模板源码是一款可以帮助用户快速开发小程序的工具,此模板源码包含五个静态页面,分别是首页、任务列表、大转盘、猜拳等五个页面,非常适合进行积分游戏等相关开发。 此模板源码的前端部分非常简单易用,用户可以根据…

mongodb 分片集群部署

文章目录 mongodb 分片部署二进制安装三台config 配置shard 分片安装shard1 安装shard2 安装shard3 安装mongos 安装数据库、集合启用分片创建集群认证文件创建集群用户部署常见问题 mongodb 分片部署 二进制安装 mkdir -p /data/mongodb tar xvf mongodb-linux-x86_64-rhel7…

数据通信——传输层TCP(可靠传输原理的ARQ)

引言 上一篇讲述了停止等待协议的工作流程,在最后提到了ARQ自动请求重传机制。接下来,我们就接着上一篇的篇幅,讲一下ARQ这个机制 还是这个图来镇楼 ARQ是什么? 发送端对出错的数据帧进行重传是自动进行的,因而这种…

C语言每日一练----Day(13)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:数字颠倒 单词倒排 💓博主csdn个人主页:小小uni…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后,clear清除了屏幕数据,加入命令无法查看,使用如下,重新查看node如何加入主节点命令: kubeadm token create --print-join-command --ttl 0 2.画圈的全部是,都复制,在…

css中文本阴影特效

文字颜色渐变 .text-clip{color:transparent;font-size: 40px;font-weight: bold;background: linear-gradient(45deg, rgba(0,173,181,1) 0%, rgba(0,173,181,.4) 100%);-webkit-background-clip: text; } 文字模糊 .text-blurry{text-align: center;color: transparent;text-…

Android修改默认gradle路径

Android Studio每次新建项目,都会默认在C盘生成并下载gradle相关文件,由于C盘空间有限,没多久C盘就飘红了,于是就需要把gradle相关文件转移到其他盘 1、到C盘找到gradle文件 具体路径一般是:C:\Users\用户\ .gradle …