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

微服务(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)]

缺陷:

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

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

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

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

相关文章:

微服务(rpc)

微服务(rpc) 微服务必备的模块生产者消费者管理平台流量控制集群情况下如何做到流量监控 负载均衡服务发现和治理序列化传输序列化和反序列化 微服务是一种架构风格,将一个应用程序拆分为一组小型、独立的服务,每个服务都可以独立…...

ThinkPHP 多应用配置,及不同域名访问不同应用的配置【详解】

ThinkPHP 多应用配置,及不同域名访问不同应用的配置【详解】 一、安装多应用扩展二、删除项目的中默认的controller文件夹三、创建多应用四、修改config/app.php文件五、测试并且访问多应用六、配置小皮,不同域名访问不同的应用七、小结 一、安装多应用扩…...

Springboot+Mybatis框架是否会取代SSM框架?

个人认真思考的观点:从市场使用来说,会有这个趋势。从技术上来说,不存在被替代这一说。 Spring BootMybatis框架是指使用Spring Boot作为基础框架,并集成Mybatis作为持久层框架的组合,它是一个基于Spring框架的快速开发…...

使用windeployqt和InstallShield打包发布Qt软件的流程

前言 Qt编译之后需要打包发布,并且发布给用户后需要增加一个安装软件,通过安装软件可以实现Qt软件的安装;用于安装软件的软件有很多,这里主要介绍InstallShield使用的流程; 使用windeployqt打包Qt编译后的程序 Qt程序…...

解决selenium的getdrive()方法阻塞问题

selenium里面的Webdriver的get()方法默认是阻塞的,也就是说要等整个页面全都加载完它才会相应。但我们大部分时候不需要用到页面里的所有东西,也许只需要用到里面的一个元素就行了 所以下面是我的解决方法: 初始化代码: # 设置…...

js的闭包

闭包是有权限访问其他函数作用域的局部变量的一个函数 代码 function outer(){const a1;function f(){console.log(a)}f()}outer() 简单来说:闭包内层函数引用的外层函数变量 为什么要使用闭包? 用此方法可以来统计函数调用次数, 但是如…...

ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

环境信息:VMware Workstation 17 Pro ubuntu20.04 (清华源) ubuntu 源点进去选:ubuntu-22.04.3-desktop-amd64.iso 如果之前装过VPP,用以下命令确定是否卸载干净: dpkg -l | grep vpp dpkg -l | grep DPDK 卸载: …...

mysql sql 执行流程

监控查询缓存的命中率 show status like ‘%qcache%’; mysql 缓存机制,以及 8.0 为啥取消 select sql_NO_Cache * from 表 where xxx; # 不使用缓存...

go-kafka

go kafka包 本文使用的是kafka-go 6.5k 这个包 其他包参考: 我们在细分市场中非常依赖GO和Kafka。不幸的是,在撰写本文时,Kafka的GO客户库的状态并不理想。可用选项是: 萨拉玛(Sarama) 10k,这…...

如何在windows电脑上安装多个node,并可以进行随意切换

一、进入官网http://nvm.uihtm.com/ 下载 二、启动解压后的程序 1.开始安装nvm 选择要安装的目录 一直下一步–下一步–最后点击完成 3.最后点击完成即可 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3656568c7e9946e8a04219811fc4c4d3.png 三、在cmd控制台进行操作…...

《机器学习核心技术》分类算法 - 决策树

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 决策树 1、决策树API2、决策时实际应用2.1、获取数据集2.2、划分数据集2.3、决策…...

aws PinPoint发附件demo

php 版aws PinPoint发附件demo Laravel8框架,安装了"aws/aws-sdk-php": "^3.257" 主要代码: public function sendRawMail(Request $request) {$file $request->file(attachment);/*echo count($file);dd($file);*/$filenam…...

边写代码边学习之Bidirectional LSTM

1. 什么是Bidirectional LSTM 双向 LSTM (BiLSTM) 是一种主要用于自然语言处理的循环神经网络。 与标准 LSTM 不同,输入是双向流动的,并且它能够利用双方的信息。 它也是一个强大的工具,可以在序列的两个方向上对单词和短语之间的顺序依赖…...

Django学习笔记-实现联机对战

笔记内容转载自 AcWing 的 Django 框架课讲义,课程链接:AcWing Django 框架课。 CONTENTS 1. 统一长度单位2. 增加联机对战模式3. 配置Django Channels 1. 统一长度单位 多人模式中每个玩家所看到的地图相对来说应该是一样的,因此需要固定地…...

nacos总结1

5.Nacos注册中心 国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 5.1.认识和安装Nacos Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c…...

Web安全测试(三):SQL注入漏洞

一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部…...

Webstorm 入门级玩转uni-app 项目-微信小程序+移动端项目方案

1. Webstorm uni-app语法插件 : Uniapp Support Uniapp Support - IntelliJ IDEs Plugin | Marketplace 第一个是不收费,第二个收费 我选择了第二个Uniapp Support ,有试用30天,安装重启webstorm之后,可以提高生产率…...

从零开始的Hadoop学习(三)| 集群分发脚本xsync

1. Hadoop目录结构 bin目录:存放对Hadoop相关服务(hdfs,yarn,mapred)进行操作的脚本etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件lib目录:存放Hadoop的本地库(对…...

golang http transport源码分析

golang http transport源码分析 前言 Golang http库在日常开发中使用会很多。这里通过一个demo例子出发,从源码角度梳理golang http库底层的数据结构以及大致的调用流程 例子 package mainimport ("fmt""net/http""net/url""…...

spring boot 项目整合 websocket

1.业务背景 负责的项目有一个搜索功能,搜索的范围几乎是全表扫,且数据源类型贼多。目前对搜索的数据量量级未知,但肯定不会太少,不仅需要搜索还得点击下载文件。 关于搜索这块类型 众多,未了避免有个别极大数据源影响整…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...