哪个网站可以做经济模拟题,杭州中小企业网站建设,域名安全检测中心,手机如何创建公众号承上启下
介绍完了Go怎么实现RESTFul api#xff0c;不可避免的#xff0c;今天必须得整一下rpc这个概念。rpc是什么呢#xff0c;很多人都想把rpc和http一起对比#xff0c;但是他们不是一个概念。RPC是一种思想#xff0c;可以基于tcp#xff0c;可以基于udp也可以基于…承上启下
介绍完了Go怎么实现RESTFul api不可避免的今天必须得整一下rpc这个概念。rpc是什么呢很多人都想把rpc和http一起对比但是他们不是一个概念。RPC是一种思想可以基于tcp可以基于udp也可以基于http。我们详细学习下把。
开始学习
RPC听起来是不是有点像“人品差”别误会这里的RPC可是“远程过程调用”的缩写它可是一个让我们的代码能够隔空打牛、远程操控的神奇技能
什么是RPC
简单来说RPC就是让你在本地调用一个函数却能够远程执行另一台机器上的代码。想象一下你在家里的沙发上按了一个遥控器结果远在千里之外的咖啡机开始给你煮咖啡是不是很神奇RPC就是这么个神奇的“遥控器”。
Go如何实现RPC
在Go语言中实现RPC就跟泡方便面一样简单。以下是泡面的步骤
准备调料包定义服务首先你需要定义一个服务也就是你的远程函数。这就像把调料包准备好等着加水泡。
type HelloService struct{}func (p *HelloService) Hello(request string, reply *string) error {*reply hello, requestreturn nil
}烧开水注册服务然后你需要把服务注册到RPC服务器上就像把调料包放进烧开的水里。
rpc.RegisterName(HelloService, new(HelloService))泡方便面启动服务器接下来启动RPC服务器等待客户端调用。
lis, _ : net.Listen(tcp, :1234)
rpc.Accept(lis)品尝美味调用服务最后客户端就可以远程调用你的服务了就像品尝美味的方便面。
client, _ : rpc.Dial(tcp, localhost:1234)
var reply string
err : client.Call(HelloService.Hello, world, reply)grpc库的使用
说到RPC怎能不提/grpc/这个库呢它可是RPC界的“老干妈”让RPC变得更加美味。
gRPC这个由Google开发的高性能、开源的RPC框架。gRPC基于HTTP/2协议使用Protocol Buffers作为接口定义语言支持多种编程语言。以下是gRPC的详细介绍
1. gRPC的特点
多语言支持gRPC支持多种编程语言包括C、Java、Python、Go、Ruby、C#、Node.js等。基于HTTP/2gRPC使用HTTP/2作为传输协议支持双向流、流控、头部压缩等特性使得通信更加高效。协议缓冲Protocol BuffersgRPC使用Protocol Buffers来定义服务接口和消息格式它是一种轻量级的数据交换格式可以跨平台和语言使用。同步和异步gRPC客户端提供了同步和异步的API可以根据需要选择不同的调用方式。负载均衡gRPC原生支持负载均衡可以通过名称解析来发现服务实例。认证gRPC支持多种认证机制如SSL/TLS、JWT等。
2. gRPC的工作流程 定义服务使用Protocol Buffers定义服务接口和消息类型。 syntax proto3;service YourService {rpc YourMethod (YourRequest) returns (YourResponse);
}message YourRequest {// request fields
}message YourResponse {// response fields
}生成代码使用Protocol Buffers编译器protoc生成服务端和客户端的代码。 protoc --go_outpluginsgrpc:. your_service.proto实现服务端实现生成的服务端接口。 type server struct{}func (s *server) YourMethod(ctx context.Context, in *pb.YourRequest) (*pb.YourResponse, error) {// implement the method
}func main() {lis, err : net.Listen(tcp, :50051)if err ! nil {log.Fatalf(failed to listen: %v, err)}s : grpc.NewServer()pb.RegisterYourServiceServer(s, server{})if err : s.Serve(lis); err ! nil {log.Fatalf(failed to serve: %v, err)}
}实现客户端使用生成的客户端代码调用服务。 conn, err : grpc.Dial(localhost:50051, grpc.WithInsecure(), grpc.WithBlock())
if err ! nil {log.Fatalf(did not connect: %v, err)
}
defer conn.Close()
c : pb.NewYourServiceClient(conn)ctx, cancel : context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err : c.YourMethod(ctx, pb.YourRequest{})
if err ! nil {log.Fatalf(could not greet: %v, err)
}
log.Printf(Response: %s, r.GetField())3. gRPC的四种调用类型
简单RPC客户端发送一个请求到服务器并等待响应就像普通的函数调用。服务器流式RPC客户端发送一个请求到服务器并获取一个流来读取一系列消息。客户端读取直到没有更多的消息。客户端流式RPC客户端写入一系列消息并发送到服务器一旦客户端完成消息写入它等待服务器读取这些消息并返回一个响应。双向流式RPC双方使用读写流发送一系列消息。两个流独立操作因此客户端和服务器可以按照自己喜欢的顺序读写。
4. gRPC的安全性和认证
gRPC支持以下安全性措施
传输安全性通过TLS/SSL来保证传输过程中的数据加密。认证gRPC支持基于Token的认证机制如OAuth 2.0。权限和审计可以通过中间件来添加权限检查和审计日志。
5. gRPC的负载均衡
gRPC支持以下负载均衡策略
名称解析gRPC客户端可以使用名称解析来发现服务实例。轮询简单的轮询策略将请求轮流分配到不同的服务器。基于权重的轮询根据服务器的权重分配请求。故障转移在主服务器故障时请求会被转发到备用服务器。
restful与rpc
通过以上的介绍我们都了解RPC远程过程调用和HTTP超文本传输协议是完全不同的概念我们反倒是可以跟Restful API进行对比
RPC与HTTP的区别
1. 目的与设计哲学
RPC旨在实现远程函数调用让远程服务调用看起来像本地函数调用一样简单。HTTP是一种用于传输超媒体文档的应用层协议主要用于Web浏览器和服务器之间的通信。
2. 通信方式
RPC通常采用二进制协议数据传输效率较高。HTTP采用文本格式如JSON、XML可读性较好但传输效率相对较低。
3. 传输协议
RPC可以使用多种传输协议如TCP、UDP甚至HTTP。HTTP默认使用HTTP/1.1或HTTP/2基于TCP。
4. 性能
RPC通常提供更低的延迟和更高的吞吐量因为它通常使用更高效的序列化/反序列化机制。HTTP由于HTTP协议的文本特性性能通常不如RPC。
5. 客户端和服务端实现
RPC需要特定的客户端和服务端库来处理消息的序列化和反序列化。HTTP可以直接使用标准的HTTP客户端和服务器如Web浏览器和Web服务器。
RPC与RESTful API的优缺点
RPC的优点
性能通常RPC框架提供更高效的序列化/反序列化机制如Protocol Buffers或MessagePack性能更优。简单性RPC让远程调用看起来像本地函数调用开发体验更接近于本地编程。强类型许多RPC框架支持静态类型有助于在编译时发现错误。
RPC的缺点
耦合性RPC可能导致客户端和服务端之间的强耦合因为它们需要共享接口定义。标准化相比RESTful APIRPC的标准化程度较低不同框架之间可能不兼容。
RESTful API的优点
无状态RESTful API是无状态的有助于构建可伸缩的系统。标准化基于HTTP协议有广泛的工具和库支持。可缓存HTTP的缓存机制可以用于优化性能。
RESTful API的缺点
性能由于HTTP的文本特性性能可能不如二进制的RPC协议。复杂性对于复杂的操作RESTful API可能需要多个请求来完成任务而RPC可以一个调用完成。
总的来说RPC和RESTful API各有适用场景。RPC更适合内部服务之间的通信特别是对性能有高要求的场景。而RESTful API更适合面向资源的Web服务尤其是需要被Web浏览器直接访问的场景。选择哪种协议取决于具体的应用需求、性能要求和开发团队的偏好。