【微服务网关——中间件实现】

1.中间件的意义

在这里插入图片描述

  • 避免成为if狂魔
  • 提高复用、隔离业务
  • 调用清晰、组合随意

2.实现原理

在这里插入图片描述

  • 中间件一般都封装在路由上,路由是URL请求分发的管理器
  • 中间件选型
    • 基于链表构建中间件
      • 基于责任链的实现
      • 缺点:实现复杂,调用方式不灵活
    • 使用数组构建中间件
      • 控制灵活方便,推荐使用
      • gin采用的方式
      • 可以进行中间件的跳跃

3.使用方法数组构建中间件—实现思路

  • 方法组装
    • 构建中间件URL路由
    • 构建URL的中间件方法数组
    • 使用use方法整合路由与方法数组
  • 方法调用
    • 构建方法请求逻辑
    • 封装http.Handler接口与http.Server整合

在这里插入图片描述
请求从路由进来后会先调用方法1、方法2等中间件,最后才会调用反向代理、业务方法。

将路由器注册到服务器中
在这里插入图片描述

4.中间件的代码实现

链接: 详见中间件代码的实现与详解

5. 限流与熔断降级

  • 高并发系统三大利器:缓存、降级、限流
    • 缓存:提升系统访问速度和增大处理容量,为响应业务增加缓存
    • 降级:当服务器压力剧增时,根据业务策略降级,以释放服务资源保证业务正常
      • 熔断降级原理
      • 网关集成熔断与降级
    • 限流:通过对并发限速,以达到拒绝服务、排队或等待、降级等处理
      • 限流原理
      • 网关集成限流

5.1 限流的分类

  • 漏桶限流
    • 每次请求时计算桶流量,超过阈值则降级请求
  • 令牌桶限流
    • 每次请求时从令牌桶里取令牌,取不到则降级请求
      在这里插入图片描述
      在这里插入图片描述
      链接: Go令牌桶详解

5.2 网关集成限流功能

将其作为中间件插入到某个路由路径上即可。

func RateLimiter() func(c *SliceRouterContext) {l := rate.NewLimiter(1, 2)return func(c *SliceRouterContext) {if !l.Allow() {c.Rw.Write([]byte(fmt.Sprintf("rate limit:%v,%v", l.Limit(), l.Burst())))c.Abort()return}c.Next()}
}

使用代码如下:

package mainimport ("github.com/e421083458/gateway_demo/proxy/middleware""github.com/e421083458/gateway_demo/proxy/proxy""log""net/http""net/url"
)var addr = "127.0.0.1:2002"// 熔断方案
func main() {coreFunc := func(c *middleware.SliceRouterContext) http.Handler {rs1 := "http://127.0.0.1:2003/base"url1, err1 := url.Parse(rs1)if err1 != nil {log.Println(err1)}rs2 := "http://127.0.0.1:2004/base"url2, err2 := url.Parse(rs2)if err2 != nil {log.Println(err2)}urls := []*url.URL{url1, url2}return proxy.NewMultipleHostsReverseProxy(c, urls)}log.Println("Starting httpserver at " + addr)sliceRouter := middleware.NewSliceRouter()sliceRouter.Group("/").Use(middleware.RateLimiter())routerHandler := middleware.NewSliceRouterHandler(coreFunc, sliceRouter)log.Fatal(http.ListenAndServe(addr, routerHandler))
}

5.3 熔断与降级的意义

  • 熔断意义
    • 熔断器是当依赖的服务已经出现故障时,为了保证自身服务的正常运行不再访问依赖的服务,防止雪崩效用
  • 降级意义
    • 当服务器压力剧增时,根据业务策略降级,以此释放服务资源保证业务正常
  • 当业务出现了熔断时,我们需要降级服务(搭配使用)

熔断器的三种状态

  • 关闭状态
    • 服务正常,维护失败率统计,达到失败率阈值时,转到开启状态
  • 开启状态
    • 服务异常,调用fallback函数,一段时间后,进入半开启状态
  • 半开启状态
    • 尝试恢复服务,失败率高于阈值,进入开启状态,低于阈值,进入关闭状态

5.4 熔断器的原理

在这里插入图片描述

5.5 hystrix-go类库

链接: hystrix-go类库的基本使用

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

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

相关文章

大模型笔记1: Longformer环境配置

论文: https://arxiv.org/abs/2004.05150 首先保证电脑上配置了git. git环境配置: https://blog.csdn.net/Andone_hsx/article/details/87937329 3.1、找到git安装路径中bin的位置,如:D:\Program Files\Git\bin 找到git安装路径中git-core的…

PostgreSQL 连接器:在 SeaTunnel 中的应用与优势

在现代企业中,数据已经成为核心资产,基于开源数据集成平台SeaTunnel,工程师如何高效地连接和管理这些数据源,直接关系到企业的竞争力和运营效率。 本文将给大家介绍如何通过 JDBC PostgreSQL 数据源连接器,在 SeaTunne…

第15周:RNN心脏病预测

目录 前言 二、前期准备 2.1 设置GPU 2.2 导入数据 2.2.1 数据介绍 2.2.2 导入代码 2.2.3 检查数据 三、数据预处理 3.1 划分训练集与测试集 3.2 标准化 四、构建RNN模型 4.1 基本概念 4.2 搭建代码 五、编译模型 六、训练模型 七、模型评估 总结 前言 &#…

