Go语言正/反向代理的姿势
先重温一下什么叫反向代理,正向代理。
鹅厂二面,nginx回忆录[1]
所谓正向,反向代理取决于代理的是出站请求,还是入站请求。
正向代理:代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。 反向代理:代理的是入站请求,客户端认为代理程序就是服务器,客户端感知不到代理逻辑,架构上距离服务端更近。
前几天利用golang实现反向代理程序[2],引出了Host请求头在反代中的关键作用。
代理程序预置upstream, 将节点对proxy.com的请求,转发给upstream service。
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 代理程序 请求外部节点。
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。
//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
本文文字和制图均为原创,鄙人会不时更正认知、修正理解,鉴于公众号编辑次数受限,请不时关注左下角永久更新地址, 也欢迎斧正;如果对您有所帮助,一键三连,甚是欣慰。
相关文章
- linux命令总结dd命令详解
- 测试必会之 Linux 三剑客之 awk
- 测试必会之 Linux 三剑客之 grep
- linux文件句柄数
- Linux常用命令
- 浅谈Linux
- Git的简单的基本使用
- Android开发——导入github安卓项目源码
- 前端学习 linux —— 软件安装(Ubuntu)
- 前端学习 linux —— shell 编程
- 前端学习 linux —— 第一篇
- PS2022软件安装包+安装教程(mac+windows全版本都有,包括最新的2023)
- PS CC 2019软件安装教程(mac+windows全版本都有,包括最新的2023)
- 最新ps2021软件绿色版安装教程 附软件安装包(mac+windows全版本都有)
- 撤销git commit
- godot使用简介
- 嵌入式:Load/Store之单寄存器的存取指令
- 开源项目 Spartacus 的 git 提交流程规范
- 开源项目 Spartacus 的 git 分支使用规范
- C++中的引用处理