trpc.group/trpc-go/trpc-go@v1.0.3/admin/README.zh_CN.md (about) 1 [English](README.md) | 中文 2 3 # 前言 4 5 管理命令(admin)是服务内部的管理后台,它是框架在普通服务端口之外额外提供的 http 服务,通过这个 http 接口可以给服务发送指令,如查看日志等级,动态设置日志等级等,具体命令可以看下面的命令列表。 6 7 admin 一般用于查询服务内部状态信息,用户也可以自己定义任意的命令。 8 9 admin 内部使用标准 restful 协议对外提供 http 服务。 10 11 框架默认不会开启 admin 能力,需要配置才会启动(生成配置时,可以默认配置好 admin,这样就能默认打开 admin 了): 12 13 ```yaml 14 server: 15 app: app # 业务的应用名,注意要改成你自己的业务应用名 16 server: server # 进程服务名,注意要改成你自己的服务进程名 17 admin: 18 ip: 127.0.0.1 # admin 的 ip,配置网卡 nic 也可以 19 port: 11014 # admin 的 port,必须同时配置这里的 ip port 才会启动 admin 20 read_timeout: 3000 # ms. 请求被接受到请求信息被完全读取的超时时间设置,防止慢客户端 21 write_timeout: 60000 # ms. 处理的超时时间 22 ``` 23 24 # 管理命令列表 25 26 框架已经内置以下命令,注意:命令中的`ip:port`是上述 admin 配置的地址,不是 service 配置的地址。 27 28 ## 查看所有管理命令 29 30 ```shell 31 curl http://ip:port/cmds 32 ``` 33 返回结果 34 ```shell 35 { 36 "cmds":[ 37 "/cmds", 38 "/version", 39 "/cmds/loglevel", 40 "/cmds/config" 41 ], 42 "errorcode":0, 43 "message":"" 44 } 45 ``` 46 47 ## 查看框架版本信息 48 49 ```shell 50 curl http://ip:port/version 51 ``` 52 返回结果 53 ```shell 54 { 55 "errorcode": 0, 56 "message": "", 57 "version": "v0.1.0-dev" 58 } 59 ``` 60 61 ## 查看框架日志级别 62 63 ```shell 64 curl -XGET http://ip:port/cmds/loglevel?logger=xxx&output=0 65 ``` 66 说明:logger 是为了支持多日志,不填即为框架的 default 日志,output 同一个 logger 下的不同输出,数组下标,不填即为 0,第一个 output。 67 68 返回结果 69 ```shell 70 { 71 "errorcode":0, 72 "loglevel":"info", 73 "message":"" 74 } 75 ``` 76 77 ## 设置框架日志级别 78 79 (value 为日志级别,值为:trace debug info warn error fatal) 80 ```shell 81 curl http://ip:port/cmds/loglevel?logger=xxx -XPUT -d value="debug" 82 ``` 83 说明:logger 是为了支持多日志,不填即为框架的 default 日志,output 同一个 logger 下的不同输出,数组下标,不填即为 0,第一个 output。 84 85 注意:这里是设置的服务内部的内存数据,不会更新到配置文件中,重启即失效。 86 87 返回结果 88 ```shell 89 { 90 "errorcode":0, 91 "level":"debug", 92 "message":"", 93 "prelevel":"info" 94 } 95 ``` 96 97 ## 查看框架配置文件 98 99 ```shell 100 curl http://ip:port/cmds/config 101 ``` 102 返回结果 103 104 content 为 json 化的配置文件内容 105 ```shell 106 { 107 "content":{ 108 109 }, 110 "errorcode":0, 111 "message":"" 112 } 113 ``` 114 115 # 自定义管理命令 116 117 ## 定义函数 118 119 首先自己定义一个 http 接口形式的处理函数,你可以在任何文件位置自己定义: 120 ```go 121 // load 触发加载本地文件更新内存特定值 122 func load(w http.ResponseWriter, r *http.Request) { 123 reader, err := ioutil.ReadFile("xxx.txt") 124 if err != nil { 125 w.Write([]byte(`{"errorcode":1000, "message":"read file fail"}`)) // 错误码,错误信息自己定义 126 return 127 } 128 129 // 业务逻辑。.. 130 131 // 返回成功错误码 132 w.Write([]byte(`{"errorcode":0, "message":"ok"}`)) 133 } 134 ``` 135 136 ## 注册路由 137 138 init 函数或者自己的内部函数注册 admin: 139 ```go 140 import ( 141 "trpc.group/trpc-go/trpc-go/admin" 142 ) 143 func init() { 144 admin.HandleFunc("/cmds/load", load) // 路径自己定义,一般在/cmds 下面,注意不要重复,不然会相互覆盖 145 } 146 ``` 147 148 ## 触发命令 149 150 触发执行自定义命令 151 ```shell 152 curl http://ip:port/cmds/load 153 ``` 154 155 # pprof 性能分析 156 157 pprof 是 go 语言自带的性能分析工具,默认跟 admin 服务同一个端口号,只要开启了 admin 服务,即可以使用服务的 pprof。 158 159 配置好 admin 配置以后,有以下几种方式使用 pprof: 160 161 ## 使用配置有 go 环境并且与服务网络连通的机器 162 163 ```shell 164 go tool pprof http://{$ip}:${port}/debug/pprof/profile?seconds=20 165 ``` 166 167 ## 将 pprof 文件下载到本地,本地 go 工具进行分析 168 169 ```shell 170 curl http://${ip}:{$port}/debug/pprof/profile?seconds=20 > profile.out 171 go tool pprof profile.out 172 173 curl http://${ip}:{$port}/debug/pprof/trace?seconds=20 > trace.out 174 go tool trace trace.out 175 ``` 176 177 # 内存管理命令 debug/pprof/heap 178 179 另外,trpc-go 会自动帮你去掉 golang http 包 DefaultServeMux 上注册的 pprof 路由,规避掉 golang net/http/pprof 包的安全问题(这是 go 本身的问题)。 180 181 所以,使用 trpc-go 框架搭建的服务直接可以用 pprof 命令,但用`http.ListenAndServe("xxx", xxx)`方式起的服务会无法用 pprof 命令。 182 183 在安装了 go 命令的内网机器进行内存分析: 184 185 ```shell 186 go tool pprof -inuse_space http://xxx:11029/debug/pprof/heap 187 go tool pprof -alloc_space http://xxx:11029/debug/pprof/heap 188 ```