别再找错方向了!热门中间件选型指南

1. 什么是 Web 开发中间件

中间件(Middleware)是介于系统的不同组件之间,用于对不同组件进行衔接的软件。在 Web 开发中,中间件位于 Web 服务器和后台应用程序之间,用于对 HTTP 请求进行额外的处理。

中间件的定义:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。

中间件的作用:

(1) 屏蔽系统底层操作的复杂性。

(2) 提供核心服务,比如说线程管理、通信服务等。

(3) 对语义信息的解释,以实现互操作性。

(4) 实现复用和开放性,从而简化系统的设计。

在 Web 开发中,常见的中间件包括:应用服务器、Web 服务器、数据库连接池、事务处理监控器、数据访问框架、对象访问中间件等。这些中间件实现了请求分发、负载均衡、身份认证、参数校验、日志记录、异常处理等功能。

Web 开发使用中间件的意义:

(1) 增强服务器可扩展性。通过在中间件上进行水平扩展,可以轻松增加系统处理能力。

(2) 减少重复工作。中间件封装了通用功能,开发者可以重用这些功能。

(3) 提高开发效率。使用成熟的中间件可以省去很多从零开始开发的工作。

(4) 关注业务创新。将常见功能交给中间件处理,开发者可以更专注业务需求。

   

2. Go 语言的常见 Web 中间件

Go 语言作为目前比较流行的服务端编程语言,在 Web 中间件领域也是应用广泛。常见的 Go 语言 Web 中间件包括:

(1) 路由中间件

路由中间件用于接收 HTTP 请求,根据请求方法和路径调用相应的处理函数。

1) gorilla/mux

gorilla/mux 是 Go 语言常用的 HTTP 请求路由库。主要功能有:

  • 定义路由

  • 根据请求方法和路径提取参数

  • 路径前缀

  • 中间件

使用示例:

import (    "github.com/gorilla/mux")
func main() {
    router := mux.NewRouter()
    router.HandleFunc("/products", GetProducts).Methods("GET")
    router.HandleFunc("/products/{key}", GetProduct).Methods("GET")
    log.Fatal(http.ListenAndServe(":8080", router))}

2) Chi

Chi 是 Go 语言中另一个流行的 HTTP 路由库。主要功能:

  • 支持正则表达式路由

  • 中间件和内联中间件

  • 路由分组

  • 简洁的 API

使用示例:

import (    "github.com/go-chi/chi"    "net/http")
func main() {    r := chi.NewRouter()    r.Get("/", func(w http.ResponseWriter, r *http.Request) {        w.Write([]byte("welcome"))    })
    http.ListenAndServe(":3000", r)}

(2) 身份认证中间件

身份认证中间件用于实现用户登录状态的管理、权限的校验等功能。

1) oauth2

oauth2 实现了 OAuth 2.0 规范,可以实现访问控制。

2) jwt-go

jwt-go 是一个实现 JWT 编码解码的库。可以用它生成和解析 JWT 令牌,常用作用户认证。

使用示例:

import (    "github.com/dgrijalva/jwt-go"    "time")
var myKey = []byte("mySecretKey")
func GenerateJWT() (string, error) {  token := jwt.New(jwt.SigningMethodHS256)  claims := token.Claims.(jwt.MapClaims)
  claims["authorized"] = true  claims["user"] = "Elliot Forbes"  claims["exp"] = time.Now().Add(time.Hour * 1).Unix()
  tokenString, err := token.SignedString(myKey)
  if err != nil {    return "", err  }
  return tokenString, nil}
func ParseJWT(cookie string) (string, error) {    token, err := jwt.Parse(cookie, func(token *jwt.Token) (interface{}, error) {      return myKey, nil  })
  if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {    username := claims["user"].(string)     return username, nil  } else {    return "", err  }
}

(3) 日志中间件

日志中间件实现了自动记录请求日志、错误日志等功能。

1) logrus

logrus 是一个灵活易用的日志库,提供各种级别的日志。

