欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用GO實(shí)現(xiàn)IP門禁優(yōu)化網(wǎng)絡(luò)流量管理

 更新時(shí)間:2023年12月25日 10:31:13   作者:南丞?PFinalClub  
這篇文章主要為大家介紹了用GO實(shí)現(xiàn)IP門禁優(yōu)化網(wǎng)絡(luò)流量管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

最近在處理數(shù)據(jù)時(shí),發(fā)現(xiàn)線上某個(gè)接口的訪問量異常高。在初次設(shè)計(jì)時(shí),并未對(duì)流量和訪問量進(jìn)行限制,因此對(duì)具體情況并不太清楚。為了解決這一問題,搞了一個(gè)簡(jiǎn)單的IP過濾腳本,并進(jìn)行了記錄。

之前搞IP過濾的時(shí)候, 使用了 PHP 的 workerman 來搞的 其實(shí)思路差不多一樣:

$worker = new Worker('tcp:0.0.0.0:8080');
// 監(jiān)聽一個(gè)端口
$worker->count = 2;
// 設(shè)置多進(jìn)程
$worker->onConnect = function (TcpConnection $connection) {
    $list_ip = []; // ip 白名單 
    $remote_ip = $connection->getRemoteIp();
    // 攔截IP
    if (!in_array($remote_ip, $list_ip)) {
        $connection->close();
    }
    // 放行連接,連接內(nèi)部目標(biāo)端口
    $to_connection = new AsyncTcpConnection('tcp:127.0.0.1:80');
    // 互相轉(zhuǎn)發(fā)流量
    $connection->pipe($to_connection);
    $to_connection->pipe($connection);
    $to_connection->connect();
}

以上PHP代碼創(chuàng)建了一個(gè)TCP監(jiān)聽器,在連接時(shí)進(jìn)行IP過濾,并將流量轉(zhuǎn)發(fā)到目標(biāo)端口。

Go實(shí)現(xiàn)客戶端

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("Listen() failed, err: ", err)
		return
	}
	defer func(listener net.Listener) {
		_ = listener.Close()
	}(listener)
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Accept() failed, err: ", err)
			continue
		}
		ip, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
		if !isIPAllowed(ip) {
			fmt.Println("IP: ", ip, " is not allowed")
			_ = conn.Close()
			// TODO 對(duì)非白名單IP的連接,應(yīng)該進(jìn)行一些處理,比如記錄日志
			continue
		}
		fmt.Println("IP: ", ip, " is allowed")
		go handleConn(conn)  // 轉(zhuǎn)發(fā)到固定的目標(biāo)端口
	}
}
func handleConn(conn net.Conn) {
	defer func(conn net.Conn) {
		_ = conn.Close()
	}(conn)
	target, err := net.Dial("tcp", "127.0.0.1:80")
	if err != nil {
		fmt.Println("Dial() failed, err: ", err)
		return
	}
	defer func(target net.Conn) {
		_ = target.Close()
	}(target)
	// 使用 copyAndCount 的并發(fā)執(zhí)行版本(同時(shí)處理流向)
	go copyAndCount(target, conn, &inTraffic)
	copyAndCount(conn, target, &outTraffic) // Block until this copy is done
}

代碼流程

  • 啟動(dòng)一個(gè) TCP 監(jiān)聽器,等待客戶端的連接請(qǐng)求。

  • 當(dāng)收到連接請(qǐng)求時(shí),檢查連接的 IP 是否在白名單中。

  • 如果 IP 在白名單中,則開始處理連接,將連接的流量從輸入流量和輸出流量分別計(jì)入相應(yīng)的計(jì)數(shù)器中。

  • 處理連接時(shí),使用 copyAndCount 函數(shù)并發(fā)地處理兩個(gè)方向的流量。

  • 處理完成后,關(guān)閉連接。

  • 循環(huán)等待新的連接請(qǐng)求。

Go 實(shí)現(xiàn)管理面板

剛開始準(zhǔn)備寫這個(gè)IP過濾的時(shí)候,沒有考慮太多,直接就寫了,后來發(fā)現(xiàn),這個(gè)東西,其實(shí)可以寫一個(gè)管理面板,這樣就方便管理了. 然后就 使用 Gin 來整了個(gè)面板

