以下是我自己翻譯的nff-go的github:https://github.com/intel-go/nff-go的readme文件,自己mark用,翻譯錯的還請指出。
Go語言的網絡功能框架(前YANFF)
好消息:我們現在支持AF_XDP,也(幾乎)支持直接從Linux中獲取包了。所以你不必再寫3種不同的應用來處理來自不同類型PMD驅動的數據包了。你只需要用NFF-Go編寫所有內容,它就可以動態的使用你想要的任何東西。如果有需要,請聯繫 我們。
它是什麼
NFF-Go是一組用於創建和部署本地雲網絡功能(NFs)的庫。它在不犧牲性能的情況下簡化了網絡功能的創建。
- 比DPDK更高級的抽象。使用DPDK作爲性能的快速I/O引擎
- Go語言:安全,生產力,性能,併發
- 網絡功能是應用程序而不是虛擬機
- 內置調度程序,基於輸入流量進行自動縮放處理。上下都有。
優勢:
- 輕鬆利用英特爾硬件功能:多核、AES-NI、CAT、QAT、DPDK
- 代碼行減少10倍
- 不需要成爲網絡編程專家也能開發高性能網絡函數
- 與C/DPDK有相似的性能
- 無須擔心彈性----自動完成
- 利用本地雲部署:持續交付、微服務、容器
感覺不同
基於ACL的簡單防火牆
func main() {
// Initialize NFF-GO library to use 8 cores max.
config := flow.Config{
CPUCoresNumber: 8,
}
flow.CheckFatal(flow.SystemInit(&config))
// Get filtering rules from access control file.
L3Rules, err := packet.GetL3ACLFromORIG("Firewall.conf")
flow.CheckFatal(err)
// Receive packets from zero port. Receive queue will be added automatically.
inputFlow, err := flow.SetReceiver(uint8(0))
flow.CheckFatal(err)
// Separate packet flow based on ACL.
rejectFlow, err := flow.SetSeparator(inputFlow, L3Separator, nil)
flow.CheckFatal(err)
// Drop rejected packets.
flow.CheckFatal(flow.SetStopper(rejectFlow))
// Send accepted packets to first port. Send queue will be added automatically.
flow.CheckFatal(flow.SetSender(inputFlow, uint8(1)))
// Begin to process packets.
flow.CheckFatal(flow.SystemStart())
}
// User defined function for separating packets
func L3Separator(currentPacket *packet.Packet, context flow.UserContext) bool {
currentPacket.ParseL4()
// Return whether packet is accepted or not. Based on ACL rules.
return currentPacket.L3ACLPermit(L3Rules)
}
NFF-Go是一個開源的BSD許可項目,主要在Linux用戶區運行。社區提供的最新補丁和增強功能在develop分支中提供。主分支提供了適當的tag下的最新的穩定發佈版本。
獲取NFF-GO
從版本0.7.0開始,NFF-Go使用go.mod獲取依賴,因此Go的版本需要1.11或更高。使用以下命令獲取NFF-Go分支:
git clone --recurse-submodules http://github.com/intel-go/nff-go
設置構建和運行環境
DPDK
NFF-GO 使用 DPDK,所以你必須設置你的系統來構建和運行DPDK。查看 System Requirements in the DPDK Getting Started Guide for Linux以獲取更多信息。
NFF-Go默認用現成的的Mellanox卡支持構建的,你需要安裝MLX網絡驅動所需的額外依賴。在Ubuntu上它們叫做libmnl-dev
和libibverbs-dev
。更多詳細信息,請參閱MLX驅動MLX4和 MLX5各自的頁面。如果這些依賴不夠,並且也不需要Mellanox驅動,你可以設置變量NFF_GO_NO_MLX_DRIVERS
爲一些非空值來禁用MLX驅動程序編譯。
pktgen也需要額外的依賴,特別是當你運行在ReadHat或者CentOS Linux發行版上時。詳細信息請查看這個文件。RedHat和CentOS的LUA部分在它的結尾。
在使用make
命令構建DPDK驅動後,你必須註冊網卡才能使用DPDK驅動,加載必要的內核模塊,並將卡綁定到模塊上。查看中的 Compiling the DPDK Target from Source 和 How to get
best performance with NICs on Intel
platforms以獲取更多信息。內核模塊是DPDK用戶模式驅動程序所必需的,它是內置的,但沒有安裝到內核目錄中。您可以使用模塊文件的完整路徑加載它:
nff-go/test/dpdk/dpdk/x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
Go
使用Go語言的1.11.4或者更高版本。使用以下命令查看Go的版本:
go version
構建 NFF-GO
當Go編譯器第一次運行的時候,它會下載go.mod文件中列出的全部依賴包。這個操作不能並行執行,否則Go的包緩存會損壞。因此在第一次運行make
之前首先要運行go mod download
。另一個選擇是在第一次運行的時候使用單進程make -j1
,但可能會很慢。
cd nff-go
go mod download # do it once before first build
make -j8
在Debug模式下構建 NFF-GO
make debug -j8
運行 NFF-GO
文檔
在線API文檔在 godoc.org site中查看. API的用法在我們的 維基頁面上解釋了.
測試
在頂層目錄中調用make
構建測試框架和示例。NFF-GO分佈式測試打包在Docker容器映像中。在一些包裏也有單節點的單元測試,你可以使用如下命令運行:
make testing
Docker 鏡像
要在本地默認目標上創建docker映像(在/var/run/docker.sock中的默認UNIX socket或其他的已經在DOCKER_HOST變量中定義了),使用make images
命令。
要在分佈式測試中部署並使用Docker鏡像,使用make deploy
命令。這個命令需要2個環境變量:
- NFF_GO_HOSTS=“hostname1 hostname2 … hostnameN”* - 部署測試Docker鏡像所需的全部主機名的列表
- DOCKER_PORT=2375* - 連接在NFF_GO_HOSTS變量中聲明的主機上運行的Docker daemon的端口號
要刪除默認Docker目標中生成的圖像,使用make clean-images
命令。
運行測試
在Docker鏡像上部署完全部測試主機後,你可以運行分佈式網絡測試了。這個測試框架在test/main目錄下,可以接受一個帶有測試規範的JSON文件。在同一目錄中有性能和穩定性測試的預定義配置。要運行這些測試,把hostname1 和 hostname2改成JSON文件裏的NFF_GO_HOSTS列表裏的主機。
清理
要清理全部已生成的二進制文件,使用make clean
命令。要刪除全部在NFF_GO_HOSTS裏列出的已部署的鏡像,使用make cleanall
命令。
Contributing
If you want to contribute to NFF-Go, check our Contributing guide. We also recommend checking the bugs with ‘help-wanted’ or ‘easyfix’ in our list of open issues; these bugs can be solved without an extensive knowledge of NFF-Go. We would love to help you start contributing.
You can reach the NFF-Go development team via our mailing list.