go的grpc

GRPC介绍

目录

  1. 单体架构
  2. 微服务架构
  3. 问题
  4. 原始的grpc
    • 服务端
    • 客户端
    • 原生rpc的问题
  5. grpc的hello world
    • 服务端
    • 客户端
  6. proto文件
  7. proto语法
    • 数据类型
      • 基本数据类型
      • 其他数据类型
  8. 编写风格
  9. 多服务

单体架构

  1. 只能对整体扩容
  2. 一荣俱荣,一损俱损
  3. 代码耦合,项目的开发者需要知道整个项目的流程

微服务架构

针对单体架构的问题出现了微服务架构

  1. 可以按照服务进行单独扩容
  2. 各个服务之间可以独立开发,独立部署

问题

  1. 代码冗余
  2. 服务之间的调用很麻烦

为什么要使用grpc
grpc使用的意义

原始的grpc

服务端

package mainimport ("fmt""net""net/http""net/rpc"
)type Server struct {
}
type Req struct {Num1 intNum2 int
}
type Res struct {Num int
}func (s Server) Add(req Req, res *Res) error {res.Num = req.Num1 + req.Num2return nil
}func main() {// 注册rpc服务rpc.Register(new(Server))rpc.HandleHTTP()listen, err := net.Listen("tcp", ":8080")if err != nil {fmt.Println(err)return}http.Serve(listen, nil)
}

客户端

package mainimport ("fmt""net/rpc"
)type Req struct {Num1 intNum2 int
}
type Res struct {Num int
}func main() {req := Req{1, 2}client, err := rpc.DialHTTP("tcp", ":8080")if (err != nil) {fmt.Println(err)return}var res Resclient.Call("Server.Add", req, &res)fmt.Println(res)
}

原生rpc的问题:

  1. 编写相对复杂,需要自己去关注实现过程
  2. 没有代码提示,容易写错。

grpc的hello world

服务端

  1. 编写一个结构体,名字叫什么不重要
  2. 重要的是得实现protobuf中的所有方法
  3. 监听端口
  4. 注册服务
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/grpclog""grpc_study/grpc_proto/hello_grpc""net"
)type HelloServiceServer struct {
}func (s HelloServiceServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (res *hello_grpc.HelloResponse, err error) {fmt.Println("请求来了!", request)return &hello_grpc.HelloResponse{Message: "Hello " + "Xiaoyu_Wang",Name:    "Server",}, nil
}func main() {// 监听端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 创建一个gRPC服务器实例。s := grpc.NewServer()server := HelloServiceServer{}// 将server结构体注册为gRPC服务。hello_grpc.RegisterHelloServiceServer(s, &server)fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen)
}

客户端

  1. 建立连接
  2. 调用方法
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""grpc_study/grpc_proto/hello_grpc""log"
)func main() {addr := ":8080"// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。// 此处使用不安全的证书来实现 SSL/TLS 连接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))}defer conn.Close()// 初始化客户端client := hello_grpc.NewHelloServiceClient(conn)result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{Name:    "Xiaoyu_Wang",Message: "ok",})fmt.Println(result, err)
}

proto文件

syntax = "proto3"; // 指定proto版本
package hello_grpc;     // 指定默认包名// 指定golang包名
option go_package = "/hello_grpc";//定义rpc服务
service HelloService {// 定义函数rpc SayHello (HelloRequest) returns (HelloResponse) {}
}// HelloRequest 请求内容
message HelloRequest {string name = 1;  // 消息号string message = 2;
}// HelloResponse 响应内容
message HelloResponse{string name = 1;string message = 2;
}

proto语法

  1. service 对应的就是go里面的接口,可以作为服务端,客户端
  2. rpc 对应的就是结构体中的方法
  3. message对应的也是结构体

数据类型

基本数据类型
message Request {double a1 = 1;float a2 = 2;int32 a3 = 3;uint32 a4 = 4;uint64 a5 = 5;sint32 a6 = 6;sint64 a7 = 7;fixed32 a8 = 8;fixed64 a9 = 9;sfixed32 a10 = 10;sfixed64 a11 = 11;bool a12 = 12;string a13 = 13;bytes a14 = 14;
}

对应的go类型:

