Nodejs 第七十三章(网关层)

什么是网关层(getway)?

技术选型fastify 速度快适合网关层 fastify教程上一章有讲

网关层是位于客户端和后端服务之间的中间层,用于处理和转发请求。它充当了请求的入口点,并负责将请求路由到适当的后端服务,并将后端服务的响应返回给客户端。网关层在分布式系统和微服务架构中起到了关键的作用。

以下是一些网关层的主要功能和优势:

  1. 路由:网关层可以根据请求的URL路径或其他条件将请求转发到不同的后端服务。它可以根据特定的路由规则来决定请求应该被发送到哪个服务处理。
  2. 负载均衡:当有多个后端服务提供相同的功能时,网关层可以通过负载均衡算法将请求分发到这些服务中,以达到分散负载、提高系统性能和可用性的目的。
  3. 缓存和性能优化:网关层可以缓存一些经常请求的数据或响应,以减少后端服务的负载和提高响应速度。通过缓存静态内容或频繁请求的数据,可以减少对后端服务的请求,从而提升整体性能。
  4. 信道加密:网关层可以提供对请求和响应数据的加密和解密功能,以确保数据在传输过程中的安全性和保密性。通过使用加密算法和安全证书,网关层可以保护敏感数据免受未经授权的访问和窃听。
  5. 熔断技术:当后端服务出现故障或异常时,网关层可以使用熔断技术来防止请求继续发送到出现问题的服务上。通过监控后端服务的状态和性能指标,网关层可以自动切换到备用服务或返回错误响应,以提高系统的容错性和可靠性。
  6. 限流:网关层可以实施请求限制策略,以防止对后端服务的过度请求造成的负载过载。通过限制每个客户端的请求速率或总请求数量,网关层可以保护后端服务免受滥用或恶意攻击。

安装依赖

npm install fastify
npm install express
npm install @fastify/caching #缓存
npm install @fastify/http-proxy #代理/负载均衡
npm install @fastify/rate-limit #限流
npm install opossum #熔断技术

目录结构

src/config/index.jsproxy/index.jsindex.js
package.json
server.js
先编写外层的server.js 启动一个简单的服务

process.argv[2]这里使用process接受端口号这样就可以方便开启多个服务

import express from 'express'const app = express()app.get('/info', (req, res) => {res.json({code:200,port: process.argv[2],})
})app.get('/', (req, res) => {res.json({code: 200})
})app.listen(process.argv[2], () => console.log(`Server running on port ${process.argv[2]}`))

启动服务

node server.js 9001
node server.js 9002
网关层编写

src/index.js

核心功能实现

  1. 代理服务(代理服务做成了配置项是个数组 循环注册,这样可以统一入口)
  2. 熔断技术(检测服务是否正常运行,如果挂掉或者超时一定阈值就熔断)
  3. 缓存技术(底层其实也是协商缓存|强缓存)
  4. 限流技术(规定在多少时间内,只能发起几次请求,防止DDOS)

温馨提示 不是必须按照我这个实现,只是个参考,一般场景是需要实现这些功能的

import fastify from 'fastify'
import proxy from '@fastify/http-proxy' //负载代理技术
import rateLimit from '@fastify/rate-limit' //限流技术
import proxyConfig from './proxy/index.js' //请往下翻
import caching from '@fastify/caching' //缓存技术
import CircuitBreaker from 'opossum' //熔断技术
import { rateLimitConfig, cachingConfig, breakerConfig } from './config/index.js' //请往下翻
const app = fastify({logger: false
})
//熔断技术
const breaker = new CircuitBreaker((url) => {return fetch(url).then((res) => res.json()) //检测服务是否挂掉
}, breakerConfig)app.register(caching, cachingConfig) //注册缓存服务app.register(rateLimit, rateLimitConfig) //注册限流proxyConfig.forEach(({ upstream, prefix, rewritePrefix, httpMethods }) => {app.register(proxy, {//请求代理服务之前触发熔断preHandler: (request, reply, done) => {//检测这个服务 如果服务挂掉立马熔断breaker.fire(upstream).then(() => done()).catch(() => reply.code(503).send('Circuit breaker tripped'))},upstream,prefix,rewritePrefix,httpMethods})
})//启动服网关
app.listen({ port: 3000 }).then(() => console.log('server running on port 3000'))

proxy/index.js

代理服务配置文件

在这里插入图片描述

我们的系统还可以根据设备的不同实现多个网关层

温馨提示 网关层不一定只有一个

