本文摘自php中文网,作者藏色散人,侵删。
下面由Golang教程栏目给大家介绍Golang实现简单的API网关的方法 ,希望对需要的朋友有所帮助!

在最近的一个项目中,采用了微服务架构-go-kit进行后端的开发。在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,因此我们需要设计一个API 网关(API Gataway),其实网上已经有较多现成的实现框架,但是本项目的需求是比较简单的,因此将使用Golang自行实现。
实现
API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
用于实现API网关的技术有很多,大致分为这么几类:
- 通用反向代理:
Nginx、Haproxy、…… - 网络编程框架:
Netty、Servlet、…… - API网关框架:
Spring Cloud Gateway、Zuul、Zuul2、……
API网关最基本的功能就是反向代理。其实现方式有很多,本文将基于标准库net/http/httputil包中的ReverseProxy类型来实现实现一个简单的反向代理。反向代理的实现主要涉及到func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy和type ReverseProxy。
1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
NewSingleHostReverseProxy返回一个新的ReverseProxy,将URLs请求路由到targe的指定的scheme, host, base path。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
ReverseProxy类型有两个重要的属性,分别是Director和ModifyResponse,这两个属性都是函数类型,在接收到客户端请求时,ServeHTTP函数首先调用Director函数对接受到的请求体进行修改,例如修改请求的目标地址、请求头等;然后使用修改后的请求体发起新的请求,接收到响应后,调用ModifyResponse函数对响应进行修改,最后将修改后的响应体拷贝并响应给客户端,这样就实现了反向代理的整个流程。
相关阅读 >>
go-carbon 1.3.3 版本发布,新增获取星座方法和判断是否是某个星座方法
聊聊dubbo-go-proxy的zookeeperregistryload
手撸golang 基本数据结构与算法 图的搜索 深度优先/广度优先
手撸golang 仿spring ioc/aop 之11 增强2
手撸golang 基本数据结构与算法 网页排名/pagerank,随机游走
更多相关阅读请进入《golang》频道 >>
Go语言101
一个与时俱进的Go编程知识库。