最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

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

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

$worker = new Worker('tcp:0.0.0.0:8080');
// 監(jiān)聽一個端口
$worker->count = 2;
// 設(shè)置多進程
$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)建了一個TCP監(jiān)聽器,在連接時進行IP過濾,并將流量轉(zhuǎn)發(fā)到目標(biāo)端口。

Go實現(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 對非白名單IP的連接,應(yīng)該進行一些處理,比如記錄日志
			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í)行版本(同時處理流向)
	go copyAndCount(target, conn, &inTraffic)
	copyAndCount(conn, target, &outTraffic) // Block until this copy is done
}

代碼流程

  • 啟動一個 TCP 監(jiān)聽器,等待客戶端的連接請求。

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

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

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

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

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

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

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

主要功能如下:

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

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

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

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

后續(xù)完善

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

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

總結(jié)

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

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

相關(guān)文章

  • go語言檢測文件是否存在的方法

    go語言檢測文件是否存在的方法

    這篇文章主要介紹了go語言檢測文件是否存在的方法,實例分析了Go語言文件操作的相關(guān)技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言copy()實現(xiàn)切片復(fù)制

    Go語言copy()實現(xiàn)切片復(fù)制

    本文主要介紹了Go語言copy()實現(xiàn)切片復(fù)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go計時器的示例代碼

    Go計時器的示例代碼

    定時器是任何編程語言的重要工具,它允許開發(fā)人員在特定時間間隔安排任務(wù)或執(zhí)行代碼,本文主要介紹了Go計時器的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Go第三方庫faker假數(shù)據(jù)生成器

    Go第三方庫faker假數(shù)據(jù)生成器

    bxcodec/faker是Go語言中用于生成假數(shù)據(jù)的第三方庫,適用于開發(fā)過程中填充數(shù)據(jù)庫和創(chuàng)建測試數(shù)據(jù),它支持生成各種類型的假數(shù)據(jù),本文就來介紹一下如何使用,感興趣的可以了解一下
    2026-02-02
  • Go語言學(xué)習(xí)之接口類型(interface)詳解

    Go語言學(xué)習(xí)之接口類型(interface)詳解

    接口是用來定義行為的類型,定義的行為不由接口直接實現(xiàn),而由通過方法由定義的類型實現(xiàn),本文就來和大家詳細(xì)講講Go語言中接口的使用吧
    2023-03-03
  • Golang?基礎(chǔ)面試題集錦

    Golang?基礎(chǔ)面試題集錦

    這篇文章主要為大家介紹了Golang?基礎(chǔ)面試題集錦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 用Go語言標(biāo)準(zhǔn)庫實現(xiàn)Web服務(wù)之項目介紹

    用Go語言標(biāo)準(zhǔn)庫實現(xiàn)Web服務(wù)之項目介紹

    從本節(jié)開始將從后端到前端一步一步實現(xiàn)一個Go語言Web服務(wù),后端除了MySQL驅(qū)動,全部使用Go語言標(biāo)準(zhǔn)庫來實現(xiàn)一個小型項目,本篇將簡單的介紹一下項目開發(fā)要準(zhǔn)備的流程,感興趣的同學(xué)可以閱讀一下
    2023-05-05
  • 在Go網(wǎng)絡(luò)請求中配置代理的方法詳解

    在Go網(wǎng)絡(luò)請求中配置代理的方法詳解

    這篇文章主要給大家介紹了如何在Go網(wǎng)絡(luò)請求中配置代理的方法,文章通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • Go語言指針使用分析與講解

    Go語言指針使用分析與講解

    這篇文章主要介紹了Go語言指針使用分析與講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • golang 后臺進程的啟動和停止操作

    golang 后臺進程的啟動和停止操作

    這篇文章主要介紹了golang 后臺進程的啟動和停止操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

阿拉善右旗| 陵水| 巫山县| 乐东| 柞水县| 西藏| 图们市| 大同市| 图们市| 广水市| 运城市| 永年县| 湛江市| 满洲里市| 凉城县| 罗甸县| 七台河市| 时尚| 鄂伦春自治旗| 扶沟县| 鄂托克旗| 五指山市| 灌云县| 边坝县| 清水县| 徐水县| 盘山县| 三门县| 甘肃省| 临西县| 砚山县| 乌鲁木齐县| 水城县| 连州市| 定兴县| 安吉县| 江阴市| 江华| 惠水县| 黄平县| 武义县|