Hprose 2.0 for Golang 支持多种底层网络协议绑定的服务器,比如:HTTP 服务器,Socket 服务器和 WebSocket 服务器。其中 HTTP 服务器支持在 HTTP、HTTPS 协议上通讯。Socket 服务器支持在 TCP、Unix Socket 协议上通讯,并且支持全双工和半双工两种模式。WebSocket 服务器支持在 ws、wss 协议上通讯。尽管支持这么多不同的底层网络协议,但除了在对涉及到底层网络协议的参数设置和服务启动上有所不同以外,其它的用法都完全相同。因此,我们在下面介绍 Hprose 服务器的功能时,若未涉及到底层网络协议的区别,就以 HTTP 服务器为例来进行说明。
Server 与 Service 的区别
hprose 的服务器端的实现,分为 Service 和 Server 两部分。其中 Service 部分是核心功能,包括接收请求,处理请求,服务调用,返回应答等整个服务的处理流程。而 Server 则主要负责启动和关闭服务器,它包括设置服务地址和端口,设置服务器启动选项,启动服务器,接收来自客户端的连接然后传给 Service 进行处理。
hprose 没有为 HTTP/HTTPS 和 WebSocket 服务提供 Server 实现,只提供了 Service 实现。
因为使用 Service 可以更方便、更灵活的跟已有的库和框架结合,例如:net/http、fasthttp、gin、echo、iris 等。这些库和框架都提供了丰富的中间件,在这种情况下,只需要把 Service 作为这些库和框架的中间件来使用就可以了,在这种情况下,我们就不需要使用 Server 了。
对于 TCP 和 UnixSocket 服务,hprose 提供了一个默认的 Server 实现。当开发者没有什么特殊需求,只是希望启动一个独立的 hprose 服务器时,那使用 Server 就是一个最方便的选择了。
Server 部分的实现是很简单的,如果开发者希望把 hprose 服务结合到自己的某个服务器中去,而不是作为一个单独的服务器来运行,在这种情况下,直接使用 Service 就可以了。
HTTP\HTTPS 和 WebSocket 服务并没有单独实现 Server,而只是实现了 Service,所以,这些服务器的启动与关闭依赖于你所使用的 http 库或框架。我们举一个在 echo 框架下面如何发布服务的例子
首先建立我们的proto文件,文章源码在末尾
syntax = "proto3";
package helloworld;
option php_namespace = "Helloworld";
option php_metadata_namespace = "Helloworld";
option php_generic_services = true;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string message = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
生成go文件
protoc \
-Iapi/protobuf-spec \
--go_out=plugins=qrpc:pkg/helloworld \
api/protobuf-spec/helloworld.proto
通过echo框架启动一个server,设置端口
```
func initServer()*internal.Server{
s := internal.NewServer()
s.Echo.Pre(middleware.RemoveTrailingSlash())
s.Echo.Use(middleware.Recover())
}
func NewServer(opt ...ServerOption) *Server {
// parse options
opts := defaultServerOptions
for _, o := range opt {
o(&opts)
}
service := rpc.NewHTTPService()