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  当然,若直接对外暴露所有接口的实现,可能不是很好,可以仅暴露部分方法