brpc::Server:默认构造后的Server不包含任何服务,也不会对外提供服务,仅仅是个对象。
methods:
AddService();SERVER_OWNS_SERVICE/SERVER_DOESNT_OWN_SERVICE区别在于局部变量与动态申请变量
Start();一个server只能监听一个端口(不考虑ServerOptions.internal_port)
Stop()/Join();Stop不会阻塞,Join会,分成两个函数的原因在于多个Server需要退出时,可以先全部Stop再一起Join。在Server退出时,对新请求立刻回复ELOGOFF错误以防止新请求加入,当客户端看到错误后,会跳过对应的Server,并在其他Server上重试对应的请求。
RunUntilAskedToQuit();可以在大部分情况下简化server的运行和停止代码(wait until ctrl-c is pressed,then stop and join the server),join完成后可以修改其中的Service并重新Start
早期的brpc允许一个pb service被http协议访问时不设置bp请求,即使里面有required字段(一般来说这个service会自动解析http请求和设置http回复,并不会访问pb请求),新版本设置opt.allow_http_body_to_pb= falsse,允许不把http body自动转化为pb request(客户端协议类型不能时http,应该说是baidu_std或者hulu_pbrpc)。
ServerOptions.idle_timeout_sec:如果一个链接在对应的时间内没有读取或写入数据,则被视为闲置,而被server主动关闭,默认-1,代表不开启
ServerOptions.pid_file:如果设置此字段,server启动时会创建同名文件,内容为进程号,默认为空
ServerOptions.auth:把实现的Authenticator实例赋值给auth
并发可能有两种含义:一种是连接数,一种是同时在处理的请求数。第一种可能是在server监听池这种情况,这里提到的是后者。brpc支持设置server级和method级的最大并发,当server或method同时处理的请求数超过并发限制时,它会立刻给他client回复brpc::ELIMIT错误,而不会调用服务回调。(brpc的请求运行在bthread中,M个bthread会映射至N个worker中)
ServerOptions.num_threads:仅仅是个提示,因为进程内的所有Server和Channel会共享线程资源,线程总是ServerOptions.num_threads和-bthread_concurrency中的最大值。另外brpc不区分IO线程和处理线程。
ServerOptions.max_concurrency:默认值0代表不限制,访问内置服务不受此选项限制。
Server.ResetMaxConcurrency():可在server启动后动态修改server级别的max_concurrency
Server.MaxConcurrencyOf():可设置method级别的max_concurrency(server.MaxConcurrencyOf("method")= num),此设置一般发生在AddService后面,server启动前,当设置失败时可能时对应method不存在。
当method级别和server级别的max_concurrency都被设置时,先检查server级别再检查method级别。
ServerOptions.internal_port:设置内部端口,设为一个仅允许内网访问的端口(注意从外部访问内部端口,可能会返回内部server地址)
TLS(thread-local storage):其中之一,为了缓存频繁访问的对象以避免反复创建。另一种则是为了在全局函数间隐式传递状态。
session-local:session-local data与一次server端RPC绑定,从进了service回调开始,到调用server端的done结束,不管该service是否同步还是异步处理(设置ServerOptions.session_local_data_factory后访问Controller.session_local_data即可获得session data)
server-thread-local:server-thread-loca与一次service回调绑定,从进service回调开始,到出service回调结束(与session-local的区别,session-local data得从server端的Controller获取,server-thread-local可以在任意函数中获得,只要这个函数直接或间接地运行在server线程中。当同步时基本没差别,session需要Controller创建,后者调用brpc::thread_local_data(),当异步时,且需要在done->Run()中访问数据,这时只能用到session-local,因为server-thread-local在service回调外已经失效了)
bthread-local:bthread_key_create,bthread_key_destroy,bthread_getspecific,bthread_setpecific等函数。由于brpc会为每个请求建立一个bthread,server中的thread-loca行为特殊:一个server创建的bthread在退出时并不删除bthread-local,而是返回server的一个pool,以被其他的bthread复用,这就可以避免bthread-loca随着bthread的创建和退出而不停的构造和析构。