Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan gRPC untuk komunikasi rangkaian selamat di Golang

Menggunakan gRPC untuk komunikasi rangkaian selamat di Golang

WBOY
WBOYasal
2023-07-18 22:46:55916semak imbas

Menggunakan gRPC untuk komunikasi rangkaian selamat di Golang

Dalam beberapa tahun kebelakangan ini, dengan perkembangan pesat pengkomputeran awan, Internet of Things dan teknologi lain, komunikasi rangkaian menjadi semakin penting. Ini mendorong pembangun untuk mencari kaedah komunikasi yang cekap dan selamat. gRPC secara beransur-ansur menjadi popular sebagai rangka kerja RPC sumber terbuka berprestasi tinggi, tak segerak. Artikel ini akan memperkenalkan cara menggunakan gRPC untuk komunikasi rangkaian selamat di Golang dan melampirkan contoh kod yang berkaitan.

  1. Pasang gRPC dan Protobuf

Pertama, anda perlu memasang gRPC dan Protobuf secara tempatan. Ia boleh dipasang melalui arahan berikut:

$ go get -u github.com/golang/protobuf/protoc-gen-go
$ go get -u google.golang.org/grpc
  1. Tentukan antara muka perkhidmatan

Seterusnya, kita perlu menentukan perkhidmatan gRPC, yang memerlukan penggunaan Protobuf untuk menentukan format mesej dan antara muka perkhidmatan. Katakan kita ingin membuat perkhidmatan log masuk mudah, contoh ditunjukkan di bawah.

syntax = "proto3";

message LoginRequest {
  string username = 1;
  string password = 2;
}

message LoginResponse {
  bool success = 1;
  string token = 2;
}

service AuthService {
  rpc Login(LoginRequest) returns (LoginResponse);
}

Simpan kod di atas sebagai auth.proto. auth.proto

  1. 生成代码

通过以下命令将Protobuf编译成Golang代码:

$ protoc --go_out=plugins=grpc:. auth.proto

执行该命令后,会在当前目录下生成auth.pb.go文件。

  1. 实现服务

接下来,我们需要编写服务代码。首先导入相应的包:

package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials"
)

// ...

我们为了保证通信的安全性,使用了gRPC提供的credentials包。然后,我们需要实现AuthService服务接口:

type authService struct{}

func (a *authService) Login(ctx context.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) {
    // 处理登录请求
    // ...
    return &pb.LoginResponse{
        Success: true,
        Token:   "YOUR_AUTH_TOKEN",
    }, nil
}

在上述代码中,我们实现了Login方法用于处理登录请求,并返回一个成功的响应。

接着,我们需要创建gRPC服务器,并注册我们实现的服务:

func main() {
    lis, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }

    // 加载TLS证书
    creds, err := credentials.NewServerTLSFromFile("cert.pem", "key.pem")
    if err != nil {
        log.Fatalf("failed to load TLS credentials: %v", err)
    }

    // 创建gRPC服务器
    server := grpc.NewServer(grpc.Creds(creds))

    // 注册服务
    pb.RegisterAuthServiceServer(server, &authService{})

    log.Println("gRPC server is running at :8080")
    err = server.Serve(lis)
    if err != nil {
        log.Fatalf("failed to start gRPC server: %v", err)
    }
}

在上述代码中,我们首先加载了TLS证书,用于加密通信。然后,我们创建了一个gRPC服务器,并注册了我们实现的authService服务。

  1. 客户端调用

最后,我们需要编写一个客户端来调用我们的服务。首先,我们需要加载CA颁发的根证书:

func main() {
    // 加载根证书
    creds, err := credentials.NewClientTLSFromFile("ca.pem", "")
    if err != nil {
        log.Fatalf("failed to load CA root certificates: %v", err)
    }

    // 创建与服务器的连接
    conn, err := grpc.Dial("localhost:8080", grpc.WithTransportCredentials(creds))
    if err != nil {
        log.Fatalf("failed to dial server: %v", err)
    }
    defer conn.Close()

    client := pb.NewAuthServiceClient(conn)

    // 调用登录服务
    resp, err := client.Login(context.TODO(), &pb.LoginRequest{
        Username: "your_username",
        Password: "your_password",
    })
    if err != nil {
        log.Fatalf("failed to login: %v", err)
    }

    log.Printf("Login response: %v", resp)
}

在上述代码中,我们首先加载了CA根证书,用于与服务器建立安全的连接。然后,我们调用了AuthService服务的Login

    Jana kod

    Kompilasi Protobuf ke dalam kod Golang melalui arahan berikut:

    rrreee

    Selepas melaksanakan arahan ini, auth.pb.goakan dijana dalam arus direktori > Fail.

      🎜Melaksanakan perkhidmatan🎜🎜🎜Seterusnya, kita perlu menulis kod perkhidmatan. Mula-mula import pakej yang sepadan: 🎜rrreee🎜Untuk memastikan keselamatan komunikasi, kami menggunakan pakej kelayakan yang disediakan oleh gRPC. Kemudian, kami perlu melaksanakan antara muka perkhidmatan AuthService: 🎜rrreee🎜Dalam kod di atas, kami melaksanakan kaedah Log Masuk untuk memproses permintaan log masuk dan mengembalikan respons yang berjaya. 🎜🎜Seterusnya, kami perlu mencipta pelayan gRPC dan mendaftarkan perkhidmatan yang kami laksanakan: 🎜rrreee🎜Dalam kod di atas, kami mula-mula memuatkan sijil TLS untuk komunikasi yang disulitkan. Kemudian, kami mencipta pelayan gRPC dan mendaftarkan perkhidmatan authService yang kami laksanakan. 🎜
        🎜Panggilan pelanggan 🎜🎜🎜Akhir sekali, kami perlu menulis pelanggan untuk menghubungi perkhidmatan kami. Pertama, kami perlu memuatkan sijil akar yang dikeluarkan oleh CA: 🎜rrreee🎜 Dalam kod di atas, kami mula-mula memuatkan sijil akar CA untuk mewujudkan sambungan selamat dengan pelayan. Kemudian, kami memanggil kaedah Log Masuk perkhidmatan AuthService, menghantar nama pengguna dan kata laluan permintaan log masuk. 🎜🎜Pada ketika ini, kami telah selesai menggunakan gRPC untuk komunikasi rangkaian selamat. Dengan menggunakan pakej bukti kelayakan yang disediakan oleh gRPC, kami boleh melaksanakan komunikasi yang disulitkan TLS dengan mudah. Dalam aplikasi praktikal, kita boleh mengembangkan dan mengubah pelaksanaan asas ini mengikut keperluan. 🎜🎜Ringkasan🎜🎜Artikel ini memperkenalkan cara menggunakan gRPC untuk komunikasi rangkaian selamat di Golang. Kami belajar tentang pemasangan gRPC dan Protobuf, mentakrifkan antara muka perkhidmatan, menjana kod yang sepadan, menulis kod pelaksanaan pelayan dan klien, dan menunjukkan cara menjalankan komunikasi TLS yang selamat. Saya harap artikel ini dapat membantu anda menggunakan gRPC dengan lebih mudah semasa proses pembangunan untuk membina aplikasi rangkaian berprestasi tinggi dan selamat. 🎜

Atas ialah kandungan terperinci Menggunakan gRPC untuk komunikasi rangkaian selamat di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn