FastGateway 一个可以用于代替Nginx的网关
在我本人研究Yarp的时候经常用于公司项目的业务网关代理,这时候就个大佬问我是否可以实现动态加载HTTPS证书?那时候我说不太可能实现,然而在某一天我看到
微软使用Yarp代替了Nginx吞吐量提升了百分之八十!

这个时候我就萌生了自己使用yarp造一个Gateway的项目,应为我本身也经常使用nginx作为网关,但是nginx的使用总得写conf,然后重启我的nginx,并且还需要配置证书重启,我就在想是否可以实现界面管理,并且完全动态管理?
然后我们的FastGateway项目就诞生了,下面我们介绍一下我们的FastGateway的项目简单案例
FastGateway
我们的FastGateway提供了俩个容器,一个是代理服务,一个是前端服务
一般简单使用就可以直接使用我们的docker-compose构建,非常简单
FastGateway支持哪些功能?
登录授权
- 通过环境变量简单设置账号密码
动态路由管理
- 完全界面操作并且实时更新
动态配置证书管理
- 完全界面操作并且实时更新
dashboard监控
- 提供了简单数据监控,后续还会提供更完善的功能
静态文件服务代理
- 使用中间件简单实现了静态文件代理(Yarp默认是不支持静态文件代理)
穿透隧道功能
- 只需要提供一个公网的Gateway服务端,然后下载我们的Gateway的客户端就可以将客户端的局域网的服务映射到外网(只支持http协议的服务)
出入口流量监控
- 基于Kestrel实现出入口流量监控,还提供当前服务器的所有网卡的出入流量实时监控
技术栈
后端技术栈
- Asp.Net 8.0 用于提供基础服务
- Yarp 用于提供反向代理服务
- FreeSql 用于提供数据库服务
- JWT 用于提供登录授权服务
- MiniApis 提供WebApi服务
前端技术栈
- reset-css 用于重置浏览器默认样式
- axios 用于发送http请求
- semi 用于提供基础组件
- react-router-dom 用于路由管理
镜像执行指令
mkdir data
docker run -d --restart always --name gateway-api -p 8000:8000 -p 8200:8080 -p 8300:8081 -v $(pwd)/data:/data/ registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-api
docker run -d --restart always --privileged --name gateway-web -p 10800:80 -e api_url=http://localhost:8000 registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-web
Docker-Compose文件
services:
gateway-api:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-api
restart: always
container_name: gateway-api
environment:
USER: root
PASS: Aa010426.
ports:
- 8000:8000 # 提供给web端调用的管理接口
- 8200:8080 # Http代理端口
- 8300:8081 # Https代理端口
volumes:
- ./data:/data/ # 请注意手动创建data目录,负责在Linux下可能出现权限问题导致无法写入
gateway-web:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-web
restart: always
build:
context: ../web
dockerfile: Dockerfile
privileged: true
environment:
api_url: http://localhost:8000
ports:
- 10800:80
如果并没有提供账号密码则默认
账号:root
密码:Aa010426.
替换默认的https证书
由于需要使用https,为了方便系统默认提供了一个pfx证书,如果你需要提供的话可以按照以下操作进行,如果是Docker执行的话证书的目录则是 /app/certificates/gateway.pfx
services:
gateway-api:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-api
restart: always
container_name: gateway-api
ports:
- 8000:8000 # 提供给web端调用的管理接口
- 8200:8080 # Http代理端口
- 8300:8081 # Https代理端口
environment:
USER: root
PASS: Aa010426.
HTTPS_PASSWORD: dd666666
HTTPS_FILE: gateway.pfx
ports:
- 8200:8080
volumes:
- ./data:/data/
- ./app/certificates:/app/certificates
gateway-web:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-web
restart: always
container_name: gateway-web
privileged: true
environment:
api_url: http://localhost:8000
ports:
- 10800:80
参考上面的docker-compose文件,我们提供了俩个环境变量HTTPS_PASSWORD,HTTPS_FILE,
HTTPS_FILE:
- 在系统中已经指定了容器的
/app/certificates目录,你只想要挂在目录中的文件名即可
HTTPS_PASSWORD:
- Pfx证书的密码,如果修改了证书请填写证书的密码。
/app/certificates:
- 这个是系统证书默认存放目录,如果映射了目录则需要提供自己的证书。
使用隧道
services:
gateway-api:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-api
restart: always
container_name: gateway-api
environment:
USER: root
PASS: Aa010426.
HTTPS_PASSWORD: dd666666
TUNNEL_PASSWORD: dd666666
HTTPS_FILE: gateway.pfx
ports:
- 8000:8000 # 提供给web端调用的管理接口
- 8200:8080 # Http代理端口
- 8300:8081 # Https代理端口
volumes:
- ./data:/data/
- ./app/certificates:/app/certificates
gateway-web:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-web
restart: always
container_name: gateway-web
privileged: true
environment:
api_url: http://localhost:8000
ports:
- 10800:80
增加TUNNEL_PASSWORD环境变量,默认为空不设置密码
下载隧道客户端 https://gitee.com/hejiale010426/Gateway/releases 然后解压压缩包,打开appsettings.json文件修改Tunnel节点的Url,如果Gateway使用了TUNNEL_PASSWORD,那么你的URL应该是https://localhost:8081/api/gateway/connect-h2?host=backend1.app&password=dd666666, host是在集群中的集群端点的域名,这个域名就是定义到我们的隧道客户端的host的这个参数,请保证值的唯一性,当绑定集群的路由匹配成功以后则会访问图片定义的端点,如果并没有存在节点那么他会直接代理。