type Request struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsA1  float64 `protobuf:"fixed64,1,opt,name=a1,proto3" json:"a1,omitempty"`A2  float32 `protobuf:"fixed32,2,opt,name=a2,proto3" json:"a2,omitempty"`A3  int32   `protobuf:"varint,3,opt,name=a3,proto3" json:"a3,omitempty"`A4  uint32  `protobuf:"varint,4,opt,name=a4,proto3" json:"a4,omitempty"`A5  uint64  `protobuf:"varint,5,opt,name=a5,proto3" json:"a5,omitempty"`A6  int32   `protobuf:"zigzag32,6,opt,name=a6,proto3" json:"a6,omitempty"`A7  int64   `protobuf:"zigzag64,7,opt,name=a7,proto3" json:"a7,omitempty"`A8  uint32  `protobuf:"fixed32,8,opt,name=a8,proto3" json:"a8,omitempty"`A9  uint64  `protobuf:"fixed64,9,opt,name=a9,proto3" json:"a9,omitempty"`A10 int32   `protobuf:"fixed32,10,opt,name=a10,proto3" json:"a10,omitempty"`A11 int64   `protobuf:"fixed64,11,opt,name=a11,proto3" json:"a11,omitempty"`A12 bool    `protobuf:"varint,12,opt,name=a12,proto3" json:"a12,omitempty"`A13 string  `protobuf:"bytes,13,opt,name=a13,proto3" json:"a13,omitempty"`A14 []byte  `protobuf:"bytes,14,opt,name=a14,proto3" json:"a14,omitempty"`
}
其他数据类型
  1. 数组类型
message ArrayRequest {repeated int64 a1 = 1;repeated string a2 = 2;repeated Request request_list = 3;
}
type ArrayRequest struct {A1          []int64 A2          []string   RequestList []*Request
}
  1. map类型
message MapRequest {map<int64, string> m_i_s = 1;map<string, bool> m_i_b = 2;map<string, ArrayRequest> m_i_arr = 3;
}
type MapRequest struct {MIS   map[int64]stringMIB   map[string]boolMIArr map[string]*ArrayRequest
}
  1. 嵌套类型
message Q1 {message Q2{string name2 = 2;}string name1 = 1;Q2 q2 = 2;
}
type Q1 struct {state         protoimpl.MessageStatesizeCache     protoimpl.SizeCacheunknownFields protoimpl.UnknownFieldsName1 string `protobuf:"bytes,1,opt,name=name1,proto3" json:"name1,omitempty"`Q2    *Q1_Q2 `protobuf:"bytes,2,opt,name=q2,proto3" json:"q2,omitempty"`
}

编写风格

  1. 文件名建议下划线,例如:my_student.proto
  2. 包名和目录名对应
  3. 服务名、方法名、消息名均为大驼峰
  4. 字段名为下划线

多服务

