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

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.rhkb.cn/news/362295.html

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

相关文章

cad怎么导出为图片?分享四种导出方法

cad怎么导出为图片?在工程设计、建筑设计、机械设计等领域,CAD图纸的编辑和分享是一项日常工作。然而,如何将CAD图纸高效、准确地导出为图片格式,一直是设计师们关注的焦点。今天,就为大家推荐四款强大的CAD导出图片软…

连接Huggingface报requests.exceptions.SSLError错误

最近在学习使用 SHAP 算法解释 BERT 模型的输出结果,然而在从 Huggingface 上导入模型和数据集的过程中出现了网络连接相关的错误,本文用于记录错误类型和解决错误的方法。 1 代码示例 SHAP 官方展示的代码如下: import datasets import nu…

企业微信内嵌H5项目接入聊天功能

产品需求是,在列表中把符合条件的列表接入聊天功能,以下是详细步骤: 1.引入企业微信 <script src"https://res.wx.qq.com/wwopen/js/jsapi/jweixin-1.0.0.js"></script> 2.获取wx签名(必须要) /*** 获取wx签名**/ export function getWxJsApi(data) {r…

如何在信创领域中做好防泄露

随着信息技术的迅猛发展&#xff0c;数据安全和防泄露成为了企业和政府机构面临的重大挑战。在信创&#xff08;Creative and Innovative Intelligent Products&#xff09;领域中&#xff0c;沙箱技术以其独特的隔离和保护机制&#xff0c;成为了防泄露的关键手段之一。 一、沙…

上古世纪战争台服官网地址+台服预约+预创建角色教程

上古世纪战争台服上线啦&#xff0c;在《上古世纪战争》中&#xff0c;通过主要势力和地区&#xff0c;剧情和角色可以想起原作。《上古世纪战争》的主要背景为&#xff0c;原大陆消失之后&#xff0c;完成移民的种族们定居在诺伊大陆之后遇到的多个势力之间的冲突。同时&#…

鸿蒙期末项目(4)

day4 页面的设计与编写基本完成&#xff0c;接下来使用我们之前搭建好的服务器与相关的网络接口将鸿蒙中的逻辑真正实现一下。 在实现购物车页面展示功能时&#xff0c;使用了如下代码&#xff1a; getCartList(uid: number): Promise<CartItem[]> {return new Promise…

MTK平台Android13实现三方launcher为默认

一、前言 目前有遇到客户的定制需求,希望使用三方的launcher作为默认的launcher使用,一般情况下直接将三方launcher通过内置到系统并通过overlay机制即可很方便的实现launcher的替换,但是存在一个问题,需要增加ROM的维护成本。本文通过设备在使用前联网通过后台下发三方lau…

基于SpringBoot的财务管理系统

根据您提供的论文内容和模板要求&#xff0c;以下是定制化的文章输出&#xff1a; 你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot…

沙龙圆满举行 | 数据资产入表新动向·驱动企业新质生产力!

近日&#xff0c;由四川智慧城市发展联盟、璞华科技有限公司等公司主办的“数据治理与入表专题沙龙会”在成都圆满落幕。璞华科技有限公司作为数据治理、数据资产入表领域的领军企业&#xff0c;为此次盛会贡献了我们的专业见解与实战经验。 沙龙现场&#xff0c;业内精英齐聚一…

Redis优化之持久化

目录 1.Redis高可用 2.Redis持久化 2.1 RDB持久化 2.1.1 触发条件 2.1.2 执行流程 2.1.3 启动时加载 2.2 AOF持久化 2.2.1 开启AOF 2.2.2 执行流程 2.2.3 文件重写触发方式 2.2.4 文件重写的流程 2.2.5 启动时加载 2.3 RDB和AOF的优缺点 3.Redis性能管理 3.1 查看…

btrace使用记录

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用三、 推荐阅读 一、导…

Vivo手机怎么录屏?分享2种录屏方法

“新换的Vivo手机还挺好用的&#xff0c;但是今天看到一个视频想录下来保存&#xff0c;但找不到录屏功能啊&#xff0c;想问问大家Vivo手机的录屏功能怎么打开啊&#xff1f;还有Vivo手机能不能录制出高质量的视频呢&#xff1f;” 随着智能手机的普及&#xff0c;录屏功能已…

C++系统编程篇——Linux第一个小程序--进度条

&#xff08;1&#xff09;先引入一个概念&#xff1a;行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…

深度学习 --- stanford cs231学习笔记五(训练神经网络之数据的预处理)

数据的预处理(Data Preprocessing) 2 Data Preprocessing数据的预处理 数据预处理的几种方法 2&#xff0c;1 数据的零点中心化 数据的零点中心化的目的就是为了把数据的整体分布拉回到原点附近&#xff0c;也就是让数据的整体均值变为0。 ​ 2&#xff0c;2 数据的标准化 数据…

必应bing搜索广告投放介绍,投放的广告形式和效果

必应Bing搜索广告以其独特的市场定位、高质量的用户群体和强大的全球覆盖能力&#xff0c;成为众多企业拓展业务、提升品牌影响力的重要渠道。作为微软旗下的一款搜索引擎&#xff0c;必应不仅在美国市场占据重要份额&#xff0c;其在全球范围内的影响力也不容小觑。对于寻求国…

数据资产与云计算深度融合:借助云计算技术,优化数据存储、高效处理并创新应用,驱动企业数字化转型

目录 一、引言 二、数据资产与云计算深度融合的必要性 1、数据资产的重要性 2、云计算技术的优势 三、云计算技术在数据资产管理中的应用 1、数据存储的优化 2、数据处理的高效性 3、数据应用的创新 四、云计算驱动企业数字化转型的实践案例 案例一&#xff1a;金融行…

Docker(九)-Docker运行redis6.0.8容器实例

1.宿主机新建目录存放redis.conf文件 目的&#xff1a;运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误&#xff0c;尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容&#xff0c;我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入&#xff0c;因此可以在maven仓…

实际项目开发:Spring集成Redis,并实现短信登录功能

redis新手&#xff0c;学了几种基本数据类型&#xff0c;却不知道怎么使用&#xff1f; 总是一边学一边忘&#xff1f; 学会了Redis的大多数使用命令&#xff0c;却不知道如何在项目中使用&#xff1f; 本文将从实际出发&#xff0c;为大家解决这些问题。 我是蚊子码农&#xf…