快速掌握Go语言正/反向代理

 更新时间:2022年11月08日 08:25:37   作者:博客猿马甲哥  
这篇文章主要介绍了快速掌握Go语言正/反向代理的相关资料,需要的朋友可以参考下

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

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

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

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

对于proxy.com的请求,都被透明无感代理到A.com

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/http/httputil"
)

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)
	}
}

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

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)
	}
}

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

使用该服务作为代理程序,将可以出站访问任何地址。

使用时,针对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指令演示(-x 后接代理地址)

curl -x 127.0.0.1:8080 www.baidu.com

GO快闪#

本文总结了go语言正反向代理的姿势。

到此这篇关于快速掌握Go语言正/反向代理的文章就介绍到这了,更多相关Go语言正/反向代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoLang channel关闭状态相关操作详解

    GoLang channel关闭状态相关操作详解

    Channel 和 goroutine 的结合是 Go 并发编程的大杀器。而 Channel 的实际应用也经常让人眼前一亮,通过与 select,cancel,timer 等结合,它能实现各种各样的功能。接下来,我们就要介绍GoLang channel关闭状态相关操作
    2022-10-10
  • 浅析go中Ticker,Timer和Tick的用法与区别

    浅析go中Ticker,Timer和Tick的用法与区别

    在go面试的时候,面试官经常会问time包的Ticker,Timer以及Tick的区别,一般在超时控制的时候用的比较多,今天就跟随小编一起来详细学一下这几个的区别吧
    2023-10-10
  • GoLang中sql.Exec()报错解决办法

    GoLang中sql.Exec()报错解决办法

    这篇文章主要给大家介绍了关于GoLang中sql.Exec()报错的解决办法,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • Go语言接口的嵌套的具体使用

    Go语言接口的嵌套的具体使用

    在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通过嵌套创造出新的接口,本文主要介绍了Go语言接口的嵌套的具体使用,感兴趣的可以了解一下
    2023-04-04
  • Go高级特性之并发处理http详解

    Go高级特性之并发处理http详解

    Golang 作为一种高效的编程语言,提供了多种方法来实现并发发送 HTTP 请求,本文将深入探讨 Golang 中并发发送 HTTP 请求的最佳技术和实践,希望对大家有所帮助
    2024-02-02
  • 用gin开发的golang项目三种开发模式方式

    用gin开发的golang项目三种开发模式方式

    这篇文章主要介绍了用gin开发的golang项目三种开发模式方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Golang文件读写操作详情

    Golang文件读写操作详情

    这篇文章主要介绍了Golang文件读写操作详情,文件是数据源(保存数据的地方)的一种,文件最主要的作用就是保存数据,文件在程序中是以流的形式来操作的,更多详细内容需要的朋友可以参考一下
    2022-07-07
  • 详解Go如何基于现有的context创建新的context

    详解Go如何基于现有的context创建新的context

    在 Golang 中,context 包提供了创建和管理上下文的功能,那么在GO语言中如何基于现有的context创建新的context,下面小编就来和大家详细聊聊
    2024-01-01
  • golang实现页面静态化操作的示例代码

    golang实现页面静态化操作的示例代码

    这篇文章主要介绍了golang实现页面静态化操作的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Go语言学习笔记之文件读写操作详解

    Go语言学习笔记之文件读写操作详解

    这篇文章主要为大家详细介绍了Go语言对文件进行读写操作的方法,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-05-05

最新评论