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: