完全指南:通过 HTTP 洞察服务器内部状态)
brpc 内置服务Builtin Services完全指南通过 HTTP 洞察服务器内部状态【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpcbrpc 内置服务Builtin Services是框架随 Server 自动注册的一组 HTTP 服务它们从不同视角暴露服务器的内部状态让开发与调试效率大幅提升。本文以官方文档 docs/en/builtin_service.md 与 docs/cn/builtin_service.md 为核心骨架结合 src/brpc/builtin/ 下的源码实现完整讲解内置服务的访问方式、输出格式控制、安全模式、主要服务与辅助服务的用法以及它们在 server.cpp 中的注册机制帮助你熟练使用 curl、浏览器和 rpc_view 快速定位线上问题。什么是内置服务内置服务以多种形式展现服务器内部状态是开发和调试 brpc 服务时最常用的诊断入口。它们由 brpc 框架通过HTTP 协议对外提供无需额外编码即可访问通过浏览器访问获得带排版、可点击的 HTML 页面含 Tab 导航通过curl 或终端访问获得纯文本输出便于管道处理与脚本化采集服务器会根据请求头中的User-Agent自动判断返回 HTML 还是纯文本你也可以在 URI 上追加?console1强制服务器返回纯文本。官方文档在百度内部开发机上维护了一个长期运行的示例服务http://brpc.baidu.com:8765/仅百度内网可访问可以点击后查看各种内置服务的实际效果。如果你的运行环境限制了端口访问例如百度内网并非所有端口都能被笔记本直接访问可以使用 rpc_view 进行代理转发——rpc_view 本身也是一个用 brpc 实现的转发服务把目标端口的 HTTP 请求代理到你的本机端口。下面是分别从浏览器和终端访问内置服务的截图注意截图中的 logo 是百度内部代号开源版本中为 brpc从浏览器访问内置服务首页以 Tab 形式组织涵盖 status、vars、connections、flags、rpcz 等主要入口。从命令行终端访问同一页面在终端下输出为纯文本便于 grep、awk 等工具处理。输出格式的判定逻辑源码解读“根据 User-Agent 返回 HTML 或纯文本”并非黑盒行为其实现位于 src/brpc/builtin/common.cpp 的UseHTML()函数bool UseHTML(const HttpHeader header) { const std::string* console header.uri().GetQuery(CONSOLE_STR); if (console ! nullptr) { return atoi(console-c_str()) 0; // ?console1 强制纯文本 } // User-Agent 中带有 curl/ 前缀则返回纯文本 const std::string* agent header.GetHeader(USER_AGENT_STR); if (agent nullptr) { // 无 User-Agent 时默认返回文本 return false; } return agent-find(curl/) std::string::npos; }关键结论可复现、可验证请求头不带 User-Agent时默认返回纯文本User-Agent 包含curl/时返回纯文本这也是 curl 无需任何参数即可获得友好文本输出的原因显式携带?console1时无论 User-Agent 是什么都返回纯文本?console0则返回 HTML其余情况如 Chrome、Firefox返回 HTML。安全模式Security Mode内置服务包含大量服务器内部信息配置、连接、内存、protobuf 结构等必须在可能被公网访问的服务器上隐藏包括经过 nginx 或其他 HTTP 服务器转发流量的场景。官方文档明确要求“builtin servicesmustbe hidden on servers that may be accessed from public”。详细的隐藏方案见 docs/cn/server.md#对外隐藏内置服务这里摘录几种核心手段1. 设置内部端口internal_port将ServerOptions.internal_port设为一个仅允许内网访问的端口。设置后通过 internal_port 可以正常访问全部内置服务通过对外端口Server.Start()传入的端口访问内置服务时会返回如下错误[a27eda84bcdeef529a76f22872b78305] Not allowed to access builtin services, try ServerOptions.internal_port... instead if youre inside internal network从源码看ServerOptions中还支持对返回错误中的 IP 做 MD5 签名避免直接泄露内网地址明文。2. HTTP 代理限定转发路径通过 nginx 等代理配置 URL 映射例如把外部流量/MyAPI转发到目标服务器的/ServiceName/MethodName而/status等内置服务路径直接由 nginx 拒绝location /MyAPI { ... proxy_pass http://target-server/ServiceName/MethodName$query_string # $query_string 是 nginx 变量 ... }3. 检查对外服务是否误开了危险开关-enable_dir_service与-enable_threads_service会严重泄露服务器信息严禁在对外服务上开启。官方提供了一条检查命令验证 /flags 页面上这两个开关是否均为 falsecurl -s -m 1 HOSTNAME:PORT/flags/enable_dir_service,enable_threads_service | awk {if($3false){falsecnt}else if($3Value){isrpc1}}END{if(isrpc!1||falsecnt2){print SAFE}else{print NOT SAFE}}输出SAFE表示两个开关均已关闭NOT SAFE表示存在泄露风险。4. 完全禁用内置服务设置ServerOptions.has_builtin_services false可以完全禁用所有内置服务。此外官方安全建议还包括不以 root 用户启动 brpc 进程避免 rpcz、profiling 等文件被越权写入、对外部可控 URL 调用brpc::WebEscape()转义防止恶意 URI 注入。主要服务Main servicesbrpc 将最常用的内置服务分为“主要服务”与“其他服务”两类下面分别展开。官方文档明确标注这些服务会显示在首页的 Tab 中。服务说明详细文档/status显示所有服务的主要状态docs/cn/status.md/vars用户可定制的、描绘各种指标的计数器docs/cn/vars.md/connections所有连接的统计信息docs/cn/connections.md/flags所有 gflags 的状态部分可动态修改docs/cn/flags.md/rpcz查看所有 RPC 的细节docs/cn/rpcz.mdcpu profiler分析 CPU 热点docs/cn/cpu_profiler.mdheap profiler分析内存占用docs/cn/heap_profiler.mdcontention profiler分析锁竞争docs/cn/contention_profiler.md/status服务状态总览显示服务器上注册的所有服务及其主要运行状态如错误计数、QPS、延迟分布等是排查服务健康度的第一入口实现位于 src/brpc/builtin/status_service.cpp。页面会遍历_fullname_service_map中的每个服务并结合MethodStatus输出每个方法的统计信息。/vars可定制的指标计数器/vars 列出所有通过 bvar 暴露的计数器用户可用bvar::Expose定制自己的指标支持按名称精确查询和通配符匹配。官方文档强调其“用户可定制”的特性——任何bvar变量一旦expose即可在 /vars 页面看到。典型用法# 查看单个变量 curl -s http://HOST:PORT/vars/rpc_num_sockets # 使用通配符批量查看$ 代替 ? 匹配单个字符 curl -s http://HOST:PORT/vars/rpc_server*_count;iobuf_blo$k_*/connections连接统计展示服务器当前所有 TCP 连接及其统计信息来源地址、收发字节数、活跃状态等实现位于 src/brpc/builtin/connections_service.cpp是排查连接泄漏、异常来源 IP 的重要工具。/flagsgflags 动态配置/flags 列出进程内所有 gflags 及其当前值部分 gflag 支持运行时动态修改前提是定义了 validator。从 src/brpc/builtin/flags_service.cpp 的实现可以看到完整的修改链路# 查看单个 flag curl -s http://HOST:PORT/flags/port # 用通配符查看多个 flag分号或逗号分隔 curl -s http://HOST:PORT/flags/guard_page_size;help* # 运行时修改 flag 的值会触发 validator 校验 curl -s http://HOST:PORT/flags/NAME?setvalueVALUE源码中值得注意的约束修改一个 flag 前框架会调用GetCommandLineFlagInfo检查其是否注册了 validator 函数无 validator 的 gflag 会返回EPERM: A reloadable gflag must have validator拒绝修改启动时可通过-immutable_flags源码见 flags_service.cpp 的DEFINE_bool(immutable_flags, false, ...)将所有 gflags 变为只读适用于对安全性要求极高的生产环境官方在 /flags 页面及文档中提示用户需自行负责动态修改带来的线程安全与一致性问题。/rpczRPC 全链路追踪/rpcz 记录进程内最近的所有 RPC 调用细节时间、延迟、错误码、trace_id 等是定位慢调用和异常调用的利器。根据 src/brpc/builtin/index_service.cpp 中首页展示的帮助信息支持丰富的过滤参数# 查看最近的 RPC 调用 curl -s http://HOST:PORT/rpcz # 只查看某个时间点之前的调用 curl -s http://HOST:PORT/rpcz?timeYYYY-MM-DD_HH:MM:SS # 限制最多扫描 10 条 curl -s http://HOST:PORT/rpcz?time...max_scan10 # 按 trace_id / span_id 过滤 curl -s http://HOST:PORT/rpcz?trace_idN curl -s http://HOST:PORT/rpcz?trace_idNspan_idM其他可用过滤器还包括min_latency、min_request_size、min_response_size、log_id、error_code等/rpcz/stats页面提供 rpcz 的统计信息。详细用法见 docs/cn/rpcz.md。三个 ProfilerCPU / 堆 / 锁竞争cpu profiler分析 CPU 热点定位性能瓶颈heap profiler分析内存分配情况定位内存占用异常contention profiler分析锁竞争定位并发瓶颈。三者分别对应 docs/cn/cpu_profiler.md、docs/cn/heap_profiler.md、docs/cn/contention_profiler.md并在首页以/hotspots/cpu、/hotspots/heap、/hotspots/growth、/hotspots/contention的形态提供见 index_service.cpp。CPU profiler 与 heap profiler 在未编译进支持时页面会标注(disabled)。相关的 profiling 结果默认存放在-rpc_profiling_dir默认./rpc_data/profiling目录下且单次 profiling 时长受-max_profiling_seconds默认 300 秒限制这两个 gflag 均定义于 src/brpc/builtin/common.cpp。其他服务Other services除主要服务外brpc 还提供一组轻量的辅助内置服务。/version查看服务器版本/version 返回服务器版本号。用户可通过Server::set_version()指定版本若未设置框架会自动生成默认版本规则为brpc_server_service-name1_service-name2 ...即拼接所有已注册服务名。从 src/brpc/builtin/version_service.cpp 可以看到实现未设置版本时返回字符串unknown。注意虽然它叫 “version”官方文档建议设置值时包含服务名而不仅仅是一个数字版本号参见 docs/cn/server.md。/health存活探测/health 返回服务器是否存活。默认实现直接输出OK若设置了ServerOptions.health_reporter则会把生成报告的职责交给自定义的 reporter。实现见 src/brpc/builtin/health_service.cpp。健康检查的具体定制方式如自定义 /health 页面内容可参考 docs/cn/server.md#定制health页面。/protobufs查看所有 protobuf 结构/protobufs 展示进程内所有 protobuf 服务的描述符服务、消息、字段实现位于 src/brpc/builtin/protobufs_service.cpp通过遍历_fullname_service_map与google::protobuf::Descriptor的关系构建结构树。在排查请求/响应字段定义、确认 protobuf 版本是否一致时非常有用。/vlog可开启的 VLOG 站点/vlog 列出程序中所有可开启的 VLOG 输出点模块:行号、当前级别、所需级别、是否启用方便在不重新编译的情况下动态开启指定模块的详细日志。注意对 glog 无效编译时BRPC_WITH_GLOG分支下不会注册该服务见 src/brpc/server.cpp 的条件编译。VLOG 的详细说明见 docs/cn/streaming_log.md#VLOG。/dir 与 /threads默认关闭的高危服务/dir浏览服务器上的所有文件基于opendir实现见 src/brpc/builtin/dir_service.cpp。方便但非常危险默认关闭/threads查看进程内所有线程的运行状况实现为执行pstack pid并返回输出与耗时见 src/brpc/builtin/threads_service.cpp调用时对程序性能影响较大默认关闭。两者分别受 gflag 控制DEFINE_bool(enable_dir_service, false, Enable /dir); // src/brpc/server.cpp#L120 DEFINE_bool(enable_threads_service, false, Enable /threads); // src/brpc/server.cpp#L121如需在调试环境开启需在启动命令中显式传入-enable_dir_service/-enable_threads_service。再次强调严禁在对外服务上开启这两个开关否则会严重泄露服务器文件系统与线程栈信息。内置服务的注册机制源码级梳理所有内置服务都在Server::Start()启动流程中由 Server::AddBuiltinServices() 统一注册。该函数依次实例化并注册Tab 型主要服务StatusService、VarsService、ConnectionsService、FlagsService、RpczService、HotspotsService、IndexService首页其他服务VersionService、HealthService、ProtobufsService、BadMethodService、ListService、PrometheusMetricsService、MemoryService、VLogService仅非 glog 构建、PProfService、BthreadsService、IdsService、SocketsService、GetFaviconService、GetJsService、GrpcHealthCheckService条件注册ThreadsService仅在-enable_threads_service为 true 时注册DirService仅在-enable_dir_service为 true 时注册。注册入口 Server::AddBuiltinService() 实际上调用通用的AddServiceInternal()并设置SERVER_OWNS_SERVICE所有权语义——内置服务对象由 Server 接管生命周期。这意味着内置服务与你通过Server::AddService()注册的业务服务共享同一套服务路由与 HTTP 访问机制这也是它们能统一通过 HTTP 路径访问的根本原因。每个内置服务本质上都是一个继承自google::protobuf::Service的类实现default_method()或具体 RPC 方法目录 src/brpc/builtin/ 中每个*_service.cpp对应一个内置服务。另外两点值得留意/status、/vars等 Tab 页的 HTML 渲染依赖框架内置的 JS/CSS 资源jquery_min_js、sorttable_js、viz_min_js、flot_min_js等均由GetJsService提供因此纯文本/HTML 双模式输出天然支持设置ServerOptions.max_concurrency不会限制内置服务的访问内置服务不受该选项限制保证线上并发受限时诊断入口仍然可用见 docs/cn/server.md。实战速查一行命令完成常见诊断以下命令均可直接替换HOST:PORT使用# 查看服务状态总览纯文本 curl -s http://HOST:PORT/status # 查看进程内所有 gflags并动态修改某个 flag curl -s http://HOST:PORT/flags curl -s http://HOST:PORT/flags/max_concurrency?setvalue100 # 查看所有 bvar 指标支持通配符 curl -s http://HOST:PORT/vars # 查看最近 RPC 调用细节 curl -s http://HOST:PORT/rpcz?min_latency1000 # 健康探测 curl -s http://HOST:PORT/health # 强制以纯文本输出适合管道处理 curl -s http://HOST:PORT/status?console1 # 在浏览器中查看时如需强制纯文本可访问 # http://HOST:PORT/status?console1适用前提与限制以上全部功能默认随 brpc Server 一起提供无需额外部署但/dir、/threads需要启动参数开启/vlog在 glog 构建下不可用公网环境务必先按“安全模式”章节完成隐藏配置。想进一步了解各主要服务的参数细节可分别阅读 docs/cn/status.md、docs/cn/vars.md、docs/cn/flags.md、docs/cn/rpcz.md 与 docs/cn/connections.md并对照 src/brpc/builtin/ 目录下的对应实现源码加深理解。【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址: https://gitcode.com/GitHub_Trending/brpc/brpc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考