grpc的简单模式

本文简要介绍了gRPC的简单模式,该模式下服务之间无法并发执行。内容包括proto文件中生成的代码示例,以及服务端和客户端的交互过程,特别是客户端如何通过拨号、发送HelloRequest消息并接收HelloReply响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grpc的简单模式

简单模式简介

简单模式:

  • 就是无法并发执行的模式,我们只能按顺序的发和接收,服务与服务直接之间无法并发的执行与访问,这个的使用其实我的上一篇文章《grpc.pb.go新版本,的外部接口调用实现问题及解决方式》中其实就是使用的基本模式进行演示的。这里我们简单的介绍一下。
//这是我们定义好的proto文件
syntax = "proto3";
option go_package = ".;proto-bak";

service Greeter { rpc SayHello(HelloRequest) returns (HelloReply);//这是我们简单定义的服务端处理业务逻辑的方法
}

message HelloRequest{
  string name = 1;
}

message  HelloReply{
  string message = 1;
}
  • proto文件中生成的部分代码
// GreeterServer is the server API for Greeter service.
// All implementations must embed UnimplementedGreeterServer
// for forward compatibility
type GreeterServer interface {//protoc帮我们定义好的调用接口,我们自己的server只需要实现里面的两个方法即可
	SayHello(context.Context, *HelloRequest) (*HelloReply, error)
	MustEmbedUnimplementedGreeterServer()
}

// UnimplementedGreeterServer must be embedded to have forward compatible implementations.
type UnimplementedGreeterServer struct {
}

func (*UnimplementedGreeterServer) SayHello(context.Context, *HelloRequest) (*HelloReply, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
}
func (*UnimplementedGreeterServer) MustEmbedUnimplementedGreeterServer() {}

func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {//注册服务
	s.RegisterService(&_Greeter_serviceDesc, srv)
}
  • 服务端:
type Server struct {//实现了protoc生成go文件中的GreeterServer interface
}

func (s *Server) MustEmbedUnimplementedGreeterServer() {
	//TODO implement me
	panic("implement me")
}

func (s *Server) SayHello(ctx context.Context, request *proto.HelloRequest) (*proto.HelloReply, error) { // 所以我们这里实现了SayHello方法,并在里面写自己的逻辑
	return &proto.HelloReply{
		Message: "hello " + request.Name,
	}, nil
}

func main() {
	//1. 通过grpc新建一个服务
	g := grpc.NewServer()
	//2. 把服务注册上去
	proto.RegisterGreeterServer(g, &Server{})

	//3. 启动服务
	lis, err := net.Listen("tcp", "0.0.0.0:8088")
	if err != nil {
		panic("failed to listen: " + err.Error())
	}

	err = g.Serve(lis) //把我们监听的端口和服务绑定在一起(并且该函每收到一个请求,就会发起一个协程来处理,不会只接收一个请求就挂逼)
	if err != nil {
		panic("failed to start grpc:" + err.Error())
	}
}
  • 客户端:这里我们客户端没有什么逻辑,所以我们直接通过拨号,建立连接,发起请求,然后携带上我们proto中定义好的message类型HelloRequest数据(Name:“LLL”)。向服务端发起请求。然后该方法会返回一个我们proto中定义好的message类型HelloReply数据,我们可以拿出里面的message数据。
func main() { //这是简单调用

	conn, err := grpc.Dial("127.0.0.1:8088", grpc.WithTransportCredentials(insecure.NewCredentials())) //现在我们可以用这一方法来实现
	//conn, err := grpc.Dial("127.0.0.1:8088", grpc.WithInsecure()) //这里会发现grpc的WithInsecure()方法已经弃用了,但是我们还可以使用
	if err != nil {
		panic("failed to get conn: " + err.Error())
	}
	defer conn.Close()                                                             //注意发起了连接就要即使关闭
	c := proto.NewGreeterClient(conn)                                              //通过连接组合我们客户端的连接对象
	res, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "LLL"}) //发起请求
	if err != nil {
		panic("failed to request:" + err.Error())
	}
	fmt.Println(res.Message)

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值