前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言正/反向代理的姿势

Go语言正/反向代理的姿势

作者头像
有态度的马甲
发布2022-12-21 14:00:12
4480
发布2022-12-21 14:00:12
举报
文章被收录于专栏:精益码农精益码农

先重温一下什么叫反向代理,正向代理。

鹅厂二面,nginx回忆录[1]

所谓正向,反向代理取决于代理的是出站请求,还是入站请求

正向代理:代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。 反向代理:代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近。


前几天利用golang实现反向代理程序[2],引出了Host请求头在反代中的关键作用。

代理程序预置upstream, 将节点对proxy.com的请求,转发给upstream service。

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
)
// 将对proxy.com/xxx/yyy的请求转发到 www.baidu.com/xxx/yyy
func ReverseProxyHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Println("receive a request from:", r.RemoteAddr, r.Header)

    target := "www.baidu.com"
    director := func(req *http.Request) {
        req.URL.Scheme = "https"
        req.URL.Host = target
        req.Host = target
    }
    proxy := &httputil.ReverseProxy{Director: director}
    proxy.ServeHTTP(w, r)
}

func main() {
    fmt.Printf("Starting server at port 8080\n")
    if err := http.ListenAndServe(":8080", http.HandlerFunc(ReverseProxyHandler)); err != nil {
        log.Fatal(err)
    }
}

以上访问localhost:8080, 在浏览器会显示www.baidu.com的内容。

--------------------------------------------------------

这几天刚好遇到了一个正向代理的case, 简单记录一下。

name.com集群 通过prxoy.com 代理程序 请求外部节点。

代码语言:javascript
复制
package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
)
// 集群请求外部节点,通过代理
func ProxyHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Printf("receive a request from {0}  {1}: \n", r.RemoteAddr, r.Header)
    if r.Host != "localhost:8080" {
        director := func(req *http.Request) {
            req.URL.Scheme = "http"
            req.URL.Host = r.Host
            req.Host = r.Host
        }
        proxy := &httputil.ReverseProxy{Director: director}
        proxy.ServeHTTP(w, r)
    } else {
        http.NotFound(w, r)
    }
}

func main() {
    if err := http.ListenAndServe(":8080", http.HandlerFunc(ProxyHandler)); err != nil {
        log.Fatal(err)
    }
}

其中要注意的就是,正向代理式要规避死循环代理。

使用该服务作为代理程序,将可以出站访问任何地址( curl -x 指令后面代理地址)。

使用时,针对httpclient 设置proxy。

代码语言:javascript
复制
//adding the proxy settings to the Transport object
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    //adding the Transport object to the http Client
    client := &http.Client{
        Transport: transport,
    }

下面使用curl指令快速验证: curl -x 127.0.0.1:8080 www.baidu.com

引用链接

[1] 鹅厂二面,nginx回忆录: https://www.cnblogs.com/JulianHuang/p/14504892.html [2] golang实现反向代理程序: https://www.cnblogs.com/JulianHuang/p/16639016.html

本文文字和制图均为原创,鄙人会不时更正认知、修正理解,鉴于公众号编辑次数受限,请不时关注左下角永久更新地址, 也欢迎斧正;如果对您有所帮助,一键三连,甚是欣慰。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用链接
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档