feat(config): 添加 gRPC 服务器配置支持
- 在配置结构中新增 GRPCServer 类型,包含 Host 和 Port 字段 - 更新 Load 函数以支持从环境变量读取 gRPC 服务器的配置 - 引入 gRPC 和 protobuf 依赖以支持 gRPC 功能
This commit is contained in:
parent
858200051e
commit
c02f051cb8
|
|
@ -6,6 +6,8 @@ require (
|
||||||
github.com/go-sql-driver/mysql v1.7.1
|
github.com/go-sql-driver/mysql v1.7.1
|
||||||
github.com/tjfoc/gmsm v1.4.1
|
github.com/tjfoc/gmsm v1.4.1
|
||||||
github.com/xuri/excelize/v2 v2.8.1
|
github.com/xuri/excelize/v2 v2.8.1
|
||||||
|
google.golang.org/grpc v1.60.1
|
||||||
|
google.golang.org/protobuf v1.32.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,27 @@ type DB struct {
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GRPCServer struct {
|
||||||
|
Host string `yaml:"host"`
|
||||||
|
Port string `yaml:"port"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g GRPCServer) Address() string {
|
||||||
|
if g.Host == "" || g.Port == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return g.Host + ":" + g.Port
|
||||||
|
}
|
||||||
|
|
||||||
type App struct {
|
type App struct {
|
||||||
Port string `yaml:"port"`
|
Port string `yaml:"port"`
|
||||||
MarketingDB DB `yaml:"marketing_db"`
|
MarketingDB DB `yaml:"marketing_db"`
|
||||||
MarketingAuthorizationDB DB `yaml:"marketing_authorization_db"`
|
MarketingAuthorizationDB DB `yaml:"marketing_authorization_db"`
|
||||||
MarketingResellerDB DB `yaml:"marketing_reseller_db"`
|
MarketingResellerDB DB `yaml:"marketing_reseller_db"`
|
||||||
YMTDB DB `yaml:"ymt_db"`
|
YMTDB DB `yaml:"ymt_db"`
|
||||||
YMTTestDB DB `yaml:"ymt_test_db"`
|
YMTTestDB DB `yaml:"ymt_test_db"`
|
||||||
YMTKeyDecryptKeyB64 string `yaml:"ymt_key_decrypt_key_b64"`
|
YMTKeyDecryptKeyB64 string `yaml:"ymt_key_decrypt_key_b64"`
|
||||||
|
GRPCServer GRPCServer `yaml:"grpc_server"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type root struct {
|
type root struct {
|
||||||
|
|
@ -84,6 +97,13 @@ func Load() App {
|
||||||
if v := os.Getenv("YMT_TEST_DB_NAME"); v != "" {
|
if v := os.Getenv("YMT_TEST_DB_NAME"); v != "" {
|
||||||
cfg.YMTTestDB.Name = v
|
cfg.YMTTestDB.Name = v
|
||||||
}
|
}
|
||||||
|
// gRPC server env overrides
|
||||||
|
if v := os.Getenv("GRPC_SERVER_HOST"); v != "" {
|
||||||
|
cfg.GRPCServer.Host = v
|
||||||
|
}
|
||||||
|
if v := os.Getenv("GRPC_SERVER_PORT"); v != "" {
|
||||||
|
cfg.GRPCServer.Port = v
|
||||||
|
}
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,93 @@
|
||||||
|
package grpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
|
"google.golang.org/grpc/keepalive"
|
||||||
|
|
||||||
|
// 使用生成的 proto 代码
|
||||||
|
// 注意:需要先运行 cd grpc && make generate 生成代码
|
||||||
|
userv1 "server/grpc/user/userv1"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
userClientOnce sync.Once
|
||||||
|
userClient *UserClient
|
||||||
|
)
|
||||||
|
|
||||||
|
type UserClient struct {
|
||||||
|
conn *grpc.ClientConn
|
||||||
|
addr string
|
||||||
|
client userv1.UserClient
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUserClient 创建用户服务 gRPC 客户端
|
||||||
|
func NewUserClient(addr string) (*UserClient, error) {
|
||||||
|
if addr == "" {
|
||||||
|
return nil, fmt.Errorf("gRPC server address is empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
userClientOnce.Do(func() {
|
||||||
|
opts := []grpc.DialOption{
|
||||||
|
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
||||||
|
grpc.WithKeepaliveParams(keepalive.ClientParameters{
|
||||||
|
Time: 10 * time.Second,
|
||||||
|
Timeout: 3 * time.Second,
|
||||||
|
PermitWithoutStream: true,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
|
||||||
|
conn, dialErr := grpc.Dial(addr, opts...)
|
||||||
|
if dialErr != nil {
|
||||||
|
err = fmt.Errorf("failed to connect to gRPC server %s: %w", addr, dialErr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
client := userv1.NewUserClient(conn)
|
||||||
|
userClient = &UserClient{
|
||||||
|
conn: conn,
|
||||||
|
addr: addr,
|
||||||
|
client: client,
|
||||||
|
}
|
||||||
|
log.Printf("gRPC user client connected to %s", addr)
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return userClient, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SimpleListAllUser 调用 SimpleListAllUser gRPC 方法
|
||||||
|
func (c *UserClient) SimpleListAllUser(ctx context.Context, keyword string) (*userv1.SimpleListAllUserResp, error) {
|
||||||
|
req := &userv1.SimpleListAllUserReq{
|
||||||
|
Keyword: keyword,
|
||||||
|
}
|
||||||
|
resp, err := c.client.SimpleListAllUser(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("gRPC SimpleListAllUser failed: %w", err)
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close 关闭连接
|
||||||
|
func (c *UserClient) Close() error {
|
||||||
|
if c.conn != nil {
|
||||||
|
return c.conn.Close()
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConn 获取 gRPC 连接(用于直接调用生成的客户端)
|
||||||
|
func (c *UserClient) GetConn() *grpc.ClientConn {
|
||||||
|
return c.conn
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue