git.zd.zone/hrpc/hrpc@v0.0.12/README.md (about)

     1  # hrpc
     2  
     3  ## 基本介绍
     4  
     5  此框架当前主要用于特殊项目使用。
     6  
     7  ## 依赖
     8  
     9  - 腾讯云的容器服务(及其Istio做的Mesh)
    10  - Consul做配置管理与服务管理
    11  
    12  ## 基本架构
    13  
    14  1. 腾讯云多节点构建的容器集群,使用istio的sidecar模式,加入Mesh依赖。
    15  2. 部署consul于当前容器集群。得到集群内服务名。
    16  3. 编写其他模块服务(引用此框架),开启grpc接口。(如果选项中开启了健康检查,那么镜像的6688端口也会被打开,用于http请求的健康检查)
    17  4. 部署服务于容器集群(设置环境变量,表示consul地址、Token等信息)
    18  
    19  ## 加载方式
    20  
    21  ```
    22  import (
    23      "git.zd.zone/hrpc/hrpc"
    24      "git.zd.zone/hrpc/hrpc/database/mysql"
    25      "git.zd.zone/hrpc/hrpc/database/redis"
    26      // "git.zd.zone/hrpc/hrpc/life"
    27      "git.zd.zone/hrpc/hrpc/option"
    28      
    29      pb "...."
    30  )
    31  func main() {
    32      // 需要携带配置
    33      s, err := hrpc.NewServer(
    34      	// 在TKE环境下的容器,可以忽略这个Consul部分的配置
    35          option.WithConsul(option.Consul{
    36              // Token 如果环境变量未配置,需要在此指定,否则连不上consul
    37  	    Token: "xxxxxx",
    38              // Address 如果环境变量未配置,需要在此指定,否则连不上consul
    39              Address: "xxx",
    40              // DataCenter 默认数据中心是dc1,如果不一样,可以配置环境变量或者在此指定
    41              DataCenter: "",
    42  	}),
    43          // 开启mysql和redis的支持
    44  	option.WithDatabases(mysql.New(), redis.New()),
    45          // 定义该服务的名称
    46  	option.WithServerName("服务名称"),
    47          // 定义环境,当前分为option.Development开发环境与option.Production生产环境
    48  	option.WithEnvironment(option.Development),
    49          // 如果开启健康检查,则会启动http服务监听本地6688端口用于consul的http请求探测
    50  	option.WithHealthCheck(),
    51      )
    52      if err != nil {
    53          panic(err)
    54      }
    55      pb.RegisterXXXXXServiceServer(s.Server(), &xxxxxServerImpl{})
    56  
    57      // 如果有任何需要的析构函数,可以在`s.Serve()`执行前,进行注册
    58      // life.WhenExit(xxxx.Destory)
    59  
    60      if err := s.Serve(); err != nil {
    61          panic(err)
    62      }
    63  }
    64  ```
    65  
    66  ## 服务间调用
    67  
    68  ```
    69  import (
    70      "git.zd.zone/hrpc/hrpc/service"
    71  )
    72  
    73  // Example 会调用consul获取对应健康状态下的服务
    74  // 如果有多个实例,则会基于weight排序,返回weight最大的那个服务
    75  // 注意:
    76  //   返回的服务包含IP、名称、权重等等信息,不推荐在TKE环境中,使用Endpoint属性(POD IP)作为连接方式,因为POD IP重启变化
    77  //   可以使用Target()属性,返回`服务名:端口`的字符串,利用TKE的DNS解析出服务IP,由TKE转发至POD中
    78  func Example() error {
    79      // 默认是基于当前环境的设置(在NewServer阶段传入的option.Development或者option.Production),获取当前环境下的服务
    80      // 但支持传入tag标识,获取其他环境下的服务
    81      // 假设当前在开发环境,如果你的consul的Token允许的话,那么可以`service.Get("服务名称", service.Tag(option.Production))`获取生产环境下的服务
    82      p, err := service.Get("服务名称")
    83  	if err != nil {
    84  		return err
    85  	}
    86  	c, err := grpc.Dial(p.Target(), grpc.WithInsecure())
    87  	if err != nil {
    88  		return err
    89  	}
    90      ...
    91      return nil
    92  }
    93  
    94  ```
    95  
    96  ## 数据库访问
    97  
    98  前提需要在main.go的`hrpc.NewServer`中,传入`option.WithDatabases(mysql.New(), redis.New()),`选项。
    99  之后在其他子包中,可直接采用如下方式访问
   100  ```
   101  import (
   102      "git.zd.zone/hrpc/hrpc/database/mysql"
   103      "git.zd.zone/hrpc/hrpc/database/redis"
   104  )
   105  
   106  func UserInfo(uid string) {
   107      // MySQL的访问
   108      var v string
   109  	if err := mysql.Client().QueryRow(ctx, `
   110  	SELECT
   111  		uid
   112  	FROM
   113  		users_info
   114  	WHERE
   115  		uid = ? AND is_admin = 1 AND status = 0`, []interface{}{&v}, uid,
   116  	); err != nil {
   117  		if err != sql.ErrNoRows 
   118  		}
   119  		return err
   120  	
   121  
   122      // Redis的访问
   123      redis.Get().Set(xxx)
   124  }
   125  ```
   126  因为,在`hrpc.NewServer`阶段,会基于配置,维护MySQL或者Redis的连接,可以用对应包的Get()方法获取链接。
   127  - 如果与MySQL或者Redis建立连接失败,会在启动阶段panic
   128  - 如果中途连接断掉,会自动尝试重连;如果对应服务挂掉,则会直接error
   129  
   130  ## 框架基本流程
   131  
   132  1. 服务启动,先规整配置信息并且有些依赖组件需要初始化,比如`uniqueid`
   133  2. 建立与consul的连接
   134  3. 对pb文件注册
   135  4. (可能)根据配置情况,建立于mysql或者redis的连接
   136     1. 相对应的,会注册close函数
   137  5. 尝试宣告获取本地8888端口
   138  6. 向consul注册服务
   139  7. goroutine启动grpc接口
   140  8. 注册一些析构函数
   141  9. 阻塞监听退出等信号
   142  
   143  ## 有效环境变量
   144  
   145  - `CONFIGS_TOKEN` 配置中心token
   146  - `CONFIGS_ADDR` 配置中心请求地址
   147  - `CONFIGS_DATACENTER` 配置中心的数据中心
   148  
   149  ## 注册端口
   150  
   151  当一个服务启动后,以下端口可能会自动开启,如果端口被占用,可能导致异常。
   152  
   153  - `2112` metrics上报使用
   154  - `6688` consul健康探测
   155  - `8080` 本地http请求测试使用
   156  - `8888` grpc主服务提供端口(关键)
   157  
   158  ## 插件列表-
   159  
   160  - `hrpc-location` 用于实现常用时区信息
   161  - `hrpc-configs` 用于对接consul
   162  - `hrpc-tester` 用于http测试grpc接口
   163  - `hrpc-inmemory` 基于内存的一个简易map存储
   164  
   165  ## TODO: