tRPC架构设计简单理解

互联网发展早期,业务场景差异大,试错迭代速度很快。这导致其后台服务使用的语言技术栈、开发框架、通信协议、服务治理系统、运维平台等或多或少存在差异。

业务发展到一定阶段后,跨业务合作越来越多,组织架构调整也愈发频繁。技术体系差异,特别是开发框架的不统一,给业务互通带来巨大成本,也导致开发和运营的效率难以快速提高。

同时,随着云原生技术的发展,业务越来越多地使用开源技术和云组件。拥抱云原生已经是一种主流趋势。

上述问题在腾讯内部也同样存在,且因为规模大、业务类型多,更加难以解决,更必须解决。tRPC就是在这种背景下诞生的。

插件化设计

既要与存量技术体系互联互通,又要适配云原生技术并且快速发展。这就要求开发框架必须具备开放性和可扩展性。为了达到这个目的,tRPC在架构设计上采用插件化设计思想。

tRPC插件化在整体设计上遵循如下的思想:

首先tRPC对框架整体进行分层和模块化,并把核心功能模块抽象封装成一个个独立的插件。然后由框架来负责这些独立插件的串联和拼装,从而实现框架所要支持的功能和特性。

在具体实现上,则采用以下的关键技术

  1. 基于接口机制的插件工厂;
  2. 基于AOP思想的拦截器;

插件工厂

插件工厂的整体实现思路是框架只定义插件的标准接口,并提供注册能力,不做具体实现。与外部服务互通,或者对接某个服务治理系统时,只需要开发对应的具体插件即可。

例如: 框架对多协议的支持,定义了统一的Codec,不同协议只需要按照Codec接口即可实现即可。

codec

例如: 框架对接不同名字服务系统,定义了统一的Registry和Selector抽象接口,对接不同的名字服务系统时只需要按照Registry和Selector接口即可实现即可。

naming

通过插件工厂的设计,可以带来以下的好处:

  • 对于框架侧: 框架只定义标准接口,没有任何插件实现,与具体平台完全解耦;

  • 对于平台侧: 只需要按照框架插件标准接口即可实现插件,即可将平台的能力融入到框架中;

  • 对于用户侧: 业务开发只需要通过配置进行使用,对用户透明;

拦截器

为了使tRPC框架有更强的可扩展性,满足业务个性化的需求(比如:Metrics监控、日志收集、链路跟踪、参数校验、请求回放、故障注入等),tRPC借鉴了java面向切面(AOP)的编程思想,支持了拦截器Filter。

Filter整体实现的思路是在框架处理RPC请求的流程上设置埋点,然后通过在埋点地方插入一系列的Filter。具体实现上,不同语言有所不同,cpp采用数组遍历的方式,go采用递归的方式,java采用链式的方式。

Filter工作流程如下图:

fitler

Filter的最终目的是让业务逻辑与框架进行解耦,并允许各自进行内聚性开发,可以在不修改框架代码的情况下,给业务程序动态添加或替换个性化的功能。

插件化架构

有了上面插件化的关键技术支持,接下来我们看看tRPC插件化架构是怎样设计的。

总体架构设计

tRPC多语言的总体架构设计如下:

architecture_design

总体架构由 “框架核心” 和 “插件” 两部分组成。 其中虚线框内为tRPC,中间的红色实线框为框架核心,蓝色框为插件部分。

框架核心又可以分三层:

  • 通信层: 负责数据的传输和协议的编解码,框架内置支持tcp、udp等通信协议,传输协议采用基于Protocol Buffers的tRPC协议来承载RPC调用,支持通过Codec插件来使用其它传输协议;

  • 服务治理层: 负责将服务治理功能抽象成插件,通过调用插件和外部服务治理系统进行对接,实现服务发现、负载均衡、监控、调用链等功能;

  • 调用层: 封装服务和服务代理实体,提供RPC调用接口,支持业务用同步、异步、单向以及流式调用等方式进行服务间调用;

此外框架还提供了Admin管理接口,方便用户或者运营平台可以通过调用Admin接口对服务进行管理。 管理接口包括更新配置、查看版本、修改日志级别、查看框架运行时信息等功能,同时框架也支持用户自定义管理接口,以满足业务定制化需求。

