[goframe] (4): grpc サービスにアクセスするには goframe を使用すると非常に便利です。サービス コードの構築と生成が簡単で、起動方法も非常に簡単です。コードを使用したローカル呼び出しは成功します。

序文


この記事の元のリンクは次のとおりです:
https://blog.csdn.net/freewebsys/article/details/108971807

ブロガーの許可なく転載することを禁じます。
ブロガーの CSDN アドレス: https://blog.csdn.net/freewebsys
ブロガーのナゲット アドレス: https://juejin.cn/user/585379920479288
ブロガーの Zhihu アドレス: https://www.zhihu. com/人/フリーウェブシステム

1. grpc マイクロサービスについて


プロジェクト参照:

https://grpc.io/docs/messages/go/quickstart/

直接インストールするには、protoc ツールが必要です。

# 手动安装 gf 工具:

git clone https://github.com/gogf/gf && cd gf/cmd/gf && go install

# 安装工具

sudo apt install -y protobuf-compiler
protoc  --version
libprotoc 3.12.4

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

プロジェクトアドレス:
https://github.com/gogf/gf-demo-grpc

次に、pbコマンドを実行できます

make pb がついに完了を示しました! 実行は成功しました:

$ make pb
/usr/bin/protoc --proto_path=/data/home/test/go/src/gf-demo-grpc/manifest/protobuf --go_out=paths=source_relative:/data/home/test/go/src/gf-demo-grpc/api --go-grpc_out=paths=source_relative:/data/home/test/go/src/gf-demo-grpc/api /data/home/test/go/src/gf-demo-grpc/manifest/protobuf/pbentity/user.proto
/usr/bin/protoc --proto_path=/data/home/test/go/src/gf-demo-grpc/manifest/protobuf --go_out=paths=source_relative:/data/home/test/go/src/gf-demo-grpc/api --go-grpc_out=paths=source_relative:/data/home/test/go/src/gf-demo-grpc/api /data/home/test/go/src/gf-demo-grpc/manifest/protobuf/user/v1/user.proto
done!

次に、proto ファイルを作成します。これも非常に簡単です:
参考ドキュメント:
https://juejin.cn/post/6978474549025177608

ユーザープロト

// ==========================================================================
// Code generated by GoFrame CLI tool. DO NOT EDIT.
// ==========================================================================

syntax = "proto3";

package pbentity;

option go_package = "github.com/gogf/gf-demo-grpc/api/pbentity";

import "google/protobuf/timestamp.proto";

message User {
    uint32                    Id       = 1   ; // User ID        
    string                    Passport = 2   ; // User Passport  
    string                    Password = 3   ; // User Password  
    string                    Nickname = 4   ; // User Nickname  
    google.protobuf.Timestamp CreateAt = 5   ; // Created Time   
    google.protobuf.Timestamp UpdateAt = 6   ; // Updated Time   
    google.protobuf.Timestamp DeleteAt = 7   ; // Deleted Time   
}

ユーザー API プロト、サービスが 1 つだけのシンプルなメソッド

// protoc --go_out=plugins=grpc:. *.proto

syntax = "proto3";

package user;

option go_package = "gf-demo-grpc/api/user/v1";

service User{
    rpc Create(CreateReq) returns (CreateRes) {}
}

message CreateReq {
    string Passport = 1; // v: required
    string Password = 2; // v: required
    string Nickname = 3; // v: required
}
message CreateRes {
    string Data = 1; // v: required
}

2. 生成されたコードを変更する


Goframe はデフォルトでコントローラーのようなサービスを作成します。これは実際には gprc サービスです。

package user

import (
	"context"
	v1 "github.com/gogf/gf-demo-grpc/api/user/v1"
	"github.com/gogf/gf/contrib/rpc/grpcx/v2"
	"github.com/gogf/gf/v2/errors/gcode"
	"github.com/gogf/gf/v2/errors/gerror"
)

type Controller struct {
    
    
	v1.UnimplementedUserServer
}

func Register(s *grpcx.GrpcServer) {
    
    
	v1.RegisterUserServer(s.Server, &Controller{
    
    })
}

func (*Controller) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
    
    
	return nil, gerror.NewCode(gcode.CodeNotImplemented)
}

