golang使用grpc

news/2024/9/29 8:18:00

(1) 安装protoc,这是通用的,所有语言都需要

​# 下载网址:

https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip

解压后将将protoc的bin目录添加到环境变量中  如果不会添加环境变量请百度

运行 protoc --version 查看是否已经添加到环境变量

 

(2)go install github.com/golang/protobuf/protoc-gen-go  我好像没有用到

(3) 新建golang项目 我使用的是goland  go版本用1.21  刚开始用1.16会运行不了

在项目新建文件夹 grpc_proto   在此文件夹下编写一个 hello.proto

syntax = "proto3"; // 指定proto版本
package hello_grpc;     // 指定默认包名// 指定golang包名
option go_package = "/hello_grpc";//定义rpc服务
service HelloService {// 定义函数
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}// HelloRequest 请求内容
message HelloRequest {string name = 1;string message = 2;
}// HelloResponse 响应内容
message HelloResponse{string name = 1;string message = 2;
}

(4) 在grpc_proto 文件夹下运行 protoc -I . --go_out=plugins=grpc:. .\hello.proto  会在此文件夹下生成一个 

hello_grpc 文件夹  hello.grpc文件夹下会有 hello.pb.go 
(5)编写客户端和服务端代码 到项目根目录下 go mod tidy 拉取依赖包
编写server.go
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/grpclog""grpc/grpc_proto/hello_grpc""net"
)// HelloServer 得有一个结构体,需要实现这个服务的全部方法,叫什么名字不重要
type HelloServer struct {
}func (HelloServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (*hello_grpc.HelloResponse, error) {fmt.Println("入参:", request.Name, request.Message)return &hello_grpc.HelloResponse{Name:    "server",Message: "hello " + request.Name,}, nil
}func main() {// 监听端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 创建一个gRPC服务器实例。s := grpc.NewServer()server := HelloServer{}// 将server结构体注册为gRPC服务。hello_grpc.RegisterHelloServiceServer(s, &server)fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen)
}

编写client.go

package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""grpc/grpc_proto/hello_grpc""log"
)func main() {addr := ":8080"// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。// 此处使用不安全的证书来实现 SSL/TLS 连接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))}defer conn.Close()// 初始化客户端client := hello_grpc.NewHelloServiceClient(conn)result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{Name:    "client",Message: "hello",})fmt.Println(result, err)
}

分别运行 go run server.go        go run client.go

 

 成功  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/49010.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

一键掌控,智慧升级:度假酒店可视化管理解决方案全解析

传统的酒店管理模式往往依赖于人工巡查、纸质记录等方式,不仅效率低下,而且容易出现疏漏。而可视化管理解决方案则通过运用先进的信息技术和物联网设备,将酒店内部的各个环节实时呈现在管理者眼前,实现了对酒店运营全过程的实时监控和数据分析。在繁忙的都市生活中,度假酒…

10. Mybatis 参数处理

环境准备: 创建模块 ,引入相关依赖 和 配置文件 创建数据库表:t_student ​​ 向数据库表中填充数据 ​​创建pojo类 :student public class Student {private Long id;private String name;private Integer age;private Double height;private Date birth;private Charact…

【C++】【MFC】MFC多文档框架

相较于单文档架构,多文档基本架构则是有起码两个框架窗口,与其相对应的也会有两个文档类进行数据管理。 参与架构的类:CMDIFrameWnd / CMDIChildWnd / CWinApp / CView / CDocument 需要用的类:CDocTemplate(文档模板类)|-> CMultiDocTemplate(多文档模板类)CDocMan…

网络物理隔离后 可以用保密U盘进行数据安全交换吗?

企业用的保密U盘通常被设计用于存储和传输敏感信息,以确保数据的安全和保密性。在网络之间实现了物理隔离后,使用保密U盘进行数据安全交换是一种常见的做法。物理隔离确保了两个网络之间的完全分离,因此使用保密U盘可以作为一种安全的手段来在这两个网络之间传输数据。 以下…

CTH: 谁帮我切开这个蛋糕???

$\quad $ 看到CTH立马就开始做了好吧,很适合当做入门题。$\quad $ 首先定义 \(f[i]\) 表示进行到第 \(i\) 位时的答案数,\(bit\) 数组表示 \(01\) 序列。那么当 \(bit[i]\) 为 \(1\) 时,有 \[f[i]=\Sigma_{j=i+1}^{n+1} f[j] \]$\quad $ 至于为什么循环到 \(n+1\) ,循环到第…

MyBatis针对String类型的数字if标签失效问题

需求描述: 大致场景是订单模块去接受流程模块发送的MQ消息,针对MQ消息发送的是一个实体类,该实体类中有一个String类型的字段,用于判断当前业务状态,1 表示 审核中 2 表示 已审核 等。订单模块根据这个状态去修改自身状态的信息可以看到这里有一个If标签,用于判断这个ev…

业务和IT部门都喜欢的文件摆渡设备是什么样的?

网络隔离技术作为网络安全和数据安全的重要保障手段被广泛应用到各个行业领域,国家出台了相关法律法规,对“网络隔离”和“数据交换安全”提出了更明确、更规范的要求,尤其是对于政府、教育、医疗、能源、航空航天、金融等行业,国家出台了更细的行业性法规,指导网络和数据…

颠覆传统编程:用ChatGPT十倍提升生产力

我们即将见证一个新的时代!这是最好的时代,也是最坏的时代!我们即将见证一个新的时代!这是最好的时代,也是最坏的时代!需求背景背景:平时会编写博客,并且会把这个博客上传到github上,然后自己买一个域名挂到github上。 我平时编写的博客会有一些图片来辅助说明的,写完…