grpc介绍:
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
安装与使用:
从 Releases · protocolbuffers/protobuf · GitHub下载适合你平台的预编译好的二进制文件(protoc-<version>-<platform>.zip),然后将压缩包内的 /bin/protoc 文件添加到环境变量即可
grpc使用
首先建一个 Go 的工程:
go mod init grpcDemo
然后导入 gRPC 包:
go get google.golang.org/grpc@latest
.......这里篇幅太长 小编就不写了 配置比较简单 大家自己配置就可以了
rpc概念:
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。 通信框架:MINA 和 Netty。 Facebook 的 Thrift、Twitter 的 Finagle 等。
重点介绍三种:
Dubbo:国内最早开源的 RPC 框架,极为出名,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。协议和序列化框架都可以插拔是极其鲜明的特色。
gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。
Thrift:最初是由 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说需要学习特定领域语言这个特性,还是有一定成本的。
2.1 Simple RPC
服务端:
package main
import (
"context"
"grpcDemo/pb"
"log"
"net"
"google.golang.org/grpc"
)
type server struct {
// 继承 protoc-gen-go-grpc 生成的服务端代码
pb.UnimplementedGreeterServer
}
// SimplePRC 服务端代码
func (s *server) SimpleRPC(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
log.Println("client call simpleRPC...")
log.Println(in)
return &pb.HelloResponse{Reply: "Hello " + in.Name}, nil
}
func main() {
// 监听本地 5678 端口
listen, err := net.Listen("tcp", ":5678")
if err != nil {
log.Fatal(err)
return
}
// 创建 gRPC 服务器
s := grpc.NewServer()
// 将实现的接口注册进 gRPC 服务器
pb.RegisterGreeterServer(s, &server{})
log.Println("gRPC server starts running...")
// 启动 gRPC 服务器
err = s.Serve(listen)
if err != nil {
log.Fatal(err)
return
}
}
客户端:
package main
import (
"context"
"grpcDemo/pb"
"io"
"log"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func simpleRPC(c pb.GreeterClient) {
ctx := context.Background()
// 调用服务端 SimpleRPC 并获取响应
reply, err := c.SimpleRPC(ctx, &pb.HelloRequest{Name: "simpleRPC"})
if err != nil {
log.Fatal(err)
}
log.Println(reply.GetReply())
}
func main() {
// 连接服务端,因为我们没有SSL证书,因此这里需要禁用安全传输
dial, err := grpc.Dial("127.0.0.1:5678", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
return
}
defer dial.Close()
conn := pb.NewGreeterClient(dial)
simpleRPC(conn)
}
总结:本篇文章主要讲述了rpc和grpc的使用和概念 rpc和grpc都是网络高性能服务器的重要步骤 喜欢的朋友可以深入了解
好了 本篇文章就到这里了 大家再见