标签:定义 err grpc gRPC go protobuf
Go gRPC使用demo
准备工作: 1. 安装protobuf 编译环境 https://github.com/protocolbuffers/protobuf/releases 2. 安装go语言的protobuf代码转换工具protoc-gen-go go get -u github.com/golang/protobuf/protoc-gen-go 3. 运行go mod init grpc_demo创建模块 使用 1. 定义和编译user.proto文件1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// 定义proto语法版本,这里指定使用proto3版本
syntax = "proto3" ;
// 这里随便定义个包名
package grpc.user;
// go需要增加这个选项,否则会报错;值用分号分隔,前者表示生成*.pb.go文件目录,会自动创建,这里指定当前目录中的protobuf目录,后者表示生成go文件里的包名,最好和当前目录名一致否则无法使用到
option go_package = "./protobuf;protobuf" ;
// 定义服务,可以有多个方法
service UserService {
// 使用rpc开头标识方法
rpc Login(LoginRequest) returns (LoginResponse) {};
}
// 定义请求信息
message LoginRequest {
// 参数类型 参数名称 标识号
string username = 1;
string password = 2;
}
// 定义响应信息
message LoginResponse {
// 参数类型 参数名称 标识号
int32 code = 1;
string message = 2;
}
// 最后使用 protoc --go_out=plugins=grpc:. ./protobuf/user.proto 来生成*.pb.go文件
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// 这里定义服务接口及实现
package service
import (
"context"
"grpc_demo/protobuf"
)
// 定义服务接口
type UserService interface {
Login(ctx context.Context, req *protobuf.LoginRequest) (*protobuf.LoginResponse, error)
}
// 定义服务实现者,这里开头小写,不能被别的包使用,所以会增加一个工厂函数来创建实例
type userService struct {
}
// 工厂函数创建服务实例
func NewUserService() UserService {
return &userService{}
}
// 实现者实现服务接口
func (userService *userService) Login(ctx context.Context, req *protobuf.LoginRequest) (*protobuf.LoginResponse, error) {
if req.Username == "admin" && req.Password == "123456" {
resp := &protobuf.LoginResponse{
Code: 10000,
Message: "登录成功" ,
}
return resp, nil
}
resp := &protobuf.LoginResponse{
Code: 10001,
Message: "登录失败" ,
}
return resp, nil
}
|
3. 定义gRPC服务端并运行 server.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
// gRPC服务端
package main
import (
"fmt"
"google.golang.org/grpc"
"grpc_demo/protobuf"
"grpc_demo/service"
"log"
"net"
)
func main() {
// 1. 监听端口
l, err := net.Listen( "tcp" , "127.0.0.1:8888" )
if err != nil {
panic(err)
}
fmt.Println( "listen on 127.0.0.1:8888" )
// 2. 实例化gRPC服务端
grpcServer := grpc.NewServer()
// 3. 注册实现的服务实例
var userService service.UserService
userService = service.NewUserService()
protobuf.RegisterUserServiceServer(grpcServer, userService)
// 4. 启动gRPC服务端
fmt.Println( "gRPC is running..." )
err = grpcServer.Serve(l)
if err != nil {
log.Fatalf( "gRPC server err:%s\n" , err)
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// gRPC客户端
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc_demo/protobuf"
)
func main() {
// 1. 打开gRPC服务端链接
conn, err := grpc.Dial( "127.0.0.1:8888" , grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
// 2. 创建gRPC客户端
client := protobuf.NewUserServiceClient(conn)
// 3. 构造请求参数
req := &protobuf.LoginRequest{
Username: "admin" ,
Password: "123456" ,
}
// 4. 调用服务端提供的服务
response, _ := client.Login(context.Background(), req)
fmt.Println( "Login Response: " , response)
}
|
标签:定义,err,grpc,gRPC,go,protobuf 来源: https://www.cnblogs.com/Janly/p/16301179.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。