自研网关架构设计

server/2024/10/20 5:29:35/

网关项目

  • 1. 了解网关
    • 网关横向对比
    • 为什么自研网关
  • 2. 架构设计
    • 技术栈
    • 技术要点
      • 异步化设计
      • 使用缓存缓冲
      • 合理使用串行化
      • 吞吐量为王
      • 合适的工作线程
    • 架构图

1. 了解网关

概念

  • 访问数据、业务逻辑或功能的 “前门
  • 负责处理接受和处理调用过程中的所有任务

类型

  • RESTful APl 使用HTTP API构建
  • WebSocket APl 通过WebSocket API构建

优势

  • 简化客户端的工作
  • 降低函数间的耦合度
  • 解放开发人员把精力专注于业务逻辑开发

劣势

  • 在微服务这种去中心化架构中,成为瓶颈点
  • 服务如果不是异步或者同步非阻塞,耦合度高

解决问题

  • 路由转发
  • 协议转换
  • 服务监控统计
  • 熔断限流
  • 日志
  • 优雅下线

网关横向对比

  1. Nginx + OpenResty
    • 同时作为流量网关和业务网关
    • C语言开发,性能非常好
    • 基于 lua 语言扩展功能
  2. Kong / APISIX
    • 基于Openresty
    • 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能
    • 支持gRPC,Dubbo,Http等协议转换
  3. Netflix Zuul1.0
    • 中小厂落地案例丰富
    • 基于同步阻塞O,性能差
  4. SpringCloud Gateway
    • 与SpringCloud生态完美兼容
    • 异步非阻塞IO,性能好
  5. Netflix Zuul2.0
    • 性能接近SpringCloud Gateway
    • Netflixi进入维护期,前景不明

在这里插入图片描述

为什么自研网关

开源网关缺点:

  1. 开源网关的组件以及附加功能太多,使用起来就越麻烦,我们希望网关足够的薄,只满足我们的业务即可。
  2. 技术栈不符合团队,如果我们使用的是Go语言,那么以上的开源网关都不符合
  3. 开源网关性能参差不齐

自研网关优点:

  1. 因需制宜。例如:可以定义某个接口走同步还是异步,比如要求一致性高的接口走同步,不要求一致性的走异步。
  2. 研发需求以及进度可控。例如:如果开源网关出现漏洞,则需要等开源社区完善。

2. 架构设计

在这里插入图片描述

在这里插入图片描述

技术栈

基础框架

  • 原生Java

网络通信框架

  • Netty

注册中心

  • Nacos

配置中心

  • Nacos

技术要点

异步化设计

需要异步化的地方

  1. 请求转发异步化
  2. 请求响应异步化
  3. 插件过滤异步化

插件过滤使用单异步模式,单异步模式:发送和接收请求使用的是同一个线程,但是可以多线程同时发送和接收
请求响应使用双异步模式,双异步模式:发送和接收请求可以使用不同的线程。

如果下游服务器性能不是很高,响应时间在 500 - 2000 毫秒,则可以使用 双异步模式,如果性能高,则使用 单异步模式

异步神器CompletableFuture

  1. Future局限性
  2. CompletableFuture简介

使用缓存缓冲

尽量使用内存作为缓存(Map、Queue)

合理使用串行化

串行化使用场景:

  • 耗时较小,性能较高的场景。(避免线程频繁的切换)

并行化使用场景:

  • 耗时较久,任务之间没有依赖关系,比如远程RPC调用场景

吞吐量为王

流量高峰使用本地缓冲(Disruptor、MPMC)

合适的工作线程

CPU密集型

  • CPU核数 + 1

IO密集型

  • 公式1:CPU核数 * 2
  • 公式2:CPU核数 / (1 - 阻塞系数)。阻塞系数:0.8 - 0.9 之间

架构图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/server/53242.html

相关文章

android Studio 无线开发调试: PC机远程安卓电脑 免费

背景 公司的安卓机比较大,还有连接着串口设备不好挪动。 但是遇到问题调试很麻烦。想找到一套远程调试方法。 实现 要求: adb android Studio 2023.3.1 安卓机IP:1928.168.1.228 直接用adb远程连接:adb connect 1928.168.1.228 默认端口…

Go语言中的go.mod与go.sum

问题1:什么是go.mod以及它是用来解决什么问题的? go mod 是 Go 语言引入的包管理工具,用于解决 Go 语言项目在依赖管理方面的问题。 传统上,若不使用go mod,则需要要通过GOPATH来管理依赖,而这种方式存在一…

spring之HelloWord版

目录 基础结构说明 涉及到的功能 执行流程 spring包 引导类 bean定义 注解 回调接口拓展 测试入口 service包 回调接口拓展实现 实体类 自定义注解 基础结构说明 spring子包内,放置spring源码相关类,如注解定义,引导类执行逻辑等…

IIC学习笔记(立创STMF4开发板)

目录 #I2C涉及相关知识 #I2C相关介绍 欢迎指正,希望对你,有所帮助!!! 个人学习笔记,参考文献,链接最后!!! #I2C涉及相关知识 SDA串行数据线: Ser…

Interview preparation--elasticSearch正排索引原理

正排索引 ElastciSearch 适合做或者说擅长做全文检索,在做全文检索的时候,他会通过生成倒排索引的方式来辅助查询,生成一个词项到 文档id的一个倒排表,这样直接通过 词项可以快速找到所有的 稳定信息。 但是并不是所有的搜索都是…

淘客返利系统的分布式事务处理

淘客返利系统的分布式事务处理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨如何在淘客返利系统中实现分布式事务处理,确保系统的数…

通过代理从ARDUINO IDE直接下载开发板包

使用免费代理 实现ARDUINO IDE2.3.2 下载ESP8266/ESP32包 免费代理 列表 测试代理是否可用的 网站 有时,代理是可用的,但依然有可能找不到开发板管理器的资料包。 可以多换几个代理试试。 代理的配置 文件 -> 首选项 -> 网络 进入后做如下配置…

基于weixin小程序农场驿站系统的设计

管理员账户功能包括:系统首页,个人中心,农场资讯管理,用户管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品类型管理 开发系统:Windows 架构模式&…