微服务(rpc)

news2025/1/12 18:54:27

微服务(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.coloradmin.cn/o/922829.html

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

相关文章

Linux: 使用scp命令复制文件夹报 not a regular file 错误解决

使用scp 命令复制文件夹报 not a regular file 错误解决 解决办法: 加入参数 -r: 递归复制整个目录 scp命令参数详解

【MyBatis】:PageHelper分页插件与特殊字符处理

目录 一、PageHelper介绍 二、PageHelper使用 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 3. 配置 Mapper.xml 4. 编写测试 三、特殊字符处理 1. 使用转义字符 2. 使用CDATA 区段 一、PageHelper介绍 PageHelper 是 Mybatis 的一个插件,这里就不扯了&a…

Unity——DOTween插件使用方法简介

缓动动画既是一种编程技术,也是一种动画的设计思路。从设计角度来看,可以有以下描述 事先设计很多基本的动画样式,如移动、缩放、旋转、变色和弹跳等。但这些动画都以抽象方式表示,一般封装为程序函数动画的参数可以在使用时指定&…

JUC初识

JUC 是什么 java.util.concurrent 在并发编程中使用的工具包 从线程start 开始 package com.jhj.Thread;public class ThreadDemo {public static void main(String[] args) {Thread t1 new Thread(() -> {}, "t1");t1.start();} }start 方法调的是native sta…

java:Tomcat

文章目录 背景服务器web 服务器服务资源的分类服务器软件的分类nginx 和 tomact总结 安装Tomcatbrew安装官网压缩包安装IDEA集成IDEA插件 说明 背景 在讲 Tomcat 是啥之前,我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑,但是这个电脑现在…

Qt6和Rust结合构建桌面应用

桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…

如何给开源仓库提交pull request?

Pull Request(PR)是一种在基于版本控制系统的协作开发中使用的功能,它允许开发人员将自己所做的代码更改(commits)提交给项目的主要代码库。具体而言,当在分支中做出代码更新后,开发人员可以发起…

射频有源器件的动态范围和交越失真

射频有源器件的动态范围和交越失真 1、增益压缩 一个输入信号Vin经过一个非线性网络后输出为Vout,Vout与Vin用泰勒级数的关系表示: Vout a0 a1*Vin a2*Vin^2 a3*Vin^3 …… a0为直流输出,a1为线性输出,a2为平方输出&…

Android 基础知识

一、Activity 1、onSaveInstanceState(),onRestoreInstanceState的调用时机 onSaveInstanceState 调用时机 从最近应用中选择运行其他程序时 但用户按下Home键时 屏幕方向切换时 按下电源案件时 从当前activity启动一个新的activity时 onRestorInstanceState调用时机 只…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址:go.dev 选择相对应的版本,下载,运行安装程序,并打开命令提示符,运行 go env ,确认已经安装go 注意关注其中GOPATH和GOROOT,这两个地址可以在系统环境变量中进行设置…

在其他python环境中使用jupyter notebook

1、切换到目标python环境 activate 目标python环境 2、安装notebook内核包 pip install ipykernel 3、加环境加入到notebook中 python -m ipykernel install 目标python环境 4、切换到base环境 activate base 5、打开目标项目的对应盘 如果,项目在c盘&…

docker-maven-plugin直接把镜像推到私有仓库

接着上篇 推送到本地docker 我们已经把服务做成镜像推到docker&#xff0c;也可以通过docker login 私有地址&#xff0c;去push。麻烦 直接上代码 1、pom改动 <properties><docker.registry>eco-registry.XXX.com</docker.repostory><docker.registry…

云从科技“AI困局”:上半年营收腰斩、亏损超3亿

“AI四小龙”云从科技难“从容”&#xff1f; 8月12日&#xff0c;云从科技集团股份有限公司(下称“云从科技”,688327.SH)公布了2023半年报。上半年云从科技推出“从容”大模型&#xff0c;但此后其迎来大规模解禁。 5月29日&#xff0c;云从科技宣布将4.55亿股股份解除限售…

如何选择合适的供应商管理系统?

供应商管理系统可以对企业的业务及其日常运营产生深远影响。该解决方案可集中管理采购、预算编制、供应商选择、交付跟踪、发票开具和报告。管理这些流程既费时又费钱&#xff0c;这也解释了为什么一半以上的企业目前都将数字化转型作为重中之重。 但是&#xff0c;如何选择合…

MediaPlayer音频与视频的播放介绍

作者&#xff1a;向阳逐梦 Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码和播放音视频。 它支持三种不同的媒体来源…

Binder通信的核心思想

Binder到底是什么&#xff1f;Binder通信到底是怎么实现的&#xff1f;脱离复杂的Android Framework代码&#xff0c;用最简单的方式来理解下什么是Binder通信。 关于IPC通信 在Linux系统中&#xff0c;正常运行的两个进程A和B&#xff0c;它们之间如果要进行数据的通信&#x…

iview时间控件 动态不可选日期 可选择24小时范围内 时间往后退24小时

演示 html 设定 起始时间 触发on-change 方法结束时间 options 动态设置不可选择的日期。 <!-- 起始时间 --> <FormItem :label"$t(startTime)" prop"startTime"><DatePickertransfertype"datetime":placeholder"$t(pleas…

文件和IO的核心API

操作文件 public static void main(String[] args) throws IOException {//创建一个文件对象&#xff0c;并且指向某个路径File file new File("C:\\Users\\1162\\Desktop\\1.trx");//创建文件System.out.println(file.exists());boolean newFile file.createNewFi…

Mysql-InnoDB数据页结构

一、页结构说明 大致分7部分 二、记录在页中的存储 2.1 页面记录内存结构 行格式 存储到 User Records 部分&#xff0c;每当我们插入一条记录&#xff0c;都会从 Free Space 部分申请一个记录大小的空间划分到 User Records 部分 &#xff0c;用完则申请新的页&#xff1b; …

Vue中使用element-plus中的el-dialog定义弹窗-内部样式修改-v-model实现-demo

效果图 实现代码 <template><el-dialog class"no-code-dialog" v-model"isShow" title"没有收到验证码&#xff1f;"><div class"nocode-body"><div class"tips">请尝试一下操作</div><d…