go语言实现一个简单的简单网关

author author     2023-04-14     449

关键词:

参考技术A 网关=反向代理+负载均衡+各种策略,技术实现也有多种多样,有基于 nginx 使用 lua 的实现,比如 openresty、kong;也有基于 zuul 的通用网关;还有就是 golang 的网关,比如 tyk。

这篇文章主要是讲如何基于 golang 实现一个简单的网关。

转自: troy.wang/docs/golang/posts/golang-gateway/

整理:go语言钟文文档:www.topgoer.cn

启动两个后端 web 服务(代码)

这里使用命令行工具进行测试

具体代码

直接使用基础库 httputil 提供的NewSingleHostReverseProxy即可,返回的reverseProxy对象实现了serveHttp方法,因此可以直接作为 handler。

具体代码

director中定义回调函数,入参为*http.Request,决定如何构造向后端的请求,比如 host 是否向后传递,是否进行 url 重写,对于 header 的处理,后端 target 的选择等,都可以在这里完成。

director在这里具体做了:

modifyResponse中定义回调函数,入参为*http.Response,用于修改响应的信息,比如响应的 Body,响应的 Header 等信息。

最终依旧是返回一个ReverseProxy,然后将这个对象作为 handler 传入即可。

参考 2.2 中的NewSingleHostReverseProxy,只需要实现一个类似的、支持多 targets 的方法即可,具体实现见后面。

作为一个网关服务,在上面 2.3 的基础上,需要支持必要的负载均衡策略,比如:

随便 random 一个整数作为索引,然后取对应的地址即可,实现比较简单。

具体代码

使用curIndex进行累加计数,一旦超过 rss 数组的长度,则重置。

具体代码

轮询带权重,如果使用计数递减的方式,如果权重是5,1,1那么后端 rs 依次为a,a,a,a,a,b,c,a,a,a,a…,其中 a 后端会瞬间压力过大;参考 nginx 内部的加权轮询,或者应该称之为平滑加权轮询,思路是:

后端真实节点包含三个权重:

操作步骤:

具体代码

一致性 hash 算法,主要是用于分布式 cache 热点/命中问题;这里用于基于某 key 的 hash 值,路由到固定后端,但是只能是基本满足流量绑定,一旦后端目标节点故障,会自动平移到环上最近的那么个节点。

实现:

具体代码

每一种不同的负载均衡算法,只需要实现添加以及获取的接口即可。

然后使用工厂方法,根据传入的参数,决定使用哪种负载均衡策略。

具体代码

作为网关,中间件必不可少,这类包括请求响应的模式,一般称作洋葱模式,每一层都是中间件,一层层进去,然后一层层出来。

中间件的实现一般有两种,一种是使用数组,然后配合 index 计数;一种是链式调用。

具体代码

用go语言实现一个简单的聊天机器人(代码片段)

一、介绍目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识。软件环境:Go1.9,Goland2018.1.5。 二、回顾Go语言基本构成要素:标识符、关键字、字面量、分隔符、操作符。它们可以组成各种表达式... 查看详情

go语言实现一个简单的登录注册web小程序

最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣。根据《goweb编程》中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜:    这个例子使用到了beego... 查看详情

go语言实现简单的一个静态web服务器

packagemainimport("net/http")funcmain(){http.Handle("/",http.FileServer(http.Dir("./www/")))http.ListenAndServe(":8123",nil)}在生成的EXE文件所在目录中创建www子目录,在该目录中放web静态文件。以上是静态文件使用http.FileServer,那么动态文件则用http. 查看详情

go语言入门很简单:go实现凯撒密码

在文本上使用凯撒密码来移动字符。调用​​strings.Map​​方法。1凯撒密码加密凯撒密码(英语:Caesarcipher),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。凯撒密码是一种替换加密技术,明文... 查看详情

go语言实现简单的聊天室(代码片段)

通常聊天室的架构分为服务器端和客户端:服务器端:接受来自于客户端的连接请求并建立连接;所有客户端的连接会放进连接池中,用于广播消息;客户端:连接服务器;向服务器发送消息;接收服务器的广播消息;注意事项... 查看详情

go语言实现简单的学生管理系统(代码片段)

