栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

【Go语言实战】(9) gRPC 实现一个简单微服务

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Go语言实战】(9) gRPC 实现一个简单微服务

文章目录
  • 写在前面
  • 1. 安装
    • 1.1 grpc
    • 1.2 proto
    • 1.3 protobuf
  • 2. 编写代码
    • 2.1 初始化项目
    • 2.2 编写proto
    • 2.3 编写服务端
    • 2.4 实现客户端
  • 3. 演示

写在前面

这一次我们用gRPC实现获取用户的信息

1. 安装 1.1 grpc

grpc的安装直接go get即可

go get google.golang.org/grpc
1.2 proto

下载proto,我是下载这个的。

然后解压出来把bin目录放在直接放在系统变量当中



1.3 protobuf

我们在终端

go get github.com/golang/protobuf

如果你像我一样go get不下来的话,可以直接git clone 源码


然后进入protoc-gen-go文件夹中,在此文件夹下打开cmd

执行

go build


就会发现多了一个可执行文件


然后把这个可执行文件放到刚刚1.2 讲的那个proto的文件夹下

打开cmd 输入 protoc


这样即可

2. 编写代码 2.1 初始化项目
  • 新建一个文件夹gRPC,然后创建proto文件夹和client.go、server.go文件

2.2 编写proto

在proto下创建一个user.proto

注意proto语法:

  • 一个message类型定义描述了一个请求或响应的消息格式,可以包含多种类型字段。
  • 例如定义一个搜索请求的消息格式,每个请求包含查询字符串、页码、每页数目。
  • 字段名用小写,转为go文件后自动变成大写,message就相当于结构体。

先定下版本号:

syntax = "proto3";

然后是输出路径

option go_package = "./";

定义客户端请求格式

message UserRequest{
    // 定义请求参数
    string name = 1;
}

指定生成的包名称

package proto;

定义服务端响应格式

message UserResponse{
   // 定义响应参数
   int32 id = 1;
   string name = 2;
   int32 age = 3;
   // 字段修饰符
   // repeated 表示可变数组,类似于切片类型
   repeated string hobby = 4;
}

定义服务接口

service UserInfoService{
    // 接口内的方法
    // 定义请求参数为UserRequest,响应参数为UserResponse
    rpc GetUserInfo (UserRequest) returns (UserResponse){

    }
}

然后执行

protoc --go_out=plugins=grpc:. user.proto


生成pb.go文件

2.3 编写服务端
  • 定义服务对象
type UserInfoService struct {
}

var u = UserInfoService{}
  • 实现服务端的执行方法
func (service *UserInfoService)GetUserInfo(ctx context.Context,req *pb.UserRequest)(resp *pb.UserResponse,err error) {
	name := req.Name
	// 在数据库查询用户信息
	if name == "zs" {
		resp = &pb.UserResponse{
			Id:   1,
			Name: name,
			Age:  19,
			// 切片字段
			Hobby :[]string{"FanOne","FanOneTwo"},
		}
	}
	err = nil
	return
}
  • 实现监听连接
	// 1. 监听
	address := "127.0.0.1:8080"
	lis, err := net.Listen("tcp", address)
	if err != nil {
		fmt.Println("监听异常 ",err)
		return
	}
	fmt.Println("监听成功")
  • 实例化rpc
	s := grpc.NewServer()
  • 在gRPC上注册微服务
	// 第一个类型是服务,第二个类型是接口的变量
	pb.RegisterUserInfoServiceServer(s,&u)
  • 启动gRPC服务端
	_ = s.Serve(lis)
2.4 实现客户端
  • 创建与gRPC服务端的连接
	conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
	if err != nil {
		fmt.Println("连接异常",err)
	}
	defer conn.Close()
  • 实例化gRPC客户端
	client := pb.NewUserInfoServiceClient(conn)
  • 组装参数,New一个请求的参数,然后发送对象
	req := new(pb.UserRequest)
	req.Name="zs"
  • 调用接口获取响应
	resp ,err := client.GetUserInfo(context.Background(),req)
	if err != nil {
		fmt.Println("响应异常",err)
	}
	fmt.Println("响应结果",resp)
3. 演示
  • 先开启服务端监听端口

  • 开启客户端发送请求

然后就可以获取到服务端信息了。

注意一点:

rpc的调用是一台机子的内存调用另一台自己的内存,所以我们要传指针的形式。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/907819.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号