插件则是框架核心和外部服务治理组件串联起来的桥梁,按功能大致分为下面几类插件:

  • Codec: 提供协议编解码相关的接口,允许通过插件的方式来扩展业务协议、序列化方式、数据压缩方式等协议处理;
  • Naming:提供了服务注册(Registry)、服务发现(Selector)、负载均衡(LoadBalance)、熔断(CircuitBreaker)等能力封装,用于对接各种名字服务系统;
  • Config:提供了配置读取相关的接口,支持读取本地配置文件、远程配置中心配置等,允许插件式扩展支持不同格式的配置文件、不同的配置中心,支持reload、watch配置更新;
  • Metrics:提供了监控上报的能力,支持常见的单维上报,如Counter、Gauge等,也支持多维上报,允许通过扩展对接不同的监控系统;
  • Logging:提供了通用的日志采集接口,允许通过插件的方式来扩展日志实现,输出到远程;
  • Tracing:提供了分布式跟踪能力,允许通过插件的方式上报到调用链系统;
  • Telemetry:提供了采集和上报遥测数据的能力,是一个集成了链路追踪(Tracing)、监控上报(Metrics)、日志采集(Logging)三大功能的插件;

具体插件实现时,一边需要按框架标准接口实现插件,注册到框架核心,并完成插件实例化;另一边具体插件还需要使用外部服务治理服务的SDK或API,实现如服务发现、负载均衡、监控、调用链等功能。

具体架构设计

在讲具体架构设计之前,我们先看看RPC的过程是怎样的。从开发者角度来说,它可以让你像本地函数调用一样进行跨节点的函数调用,通常一个完整的RPC过程如下图:

rpc

上图描述了一个RPC调用必须要经过的环节。基于此共性,我们把框架在横向上分为服务端和客户端,在纵向进行分层。其中,纵向上的服务端大致分为Transport、Codec、Service和Filter层,客户端分为Transport、Codec、ServiceProxy、Filter层,具体设计如下图:

rpc

在这张图中,我们新增了一层Filter层(拦截器),其主要目的是采用AOP的思想,把业务个性化的需求(比如:校验校验、请求回放、故障注入等)、以及服务治理的大部分功能(比如:监控指标上报,调用链跟踪,远程日志,鉴权等)以横切关注点的方式,插入到请求/响应处理的流程中,通过这样的设计来增强框架的可扩展性。

同时系统对每一层进行模块化拆分,采用插件化的实现,框架通过基于接口编程的思想,串联RPC的全流程。对于一些模块,框架也采用了更细粒度的模块拆分。比如:Selector模块被细分为服务发现、服务路由、负载均衡和熔断等子模块,Codec层也被细分为编解码、序列化、压缩三个子模块。

通过上面整体的分层设计,具体模块的插件化实现和细粒度的模块拆分,使框架具备很强的扩展性和开放性。业务可以灵活替换插件,实现与不同系统的对接,也可以进行业务个性化定制能力实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

局域网管理软件哪个好?局域网电脑管理系统实践案例

之前有一个公司案例,是这样的: 公司名称:智慧科技有限公司 背景: 智慧科技有限公司是一家拥有数百名员工的中型企业,随着业务的快速发展,公司面临着网络管理上的挑战。 员工在日常工作中需要频繁地访问…

旧版本jquery升级新版本后如何处理兼容性问题

前言 最近项目在漏洞扫描过程中发现现在的jquery版本受多个跨站点脚本漏洞影响,需要升级jquery版本。 1、首先下载高版本的jquery,我这里升级的是3.6.0 2、对应的bootstrap版本也要升级,这里升级的是3.3.7 本来以为替换完这两个文件后&#…

【SpringBoot】-- 使用minio对象存储服务实现上传图片

目录 一、安装minio 拉取镜像 启动 查看 进入登录页面 创建bucket 二、安装miniomc 三、代码 application.yml MinioUtil Controller 四、拓展 以下基于云服务和docker使用minio服务 一、安装minio Minio 是一个开源的对象存储服务器。它允许用户在私有云环境中建…

全闪存储阵列利用 U.2NVMe技术实现高性能体验

U.2 NVMe全闪存储阵列日益成为全闪存储的主流,以Infortrend普安科技最新推出GS 5000U为例。作为GS 5000U系列首发机型,GS 5024UE全面升级,搭载第五代IntelXeon处理器,支持PCIe 5.0、NVMe-OF、100GbE,带宽性能比之前的旗…

cPanel如何远程MySQL

本周有一个客户,购买Hostease的HK Basic Linux虚拟主机,询问我们的在线客服,主机是否支持远程访问MySQL及如何配置的问题。我们为用户提供教程,用户很快完成了设置。在此,我们分享这个操作教程,希望可以对您…

[2024]最新激活Navicat教程附激活码

