Skip to Content
🎉 gRPCity 3.0 is released. Read more →

Server

Server 接管服务端的整个生命周期:基于 loader 构造它,注册一个或多个 service 实现,按需加上中间件,再 listen()。一个实例可以在同一个进程里挂多个 service。

实例获取

const server = await loader.initServer(serverOptions)

serverOptions

  • channelOptions(可选)—— 底层 gRPC server 的 channel 级配置。
  • credentials(可选)—— 服务端 TLS 凭证。

channelOptions 默认值见 Config 指南,TLS 配置见 Credentials 指南

服务绑定

server.add(name, implementation, options)
  • name(必填)—— proto 中含包名的完整 service 名称。
  • implementation(必填)—— 一个实例化的对象或类,方法名要与 service 的 RPC 对应。
  • options(可选)
    • exclude(string[])—— 不参与绑定的 implementation 方法(例如内部 helper)。
    • inherit —— 如果 implementation 通过继承获得 handler,把父类传进来即可让继承到的方法也被发现。

服务解绑

server.remove(name)

nameadd() 时使用的完整 service 名称相同。

添加中间件

server.use() 在每个 handler 前后运行。(ctx, next) 模式见 Server Middleware 指南

// 逐个添加 server.use(f1) server.use(f2) server.use(f3) // 多个位置参数添加 server.use(f1, f2, f3) // 用数组添加 server.use([f1, f2, f3])

中间件只对 async handler 生效。callback 形式会绕过中间件。

在 handler 中返回错误

直接 throw 就行。gRPCity 会捕获抛出的 Error,并对四类 RPC(unary、client stream、server stream、bidi)都把它转换成 wire 上的 gRPC status。

特别是 server-stream 与 bidi handler,throw 就是正确的失败方式 —— gRPCity 会通过底层 server stream 的 'error' 通道发回 status trailer,让客户端立刻收到错误,而不是等到 deadline 才超时。客户端侧的接收形态请见 Error 指南

证书与启动

listen(addr, credentials?) 启动服务。

  • addr(必填)—— 监听的 host 和 port。两种形态:
    • host:port 字符串,例如 '127.0.0.1:9099'
    • 对象 { host, port },其中 port 范围 [0, 65535]
  • credentials(可选)—— 用 loader.makeServerCredentials() 构造。
const credentials = loader.makeServerCredentials(rootCerts, keyCertPairs, checkClientCertificate) // 两种写法都可以 await server.listen('127.0.0.1:9099', credentials) await server.listen({ host: '127.0.0.1', port: 9099 }, credentials)

Credentials 优先级:listen() > initServer() > 内置默认。

服务退出

// 优雅退出 —— 等待进行中的调用完成 await server.shutdown() // 强制退出 —— 立刻关闭一切 server.forceShutdown()
Last updated on