Nodejs 第七十三章(网关层)

news2024/11/19 10:27:02

什么是网关层(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.js
  proxy/
    index.js
  index.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.coloradmin.cn/o/1707684.html

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

相关文章

怎样打造一份个性化画册呢?我来教你

在这个数字化的时代,传统的照片已经不能满足我们对个性化回忆的需求。个性化画册,不仅能够承载我们的记忆,还能展现自我风格。今天,就让我来教你如何打造一份属于自己的个性化画册。 1.要制作电子杂志,首先需要选择一款适合自己的…

Debian12 安装留档@Virtual Box

在学蜜罐系统的时候,T-Pot 需要Debian,于是安装Debian12 下载安装光盘 先去中科大下载了12的安装光盘,然后在VirtualBox中创建一个新虚拟机,将安装光盘挂载上。 安装光盘下载地址:https://mirrors.ustc.edu.cn/debi…

隐藏服务器源IP怎么操作,看这一篇学会!

在当今的网络环境中,服务器作为信息和服务的中枢,常驻于公网之上,面临着各式各样的安全威胁,其中,分布式拒绝服务(DDoS)攻击尤为猖獗,它通过协调大量计算机同时向目标服务器发送请求…

看花眼,眼花缭乱的主食冻干到底应该怎么选?靠谱的主食冻干分享

随着科学养猫知识的普及,主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性,还能提供均衡的营养,有助于维护猫咪的口腔和消化系统健康。许多猫主人认识到了主食冻干喂养的诸多益处,计划尝试这种喂养方式&#…

缓存三问与缓存预热-如何预防缓存崩溃

一、缓存三剑客 (图片来源:什么是缓存雪崩、击穿、穿透? | 小林coding) 缓存穿透 (Cache Penetration) 又称"空缓存"指用户请求的数据在缓存和数据库中都不存在,导致每次请求都去查询数据库,给数据库带来巨大压力。解…

代码随想录——平衡二叉树(Leetcode110)

题目链接 后序遍历高度,高度判断是否平衡 前序遍历深度 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

短视频再度重逢:四川京之华锦信息技术公司

短视频再度重逢 在数字化时代的浪潮中,短视频以其独特的魅力迅速崛起,成为现代人生活中不可或缺的一部分。而当我们谈论起短视频,我们不仅仅是在谈论一种娱乐方式,更是在谈论一种情感的载体,一种回忆的媒介。今天&…

143.栈和队列:用队列实现栈(力扣)

题目描述 代码解决 class MyStack { public:queue<int> que; // 定义一个队列用于实现栈// 构造函数&#xff0c;初始化队列MyStack() {}// 向栈中推入元素 xvoid push(int x) {que.push(x); // 使用队列的 push 方法将元素 x 添加到队列尾部}// 从栈中弹出并返回栈顶元…

【edge浏览器】控制台报错信息隐藏-恢复

问题描述 解决方法&#xff1a;只需要清空筛选器

软件构造复习1

一、软件构造的多维度视图&#xff1a; 共有三个维度&#xff1a;1.按阶段划分&#xff1a;构造时/运行时视图&#xff0c;2.按动态性划分&#xff1a;时刻/阶段视图&#xff0c;3.按构造对象层次划分&#xff1a;代码/构件视图 具体可如图所示&#xff08;图片来自PPT&#…

Vue3实战笔记(36)—粒子特效完成炫酷的404

文章目录 前言404特效总结 前言 昨天介绍了一个粒子特效小例子&#xff0c;不够直观&#xff0c;下面直接实战在自己的项目中实现一个好玩滴。 404特效 更改之前创建好的404.vue: <template><div class"container"><vue-particles id"tspartic…

怎么做图片海报二维码?扫码查看图片内容

现在很多的宣传推广海报会放入二维码中&#xff0c;然后将二维码分享给用户后&#xff0c;通过扫码的方式来查看图片内容&#xff0c;从而获取自己需要的信息&#xff0c;经常在活动宣传、商品推广、旅游攻略等场景下使用。二维码可以提供更加便捷的内容获取方式&#xff0c;让…

Go源码--sync库(1)

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

llama_factory的使用

1.git clone llama_factory到本地 2.记得安环境&#xff0c;在clone后 3.多显卡要设置一下 4.数据文件放在data里面&#xff0c;仿照模板里的格式 5.进入llama_factory微调页面 python src/webui.py 6.llama_factory介绍&#xff1a;10分钟打造你个人专属的语言大模型&am…

「Element-UI表头添加带Icon的提示信息」

一、封装全局组件 &#x1f353; 注意&#xff1a;可以直接复制该文件 <!-- // 写一个PromptMessage的组件&#xff0c;并全局注册 --> <template><div class"tooltip"><el-tooltip effect"dark" placement"right">&l…

vue实现附件下载 获取到接口的图片,设置宽度100%样式

一、vue实现附件下载&#xff0c;使用a链接 <a class"btn flex_center" target"_blank" :href"localImgSrc(goodsDetail.attachment)" :download"localImgSrc(goodsDetail.attachment)" >立即下载 </a>二、 获取到接口…

js检验一个字符串是否是正确时间格式的工具方法

js检验一个字符串是否是正确时间格式的工具方法 (()> {/*** 检验字符串是否为时间格式* param {String} date 需要检验的时间格式* returns true 为时间格式&#xff0c;false 为非时间格式*/const isTimaFormat (date) > {if(!date) return false;try{const tempTime …

js之图片上传

话不多说&#xff0c;直接上干货&#xff0c;注释在代码里面 下面是效果图和代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

Llama模型家族训练奖励模型Reward Model技术及代码实战(三) 使用 TRL 训练奖励模型

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

监控员工电脑的软件有哪些,不得不说这几款电脑监控软件太好用了

监控员工电脑的软件在市场上种类繁多&#xff0c;以下是几款备受好评的电脑监控软件&#xff0c;它们各自具有独特的功能和优势&#xff0c;选择前必须了解一下才能做成正确决定。 1.安企神&#xff1a; 这款软件支持7天试用测试&#xff0c;获取测试版请移驾 ↓↓↓ 安企神…