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

Python016

go语言实现一个简单的简单网关,第1张

网关=反向代理+负载均衡+各种策略,技术实现也有多种多样,有基于 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 计数;一种是链式调用。

具体代码

前段时间使用docker搭建了一个wiki的网站,用于记录日常学习中的笔记,用了一段时间,功能很强大,但是编辑器不太熟悉,网站使用java开发的,功能很全面,插件多的时候就感觉越来越臃肿。曾经有段时间就不想使用它了,最近偶然发现一个静态网站的生成工具hugo,可以将markdown直接生成网站,部署到站点上作为自己的知识库或者博客,hugo是使用go语言开发的,使用起来非常方便,生成的网站可直接部署在Nginx、IIS等中间件上面供其他人访问,hugo还有很多漂亮的主题,大家可以选择自己喜欢的进行使用,下面介绍下 我安装使用hugo的经历和方法。

1)使用brew install命令安装

我的电脑是mac的,所以最方便的是直接用brew install hugo命令安装最为方便:

执行安装完成后执行hugo version 命令查看版本,确保安装成功

2)官网下载二进制包:解压后将二进制文件加入环境变量的方式安装。大家可以根据自己的操作系统,下载适合的安装包。

3)也可以下载源码 编译 运行,由于我本地的go版本是1.17的,而hugo的最新代码的最低要求是1.18,暂时还不想升级,所以源码编译的方式这里就不过多介绍,感兴趣的可以下载源码编译试试。

进入要创建网站的目录,执行一下命令

这样名称为test-blog的网站就建好了 ,

下载一个主题 可以在 官网上找到各种各样的主题

将主体添加至配置文件

打开content/posts目录下的index.md 文件进行编辑,页面的配置项说明参见官网

执行下面命令

成功以后就可以访问http://localhost:1313/就可以访问网站了。

执行命令hugo -D 即可生成一个public的文件夹,其下面的内容即为静态网站的所有文件

这里使用nginx的docker镜像 进行部署,执行以下命令:

执行成功后就能通过http:localhost访问到静态网站了。

这个工具还有很多需要研究的地方,这里只是将简单的使用方法记录了一下,以后怎样使用才能使网站更加的方便,快捷、美观,还要花时间研究。有兴趣的小伙伴可以私信我一块研究。