gRPC(四)基础:gRPC流
前言 这章的内容需要安装好插件和protoc,建议阅读我的上一篇grpc使用篇示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转 一、gRPC的请求模型gRPC 有两种类型的请求模型: 一元 - 直接的请求响应映射在 HTTP/2 请求响应之上。 简单来说一元就是一个简单的 RPC,其中客户端使用存根向服务器发送请求并等待响应返回,就像正常的函数调用一样。 1rpc SayHi(Request) returns (Response); 流式传输——多个请求和响应通过长寿命 HTTP/2 流进行交换,可以是单向或双向的。 其中许多进程可以通过 HTTP/2 的多路复用能力(通过单个 TCP 连接一起发送多个响应或接收多个请求)在单个请求中发生。 Server-side streaming RPC—— 客户端向服务器发送单个请求并接收回数据序列流(读回一系列消息)。客户端从返回的流中读取,直到没有更多消息为止。 Client-side streaming RPC—— 客户端向服务器发送数据序列流(写入一系列消息),一旦客户端完成了消息的写入,它会等待服...
gRPC(三)基础:gRPC快速入门
前言 示例代码已经上传到github:点击跳转gRPC官方文档:点击跳转 一、gRPC概述1、什么是gRPC?gRPC 是一个强大的开源 RPC(远程过程调用)框架,用于构建可扩展且快速的 API。它允许客户端和服务器应用程序透明地通信并开发连接的系统。gRPC框架依赖 HTTP/2、协议缓冲区和其他现代技术堆栈来确保最大的 API 安全性、性能和可扩展性。 在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像是本地对象一样,更容易创建分布式应用程序和服务。 与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(自动生成的文件),它提供与服务器相同的方法。 2、gRPC 的历史2015 年,Google 开发了 gRPC 作为 RPC 框架的扩展,以链接使用不同技术创建的许多微服务。最初,它与 Google 的内部基础设施密切相关,但后来,它被开源并标准化以供社区使用。在其发布的第一年,顶级组织利用它...
gRPC(二)入门:Protobuf入门
前言 通过protubuf文档先了解一下protobuf语法。示例代码已经上传到github:点击跳转 一、Protobuf1、什么是protobuf?Protocol Buffers ( Protobuf ) 是一种免费的开源 跨平台数据格式,用于序列化结构化数据。它是谷歌公司开发的一种数据描述语言,并于2008年开源。Protobuf刚开源时的定位类似于XML、JSON等数据描述语言,通过附带工具生成代码并实现将结构化数据序列化的功能。 Protocol Buffers 是一种与语言、平台无关,可扩展的序列化结构化数据的方法,常用于通信协议,数据存储等等。相较于 JSON、XML,它更小、更快、更简单,因此也更受开发人员的青眯。 protobuf官方文档:点击跳转 2、JSON、XML、Protobuf选择1)什么是序列化和反序列化 序列化是将数据结构或对象状态转换为格式(xml/json/protobuf)的过程可以存储或传输。 反序列化是从表示的格式(xml/json/protobuf)构造数据结构/对象状态的过程 ...
gRPC(一)入门:什么是RPC?
前言 本文作为Grpc的开篇,通过文档先了解一下rpc。示例代码已经上传到github:点击跳转 一、RPC1、什么是RPC?RPC(Remote Procedure Call 远程过程调用)是一种软件通信协议,一个程序可以使用该协议向位于网络上另一台计算机中的程序请求服务,而无需了解网络的详细信息。RPC 用于调用远程系统上的其他进程,如本地系统。过程调用有时也称为 函数调用或 子程序调用。 RPC是一种客户端-服务器交互形式(调用者是客户端,执行者是服务器),通常通过请求-响应消息传递系统实现。与本地过程调用一样,RPC 是一种 同步 操作,需要阻塞请求程序,直到返回远程过程的结果。但是,使用共享相同地址空间的轻量级进程或 线程 可以同时执行多个 RPC。 通俗的解释:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 接口定义语言(IDL)——用于描述软件组件的应用程序编程接口(API)的规范语言——通常用于远程过程调用软件。在这种情况下,IDL 在链路两端的机器之间提供了一座桥梁,这些机器可能使用不同的操作系统 (O...
Go高性能编程-Go中的类型对齐保证
前言 本文将介绍Go中的各种字段类型的字节数和对齐保证。 一、内存对齐1、什么是内存对齐?元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小(通常它为4字节(32位)或8字节(64位))来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始,这就是所谓的内存对齐。 2、为什么需要内存对齐?CPU 访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如 32 位的 CPU ,字长为 4 字节,那么 CPU 访问内存的单位也是 4 字节。64位 CPU 访问内存的单位是8个字节。 这么设计的目的,是减少 CPU 访问内存的次数,加大 CPU 访问内存的吞吐量。比如同样读取 8 个字节的数据,一次读取 4 个字节那么只需要读取 2 次。CPU 始终以字长访问内存。 提出设想如果我们不进行内存对齐,而是按照类型字节长度紧密对齐呢? 变量 a、b 各占据 3 字节的空间,我们使用32位 CPU 访问内存读取变量,例如: 内存对齐后,a、b 占据 4 字节空间,CP...
Gorm学习(五)进阶:多态关联、关联标签以及事务
前言 感谢开源项目gin-vue-admin,以及1010工作室的视频教程 一、多态关联1、多态关联概述 什么是多态? 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 什么是多态表? 假设我们有一张地址表,其中的地址可能是来自User中的,也可能是来自Orders中的。而区分不同的对象则用type字段。如:type=User时对象是文章表。 什么是多态关联? 多态关联就是多态表和对象表之间的关联性。一个多态关联由使用同一外键发生的两个(或多个)关联组成. 2、为什么用多态关联?出现需要外键引用多个表的情况,不可能删除原来表结构,重新添加一个外键ID再建表,所以我们可以建立一个交叉表。让Addres不再依赖于User表或者Order表。has one的情况解决方案,如果我们希望一个给定的地址,只能够在一张交叉表中出现一次,上面的复合主键已经做到了。 has many的情况解决方案,如果希望一个地址可以在一张交叉表中出现多次,可以取消Address的复合主键。 3、Has OneGORM 为 ha...
Gorm学习(四)基础:关联
前言 感谢开源项目gin-vue-admin,以及1010工作室的视频教程 一、One To One 一对一数据库连接例子: 1234567891011var db *gorm.DBfunc init() { var err error //我这里用到数据库是mysql,需要配置DSN属性[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] dsn := "root:123456@tcp(127.0.0.1:3306)/go_test?charset=utf8&parseTime=True" db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") }} 1、Belongs To ...
Gorm学习(三)基础:迁移(数据库建表以及字段设置)
前言 感谢开源项目gin-vue-admin,以及1010工作室的视频教程 一、迁移概念在项目开发中,我们可能会随时调整声明的模型,比如添加字段和索引,使用 GORM 的自动迁移功能,可以始终让我们的数据库表结构保持最新。 此外,GORM 还提供了一些迁移接口的方法,可以帮助我们方便操作数据库表、字段和索引。 二、AutoMigrate 自动迁移AutoMigrate 用于自动迁移你的 schema(模式),保持你的 schema(模式) 是最新的。 注意: AutoMigrate 会创建表、缺失的外键、约束、列和索引。 并且会更改现有列的类型,如果大小、精度、是否为空可以更改。 但不会删除未使用的列,以保护您的数据。(只增不减) 在执行 AutoMigrate时,我们需要先声明模型。 1234567891011121314151617type User struct { gorm.Model Name string Age uint}type Product struct { gorm.Model Name string Price in...
Gorm学习(二)基础:CRUD接口(数据库增删改查操作)
前言 感谢开源项目gin-vue-admin,以及1010工作室的视频教程 一、创建GORM里的创建(Create方法),也就是数据库插入语句(Insert语句),可以创建单条或者多条,指定字段创建等 1、Create方法1)创建单条记录1234567user := User{Name: "linzy", Age: 23, Birthday: time.Now()}result := db.Create(&user) // 通过数据的指针来创建user.ID // 返回插入数据的主键result.Error // 返回 errorresult.RowsAffected // 返回插入记录的条数 2)创建多条记录要有效地插入大量记录,需要将一个 slice 切片传递给 Create 方法。 将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。 123456var users = []User{{Na...
Gorm学习(一)入门:Gorm入门指南
前言 感谢开源项目gin-vue-admin,以及1010工作室的视频教程 一、GORM介绍1、GORM概述GORM一个目前比较热门的,使用简单,对开发人员友好的 Golang ORM 库。GORM框架是go的一个数据库连接及交互框架,主要是把struct类型和数据库记录进行映射,数据库语句复杂的情况下可以直接手写语句,一般用于连接关系型数据库,这里我主要使用MySQL数据库。 对象关系映射(英语:Object Relational Mapping,简称ORM): 通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射,可以使用面向对象的范例从数据库中查询和操作数据。简而言之:代码结构即是数据库结构,代码行为就是数据库行为。 2、为什么选择GORM?特性: 数据库连接(以MySQL为例)和自动建表方便。 文档内容详细全面,适合快速入门上手。 支持关联 (一对一,一对多,多对多的关系)。 带有Create,Save,Update,Delete,Find 中钩子方法。 支持 Preload、Joins 的预加载,对于关联查询很重要,主要用于显示关联子结构...