PS:在开始前,建议先断开本地网络!!!建议先断开本地网络!!!建议先断开本地网络!!! 1 安装 1.1 点击下一步 1.2 许可证选择“我同意”&#xff0c…

Fastgpt配合chatglm+m3e或ollama+m3e搭建个人知识库

概述: 人工智能大语言模型是近年来人工智能领域的一项重要技术,它的出现标志着自然语言处理领域的重大突破。这些模型利用深度学习和大规模数据训练,能够理解和生成人类语言,为各种应用场景提供了强大的文本处理能力。AI大语言模…

redis 数据迁移到rds2214(TongRDS-2.2.1.3.Load版 by lqw)

​ 文章目录 一.备份redis文件 vi redis.conf ,看看有没有这两行设置,有的话改成跟下面的一致: appendonly yes appendfilename “appendonly.aof” 之后连接redis客户端,输入INFO persistence,如图所示即为开启成功…

云LIS系统源码,ASP.NET区域LIS系统源码,实验室信息系统

云LIS系统源码,ASP.NET区域LIS系统源码,实验室信息系统 LIS技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、S…

在启动Windows安装的Nacos时报错

Please set the JAVA_HOME variable in your environm 有可能时jdk版本过低引起的,所以安装一个1.8版本以上的jdk 在安装jdk完成以后配置好环境变量,测试一下 winr打开控制台,输入: Java -version 出现如下情况说明jdk安装配置…

ELK+Filebeat日志分析系统

一、ELK基本介绍: 1.ELK 简介: ELK平台是一套完整的日志集中处理解决方案(日志系统)。 将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ELK --> ELFK --> ELFKMQ2.ELK组件介绍…

Android13 CameraServer启动流程

代码入口 frameworks/av/camera/cameraserver 里面包含了四个文件 我们先来看看Android.bp的内容 package {// See: http://go/android-license-faq// A large-scale-change added default_applicable_licenses to import// all of the license_kinds from "frameworks_a…

青少年体能素质教育平台

一、项目背景与意义 随着社会的快速发展和人们生活水平的提高,青少年体能素质教育逐渐受到社会各界的广泛关注。体能素质作为青少年全面发展的重要组成部分,对于提升他们的健康水平、增强自信心、培养团队协作精神和创新能力具有重要意义。然而&#xf…

数据结构(七)——查找的基本概念

七、查找 7.1 查找的基本概念 7.1.1 基本概念 查找 —— 在数据集合中寻找满⾜某种条件的数据元素的过程称为查找 查找表(查找结构)—— ⽤于查找的数据集合称为查找表,它由同⼀类型的数据元素(或记录)组成 关键字 …

网络流量分析与控制

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计5477字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

蓝桥杯——与或异或

题目 分析 很明显的DFS题&#xff0c;这里关键要找到边界&#xff0c;即x与y的关系&#xff0c;容易知道y<4-x&#xff0c;小于和等于是不同的搜索&#xff0c;小于的话就在同一行搜索&#xff0c;从下一列搜索&#xff0c;等于的话就从下一行的第一个搜索。 代码 num[[0…

ChatGPT 人工智能助手为你定制测试计划,精准又高效!

简介 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、测试任务、谁执行任务和风险控制等。 所以在使用ChatGPT输出结果之前&#xff0c;我们需要先将文档的内容框架梳理好&#xff0c;以及将内容范围划定好&#xff0c;必要…

基于SpringBoot+Vue的咖啡商城(带文档)

项目介绍: 基于SpringBootVue的咖啡商城&#xff08;带文档&#xff09; 网上咖啡商城系统&#xff0c;咖啡商城系统 前后端分离&#xff0c;Java开发&#xff0c;Vue框架&#xff0c;Redis分布式缓存&#xff0c;MyBatis 运行环境&#xff1a;JDK1.8MySQLMavenRedisNode.js 项…

【Next】错误处理和并行路由

错误处理 error.tsx 文件约定处理 嵌套路由 中意外的运行时错误。将错误隔离到受影响的段&#xff0c;同时保持应用的其余部分正常运行。 app/dashboard/error.tsx use client export default function Error({error,reset}: {error: Error,reset: () > void }) {return …

Ansys Zemax | 如何将光栅数据从Lumerical导入至OpticStudio(下)

附件下载 联系工作人员获取附件 本文介绍了一种使用Ansys Zemax OpticStudio和Lumerical RCWA在整个光学系统中精确仿真1D/2D光栅的静态工作流程。将首先简要介绍方法。然后解释有关如何建立系统的详细信息。 本篇内容将分为上下两部分&#xff0c;上部将首先简要介绍方法工作…