github.com/Go-To-Byte/DouSheng/user_center@v0.0.0-20230524130918-ad531c1a3f6a/client/README.md (about) 1 # 如何提供用户中心的[user_center]SDK —— GRPC调用方式 2 3 4 ## 一、定义配置文件、通过dou_kit公共库,获取对应服务客户端 5 6 需要先定义好服务发现的配置,如: 7 8 ```toml 9 [consul.discovers.user_center] 10 discover_name = "user_center" 11 address = "127.0.0.1:8500" 12 ``` 13 14 p.s.配置对象: 15 16 ```go 17 type Discover struct { 18 DiscoverName string `toml:"discover_name" env:"CONSUL_DISCOVER_NAME"` 19 Addr string `toml:"address" env:"CONSUL_ADDR"` 20 } 21 ``` 22 23 然后可通过两种方式获取用户中心的客户端 24 1. NewUserCenterClientFromCfg() —— 配置文件 25 2. NewUserCenterClientFromEnv() —— 环境变量 26 27 ```go 28 // 从配置文件中获取 user_center 的Client 29 client, err := rpc.NewUserCenterClientFromCfg() 30 31 if err != nil { 32 return nil, err 33 } 34 ``` 35 36 ## 二、利用用户中心的客户端调用它的SDK 37 38 若提供配置无误,经过第一步后,我们已经获取了用户中心的客户端,现在就可以利用客户端来调用对外暴露的GRPC服务了, 39 可简单理解成调用 user_center 的SDK 40 41 使用此SDK的方式如下测试代码: 42 43 ```go 44 var ( 45 userCenter *rpc.UserCenterClient 46 ) 47 48 func TestUserCenter(t *testing.T) { 49 should := assert.New(t) 50 51 tokenReq := token.NewValidateTokenRequest("xxx") 52 // 这里主要是为了获取 用户ID 53 validatedToken, err := userCenter.TokenService().ValidateToken(context.Background(), tokenReq) 54 if should.NoError(err) { 55 t.Log(validatedToken) 56 } 57 58 } 59 ``` 60 61 详细使用方式请看 client_test.go 文件 62 63 ## 三、如何编写用户中心的客户端? 64 65 如果仅仅是调用方,看看上面即可。 66 67 那作为编写用户中心的coder,该如何对外提供SDK呢? 68 69 这是用户中心中,能对外暴露的所有接口(利用protobuf文件生成): 70 1. `user.ServiceClient` 71 72 那咱们可以用面向对象的方式来编写用户中心的客户端,新建结构体`UserCenterClient` 73 74 ```go 75 type UserCenterClient struct { 76 userService user.ServiceClient 77 78 l logger.Logger 79 } 80 ``` 81 82 利用第一步,从dou_kit公共库中获取的ClientSet,连接对象,给接口附上实现: 83 84 ```go 85 func newDefault(clientSet *client.ClientSet) *UserCenterClient { 86 conn := clientSet.Conn() 87 return &UserCenterClient{ 88 l: zap.L().Named("USER_CENTER_RPC"), 89 90 // Token 服务 91 tokenService: token.NewServiceClient(conn), 92 // User 服务 93 userService: user.NewServiceClient(conn), 94 } 95 } 96 ``` 97 98 对外暴露Get方法,即可直接调用接口的具体实现: 99 100 ```go 101 102 func (c *UserCenterClient) UserService() user.ServiceClient { 103 if c.userService == nil { 104 c.l.Errorf("获取用户中心[Token Client]失败") 105 return nil 106 } 107 return c.userService 108 } 109 ``` 110 111 当然,若直接对外暴露所有接口的实现,可能不是很好,可以仅暴露部分方法