介绍总结go语言的基础学习,通过两种方式实现简单的学生信息管理系统方法一packagemainimport( "fmt" "os")//定义所有学生信息varstudentDatamap[int]*student//定义学生typestudentstruct idint64 namestring scoreint//初始化分配内存空间f... 查看详情

贝壳go实现的多云对接存储网关建设(代码片段)

1、功能介绍贝壳存储服务通过S3协议向业务方提供文件、图片、音视频的存储及下载。S3协议由AWS推出,在对象存储行业已经成为事实标准。腾讯云对象存储COS、阿里云对象存储OSS均兼容S3协议。S3协议可以简单理解为一套webapi接... 查看详情

go语言入门篇-grpc基于golang&java简单实现

一.什么是RPC1.简介:RPC:RemoteProcedureCall,远程过程调用。简单来说就是两个进程之间的数据交互。正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用。和本地过程调用相对的就... 查看详情

go语言入门很简单:实现vigenere加密算法

Vigenere加密算法该密码由意大利密码学家GiovanBattistaBellaso于1553年发明,但几个世纪以来一直归功于16世纪的法国密码学家BlaisedeVigenère,他在1586年设计了类似的密码。VigenereCipher是一种加密字母文本的方法。它使用一种简单的多... 查看详情

go语言入门很简单:什么是上下文

GoContextGolang的Context应用开发常用的并发控制工具,用于在程序中的API层或进程之间共享请求范围的数据、取消信号以及超时或截止日期。Context又被称为上下文,与WaitGroup不同的是,context对于派生goroutine有更强的控制力,可以管... 查看详情

go语言实战grpc实现一个简单微服务(代码片段)

文章目录写在前面1.安装1.1grpc1.2proto1.3protobuf2.编写代码2.1初始化项目2.2编写proto2.3编写服务端2.4实现客户端3.演示写在前面这一次我们用gRPC实现获取用户的信息1.安装1.1grpcgrpc的安装直接goget即可gogetgoogle.golang.org/grpc1.2proto下载proto... 查看详情

go语言建立一个最简单的服务端点

handlers/handlers.gopackagehandlersimport( "encoding/json" "net/http")funcRoutes(){ http.HandleFunc("/sendjson",SendJSON)}funcSendJSON(rwhttp.ResponseWriter,r*http.Request){ u:=struct{ Namestring Em 查看详情

编程实践用go语言实现一个sqldsl(代码片段)

文章目录用go语言实现一个SQLDSL一、编写SQLDSL二、使用工厂模式构造SQLDSL三、使用反射实现SQLDSL四、小结用go语言实现一个SQLDSLGo语言是一种广泛使用的编程语言,特别是在Web开发领域。它的优势是高效、简单、易于编写、易于理... 查看详情

go语言:一个简单的goroutine同步(synchronize)

我们可以使用channels在多个goroutine之间进行同步(synchronize),下面直接看例子。例子1,使用chan等待一个goroutine结束。packagemainimport"fmt"import"time"//在这定义一个函数,以goroutine的方式运行。使用done这个chan来通知//其... 查看详情

go实现简单(命令行)工具:sftp,文檔压解,rds备份,rds备份下载(代码片段)

...密码解压(zip)4.window下调用阿里雲RDSapi查询备份并下载5.GO语言命令行工具技巧首先,写这篇博文的一个出发点是:我无法在window的cmd命令行下实现日期的加减(還有其他問題),当然這不是没有实现的方法,而是实现起来很难维护... 查看详情

go系列教程——第28篇:多态(代码片段)

Go通过接口来实现多态。我们已经讨论过,在Go语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部方法,那它就实现了该接口。现在我们来看看,利用接口,Go是如何实现多态的。使用接口实现多态一个类型... 查看详情

go简单入门

GO的环境配置?GOPATHGOROOT都是干嘛用的?配置环境跟java对比有点奇怪https://blog.csdn.net/weixin_40563757/article/details/115476327语言特性协程?建立一个协程很简单加一个go关键字就可以package 查看详情

grpc介绍和简单实现

gRPC介绍  gRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架。gRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多个服务,对于移动设备更加友好。本节将讲述gRPC的简单用法。gRPC的技术栈:   最底层为TCP或UnixSocket... 查看详情