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

news/2024/7/5 20:29:54 标签: nginx, proxy, http, golang, go

https://img-blog.csdnimg.cn/img_convert/9b4a2ce70f6baf2a67757e3f0b4a9be1.gif" alt="9b4a2ce70f6baf2a67757e3f0b4a9be1.gif" />

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

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

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

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

https://img-blog.csdnimg.cn/img_convert/8de21dd94ebeeab91b86c2ef776e8ae3.png" alt="8de21dd94ebeeab91b86c2ef776e8ae3.png" />

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

https://img-blog.csdnimg.cn/img_convert/9948eed52a47ebe9cbe979fcc0c73c7f.png" alt="9948eed52a47ebe9cbe979fcc0c73c7f.png" />代理程序预置upstream, 将节点对proxy.com的请求,转发给upstream service。
go">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, 简单记录一下。

https://img-blog.csdnimg.cn/img_convert/99480839a2d3b2deaf20ff313e9febc9.png" alt="99480839a2d3b2deaf20ff313e9febc9.png" /> name.com集群 通过prxoy.com 代理程序 请求外部节点。
go">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

go">//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

https://img-blog.csdnimg.cn/img_convert/7921fbfa74e4d8cba9512e54c44b07b8.png" alt="7921fbfa74e4d8cba9512e54c44b07b8.png" />

引用链接

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

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


http://www.niftyadmin.cn/n/1864411.html

相关文章

你认识的C# foreach语法糖,真的是全部吗?

本文的知识点其实由golang知名的for循环陷阱发散而来, 对应到我的主力语言C#, 其实牵涉到闭包、foreach。为了便于理解,我重新组织了语言,以倒叙结构行文。 先给大家提炼出一个C#题:观察for、foreach闭包的差异 左边输…

项目管理概述

项目管理 项目是为创造独特的产品、服务或成果而进行的临时性工作。 临时性:指的是有开始、结束时间,而不是指时间很短 独特性:项目中某些可交付成果或者活动中的某些元素是重复的,但项目仍然具有独特性 项目管理让项目目标落地&…

项目运行环境

项目运行环境 影响项目的两大因素 事业环境因素 客观存在,对项目可能有帮助,也可能有阻碍,项目经理只能去应对,而不能回避 所有公司外部的环境,包括法律法规、市场环境、政府行业标准等公司内组织文化、员工能力、基础…

组织体系

组织体系 ​ 单个组织内多种因素交织影响创造出的一个独特系统,会对在该系统内运行的项目造成影响,其因素包括: 管理要素治理框架组织结构类型 运行项目的过程中需要应对治理框架和组织结构带来的制约 项目管理办公室(PMO&#…

项目经理角色

项目经理角色 项目经理的作用 对团队成果负责,需要从整体角度看待团队产品,以便进行规划、协调、完成 项目经理和职能经理 项目经理:由执行组织委派,领导团队实现项目目标的个人。通常项目经理会花大量时间进行沟通协调&#xf…

空跑任务,满足CPU使用率合规要求

语言:golang 适用系统:linux 用途:空跑任务,满足CPU使用率合规要求 使用方法:go run cpulimit.go 0.35 // 百分之35%使用率 package mainimport ("fmt""io/ioutil"// "math""os&q…

获取CPU使用率(golang)

语言:golang 适用系统:linux 用途:获取CPU使用率 原文地址:https://stackoverflow.com/questions/11356330/how-to-get-cpu-usage package mainimport ("fmt""io/ioutil""strconv""strings&q…

跑任务满足内存使用率要求

语言:golang 适用系统:linux 用途:空跑任务,满足内存使用率合规要求 使用方法:go run mem.go 0.35 // 百分之35%使用率 package mainimport ("fmt""io""io/ioutil""log"&quo…