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)name 与 add() 时使用的完整 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