go-grpc的使用和学习

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: go-grpc的使用和学习

grpc

正常客户端发送数据(以字节流的方式),服务器接受并解析,根据约定知道要执行什么,然后把结果返回给客户

rpc将上述过程封装,使其操作更加优化,使用一些大家都认可的协议,使其规范化,做成一些框架,直接或间接产生利益


基础知识:

单体架构:一旦某个服务出现错误,整体不可用,微服务架构解决了单体架构的弊端

grpc使用的是protobuf谷歌开源的成熟的数据结构序列化机制

序列化:将数据结构或对象转化成二进制串的过程

反序列化:将二进制串转化成数据结构或对象的过程

对称加密:加密和解密时候使用的都是同一个密码

非对称加密:加密和解密的时候使用的不是同一个密码


操作流程

安装

推荐看grpc官方或者中文文档;

首先安装protobuf,并把安装目录bin加入环境变量中,然后安装加载grpc的核心配置和运行工具(是带谷歌那个),准备工作已经完全完了


proto文件配置

分别创建客户端和服务端,创建以proto为后缀的文件,然后编写相关配置,

例如: 类似的文件配置

syntax = "proto3";
//这部分的内容是关于最后生成的go文件是在哪个目录哪个包中
//.代表在当前文件生成,server表示生成的go文件的包名为server
option go_package = ".;server";
// 定义一个服务,可以接收客户端的参数,在返回服务端去响应
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse){}
}
// The request message containing the user's name.
message HelloRequest {
  string requestName = 1;
  int64 age = 2;
  repeated string name =3;
}
// message关键词  可以理解为go中的结构体
//=后面的值不是赋值,是在结构体中的位置
message HelloResponse {
  string message = 1;
}


在配置过之后,可以在终端运行:即可以生成两个程序

protoc --go_out=. hello.proto

protoc --go-grpc_out=. hello.proto

1a32b5279a9c452fb2716d8ee827b497.png


在server会生成两个go程序,此时往client中也要复制一份


服务端和客户端代码示例:


我们只需要在客户端和服务端实现相关操作即可,proto底层已经帮我们实现好了大部分方法

服务端:

package main
import (
  "context"
  "github.com/sirupsen/logrus"
  "google.golang.org/grpc"
  "net"
  haha "rpc/server/proto"
)
type server struct {
  haha.UnimplementedGreeterServer
}
func main() {
  //开启端口
  listen, err := net.Listen("tcp", ":9090")
  if err != nil {
    logrus.Info("listen port is fail")
  }
  //创建grpc服务
  grpcServer := grpc.NewServer()
  //在grpc中去注册
  haha.RegisterGreeterServer(grpcServer, &server{})
  //启动服务
  err = grpcServer.Serve(listen)
  if err != nil {
    logrus.Info("fail to start server")
  }
}
func (s *server) SayHello(ctx context.Context, req *haha.HelloRequest) (*haha.HelloResponse, error) {
  return &haha.HelloResponse{Message: "hello" + req.RequestName}, nil
}


客户端:

syntax = "proto3";
//这部分的内容是关于最后生成的go文件是在哪个目录哪个包中
//.代表在当前文件生成,server表示生成的go文件的包名为server
option go_package = ".;server";
// 定义一个服务,可以接收客户端的参数,在返回服务端去响应
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse){}
}
// The request message containing the user's name.
message HelloRequest {
  string requestName = 1;
  int64 age = 2;
  repeated string name =3;
}
// message关键词  可以理解为go中的结构体
//=后面的值不是赋值,是在结构体中的位置
message HelloResponse {
  string message = 1;
}

但是此时服务端和客户端之间的连接是不安全的,需要通过制定协议SSL/TSL协议来保证安全。

相关文章
|
3月前
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
3月前
|
缓存 NoSQL Go
通过 SingleFlight 模式学习 Go 并发编程
通过 SingleFlight 模式学习 Go 并发编程
|
7天前
|
数据采集 监控 Java
go语言编程学习
【11月更文挑战第3天】
23 7
|
17天前
|
设计模式 测试技术 Go
学习Go语言
【10月更文挑战第25天】学习Go语言
19 4
|
2月前
|
编译器 Go
go语言学习记录(关于一些奇怪的疑问)有别于其他编程语言
本文探讨了Go语言中的常量概念,特别是特殊常量iota的使用方法及其自动递增特性。同时,文中还提到了在声明常量时,后续常量可沿用前一个值的特点,以及在遍历map时可能遇到的非顺序打印问题。
|
3月前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
130 1
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
3月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
3月前
|
Go
Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
58 12
|
3月前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
2月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习