一、Transport 传输
rpcx 可以通过 TCP、HTTP、UnixDomain、QUIC和KCP通信。你也可以使用http客户端通过网关或者http调用来访问rpcx服务。
TCP
这是最常用的通信方式。高性能易上手。可以使用TLS加密TCP流量。
Example: 101basic
服务端使用 tcp 做为网络名并且在注册中心注册了名为 serviceName/tcp@ipaddress:port
的服务。
s.Serve("tcp", *addr)
客户端可以这样访问服务:
d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "") xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, client.DefaultOption) defer xclient.Close()
HTTP Connect
你可以发送 HTTP CONNECT 方法给 rpcx 服务器。 Rpcx 服务器会劫持这个连接然后将它作为TCP连接来使用。 需要注意,客户端和服务端并不使用http请求/响应模型来通信,他们仍然使用二进制协议。
网络名称是 http, 它注册的格式是 serviceName/http@ipaddress:port。
HTTP Connect并不被推荐。 TCP是第一选择。
如果你想使用http 请求/响应 模型来访问服务,你应该使用网关或者http_invoke。
Unixdomain
网络名称是 unix。
Example: unix
QUIC
网络名称是 quic。
Example: quic
KCP
KCP 是一个快速并且可靠的ARQ协议。
网络名称是 kcp。
当你使用kcp的时候,你必须设置Timeout,利用timeout保持连接的检测。因为kcp-go本身不提供keepalive/heartbeat的功能,当服务器宕机重启的时候,原有的连接没有任何异常,只会hang住,我们只能依靠Timeout避免hang住。
Example: kcp
reuseport
网络名称是 reuseport。
Example: reuseport
它使用tcp协议并且在linux/uxix服务器上开启 SO_REUSEPORT
socket 选项。
TLS
Example: TLS
你可以在服务端配置 TLS:
func main() { flag.Parse() cert, err := tls.LoadX509KeyPair("server.pem", "server.key") if err != nil { log.Print(err) return } config := &tls.Config{Certificates: []tls.Certificate{cert}} s := server.NewServer(server.WithTLSConfig(config)) s.RegisterName("Arith", new(example.Arith), "") s.Serve("tcp", *addr) }
你可以在客户端设置 TLS:
func main() { flag.Parse() d := client.NewPeer2PeerDiscovery("tcp@"+*addr, "") option := client.DefaultOption conf := &tls.Config{ InsecureSkipVerify: true, } option.TLSConfig = conf xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d, option) defer xclient.Close() args := &example.Args{ A: 10, B: 20, } reply := &example.Reply{} err := xclient.Call(context.Background(), "Mul", args, reply) if err != nil { log.Fatalf("failed to call: %v", err) } log.Printf("%d * %d = %d", args.A, args.B, reply.C) }
注:官网地址:rpcx
例子均为官网示例