一、HTTP/2服务核心架构

1. 协议定义规范 
BRPC要求HTTP/2服务接口仍通过Protobuf定义,但请求响应体留空:
            
            
              cpp
              
              
            
          
          service HttpService {
  rpc Echo(HttpRequest) returns (HttpResponse); 
}
message HttpRequest {}  // 实际数据存储在Controller
message HttpResponse {}
        2. 请求处理流程 
通过Controller对象获取完整HTTP上下文:
            
            
              cpp
              
              
            
          
          void HttpServiceImpl::Echo(...) {
  brpc::Controller* cntl = static_cast<brpc::Controller*>(cntl_base);
  // 获取请求信息
  const brpc::HttpHeader& header = cntl->http_request();
  butil::IOBuf& request_body = cntl->request_attachment();
  // 设置响应
  cntl->http_response().set_status_code(brpc::HTTP_STATUS_OK);
  cntl->response_attachment().append("Hello BRPC HTTP/2");
}
        二、三种路由模式详解
1. 标准服务路由
/ServiceName/MethodName 格式:
            
            
              cpp
              
              
            
          
          // 访问 /HttpService/Echo
cntl->http_request().unresolved_path();  // 返回空字符串
        2. 资源路径路由
使用default_method处理动态路径:
            
            
              cpp
              
              
            
          
          service FileService {
  rpc default_method(HttpRequest) returns (HttpResponse);
}
        
            
            
              cpp
              
              
            
          
          // 访问 /FileService/docs/manual.md
cntl->http_request().unresolved_path(); // 返回 "docs/manual.md"
        3. RESTful路由映射
通过AddService定制URL规则:
            
            
              cpp
              
              
            
          
          server.AddService(&svc, brpc::SERVER_DOESNT_OWN_SERVICE,
                  "/v1/users/* => get_user,"
                  "/v1/data/*.json => download_json");
        | 原始路径 | 映射方法 | unresolved_path | 
|---|---|---|
| /v1/users/123 | get_user | "123" | 
| /v1/data/report.json | download_json | "report" | 
三、HTTP协议深度优化
1. 头部精准控制
            
            
              cpp
              
              
            
          
          // 获取Header
const string* agent = cntl->http_request().GetHeader("User-Agent");
// 设置Header
cntl->http_response().SetHeader("Cache-Control", "max-age=3600");
cntl->http_response().AppendHeader("Set-Cookie", "session_id=xyz"); 
        2. 智能压缩传输
            
            
              cpp
              
              
            
          
          // 响应压缩(自动判断客户端支持)
cntl->set_response_compress_type(brpc::COMPRESS_TYPE_GZIP);
// 请求解压缩
if (cntl->http_request().GetHeader("Content-Encoding") == "gzip") {
  butil::IOBuf uncompressed;
  brpc::policy::GzipDecompress(cntl->request_attachment(), &uncompressed);
}
        3. 流式响应支持 
处理大文件下载:
            
            
              cpp
              
              
            
          
          butil::intrusive_ptr<brpc::ProgressiveAttachment> pa = cntl->CreateProgressiveAttachment();
pa->Write("First chunk");  // 立即发送
pa->Write("Final chunk");  // 后续数据
        四、安全与性能实践
1. HTTPS配置
            
            
              cpp
              
              
            
          
          brpc::ServerOptions options;
options.ssl_options.default_cert.certificate = "server.crt";
options.ssl_options.default_cert.private_key = "server.key";
        2. 生产环境调优
            
            
              cpp
              
              
            
          
          # 启动参数
-http_body_compress_threshold=1024  # 大于1KB才压缩
-bvar_collect_interval=10            # 监控数据采样间隔
        3. 异常处理规范
            
            
              cpp
              
              
            
          
          // 自定义错误页面
cntl->http_response().set_status_code(brpc::HTTP_STATUS_NOT_FOUND);
cntl->response_attachment().append("<h1>404 资源不存在</h1>");
// 重定向实现
cntl->http_response().set_status_code(brpc::HTTP_STATUS_FOUND);
cntl->http_response().SetHeader("Location", "/new-location");
        五、经典问题解决方案
Q: Nginx报final fail错误 
✅ 检查BRPC是否收到非法HTTP请求
✅ 配置Nginx过滤非常规方法:
            
            
              nginx
              
              
            
          
          location / {
  proxy_pass http://backend;
  proxy_method GET;  # 只允许GET请求
}
        Q: Query String解析异常 
✅ 对特殊字符进行编码处理:
            
            
              cpp
              
              
            
          
          string encoded_value = brpc::PercentEncode("data==abc");
cntl->http_request().uri().SetQuery("key", encoded_value);
        Q: 流控策略实现
            
            
              cpp
              
              
            
          
          // 限制每秒1000请求
if (bvar::Adder<int> qps("http_qps"); ++qps > 1000) {
  cntl->SetFailed(brpc::ELIMIT, "请求超限");
}
        结语:HTTP/2服务核心优势
- 协议统一:单端口同时支持HTTP/1.x与HTTP/2
 - 性能标杆:基于node.js解析器+rapidjson实现毫秒级响应
 - 流式革命:ProgressiveAttachment支持TB级数据流
 - 无缝加密:SSL/TLS集成简化HTTPS部署
 
部署检查清单:
- 开启
 -http_verbose调试请求日志- 使用
 wrk -t12 -c400 -d30s https://service进行压测- 通过
 /status页面监控http_errors和http_sent_bytes
通过BRPC构建的HTTP/2服务已在百度地图、网盘等产品中验证,单实例稳定支撑10万+QPS。完整示例代码参考:brpc/examples/http_server.cpp
Reference
- brpc documentation