2) zap

zap 同样是一个日志库,它通过预定义有意义的日志级别、高性能输出、灵活的配置来简化日志操作。

(4) 错误处理中间件

错误处理中间件通过捕获全局错误,生成日志,返回友好提示来优化异常处理。

1) pkg/errors

pkg/errors 可以包裹错误并记录堆栈轨迹,用于跟踪 error。

使用示例:​​​​​​​

import (    "github.com/pkg/errors")
func queryDatabase() error {
    row, err := db.Query("SELECT * FROM table")
    if err != nil {        return errors.Wrap(err, "Database query failed")    }
    // Working with result set   return nil}

(5) 数据 ORM 中间件

ORM (Object Relational Mapping)用于实现数据和对象之间的转换。

1) GORM

GORM 是一个 Go 语言的 ORM 库。它内置了常见数据库的操作支持。

2) XORM

XORM 是一个简单而强大的 Go 语言 ORM 库,支持 MySQL、PostgreSQL、SQLite3 等主流数据库。

   

3. 使用 Go 实现一个中间件

实现一个简单的 HTTP 日志记录中间件。该中间件可以打印每一个 HTTP 请求信息。

(1) 需求分析

记录 HTTP 请求日志非常常见,相关数据包括:

  • 请求时间

  • 请求方法(GET/POST 等)

  • 请求路径

  • 请求参数

  • 响应时间

  • 响应状态码

(2) 功能设计

HTTP 日志中间件作为一个独立函数,接收 HTTP handler 作为参数。在函数内部,通过闭包的方式扩展 handler,在请求前后打印日志,然后调用 handler。

(3) 接口实现​​​​​​​

// HTTP 请求日志中间件func Logger(inner http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        start := time.Now()
        log.Printf(            "Request Started\nMethod: %s\nPath: %s\n",            r.Method, r.URL.Path,        )
        inner.ServeHTTP(w, r)
        log.Printf(            "Request Completed\nMethod: %s\nPath: %s\nTime: %v\n",            r.Method, r.URL.Path, time.Since(start),        )    })}

注册中间件:​​​​​​​

mux := http.NewServeMux()
mux.HandleFunc("/", handler)
http.ListenAndServe(":8000", Logger(mux))

   

4. Go 语言中间件的优劣势分析

(1) 优势

  • 性能高:Go 语言编译成机器码运行,拥有和 C/C++同样的高性能。

  • 资源占用少:Go 语言的并发模型天生高效,微服务编写更高效,资源占用较低。

  • 简单快速:语法简单,无需额外的框架,可快速上手;由于是编译型语言,运行效率高。

(2) 劣势

  • 依赖管理复杂:Go 语言内置的依赖管理不够完善,需要使用第三方工具 verdor 等。

  • 框架不够成熟:Go 语言框架发展时间不长,很多功能还需自行开发封装。

  • 分布式困难:分布式系统开发相对复杂,需要开发者具备高超的技巧。

如何克服 Go 语言的劣势?

依赖管理可采用 dep、mod 等工具,编写 import configs 文件来管理。

框架生态可以借鉴 Java Spring、.NET Core 的理念进行改进。增强框架内核,丰富模块包。

分布式系统可进行增强,提供内置的服务治理、负载均衡等机制,也可以与第三方中间件进行对接。

   

5、总结

中间件在今天的分布式架构中发挥着重要作用,Go 语言作为云原生时代的首选语言,在中间件的应用上也具备自己的特色。

Go 语言生态中的各种优秀 Web 中间件为构建高性能服务提供了支持。同时程序员也可以参考现有中间件的设计,利用 Go 语言构建自定义的中间件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中,我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题!!! 一、题目讲解 一组非负整数,包…

【面试经典 150 | 图】被围绕的区域

文章目录 写在前面Tag题目来源解题思路方法一:深搜方法二:广搜 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic,副本数设置为3,分区数设置为2: bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

