首页 > 其他分享 >GO中GRPC

GO中GRPC

时间:2024-08-25 13:48:15浏览次数:6  
标签:service GRPC gRPC SayHello go GO HelloRequest grpc

什么是GRPC

gRPC是一款语言中立、平台中立、开源的远程过程调用系统,gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用。

数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml, json,protobuf等
gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制。在学习gRPC之前,需要先了解protocol buffers

基础使用

依赖安装

安装一个对应的go插件

brew install protoc-gen-go-grpc
brew install protobuf
go get google.golang.org/grpc

Protobuf文件

定义对应的一个中间文件

// 声明版本
syntax = "proto3";
//option go_package = "path;name" path表示生成go的存放地址,自动生成目录,name表示go文件所属包名
option go_package = ".;service";

//服务方法,接受客户端参数,返回服务端响应
service SayHello {
  rpc SayHello(HelloRequest) returns (HelloResponse) {}
}

//类似结构体
message HelloRequest {
  string username = 1;
  int64 code = 2;
}

message HelloResponse {
  string responseMsg = 1;
}

使用命令生成对应的go文件

protoc --go_out=./  ./hello.proto
protoc --go-grpc_out=./ ./hello.proto 

服务端代码

package main  
  
import (  
    "context"  
    "fmt"    "google.golang.org/grpc"    "google.golang.org/grpc/reflection"    "log"    "net"    "rpc_project/service"    "strconv")  
  
type server struct {  
    service.UnimplementedSayHelloServer  
}  
  
func (s *server) SayHello(ctx context.Context, req *service.HelloRequest) (*service.HelloResponse, error) {  
    fmt.Println("recv from " + req.Username)  
    return &service.HelloResponse{ResponseMsg: "hello " + req.Username + "\nyour code is: " + strconv.Itoa(int(req.Code))}, nil  
}  
func main() {  
    lis, err := net.Listen("tcp", ":2333")  
    if err != nil {  
       log.Fatalf("failed to listen: %v", err)  
    }  
    grpcServer := grpc.NewServer()  
    service.RegisterSayHelloServer(grpcServer, &server{})  
    reflection.Register(grpcServer)  
    fmt.Println("Listening on port 2333...")  
    grpcServer.Serve(lis)  
  
}

客户端代码

package main  
  
import (  
    "clinet/service"  
    "context"    "fmt"    "google.golang.org/grpc"    "google.golang.org/grpc/credentials/insecure")  
  
func main() {  
    conn, err := grpc.Dial("127.0.0.1:2333", grpc.WithTransportCredentials(insecure.NewCredentials()))  
    if err != nil {  
       return  
    }  
    defer conn.Close()  
  
    client := service.NewSayHelloClient(conn)  
    resp, _ := client.SayHello(context.Background(), &service.HelloRequest{  
       Username: "qqw",  
       Code:     3377,  
    })  
  
    fmt.Println(resp.GetResponseMsg())  
}

服务端

方法增强

gRPC 插件会为服务端和客户端生成不同的接口

type SayHelloClient interface {  
    SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error)  
}

type SayHelloServer interface {  
    SayHello(context.Context, *HelloRequest) (*HelloResponse, error)  
    mustEmbedUnimplementedSayHelloServer()  
}

基于服务端的 SayHelloServer接口可以重新实现 SayHellol服务:

func (s *server) SayHello(ctx context.Context, req *service.HelloRequest) (*service.HelloResponse, error) {  
    fmt.Println("recv from " + req.Username)  
    return &service.HelloResponse{ResponseMsg: "hello " + req.Username + "\nyour code is: " + strconv.Itoa(int(req.Code))}, nil  
}

这里就对原本的SayHello方法进行了一个对应的增强。

服务创建

gRPC 服务的启动流程和标准库的 RPC 服务启动流程类似。

func main() {  
    lis, err := net.Listen("tcp", ":2333")  
    if err != nil {  
       log.Fatalf("failed to listen: %v", err)  
    }  //创建一个 TCP 监听器,它将监听 2333 端口上的传入连接。
    grpcServer := grpc.NewServer()  //创建一个新的 gRPC 服务器实例
    service.RegisterSayHelloServer(grpcServer, &server{})  //将 SayHello 服务的实现注册到 gRPC 服务器上
    reflection.Register(grpcServer)  //启用了 gRPC 服务器反射功能,允许客户端检查服务器上可用的服务和方法。
    fmt.Println("Listening on port 2333...")  //启动 gRPC 服务器并阻塞,等待传入的连接。服务器将处理传入的请求,并将它们转发给注册的 SayHelloServer 实现。
    grpcServer.Serve(lis)  
  
}

客户端

