电脑显示rpc服务器不可用自行解决

一、RPC简介
远程过程调用(Remote Procedure Call,RPC)是一种计算机通信协议,允许一台计算机的程序调用另一台计算机的子程序,就像调用本地程序一样。这种调用无需程序员为交互作用编写额外的代码。如果采用面向对象编程,远程过程调用也可以称为远程调用或远程方法调用。
在RPC中,因为涉及的函数可能位于非常远的地方,甚至使用完全不同的语言,语言就成了沟通的障碍。而Protobuf(Protocol Buffers)因其支持多种语言并方便描述服务接口(即方法列表)的特性,非常适合作为RPC世界的接流语言。
二、Go语言中的RPC
1. net/rpc库
Go语言官方的net/rpc库使用encoding/gob进行数据的编解码。它支持TCP和HTTP数据传输方式。但由于其他语言不支持gob编解码方式,net/rpc库默认只支持Go语言开发的服务器与客户端之间的交互。
2. net/rpc/jsonrpc库
官方还提供了net/rpc/jsonrpc库实现RPC方法,它采用JSON进行数据编解码,因此支持跨语言调用。目前jsonrpc库主要基于TCP协议实现,不支持HTTP传输方式。
本文将介绍net/rpc库的使用,下一篇文章将介绍net/rpc/jsonrpc库的使用。
三、基于TCP连接的RPC
我们先演示基于TCP的RPC调用,然后再演示基于HTTP连接的RPC调用。
在Go语言中,使用RPC时,需要进行以下步骤:
1. 注册RPC服务:使用`rpc.Register()`函数注册服务。
2. 创建服务器:指定的端口,等待客户端连接。
3. 提供RPC服务:通过`rpc.ServeConn()`为客户端提供RPC服务。
客户端需要以下步骤:
1. 拨号RPC服务:使用`rpc.Dial()`连接RPC服务器。
2. 调用RPC方法:使用`Client.Call()`调用具体的RPC方法。
四、更安全的RPC接口
在涉及RPC的应用中,至少有三种角色:服务端实现RPC方法的开发人员、客户端调用RPC方法的人员以及设计服务端和客户端RPC接口规范的设计人员。
为了更有利于后期的维护和工作切割,我们需要设计更安全的RPC接口。这包括:
1. 定义服务的名字,为了避免名字冲突,可以在RPC服务的名字中加入包路径前缀。
2. 定义接口,当注册服务时,要求传入的对象满足定义的接口。
3. 使用`RegisterHelloService()`函数注册RPC服务,这样不仅可以避免命名服务名称的工作,同时也保证了传入的服务对象满足了RPC接口的定义。
4. 在服务端代码中添加了一个for循环,使得服务端可以接收多个客户端的连接。
客户端代码也进行相应的重构,封装了客户端类型,并简化了调用方式。
五、基于HTTP连接的RPC
除了基于TCP的RPC,我们还可以基于HTTP连接实现RPC调用。在Go语言中,这需要将RPC服务绑定到HTTP协议上,并使用`rpc.HandleHTTP()`函数注册到默认的HTTP多路复用器上。然后,使用`http.ListenAndServe()`函数指定的端口并提供服务。
客户端可以通过`rpc.DialHTTP()`函数与基于HTTP的RPC服务端进行连接,并调用其方法。
给出了一个简单的示例,其中服务端提供矩形计算的RPC服务,客户端通过HTTP连接调用这些服务。
