• Golang Gin框架搭建项目(六)Grpc服务


    1、安装编译器:

    Releases · protocolbuffers/protobuf · GitHub下载地址 :Releases · protocolbuffers/protobuf · GitHub

    windows电脑下载:protoc-21.2-win64.zip

    解压后将bin目录添加到环境变量中,GoLand不生效就重启软件:

     2、下载protoc-gen-go和grpc包:

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

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

    go get google.golang.org/grpc

    3、编写一个proto文件:GrpcDemo.proto

    1. syntax = "proto3";
    2. option go_package = "./serviceGrpc/;serviceGrpc";//存放目录和包名
    3. package demo;
    4. service DemoService {
    5. rpc UnaryCall (DemoRequest) returns (DemoReply);
    6. // rpc StreamingFromServer (Request) returns (stream Reply);
    7. // rpc StreamingFromClient (stream Request) returns (Reply);
    8. // rpc StreamingBothWays (stream Request) returns (stream Reply);
    9. }
    10. message DemoRequest {
    11. string json = 1;
    12. };
    13. message DemoReply {
    14. string message = 1;
    15. }

    4、根据proto文件生成go代码文件:

    #将./protos/*.proto匹配到的proto文件生成输出到当前目录下的serviceGrpc文件夹下(与proto文件中的option go_package对应)。

    protoc --go_out=. --go-grpc_out=. ./protos/*.proto  


     

     5、Grpc服务端:

    创建一个业务处理文件:MyDemoServer.go

    1. package serviceGrpc
    2. import (
    3. "context"
    4. "fmt"
    5. )
    6. type MyDemoServer struct {
    7. UnimplementedDemoServer
    8. }
    9. func (s *MyDemoServer) UnaryCall(ctx context.Context, req *DemoRequest) (*DemoReply, error) {
    10. fmt.Println("request:", req.Json)
    11. return &DemoReply{Message: "Hello " + req.Json}, nil
    12. }

     

    入口main.go 同时使用gin和grpc:

            单独开一个协程去启动grpc,也看情况可以独立使用gin或grpc。

    1. func main() {
    2. go useGrpc()
    3. useGin()
    4. }
    5. func useGin() {
    6. conf, err := config.ParseConfig("./config/app.json")
    7. if err != nil {
    8. panic("读取配置文件失败," + err.Error())
    9. }
    10. //fmt.Printf("conf:%#v\n", conf)
    11. utils.InitRedisUtil(conf.RedisConfig.Addr, conf.RedisConfig.Port, conf.RedisConfig.Password)
    12. utils.InitMySqlUtil(conf.Database)
    13. //创建一个默认的路由引擎
    14. engine := gin.Default()
    15. routers.RegisterRouter(engine)
    16. engine.Run(":9090")
    17. }
    18. func useGrpc() {
    19. const port = ":9091" // 服务器端口
    20. listen, err := net.Listen("tcp", port)
    21. if err != nil {
    22. fmt.Printf("failed to listen: %v", err)
    23. return
    24. }
    25. s := grpc.NewServer()
    26. serviceGrpc.RegisterDemoServer(s, &serviceGrpc.MyDemoServer{})
    27. //reflection.Register(s)
    28. defer func() {
    29. s.Stop()
    30. listen.Close()
    31. }()
    32. err = s.Serve(listen)
    33. if err != nil {
    34. fmt.Printf("failed to server: %v", err)
    35. return
    36. }
    37. }

     6、使用postman模拟请求

  • 相关阅读:
    蓝桥杯 Java 青蛙过河
    Ubuntu下配置hive
    用Tinyproxy搭建自己的proxy server
    为什么iphone邮箱里已发送邮件是空的
    有限小数,进制转换,思维
    用动态表动态生成DEV Gridview
    Spring Security 注册过滤器关键点与最佳实践
    Gitlab配置pre-receive钩子拦截检查提交日志是否满足规范
    浏览器渲染机制
    CU-Mamba:具有通道学习功能的选择性状态空间模型用于图像恢复
  • 原文地址:https://blog.csdn.net/qq_26900081/article/details/125533745