grpc使用教程

准备

复制代码
1,安装grpc
go get -u google.golang.org/grpc

2, 安装go语言protobuf生成器protoc-gen-go
go get -u google.golang.org/protobuf/cmd/protoc-gen-go

3, 通过下面连接,找到合适版本并安装protoc工具,如windows选择 protoc-3.19.5-win64.zip 
https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.5

注意: 将GOPATH下的bin目录以及protoc的bin目录配置在环境变量中否则会找不到相关命令

编写proto文件

复制代码
# server/proto/test.proto 文件
syntax = "proto3";

package test;
option go_package = "../proto";

service Greeter {
    rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string message = 1;
}

生成protobuf

复制代码
cd server/proto
protoc --proto_path=. --go_out=plugins=grpc:. *

编写服务端程序

复制代码
# server/main.go
package main

import (
	"context"
	"google.golang.org/grpc"
	"log"
	"net"
	pb "server/proto"
)

type server struct {
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
	return &pb.HelloResponse{
		Message: "hello " + in.Name,
	}, nil
}

func main() {
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		log.Fatal("net.Listen err", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})

	if err = s.Serve(listen); err != nil {
		log.Fatal("s.Serve err", err)
	}
}

编写客户端

复制代码
# 先将server/proto 目录复制到 client/proto

# client/main.go
package main

import (
	pb "client/proto"
	"context"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
	"net"
	"net/http"
)

type server struct {
	httpServer http.Server
}

func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == "/sayHello" {
	    _ = r.ParseForm()
		message := sayHello(r.Form.Get("name"))
		w.WriteHeader(http.StatusOK)
		w.Header().Set("Content-Type", "text/html")
		w.Write([]byte("<h1>" + message + "</h1>"))
	}
}

func sayHello(name string) string {
	conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal("连接失败:", err)
	}
	defer conn.Close()
	client := pb.NewGreeterClient(conn)

	resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatal("调用失败:", err)
	}
	return resp.GetMessage()
}

func main() {
	listen, err := net.Listen("tcp", ":80")
	if err != nil {
		log.Fatal("net.Listen err", err)
	}

	s := &server{}
	s.httpServer.Handler = s
	if err = s.httpServer.Serve(listen); err != nil {
		log.Fatal("httpServer.Serve err", err)
	}
}

验证

复制代码
通过postman请求 http://127.0.0.1/sayHello 接口, 参数 name 为jack, 看到响应了 <h1>hello jack</h1>
相关推荐
喵了meme6 小时前
C语言实战4
c语言·开发语言
码界奇点6 小时前
Python从0到100一站式学习路线图与实战指南
开发语言·python·学习·青少年编程·贴图
码事漫谈6 小时前
C++ 多线程开发:从零开始的完整指南
后端
9ilk6 小时前
【C++】--- 特殊类设计
开发语言·c++·后端
码事漫谈6 小时前
十字路口的抉择:B端与C端C++开发者的职业路径全解析
后端
sali-tec7 小时前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
提笔了无痕8 小时前
git基本了解、常用基本命令与使用
git·后端
java1234_小锋8 小时前
Spring IoC的实现机制是什么?
java·后端·spring
喵个咪8 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:JWT 集成指南
后端·go
生骨大头菜8 小时前
使用python实现相似图片搜索功能,并接入springcloud
开发语言·python·spring cloud·微服务