主要功能如下:

  • IP 白名單管理, 并且提供了一個(gè)接口, 給上面的 轉(zhuǎn)發(fā)客戶端來用

  • 攔截統(tǒng)計(jì),提供了一個(gè)接口, 給上面的客戶端來上報(bào)攔截日志

  • 流量統(tǒng)計(jì), 包括輸入流量和輸出流量

  • 流量限制, 包括輸入流量限制和輸出流量限制

后續(xù)完善

  • 目前這個(gè)腳本只支持了一個(gè)端口的轉(zhuǎn)發(fā),沒有實(shí)現(xiàn)多個(gè)端口的同時(shí)綁定轉(zhuǎn)發(fā)

  • 目前這個(gè)腳本沒有實(shí)現(xiàn)對(duì)客戶端的流量進(jìn)行限制, 也沒有實(shí)現(xiàn)對(duì)服務(wù)器的流量進(jìn)行限制

總結(jié)

最后的最后,我也不知道我這玩意兒該叫啥, 因?yàn)? 其實(shí), 它就是一個(gè)轉(zhuǎn)發(fā)代理, 只不過, 它對(duì)流量進(jìn)行了限制, 并且對(duì)流量進(jìn)行了統(tǒng)計(jì), 并且提供了管理面板.

以上就是用GO實(shí)現(xiàn)IP門禁優(yōu)化網(wǎng)絡(luò)流量管理的詳細(xì)內(nèi)容,更多關(guān)于GO IP門禁的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)

    Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言多人聊天室項(xiàng)目實(shí)戰(zhàn),實(shí)現(xiàn)單撩或多撩等多種功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 深入理解Go設(shè)計(jì)模式之代理模式

    深入理解Go設(shè)計(jì)模式之代理模式

    代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,?其中代理控制著對(duì)于原對(duì)象的訪問,?并允許在將請(qǐng)求提交給原對(duì)象的前后進(jìn)行一些處理,從而增強(qiáng)原對(duì)象的邏輯處理,這篇文章主要來學(xué)習(xí)一下代理模式的構(gòu)成和用法,需要的朋友可以參考下
    2023-05-05
  • golang中三種線程安全的MAP小結(jié)

    golang中三種線程安全的MAP小結(jié)

    在Go語(yǔ)言中,Map是并發(fā)不安全的,本文主要介紹了golang中三種線程安全的MAP小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Go語(yǔ)言的反射reflect使用大全

    Go語(yǔ)言的反射reflect使用大全

    Go語(yǔ)言中reflect包提供了運(yùn)行時(shí)反射的功能,本文主要介紹了Go語(yǔ)言的反射reflect使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 深入了解Go語(yǔ)言中context的用法

    深入了解Go語(yǔ)言中context的用法

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中context用法的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • Golang 處理浮點(diǎn)數(shù)遇到的精度問題(使用decimal)

    Golang 處理浮點(diǎn)數(shù)遇到的精度問題(使用decimal)

    本文主要介紹了Golang 處理浮點(diǎn)數(shù)遇到的精度問題,不使用decimal會(huì)出大問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用Golang開發(fā)一個(gè)簡(jiǎn)易版shell

    使用Golang開發(fā)一個(gè)簡(jiǎn)易版shell

    這篇文章主要為大家詳細(xì)介紹了如何使用Golang開發(fā)一個(gè)簡(jiǎn)易版shell,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 類型轉(zhuǎn)換工具包strconv包的用法

    Go 語(yǔ)言的?strconv?包提供了用于基本數(shù)據(jù)類型之間轉(zhuǎn)換的函數(shù),本文主要介紹了Go 類型轉(zhuǎn)換工具包strconv包的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 解決golang中container/list包中的坑

    解決golang中container/list包中的坑

    這篇文章主要介紹了解決golang中container/list包中的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go語(yǔ)言中你不知道的Interface詳解

    Go語(yǔ)言中你不知道的Interface詳解

    對(duì)于go語(yǔ)言來說,設(shè)計(jì)最精妙的應(yīng)該是interface了,直白點(diǎn)說interface是一組method的組合。下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言中你不知道的Interface的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-02-02

最新評(píng)論