出入流量监控
使用环境变量控制是否启用流量监控,使用环境变量ENABLE_FLOW_MONITORING设置我们是否启用流量监控,如果为空则默认启动流量监控,然后可以打开我们的控制面板查看流量监控的数据。
services:
gateway-api:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-api
restart: always
container_name: gateway-api
environment:
USER: root
PASS: Aa010426.
HTTPS_PASSWORD: dd666666
HTTPS_FILE: gateway.pfx
ENABLE_FLOW_MONITORING: true
ports:
- 8000:8000 # 提供给web端调用的管理接口
- 8200:8080 # Http代理端口
- 8300:8081 # Https代理端口
volumes:
- ./data:/data/
- ./app/certificates:/app/certificates
gateway-web:
image: registry.cn-shenzhen.aliyuncs.com/tokengo/gateway-web
restart: always
container_name: gateway-web
privileged: true
environment:
api_url: http://localhost:8000
ports:
- 10800:80
效果图



FastGateway 一个可以用于代替Nginx的网关的更多相关文章
- 用Docker搭建一个支持https的nginx代理服务
用Docker搭建一个支持https的nginx代理服务 说明:本文所提的服务只是作者平常测试使用,可能含有未知bug或不成熟的解决方案,仅供参考,请不要用于正式环境,当然,使用过程中有任何问题欢迎提 ...
- 此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求
FirFox打开80以外的端口,会弹出以下提示: “此地址使用了一个通常用于网络浏览以外的端口.出于安全原因,Firefox 取消了该请求.”. 解决方法如下: 在Firefox地址栏输入about: ...
- 火狐----此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。
FirFox打开80以外的端口,会弹出以下提示: “此地址使用了一个通常用于网络浏览以外的端口.出于安全原因,Firefox 取消了该请求.”.经网上搜索,解决方法如下: 在Firefox地址栏输入a ...
- 火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法
关于火狐浏览器访问本机IIS部署的网站弹出“此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求”这个错误(错误截图如下): 解决方法如下: 1.打开火狐浏览器, ...
- 此地址使用了一个通常用于网络浏览以外目的的端口。出于安全原因,Firefox 取消了该请求。
火狐无法访问本机IIS部署的网站,弹出:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求 的解决办法 关于火狐浏览器访问本机IIS部署的网站弹出"此 ...
- fastText一个库用于词表示的高效学习和句子分类
fastText fastText 是 Facebook 开发的一个用于高效学习单词呈现以及语句分类的开源库. 要求 fastText 使用 C++11 特性,因此需要一个对 C++11 支持良好的编 ...
- 树莓派变成一个Web服务器: nginx + php + sqlite
将树莓派变成一个Web服务器,通过访问网页,就可以控制树莓派,比如:查看摄像头\开灯等等. 一想到Linux Web服务器,我们首先想到的是,Apache + MySql + Php. 树莓派可以安装 ...
- 一个简单可参考的API网关架构设计
网关一词较早出现在网络设备里面,比如两个相互独立的局域网段之间通过路由器或者桥接设备进行通信, 这中间的路由或者桥接设备我们称之为网关. 相应的 API 网关将各系统对外暴露的服务聚合起来,所有要调用 ...
- linux搭建一个配置简单的nginx反向代理服务器 2个tomcat
1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...
- 记一个http-proxy-middleware 代理访问nginx映射的接口不通过的问题(connection close)
工作过程中遇见一个问题,使用Vue-cli 搭建了一个工程,由于跨域的问题 使用了自带的dev-server Express Server(A后台) http-proxy-middleware 去访问 ...
随机推荐
- SpringCloud学习 系列二、 简介
系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...
- v-html会导致xss攻击
- uni-app滚动加载下一页
https://www.bilibili.com/video/BV1BJ411W7pX?p=39
- zzuli 1908
***做的时候判断当前位置为.的上下左右是否为*,如果全是改位置就改为*,如果四周中有为.,再DFS一下,其实就相当于把判断化为更小的子问题*** #include<iostream> # ...
- Java中内存四区
这里简要说明这四个区域通常用于存储的变量类型: 栈区(Stack): 存放局部变量.方法参数.返回地址等. 变量的生命周期与其所在的方法(函数)的调用周期一致. 堆区(Heap): 主要用于动态分配内 ...
- IDEA中无法调出中文输入法?
参考链接:idea写代码时无法切换到中文输入
- [转帖]ESXi下查看CPU 频率
https://www.jianshu.com/p/8943a4223ed7 查看CPU的固定频率 [root@localhost:/bin] esxcli hardware cpu list|gr ...
- 让你轻松看懂defer和async
defer和async产生的原因 HTML 网页中,浏览器通过<script>标签加载 JavaScript 脚本. <!-- 页面内嵌的脚本 --> <script t ...
- 在web中,用户输入的文字过多 和页面排版一行显示不下 怎么办
在写管理系统中, 如果用户在input中,表单输入过多,应该如何去处理 常用的解决办法是: 1==>用户只能够输入一定范围内的字数 2==>超出几个字后(宽度)使用省略号显示. 3==&g ...
- ES6 Array.fiill()的用法
简单使用 // arr.fill(value, start, end) // value填充的值 // start填充的起始位置包含 // end填充的结束值,不包含,如果省略这个参数,表示从起始位置 ...