export default [{upstream: 'http://localhost:9001', //代理地址prefix: '/pc', //前缀rewritePrefix: '', //实际请求将pc 替换成 '' 因为后端服务器没有pc这个路由httpMethods: ['GET', 'POST'], //允许的请求方式},{upstream: 'http://localhost:9002',prefix: '/mobile',rewritePrefix: '',httpMethods: ['GET', 'POST'],}
]

config/index.js

其他配置项

export const rateLimitConfig = {max: 5, //每 1 分钟最多允许 5 次请求timeWindow: '1 minute', //一分钟
}export const cachingConfig = {privacy: 'private', //缓存客户端服务器 禁止缓存代理服务器expiresIn: 1000 //缓存1s
}export const breakerConfig = {errorThresholdPercentage: 40, //超过 40% 会触发熔断timeout: 1000, //超过 1s 会触发熔断resetTimeout: 5000, //熔断后 5s 会重置
}

启动服务

nodemon src/index.js

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

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

相关文章

一个基于HOOK机制的微信机器人

一个基于✨HOOK机制的微信机器人,支持🌱安全新闻定时推送【FreeBuf,先知,安全客,奇安信攻防社区】,👯Kfc文案,⚡备案查询,⚡手机号归属地查询,⚡WHOIS信息查询…

有哪些地图采集软件可以采集商家数据导出功能?

1.国内商家采集 寅甲地图数据采集软件 寅甲地图数据采集软件一款多关键词多城市同时采集百度地图、360地图、高德地图、搜狗地图、腾讯地图、图吧地图、天地图商家、公司、店铺的手机、座机、地址、坐标等数据信息的软件。 2.国外商家采集 寅甲谷歌地图数据采集软件 专为做…

叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取

引言 多种卫星遥感数据反演叶面积指数(LAI)产品是地理遥感生态网推出的生态环境类数据产品之一。产品包括2000-2009年逐8天数据,值域是-100-689之间,数据类型为32bit整型。该产品经过遥感数据获取、计算归一化植被指数、解译植被类…

完成商品SPU管理页面

文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目,使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包,然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…

【超详细】固态硬盘新盘验货检测教程

观前声明: 本文使用的固态硬盘为作者自费购买,同时也带有作者一定的主观意见,无任何软件和硬件的推广。 作者本人也正处于学习阶段,本文若有错误或有待改进的地方,欢迎评论区友善讨论~ 一、产品外包装信息检查 PS&…

Golang | Leetcode Golang题解之第109题有序链表转换二叉搜索树

题目: 题解: var globalHead *ListNodefunc sortedListToBST(head *ListNode) *TreeNode {globalHead headlength : getLength(head)return buildTree(0, length - 1) }func getLength(head *ListNode) int {ret : 0for ; head ! nil; head head.Next…

Java_多线程

有了多线程,我们就可以让程序同时做多件事情 作用: 提高效率 应用场景: 只要想让多个事情同时运行就需要用到多线程 比如:软件中的耗时操作、所有的聊天软件、所有的服务器... 并发和并行 并发:在同一时刻&#xff0…

AI是否可统计人类理性和感性的非线性?

一、背景 从控制理论的角度来看,“人类理性和感性的非线性”可以类比为动态系统中非线性元件的行为特性。在控制理论中,非线性意味着系统的输出不再严格与其输入成比例,也就是说,同样的输入条件下可能会导致不同的结果&#xff0…

为什么defineComponent组件名字和文件名字不能一样

今天在开发新组件时,在使用defineComponent定义组件时,把name写成了文件名的首字母大写法导致项目一直报错。找了很久才知道是名字的问题。 defineComponent组件名字和文件名字不能一样 在某些情况下,将组件的名称与文件名相同可能会导致一些…

当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!

一、写在开头 依稀记得多年以前的一场面试中,面试官从Java并发编程问到了锁,从锁问到了原子性,从原子性问到了Atomic类库(对着JUC包进行了刨根问底),从Atomic问到了CAS算法,紧接着又有追问到了…

【c语言】函数递归

在C语言中,函数递归是一种函数调用自身的技术。递归函数通常用于解决可以分解为更小、类似子问题的问题。递归函数有两个基本部分: 基本情况(Base Case):这是递归的终止条件,即函数停止递归并返回值的条件…

Mysql with 用法

什么是 with 语句 WITH 子句是 MySQL 中的一种 SQL 结构,又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下,允许开发人员临时创建一个内存中的结果集,然后对其进行操作。 with 语句用法 语法格式 WITH cte_name (…

JVM-调优之-高cpu线程问题排查

这里主要是对jstack命令的使用; 程序在运行过程中卡主,前端无法访问,一看服务器CPU占用达到200到300%多。 排查思路 1)找出占用高的进程 2)找出占用高的线程 3)找出具体的代码 分析步骤: …

C++里的vector详细讲解

在C的标准模板库(STL)中,vector是一个非常有用的动态数组容器。它允许我们存储可变大小的同类型元素序列,并且能够动态地增长和缩小。由于其灵活性和易用性,vector在C编程中得到了广泛的应用。 一、vector的基本操作 …

Java异常处理:最佳实践与常见模式

在Java编程中,异常处理是保证程序健壁性和稳定性的重要方面。良好的异常处理不仅可以帮助程序在面对错误情况时恢复到正常状态,还可以提供错误诊断的信息,辅助开发者快速定位问题。本文将探讨Java中的异常处理机制,包括异常的分类…

esp32 Micropython 长按按键动作一次代码

1. 长按按键,松手后动作 from machine import Pin import timeEnter_key Pin(15, Pin.IN, Pin.PULL_UP) Enter_key_flag 0 Enter_key_flag_temp 0while True:if Enter_key.value() 0:time.sleep_ms(10)while Enter_key.value() 0:Enter_key_flag_temp not En…

System.Collections.Generic 中的接口和类型区分

System.Collections.Generic 命名空间包含了许多与泛型集合相关的接口和类。这些接口定义了一组通用的集合行为&#xff0c;而具体的实现&#xff08;如 List、Dictionary<TKey, TValue> 等&#xff09;则遵循这些接口&#xff0c;从而提供具体的集合功能。以下是 System…

前后端开发入门全攻略:零基础学起

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、前后端开发概览 二、后端开发基础&#xff1a;Flask框架入门 代码案例&#xff1a;Hel…

vue3之使用图片实现类似于 el-radio 的单选框功能,并且可实现选中和取消选中

背景 我们在工作中常用的一般都是使用类似于 element-plus 中的 el-radio 或者是 el-checkbox 来实现单选或者多选 若有一天我们遇到了一个新的业务需求,需要使用 图片 来实现类似于 el-radio 的功能,并且要求实现第一次点击时处于选中状态,当我们再次点击时处于非选中状态…

谈恋爱没经验?那就来刷谈恋爱经验宝宝吧

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…