直播怎么录制视频?直播视频,3种录制方法

“今晚我最喜欢的游戏博主要进行直播,但我可能还要加班。怎么办,不想错过直播的内容!电脑怎么才能进行直播录制视频啊?谁能教教我?” 在数字化的今天,直播已经成为人们获取信息和娱乐的重要途径。有时&…

执行yum命令报错Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error

执行yum命令报错 [Errno 14] curl#6 - "Could not resolve host: mirrors.cloud.aliyuncs.com; Unknown error 修改图中所示两个文件: vim epel.repo vim CentOS-Base.repo 将所有的http://mirrors.cloud.aliyuncs.com 修改为http://mirrors.aliyun.com。 修改…

趣测系统搭建APP源码开发,娱乐丰富生活的选择!

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 趣测系统提供了一个集合多种有趣测试的平台,如心理测试和星座测试等,这些测试内容富有趣味性和娱乐性,能够帮助大众在忙碌的生活中找到放松和娱乐的时刻…

yolov5驾驶员不规范行为检测

1 项目介绍 1.1 摘要 随着汽车工业的迅速发展和交通拥堵的加剧,驾驶员在行车过程中的不规范行为成为了导致交通事故频发的重要因素之一。为了减少交通事故的发生,保障道路安全,提高驾驶员的行车安全意识,本研究致力于实现驾驶员…

5. PyTorch+NCCL源码编译

系列文章 第1章 多机多卡运行nccl-tests 和channel获取第2章 多机多卡nccl-tests 对比分析第3章 使用tcpdump抓取rdma数据包第5章 PyTorchNCCL源码编译 目录 系列文章前言一、本地环境二、安装cudnn三、使用pytorch自带NCCL库进行编译安装1. 源码编译2. 查看版本和all_reduce测…

【机器学习】机器学习重要方法——迁移学习:理论、方法与实践

文章目录 迁移学习:理论、方法与实践引言第一章 迁移学习的基本概念1.1 什么是迁移学习1.2 迁移学习的类型1.3 迁移学习的优势 第二章 迁移学习的核心方法2.1 特征重用(Feature Reuse)2.2 微调(Fine-Tuning)2.3 领域适…

【启明智显分享】典型的HMI应用实现方案:帮你更好地主控选型!

HMI是操作者与机器/系统间资讯传递和交换的主要桥梁。HMI系统通常能提供丰富的资讯,例如温度、压力、制造流程步骤以及材料的计量数据。还能显示设备中物料的确切位置或储存槽内的液位数据等讯息。无论是在工业自动化还是医疗、商业等重要行业领域,HMI都…

【前端项目笔记】6 参数管理

参数管理 效果展示: 在开发功能之前先创建分支goods_params cls 清空终端 git branch 查看所有分支 git checkout -b goods_params 新建分支goods_params git push -u origin goods_params 把本地的新分支推送到云端origin并命名为goods_params 参数管理需要维…

一个易于使用、与Android系统良好整合的多合一游戏模拟器

大家好,今天给大家分享的是一个易于使用、与Android系统良好整合的多合一游戏模拟器 Lemuroid。 Lemuroid 是一个专为Android平台设计的开源游戏模拟器项目,它基于强大的Libretro框架,旨在提供广泛的兼容性和卓越的用户体验。 项目介绍 Lem…

如何安装多版本CUDA?

首先聊一个题外话:前几天在csdn上看到的一个话题”安装pytorch一定要去nvidia官网下载安装cuda和cudnn吗?“ 我相信任何一个刚开始接触或者从事深度学习的炼丹者都会从安装cuda开始,现在网上随便一搜如何安装pytorch,蹦出来教程提…

pd虚拟机 Parallels Desktop 19 for Mac 破解版小白安装使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机,并于其中装设不同的操作系统,如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时,您可在 …

无线麦克风推荐哪些品牌,一文揭秘无线麦克风领夹哪个牌子好!

​究竟该如何选择麦克风呢?又该如何挑选无线麦克呢?询问我关于麦克风选择问题的人着实不少。对于那些仅仅是想要简单地自我娱乐的朋友而言,着实没必要去折腾,直接使用手机自带的麦克风便可以了。 但若是处于想要直播、拍摄短视频…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

为什么带货主播,他突然就不吃香了?

为什么带货主播他突然就不吃香了?工资骤降50%。 相比 2023 年初主播的平均薪资降了50%,那不管你是头部主播还是腰部主播,全部都降薪了。那尾部主播就更不用说了,有的主播他的时薪已经低到 20 块钱一个小时,还不如大学…

U-boot相关基础知识

U-boot和Bootloader之间的关系 U-Boot是Bootloader的一种实现,它专门用于嵌入式系统,特别是那些基于ARM、MIPS等处理器的系统。U-Boot提供了丰富的硬件支持和功能,使得开发者能够轻松地初始化硬件、加载操作系统内核,并进行一些基…

【漏洞复现】安美数字酒店宽带运营系统——命令执行漏洞(CNVD-2021-37784)

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 安美数字酒店宽带运营系统 server_ping.php 存在远程命令执行漏洞&#…

一文带你了解什么是【点击劫持】

点击劫持,意思就是你点击网页的时候,有人劫持你,对没错,劫持你的信息,甚至劫持你的马内,劫持你的理想,劫持你的肉体,劫持你的灵魂。就是这么可怕。 目录 1 如何实现假网站 1.1 if…