ROS1快速入门学习笔记 - 07话题消息的定义与使用

目录 一、话题模型 二、自定义话题消息 1. 在功能包下创建msg目录用于存储话题文件 2. 在package.xml文件中添加功能包依赖; 3. 在CMakeLists.txt增加编译选项; 4. 完成编译 5. 配置CMakeLists.txt中的编译规则(增加发布者和订阅者&am…

卫浴品牌商家做展示预约小程序的作用是什么

卫浴品牌类别多、普通/智能、场景化等,无论企业还是经销商市场门店都比较饱满,虽然市场需求度高,但同样需要商家不断拓宽销售渠道和挖掘客户价值,破圈增长。 线上多平台发展尤为重要,而小程序作为连接点,对…

ctf web-部分

** web基础知识 ** *一.反序列化 在PHP中,反序列化通常是指将序列化后的字节转换回原始的PHP对象或数据结构的过程。PHP中的序列化和反序列化通过serialize()和unserialize()函数实现。 1.序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近些年&…

ArcGIS小技巧—模型构建器快速提取河网

上篇文章介绍的基于DEM的河网提取,需要使用多个工具,整体操作比较繁琐,在日常工作中,使用Arcgis提供的模型构建器可以帮助我们将多个工具整合在一起,在面对大量数据批量处理时,可以大大提高工作效率 利用模…

【题解】—— LeetCode一周小结17

【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结16 22.组合总和 Ⅳ 题目链接:377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数…

基于SSM的“个性化电子相册”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“个性化电子相册”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 个性化电子相册功能结构图 系统后台界面 会员信息管理界面 相…

在网站源码后台增加响应式布局

一本教材上的网站源码,后台在手机上查看还是按照电脑的页面样式,不方便查看和发布新内容。教材上讲了响应式布局。对于页面结构简单的网站,可以利用响应式,使页面自动适用各种屏幕的分辨率。 今天在一个网站源码的后台使用了响应…

经典案例:学习 Java 异常处理的最佳实践

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

OpenCV如何模板匹配

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现背投 下一篇 :OpenCV在图像中寻找轮廓 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程,但是小白重新去看了一下,发现写的内容太多,怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲:在同一台机器上安装Windows10双系统的教程。 注意哦!这里的Wi…

用来传输文件的协议-FTP

一.FTP协议--文件传输协议 1.了解FTP协议 (1)FTP服务是用来传输文件的协议 FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一,用于互联网上的控制文件的双向传输。是传输文件到Linu…

C++:string 类

在C中定义一个 std::string 字符串可以采用以下几种方式: 1.使用字符串字面量初始化: std::string str "Hello, world!"; 2.使用构造函数初始化: std::string szStringB("Hello wolven"); 3.使用重复字符初始化&am…

51单片机入门(一)

1. 51单片机的基础介绍 2. RAM和ROM的区别 总体而言,RAM和ROM在计算机系统中起着不同的角色,RAM用于临时存储运行时数据,而ROM用于存储永久性的固件和系统程序。 3. 为什么叫51单片机 因为51系列单片机都是使用Intel 8031指令系统的单片机…

【链表——数据结构】

文章目录 1.单链表1.定义2.基本操作2.1.不带头结点2.2后插2.3前插2.4删除2.5按位查找2.6按值查找2.7求单链表长度2.8 建表 2.双链表1.初始化2.插入(后插)3.删除(后删)4.遍历 3.循环链表1.循环单链表2.循环双链表3.代码问题 4.静态链表1.简述基本操作的实现1.初始化3.删除某个结…

前端---Bootstrap---的下载和使用

目录 Bootstrap的下载 网页链接: 下载步骤: Bootstrap的使用 引用步骤: Bootstrap常用: Bootstrap-栅格系统 Bootstrap-组件 Bootstrap 是由 Twiter 公司开发维护的前端 U框架,它提供了大量编写好的 CSS 样式,允许开发者结合一定 HTML结构及JavaS…
最新文章