ただし、変更するには、デフォルトの grpc が未実装コードの例外を直接返します。

nil を返す、gerror.NewCode(gcode.CodeNotImplemented)

に変更されました:

func (*Controller) Create(ctx context.Context, req *v1.CreateReq) (res *v1.CreateRes, err error) {
    
    

	g.Log().Printf(ctx, `Create user get Nickname : %+v`, req.Nickname)

	res = &v1.CreateRes{
    
    }
	res.Data = "OK"

	return res, nil
}

次に、テスト方法を変更します。

package test

import (
	"fmt"
	"testing"

	"github.com/gogf/gf/contrib/rpc/grpcx/v2"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/test/gtest"

	v1 "github.com/gogf/gf-demo-grpc/api/user/v1"
)

func Test_Create(t *testing.T) {
    
    
	gtest.C(t, func(t *gtest.T) {
    
    
		var (
			ctx  = gctx.GetInitCtx()
			conn = grpcx.Client.MustNewGrpcClientConn("demo")
			user = v1.NewUserClient(conn)
		)
		for i := 1; i <= 10; i++ {
    
    
			res, err := user.Create(ctx, &v1.CreateReq{
    
    
				Passport: fmt.Sprintf(`passport-%d`, i),
				Nickname: fmt.Sprintf(`nickname-%d`, i),
			})
			if err != nil {
    
    
				g.Log().Fatalf(ctx, `create user failed: %+v`, err)
			} else {
    
    
				g.Log().Printf(ctx, `create user success : %+v`, res.Data)
			}
		}
	})
}

10回実行:
結果:

2023-06-06 11:44:26.456 {003338c60bf5651781952122252686fb} ユーザーの作成成功 : OK

grpcから返されるデータdataを取得することができます。
直接接続を通じてデータをリクエストすることもできます。

		host := "localhost:8000"
		ctx  := gctx.GetInitCtx()
		conn, err := grpc.Dial(host, grpc.WithTransportCredentials(insecure.NewCredentials()) )
		g.Log().Print(ctx, `create ChatMessage response `, err)
		user = v1.NewUserClient(conn)

直接接続する理由は、外部ネットワーク上の他のユーザーにサービスを提供する必要がある場合があるためです。
同時に、負荷分散に nginx を使用したり、他のサービスのプロキシと同様に grpc_pass リバース プロキシを直接使用したりできます。

その他の参考文献: https://juejin.cn/post/7179907227031994405

 upstream grpc_servers {
    
    
   server 192.168.1.101:8000;
   server 192.168.1.102:8000;
 }

   location / {
    
    
       grpc_pass grpc://grpc_servers:8000;
   }

3. 関連する goframe grpc 設定


構成リファレンス:

https://goframe.org/pages/viewpage.action?pageId=80488218

その中の config.yaml 設定は次のとおりです。

# GRPC Server.
# 
grpc:
  address: ":8000" # 自定义服务监听地址
  name: "demo"
  logPath: ""
  logStdout: true
  errorStack: true
  errorLogEnabled: true
  errorLogPattern: "error-{Ymd}.log"
  accessLogEnabled: true
  accessLogPattern: "access-{Ymd}.log"

次に、メインでサービスを開始します。

package main

import (
	"github.com/gogf/gf-demo-grpc/internal/controller/user"
	"github.com/gogf/gf/contrib/rpc/grpcx/v2"
)

func main() {
    
    
	// cmd.Main.Run(gctx.New())
	s := grpcx.Server.New()
	user.Register(s)
	s.Run()
}

4. まとめ


確かにgrpcのサービスは他のサービス開発に比べて少し面倒です。
主にプロトツールのインストールと設定を行います。
しかし、使いこなしてみると、多言語の相互通話にも対応しており、非常に便利であることが分かりました。

同時に、goframe のツール統合により、サービスの構成を直接支援することが容易になります。
私はそれらをすべて書くのを手伝いました。残りはビジネス ロジックを書くために使用できるので、非常に便利です。おすすめされた。

この記事の元のリンクは次のとおりです:
https://blog.csdn.net/freewebsys/article/details/108971807

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/freewebsys/article/details/131028720
おすすめ