func main() {
	// 创建一个到 gRPC 服务器的不安全连接
	conn, err := grpc.Dial("127.0.0.1:2333", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		// 如果连接失败,直接返回
		return
	}
	defer conn.Close() // 程序退出时关闭连接

	// 创建 SayHello 服务的客户端
	client := service.NewSayHelloClient(conn)

	// 创建一个 HelloRequest 并发送给服务器
	resp, _ := client.SayHello(context.Background(), &service.HelloRequest{
		Username: "qqw",
		Code:     3377,
	})

	// 打印服务器返回的响应消息
	fmt.Println(resp.GetResponseMsg())
}

连接凭证

grpc.WithTransportCredentials 是一个 gRPC 连接选项,用于指定连接的安全凭证。它是用于配置 gRPC 客户端与服务器之间的安全通信的重要功能。

conn, err := grpc.Dial("127.0.0.1:2333", grpc.WithTransportCredentials(insecure.NewCredentials()))

这里我们使用insecure.NewCredentials() 返回一个不提供任何安全凭证的 gRPC 凭证。

方法调用

client := service.NewSayHelloClient(conn)  
resp, _ := client.SayHello(context.Background(), &service.HelloRequest{  
    Username: "qqw",  
    Code:     3377,  
})

其中HelloRequest 和client.SayHello均为Protocol Buffers 定义的消息类型。

参考文章

https://mszlu.com/grpc/01/01.html#_4-2-实例
https://blog.xmcve.com/2023/03/23/GRPC学习/#title-7

标签:service,GRPC,gRPC,SayHello,go,GO,HelloRequest,grpc
From: https://www.cnblogs.com/Ho1dF0rward/p/18378889

相关文章

  • golang mutex原理
    最近面试遇到问锁的问题,答得不是很好,重新做一下总结梳理 go中的sync包提供了两种锁的类型,分别是互斥锁sync.Mutex和读写锁sync.RWMutex,这两种锁都属于悲观锁饥饿模式与正常模式在下面的内容会经常涉及到一个概念,饥饿模式,这里先简单说一下1.正常模式(非公平锁)正常模式下,所......
  • 计算机毕业设计django+vue共享自习室系统【开题+程序+论文】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着社会对终身学习和自我提升需求的日益增长,共享自习室作为一种新兴的学习空间模式,逐渐受到广大学习者的青睐。然而,传统的自习室管理方式......
  • 计算机毕业设计django+vue基于Android的婚物语APP的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分,特别是在婚嫁领域,移动应用以其便捷性、实时性和个性化服务的......
  • Go使用crypto实现AES和RSA加密处理
    前言在Go语言中,实现数据加密可以通过使用标准库中的crypto包以及encoding/base64等包来完成。这里,我们将重点阐述如何在Go语言中使用这些库来实现对称加密和非对称加密的详细逻辑。一、对称加密对称加密是指加密和解密使用同一密钥的加密方式。常用的对称加密算法有AES、......
  • Centos 7.9安装go
    1.go文件的下载:Downloads-TheGoProgrammingLanguage 2.放入linux系统中,并在/usr/local/目录下解压文件#cd/usr/local/#tar-zxvfgo1.19.linux-amd64.tar.gz#解压文件3.更改环境变量:#vim/etc/profileexportGOROOT=/usr/local/go/exportGOPATH=/home/goexpor......
  • Writing your first Django app, part 1
    使用以下代码查看django的版本信息。$python-mdjango--version进入项目文件夹创建一个名为mysite的django项目。$django-adminstartprojectmysite会创建一个项目目录mysite/manage.pymysite/__init__.pysettings.pyurls.......
  • go免杀学习记录
    题记最近剑来动漫上线,虽然观感不如我的预期,感觉节奏过快。但是也是一种进步了,愿各位道友都能找到自己的宁姚。"我喜欢的姑娘啊,她眉如远山,浩然天下所有好看的山,好看的水,加起来都不如她。她睫毛轻颤的模样,落在了我的心里。那万年不动的剑气长城,都好像轻轻晃了晃。"  ......
  • Study Plan For Algorithms - Part11
    1.合并两个有序链表题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。classSolution:defmergeTwoLists(self,list1:Optional[ListNode],list2:Option......
  • 勇夺三项SOTA!北航&爱诗科技联合发布灵活高效可控视频生成方法TrackGo!
    论文链接:https://arxiv.org/pdf/2408.11475项目链接:https://zhtjtcz.github.io/TrackGo-Page/★亮点直击本文引入了一种新颖的运动可控视频生成方法,称为TrackGo。该方法为用户提供了一种灵活的运动控制机制,通过结合masks和箭头,实现了在复杂场景中的精确操控,包......
  • Go 编程-mysql数据库操作
    一、环境准备在Go语言中连接MySQL数据库通常使用database/sql包配合一个MySQL驱动,比如github.com/go-sql-driver/mysql安装github.com/go-sql-driver/mysqlgogetgithub.com/go-sql-driver/mysql二、连接及增删改查packagemainimport( "database/sql" "fmt" "log"......