Thêm Outline SDK vào mã Go

Hướng dẫn này sẽ hướng dẫn bạn quy trình thiết lập môi trường Go và sử dụng Outline SDK trong mã Go.

Chúng ta sẽ xây dựng một ứng dụng mẫu có tên là splitfetch để giới thiệu một tính năng của SDK. Ứng dụng này tìm nạp một trang web, nhưng thay vì gửi yêu cầu trong một gói mạng, ứng dụng này sử dụng Outline SDK để phân tách luồng TCP ban đầu thành hai gói riêng biệt. Điều này có thể giúp bỏ qua một số hình thức can thiệp vào mạng.

Bạn có thể chạy ứng dụng trên Linux, Mac và Windows. Để tích hợp với ứng dụng di động, hãy xem bài viết Thêm Outline SDK vào ứng dụng di động.

Bước 1: Thiết lập Go

Trước tiên, bạn cần có ngôn ngữ lập trình Go. Nếu đã cài đặt Go (phiên bản 1.21 trở lên), bạn có thể chuyển sang bước tiếp theo.

Để cài đặt, bạn có thể làm theo hướng dẫn chính thức; hoặc nếu bạn sử dụng trình quản lý gói:

Linux

Làm theo các bước trong Go Wiki: Ubuntu.

Mac

brew install go

Windows

winget install --id=GoLang.Go  -e

Sau khi cài đặt Go, bạn có thể xác minh rằng Go đã được cài đặt đúng cách bằng cách chạy lệnh sau trong một thiết bị đầu cuối:

go version

Bước 2: Tạo ứng dụng splitfetch

Hãy thiết lập dự án splitfetch. Trước tiên, hãy tạo thư mục dự án và khởi chạy mô-đun Go:

mkdir splitfetch
cd splitfetch
go mod init example/splitfetch

Tiếp theo, hãy lấy Outline SDK và tạo tệp main.go:

go get github.com/Jigsaw-Code/outline-sdk@latest
touch main.go

Bước 3: Sử dụng Outline SDK trong ứng dụng

Mở tệp main.go trong trình soạn thảo mã mà bạn yêu thích rồi dán mã sau vào tệp đó. Mã này chứa tất cả logic cho ứng dụng splitfetch.

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "net"
    "net/http"
    "os"

    "github.com/Jigsaw-Code/outline-sdk/transport"
    "github.com/Jigsaw-Code/outline-sdk/transport/split"
)

// The number of bytes to send in the first packet.
const splitPacketSize = 3

func main() {
    // 1. Get the URL from the command-line arguments.
    if len(os.Args) < 2 {
        log.Fatalf("Usage: %s <URL>", os.Args[0])
    }
    url := os.Args[1]

    // 2. Create a split dialer from the Outline SDK.
    // This dialer wraps a standard TCP dialer to add the splitting behavior.
    dialer, err := split.NewStreamDialer(&transport.TCPDialer{}, split.NewFixedSplitIterator(splitPacketSize))
    if err != nil {
        log.Fatalf("Failed to create split dialer: %v", err)
    }

    // 3. Configure an HTTP client to use our custom split dialer for TCP connections.
    httpClient := &http.Client{
        Transport: &http.Transport{
            DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
                return dialer.DialStream(ctx, addr)
            },
        },
    }

    // 4. Use the custom client to make the HTTP GET request.
    resp, err := httpClient.Get(url)
    if err != nil {
        log.Fatalf("HTTP request failed: %v", err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed to read response body: %v", err)
    }
    fmt.Println(string(body))
}

Sau khi lưu mã, hãy chạy lệnh sau trong dòng lệnh để đảm bảo tệp go.mod được cập nhật chính xác.

go mod tidy

Bước 4: Chạy ứng dụng

Giờ đây, bạn có thể chạy ứng dụng splitfetch bằng mã đã có.

Trong thư mục splitfetch, hãy chạy lệnh sau trong dòng lệnh, truyền URL làm đối số:

go run . https://getoutline.org

Thao tác này sẽ biên dịch và chạy ứng dụng, hiển thị nội dung HTML của trang web.

Nếu bạn muốn tạo và phân phối một chương trình độc lập mà bạn có thể chạy mà không cần go, hãy sử dụng lệnh go build:

Linux và Mac

go build -o splitfetch .

Windows

go build -o splitfetch.exe .

Sau khi bản dựng hoàn tất, bạn có thể phân phối và chạy ứng dụng. Ví dụ:

./splitfetch https://getoutline.org