Golang实现API网关的方法是什么

  介绍

Golang实现API网关的方法是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

在最近的一个项目中,采用了微服务架构,<代码> go-kit 进行后端的开发。在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,因此我们需要设计一个<强> API网关(API Gataway) 强,其实网上已经有较多现成的实现框架,但是本项目的需求是比较简单的,因此将使用<代码> Golang>

实现

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证,监控,负载均衡,缓存,请求分片与管理,静态响应处理。

用于实现API网关的技术有很多,大致分为这么几类:

    <李>通用反向代理:<代码> Nginx ,<代码> Haproxy> <李>网络编程框架:<代码>网状的,<代码> Servlet代码> <李> API网关框架:<代码>春云网关,<代码> Zuul ,<代码> Zuul2>

API网关最基本的功能就是反向代理。其实现方式有很多,本文将基于标准库>net/http/httputil <代码> ReverseProxy> func NewSingleHostReverseProxy(目标* url.URL) * ReverseProxy 和<代码>类型ReverseProxy>

 func NewSingleHostReverseProxy(目标* url.URL) * ReverseProxy 
//NewSingleHostReverseProxy返回一个新的ReverseProxy路线//url的计划,目标主机,提供的基本路径。//目标# 39;年代如果路径“/base"和传入的请求是“/dir"//目标请求将/基地/dir。//NewSingleHostReverseProxy不重写主机头。//重写主机头,使用ReverseProxy直接与一个定制的董事//政策。func NewSingleHostReverseProxy(目标* url.URL) * ReverseProxy {   targetQuery:=target.RawQuery   导演:=func(要求* http.Request) {   req.URL。计划=target.Scheme   req.URL。主机=target.Host   req.URL。=singleJoiningSlash(目标路径。路径,req.URL.Path)   如果targetQuery==?“| | req.URL。RawQuery==?“{   req.URL。RawQuery=targetQuery + req.URL。其他rawquery} {   req.URL。RawQuery=targetQuery +“,“+ req.URL。rawquery}   如果_,好的:=req.Header (“User-Agent");!好{//显式禁用用户代理所以变# 39;不设置为默认值   req.Header.Set (“User-Agent",““)   }   }   返回,ReverseProxy{导演:导演}}

<代码> NewSingleHostReverseProxy 返回一个新的<代码> ReverseProxy> url> 圆盾> ,<代码>主机,<代码>基本路径

//ReverseProxy HTTP处理程序,需要传入请求和//发送到另一台服务器,代理回//客户机的响应。ReverseProxy struct类型{//董事必须修改的功能//发送请求到一个新的请求//使用交通工具。然后复制其响应//回原来的客户修改的。//董事不得访问提供的请求//返回之后。
  导演func (* http.Request)
  
  运输http.RoundTripper
  
  FlushInterval time.Duration
  
  ErrorLog * log.Logger
  
  缓冲池缓冲池//ModifyResponse是一个可选功能,修改//响应从后端。它被称为后端//返回响应,与任何HTTP状态代码。//如果后端是遥不可及的,可选的ErrorHandler//没有任何调用ModifyResponse。////如果ModifyResponse返回一个错误,ErrorHandler//错误值。如果ErrorHandler nil,违约//实现使用。
  ModifyResponse func (* http.Response)错误
  
  ErrorHandler func (http。ResponseWriter, * http。请求,错误)}

<代码> ReverseProxy> 和<代码> ModifyResponse> ServeHTTP 函数首先调用<代码> 主任函数对接受到的请求体进行修改,例如修改请求的目标地址,请求头等,然后使用修改后的请求体发起新的请求,接收到响应后,调用<代码> ModifyResponse 函数对响应进行修改,最后将修改后的响应体拷贝并响应给客户端,这样就实现了反向代理的整个流程。

Golang实现API网关的方法是什么