syntax = "proto3";option go_package = "/duo_grpc";service VideoService {rpc Look (Request) returns (Response) {}
}message Request{string name = 1;
}message Response{string name = 1;
}service OderService {rpc Buy (Request) returns (Response) {}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.12.信息系统的分类【ES】

专家系统&#xff08;ES&#xff09;技术架构深度解析 一、ES核心定义 &#x1f9e0; 智能决策中枢 由三大核心能力构建的领域专家模拟系统&#xff1a; 存储专家级领域知识&#xff08;10^4规则量级&#xff09;支持不确定性推理&#xff08;置信度>85%&#xff09;动态…

考研数一非数竞赛复习之Stolz定理求解数列极限

在非数类大学生数学竞赛中&#xff0c;Stolz定理作为一种强大的工具&#xff0c;经常被用来解决和式数列极限的问题&#xff0c;也被誉为离散版的’洛必达’方法&#xff0c;它提供了一种简洁而有效的方法&#xff0c;使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…

html播放本地音乐

本地有多个音乐文件&#xff0c;想用 html 逐个播放&#xff0c;或循环播放&#xff0c;并设置初始音量。 audio 在 html 中播放音乐文件用 audio 标签&#xff1a; controls 启用控制按钮&#xff0c;如进度条、播放、音量、速度等。不加不显示任何 widget。autoplay 理应启…

DeepSeek-Manus精品课合集【附下载】

AI消息不断&#xff0c;继DeepSeek之后&#xff0c;又出了一个颠覆性的AI产品Manus&#xff0c;号称全球第一个通用型AI。相比与DeepSeek&#xff0c; Manus拥有更强的自主性和执行力。 如果说DeepDeek是一个最强大脑&#xff0c;那么Manus就是一个完整的人&#xff01; DeepS…

MySQL复习笔记

MySQL复习笔记 1.MySQL 1.1什么是数据库 数据库(DB, DataBase) 概念&#xff1a;数据仓库&#xff0c;软件&#xff0c;安装在操作系统&#xff08;window、linux、mac…&#xff09;之上 作用&#xff1a;存储数据&#xff0c;管理数据 1.2 数据库分类 关系型数据库&#…

从源到目标:深度学习中的迁移学习与领域自适应实践

引言&#xff1a;数据驱动的智能时代与迁移挑战 在深度学习快速发展的今天&#xff0c;模型训练对数据量和质量的依赖成为核心瓶颈。面对新场景时&#xff0c;标注数据不足、数据分布差异等问题常导致模型性能骤降。迁移学习&#xff08;Transfer Learning&#xff09;与领域自…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;工作在OSI顶层应用层&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信,B/S模式 无状态&#xff1a;每次请求独立&#xff0c;服务器不保存客户端状态&#xff08;通…

Jmeter使用介绍

文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一&#xff08;仅一次性&#xff09;方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…

【NLP 32、文本匹配任务 —— 深度学习】

大劫大难以后&#xff0c;人不该失去锐气&#xff0c;不该失去热度&#xff0c;你镇定了却依旧燃烧&#xff0c;你平静了却依旧浩荡&#xff0c;致那个从绝望中走出来的自己&#xff0c;共勉 —— 25.1.31 使用深度学习在文本匹配任务上主要有两种方式&#xff1a;① 表示型 ②…

发展史 | 深度学习 / 云计算

注&#xff1a;本文为来自 csdn 不错的“深度学习 / 云计算发展史 ” 相关文章合辑。 对原文&#xff0c;略作重排。 深度学习发展史&#xff08;1943-2024 编年体&#xff09;&#xff08;The History of Deep Learning&#xff09; Hefin_H 已于 2024-05-23 15:54:45 修改 …

通领科技冲刺北交所

高质量增长奔赴产业新征程 日前&#xff0c;通领科技已正式启动在北交所的 IPO 进程&#xff0c;期望借助资本市场的力量&#xff0c;加速技术升级&#xff0c;推动全球化战略布局。这一举措不仅展现了中国汽车零部件企业的强大实力&#xff0c;也预示着行业转型升级的新突破。…

TCP/IP 5层协议簇:网络层(ICMP协议)

1. TCP/IP 5层协议簇 如下&#xff1a; 和ip协议有关的才有ip头 2. ICMP 协议 ICMP协议没有端口号&#xff0c;因为不去上层&#xff0c;上层协议采用端口号

RISC-V汇编学习(三)—— RV指令集

有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识&#xff0c;本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点&#xff0c;是以RV32I为作为ISA的核心模块&#xff0c;其他都是要基于此为基础&#xff0c;可以这样认为&#xff1a;RISC-V ISA 基本整数指…

C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解

目录 1. 操作符的分类 2. ⼆进制和进制转换 2.1 2进制转10进制 2.2 10进制转2进制 2.3 2进制转8进制 2.4 2进制转16进制 3. 原码、反码、补码 4. 移位操作符 4.1 左移操作符 4.2 右移操作符 5. 位操作符&#xff1a;&、|、^、~ 5.1 & 按位与 5.2 | 按位或 …

docker1

前言 技术架构 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 写入主的时候&#xff0c;要同步Mysql从的数据才可以 冷热分离架构 写的时候要写入主和缓存数据库 读的时候先去缓存看有没有&#xff0c;没有的话就去从数据库读数据 主要就是看这个数据是…

Spring Boot整合ArangoDB教程

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、环境准备 JDK 17Maven 3.8Spring Boot 3.2ArangoDB 3.11&#xff08;本地安装或Docker运行&#xff09; Docker启动ArangoDB docker run -d --name ar…

从离散迭代到连续 常微分方程(Ordinary Differential Equation, ODE):梯度流

从离散迭代到连续 ODE&#xff1a;梯度下降与梯度流的奇妙联系 在机器学习和优化领域&#xff0c;我们常常使用离散的迭代算法&#xff08;如梯度下降&#xff09;来求解目标函数的最优解。然而&#xff0c;你是否想过这些离散步骤背后可能隐藏着连续的动态&#xff1f;常微分…

常见的 Git 命令

基础配置和信息查询 (Setup and Information) git config --global user.name “Your Name”: 配置全局用户名&#xff0c;用于 Git 提交记录。 git config --global user.email “your.emailexample.com”: 配置全局用户邮箱&#xff0c;同样用于 Git 提交记录。 git confi…

深度解析:视频软编码与硬编码的优劣对比

视频编码 一、基本原理与核心技术 压缩原理 通过时空冗余消除实现数据压缩&#xff1a; 空间冗余&#xff1a;利用帧内预测&#xff08;如DC/角度预测&#xff09;消除单帧内相邻像素相似性。时间冗余&#xff1a;运动估计与补偿技术&#xff08;ME/MC&#xff09;减少连续帧间…

蓝耘智算 + 通义万相 2.1:为 AIGC 装上 “智能翅膀”,翱翔创作新天空

1. 引言&#xff1a;AIGC 的崛起与挑战 在过去几年中&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;技术突飞猛进。AIGC 涉及了文本生成、图像创作、音乐创作、视频制作等多个领域&#xff0c;并逐渐渗透到日常生活的方方面面。传统的内容创作方式已经被许多人类创…