【Go】protobuf介绍及安装

目录

一、Protobuf介绍

1.Protobuf用来做什么

2. Protobuf的序列化与反序列化

3. Protobuf的优点和缺点

4. RPC介绍

<1>文档规范

<2>消息编码

<3>传输协议

<4>传输性能

<5>传输形式

<6>浏览器的支持度

<7>消息的可读性和安全性

<8>代码的编写

5. gRPC的适用场景

二、gRPC简单实践

1. 安装 protobuf 编译库

2.安装protoc-gen-go


一、Protobuf介绍

  Protobuf (Protocol Buffers) 是谷歌开发的一款无关平台,无关语言,可扩展,轻量级高效的序列化结构的数据格式,用于将自定义数据结构序列化成字节流,和将字节流反序列化为数据结构。所以很适合做数据存储和为不同语言,不同应用之间互相通信的数据交换格式,只要实现相同的协议格式,即后缀为proto文件被编译成不同的语言版本,加入各自的项目中,这样不同的语言可以解析其它语言通过Protobuf序列化的数据。目前官方提供c++,java,go等语言支持。

下面表格是支持语言的列表及各个语言的插件

Github源码地址:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format

支持的语言列表,以及支持每种语言对应的安装说明:

LanguageSource
C++ (include C++ runtime and protoc)src
Javajava
Pythonpython
Objective-Cobjectivec
C#csharp
Rubyruby
Goprotocolbuffers/protobuf-go
PHPphp
Dartdart-lang/protobuf
JavaScriptprotocolbuffers/protobuf-javascript

1.Protobuf用来做什么

protobuf是跨平台的数据交互格式,通过字节流的方式在不同终端或服务器之间进行数据传输。

目前主要有以下数据交换格式:

  • json,一般用于WEB项目中,因为浏览器对JSON格式的数据支持非常好,大部分编程语言有很多内建函数支持,而且JSON几乎支持所有编程语言。用于Restful通信协议。
  • xml,XML在WebService中的应用比较多,相比于JSON,它的数据更加冗余,因为需要成对的闭合标签,而JSON使用了键值对的方式,不仅压缩了一定的数据空间,同时也有更好的可读性。
  • protobuf,谷歌公司新开发的一种数据格式,适合高性能,对响应速度有要求的数据传输场景。因为Protobuf是二进制数据格式,需要编码和解码。数据本身不具有可读性,因此只能反序列化得到可读数据。用于gRPC通信协议

2. Protobuf的序列化与反序列化

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

  2. 反序列化:将序列化过程中所产生的二进制串转换成数据结构或对象的过程。

3. Protobuf的优点和缺点

优点:

  1. Protobuf序列化和反序列化速度快,序列化后的体积比json,xml更小,传输更快。使用相对也简单,因为Proto编译器能自己序列化和反序列化。
  2. 可以定义自己的数据结构,然后使用代码生成器去生成的代码来读写这个数据结构,甚至可以在不用重新部署的情况下来更新这个数据结构,只需要使用Protobuf对数据结构进行一次描述,就可以利用不同的语言或者从不同的数据流对你的结构化数据轻松的读写。
  3. 向后兼容性好,不需要破坏旧的数据格式,依靠老的数据格式的程序就可以对数据结构更新。
  4. 语义比xml更加清晰,无需类似xml解析器的东西(因为Protobuf编译器会将.proto文件编译成对应的数据访问用以对Protobuf数据进行序列化和反序列化操作)。
  5. 跨平台,跨语言,可扩展性好。
  6.  维护成本比较低,多个平台只需要维护一套.proto对象协议文件。
  7. 加密性好。

 缺点:  

  1. Protobuf功能简单,无法用来表示复杂的概念。
  2. 相比xml,xml具有某种程度的自解释性,因为最终是转成二进制流,不像xml和json能够直接查看明文。

4. RPC介绍

既然protobuf是跨语言的,gRPC是通过protobuf协议传输的,自然而然gRPC也是跨语言的。说起gRPC还是先聊聊RPC,RPC全称Remote Procedure Call,中文译为远程过程调用。通俗地讲,使用RPC进行通信,调用远程函数就像调用本地函数一样,RPC底层会做好数据的序列化与传输,从而能使我们更轻松地创建分布式应用和服务。

而gRPC,则是RPC的一种,它是免费且开源的,由谷歌出品。使用gRPC,我们只需要定义好每个API的Request和Response,剩下的gRPC这个框架会帮我们自动搞定。另外,gRPC的典型特征就是使用protobuf(全称protocol buffers)作为其接口定义语言(Interface Definition Language,缩写IDL),同时底层的消息交换格式也是使用protobuf。官网gRPC调用流程图如下:

4.1 常见的 PRC 框架
目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Google 的 gRPC、Facebook 的 Thrift 和 Twitter 的 Finagle 等。

  1. Go RPC:Go 语言原生支持的 RPC 远程调用机制,简单便捷。
  2. gRPC:Google 发布的开源 RPC 框架,是基于 HTTP 2.0 协议的,并支持众多常见的编程语言,它提供了强大的流式调用能力,目前已经成为最主流的 RPC 框架之一。
  3. Thrift:Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架,作为老牌开源 RPC 协议,以其高性能和稳定性成为众多开源项目提供数据的方案选项。

4.2 gRPC VS Restful

平时我们对接接口大都使用Restful协议比较多,gRPC能为我们解决什么样的问题又能带来什么样的体验,知乎的一篇文章分析很详细我引用如下:

gRPC和Restful之间的对比,历来是学习gRPC的必修课,我会从文档规范、消息编码、传输协议、传输性能、传输形式、浏览器的支持度以及数据的可读性、安全性等方面进行比较。

<1>文档规范

文档规范这种东西有点见仁见智,在我看来,gRPC使用proto文件编写接口(API),文档规范比Restful更好,因为proto文件的语法和形式是定死的,所以更为严谨、风格统一清晰;而Restful由于可以使用多种工具进行编写(只要人看得懂就行),每家公司、每个人的攥写风格又各有差异,难免让人觉得比较混乱

另外,Restful文档的过时相信很多人深有体会,因为维护一份不会过时的文档需要很大的人力和精力,而公司往往都是业务为先;而gRPC文档即代码,接口的更改也会体现到代码中,这也是我比较喜欢gRPC的一个原因,因为不用花很多精力去维护文档

<2>消息编码

消息编码这块,gRPC使用protobuf进行消息编码,而Restful一般使用JSON进行编码

<3>传输协议

传输协议这块,gRPC使用HTTP/2作为底层传输协议,据说也可替换为其他协议,但目前还未考证;而RestFul则使用HTTP

RPC 和 RestFul都是微服务间通信较为常用的方案之一,其实RPC 和 RestFul 并不完全是同一个层次的概念,它们之间还是有所区别的。

  • RPC 是远程过程调用,其调用协议通常包括序列化协议和传输协议。序列化协议有基于纯文本的 XML 和 JSON、二进制编码的Protobuf和Hessian。传输协议是指其底层网络传输所使用的协议,比如 TCP、HTTP。
  • 可以看出HTTP是RPC的传输协议的一个可选方案,比如说 gRPC 的网络传输协议就是 HTTP。HTTP 既可以和 RPC 一样作为服务间通信的解决方案,也可以作为 RPC 中通信层的传输协议(此时与之对比的是 TCP 协议)。
<4>传输性能

由于gRPC使用protobuf进行消息编码(即序列化),而经protobuf序列化后的消息体积很小(传输内容少,传输相对就快);再加上HTTP/2协议的加持(HTTP1.1的进一步优化),使得gRPC的传输性能要优于Restful。

<5>传输形式

传输形式这块,gRPC最大的优势就是支持流式传输,传输形式具体可以分为四种(unary、client stream、server stream、bidirectional stream),这个后面我们会讲到;而Restful是不支持流式传输的。

<6>浏览器的支持度

不知道是不是gRPC发展较晚的原因,目前浏览器对gRPC的支持度并不是很好,而对Restful的支持可谓是密不可分,这也是gRPC的一个劣势,如果后续浏览器对gRPC的支持度越来越高,不知道gRPC有没有干饭Restful的可能呢?

<7>消息的可读性和安全性

由于gRPC序列化的数据是二进制,且如果你不知道定义的Request和Response是什么,你几乎是没办法解密的,所以gRPC的安全性也非常高,但随着带来的就是可读性的降低,调试会比较麻烦;而Restful则相反(现在有HTTPS,安全性其实也很高)

<8>代码的编写

由于gRPC调用的函数,以及字段名,都是使用stub文件的,所以从某种角度看,代码更不容易出错,联调成本也会比较低,不会出现低级错误,比如字段名写错、写漏。

5. gRPC的适用场景

从上面gRPC和Restful的比较中,我们其实也从侧面了解gRPC的优劣势,也能顺势推断出其应用场景。

  • gRPC,主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。
  • Restful,主要用于对外,比如提供接口给前端调用,提供外部服务给其他人调用等。

二、gRPC简单实践

一般来讲,实现一个gRPC服务端和客户端,主要分为这几步:

  • 1.安装 protobuf 依赖
  • 2.编写 proto 文件(IDL)
  • 3.编译 proto 文件(生成stub文件)
  • 4.编写server端,实现我们的接口
  • 5.编写client端,测试我们的接口

1. 安装 protobuf 编译库

        这是一个开源的项目,要使用protobuf需要安装protobuf编译环境和具体语言代码生成工具,这里以go语言为例进行安装测试,需要安装1个类库,2个工具

  • protobuf:protobuf核心类库
  • protoc-gen-go:生产go语言对应的代码,Java,python,ruby官网都有对应的工具。
  • protoc-gen-go-grpc:生成go语言gRPC调用接口定义go语言代码对应的工具

protobuf github地址:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format

安装protobuf,两种安装方式

<1>命令行安装

    可以搜索可用的protobuf源

brew search protobuf
搜索结果如下:
protobuf        protobuf-c      protobuf@21     protobuf@3      swift-protobuf

选择protobuf执行 

brew install protobuf

a.查看安装版本

protoc --version
libprotoc 25.1

b.查看安装的文件

brew list protobuf
/opt/homebrew/Cellar/protobuf/25.1/bin/protoc #二进制路径
/opt/homebrew/Cellar/protobuf/25.1/bin/protoc-25.1.0
/opt/homebrew/Cellar/protobuf/25.1/include/google/ (233 files) #google api文件路径
/opt/homebrew/Cellar/protobuf/25.1/include/java/core/src/main/java/com/google/protobuf/java_features.proto
/opt/homebrew/Cellar/protobuf/25.1/include/ (2 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/libprotobuf-lite.25.1.0.dylib
/opt/homebrew/Cellar/protobuf/25.1/lib/libprotobuf.25.1.0.dylib
/opt/homebrew/Cellar/protobuf/25.1/lib/libprotoc.25.1.0.dylib
/opt/homebrew/Cellar/protobuf/25.1/lib/cmake/ (10 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/pkgconfig/ (3 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/python3.10/ (56 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/python3.11/ (56 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/python3.12/ (56 files)
/opt/homebrew/Cellar/protobuf/25.1/lib/ (5 other files)
/opt/homebrew/Cellar/protobuf/25.1/share/emacs/site-lisp/protobuf/protobuf-mode.el
/opt/homebrew/Cellar/protobuf/25.1/share/protobuf/ (25 files)
/opt/homebrew/Cellar/protobuf/25.1/share/vim/vimfiles/syntax/proto.vim

c.protoc执行搜索的文件

cd /opt/homebrew/Cellar/protobuf/25.1/include/google/protobuf 
ll *.proto
-rw-r--r--@ 1 easton  admin   6.0K 11 16 02:52 any.proto
-rw-r--r--@ 1 easton  admin   7.5K 11 16 02:52 api.proto
-rw-r--r--@ 1 easton  admin   974B 11 16 02:52 cpp_features.proto
-rw-r--r--@ 1 easton  admin    49K 11 16 02:52 descriptor.proto
-rw-r--r--@ 1 easton  admin   4.8K 11 16 02:52 duration.proto
-rw-r--r--@ 1 easton  admin   2.3K 11 16 02:52 empty.proto
-rw-r--r--@ 1 easton  admin   8.0K 11 16 02:52 field_mask.proto
-rw-r--r--@ 1 easton  admin   2.3K 11 16 02:52 source_context.proto
-rw-r--r--@ 1 easton  admin   3.7K 11 16 02:52 struct.proto
-rw-r--r--@ 1 easton  admin   6.3K 11 16 02:52 timestamp.proto
-rw-r--r--@ 1 easton  admin   6.2K 11 16 02:52 type.proto
-rw-r--r--@ 1 easton  admin   3.9K 11 16 02:52 wrappers.proto

每当在proto文件中写

import “google/protobuf/descriptor.proto”; 

protoc在编译时会自动搜索protoc的安装路径,并查询descriptor.proto文件。

如果由于网络导致安装失败建议通过编译安装,下载源码进行编译,并安装。

<2>编译安装

下载源码:https://github.com/protocolbuffers/protobuf/releases

选择对应的操作系统下载源码即可,mac下载protoc-25.1-osx-aarch_64.zip

a.解压源码:

unzip protoc-25.1-osx-aarch_64.zip 

 b.执行编译并安装到:/usr/local/protobuf/,进入到解压后的目录执行如下命令

cd protoc-25.1-osx-aarch_64sudo ./configure --prefix=/usr/local/protobufsudo makesudo make checksudo make install

c.配置环境变量

vim ~/.bash_profile
export PROTOBUF=/usr/local/protobuf 
export PATH=$PROTOBUF/bin:$PATH
source ~/.bash_profile

d.执行命令:protoc --version 检查是否安装成功

protoc --version
libprotoc 25.1

2.安装protoc-gen-go

上一步安装的是protocol编译器。而上文中我们提到了可以生成各种不同语言的代码。因此,除了这个编译器,我们还需要配合各个语言的代码生成工具。

对于Golang来说,称为protoc-gen-go

不过在这儿有个小小的坑,github.com/golang/protobuf/protoc-gen-gogoogle.golang.org/protobuf/cmd/protoc-gen-go是不同的。

⚠️注意:原来的github.com/golang/protobuf/protoc-gen-go这个库已经被弃用,我们需要使用 google.golang.org/protobuf 这个库

 % go get -u github.com/golang/protobuf/protoc-gen-go
go: module github.com/golang/protobuf is deprecated: Use the "google.golang.org/protobuf" module instead.
go: added github.com/golang/protobuf v1.5.2
go: added google.golang.org/protobuf v1.28.0

区别在于前者是旧版本,后者是google接管后的新版本,他们之间的API是不同的,也就是说用于生成的命令,以及生成的文件都是不一样的。

因为目前的gRPC-go源码中的example用的是后者的生成方式,为了与时俱进,本文也采取最新的方式。

官网关于go语言的代码生成工具安装文档如下:

Go Generated Code Guide | Protocol Buffers Documentation

a.执行安装命令

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

这条命令会安装,并将protoc-gen-go可执行文件复制到 $GOBIN 文件夹下 ,也会将google.golang.org/protobuf源码文件下载到pkg包下,我的工程$GOBIN路径如下:

/Users/easton/sourceCode/go/goproject01/bin,可以看到生成了protoc-gen-go二进制文件

由于使用go mod包管理模式,会将源码下载到 $GOMODCACHE 目录下

GOMODCACHE="/Users/easton/sourceCode/go/goproject01/pkg/mod"

b.执行完安装,查看版本

可以进入到项目目录下执行命令

我的项目路径:cd /Users/easton/sourceCode/go/goproject01

protoc-gen-go --version
protoc-gen-go v1.31.0 #版本号

c.配置$GOBIN到环境变量

vim ~/.bash_profileexport GOBIN=/Users/easton/sourceCode/go/goproject01/bin
export $PATH=$GOBIN:$PATH

d.然后执行命令 

protoc-gen-go --version
protoc-gen-go v1.31.0 #版本号

3.安装protoc-gen-go-grpc

客户端代码访问服务端程序需要遵循grpc协议,这个需要根据proto文件定义对应的go语言版本的代码,使用protoc-gen-go-grpc工具生成。

a.执行安装命令

//先获取代码,再执行安装成二进制可执行文件
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

执行完在$GOBIN目录下生成protoc-gen-go-grpc,源码对应在pkg下

 

b. 查看安装版本

protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.3.0

c.配置$GOBIN到环境变量

如果希望在其他目录可以执行此命令需要配置一下环境变量,将 $GOBIN添加到环境变量,如果在安装protoc-gen-go配置过,则不再需要配置,如果发现命令不可用,执行一下你操作系统的环境变量bash脚本,zsh执行 source ~/.zshrc,bash执行 source ~/.bash_profile即可。

参考资料

Mac下protobuf安装:Protobuf 介绍与实战1:Mac环境下安装Protobuf(两种方式安装)_mac安装protobuf-CSDN博客

Mac下protobuf安装:Mac下环境搭建(用brew安装go和protoc)-腾讯云开发者社区-腾讯云

protobuf安装配置:Protobuf的安装、配置和使用(golang版) - 掘金

go proto代码生成工具安装:Go Generated Code Guide | Protocol Buffers Documentation

聊聊什么是gRPC - 知乎

gRPC介绍:https://www.cnblogs.com/songgj/p/11560565.html

protobuf介绍:https://www.cnblogs.com/songgj/p/13463717.html

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

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

相关文章

graphics.h安装后依旧报错

问题解决一&#xff1a; 我在网上找了很多&#xff0c;都说找到graphics.h这个文件&#xff0c;放到include这个目录下&#xff0c;我照做了&#xff0c;然后 当我进行编译时&#xff0c;自动跳到graphics.h这个文件并出现一堆报错 问题解决二&#xff1a; 看一下这两个文件是…

Windows11亮度调节滑块消失不见,如何解决

电脑亮度调节滑块消失&#xff0c;键盘F6&#xff0c;F7亮度调节失效&#xff0c;系统-屏幕-亮度和颜色-亮度调节消失不见 1.首先winR ,输入regedit打开注册表编辑器 2.在注册表编辑器中依次点击(红橙黄绿青蓝紫) “计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Cl…

CFS三层靶机内网渗透

CFS三层靶机内网渗透 一、靶场搭建1.基础参数信息2.靶场搭建2.1网卡配置2.2Target1配置2.2.1 网卡配置2.2.2 Target1 BT配置 2.3Target2配置2.3.1 网卡配置2.3.2 Target2 BT配置 2.4Target3配置 二、内网渗透Target11.1信息收集1.1.1IP收集1.1.2端口收集1.1.3目录收集 1.2 webs…

CentOS最小化安装后怎么转图形界面/可视化桌面?

文章目录 1、命令行和图形界面切换方式一方式二 2、最小化安装转桌面1-设置网络2-测试网络3-更新文件4-安装图形5-查看默认6-设置默认 界面效果参考视频 1、命令行和图形界面切换 如果安装的是最小化&#xff0c;那么init 5 (进入图像化桌面)命令是无效的 方式一 1.如果在命…

【计算机网络】15、NAT、NAPT 网络地址转换、打洞

文章目录 一、概念二、分类&#xff08;主要是传统 NAT&#xff09;2.1 基本 NAT2.2 NAPT 三、访问NAT下的内网设备的方式3.1 多拨3.2 端口转发、DMZ3.3 UPnP IGD、NAT-PMP3.4 服务器中转&#xff1a;frp 内网穿透3.4.1 NAT 打洞3.4.2 NAT 类型与打洞成功率3.4.2.1 完全圆锥形 …

基于hadoop下的hbase安装

简介 HBase是一个分布式的、面向列的开源数据库&#xff0c;该技术来源于Fay Chang所撰写的Google论文“Bigtable&#xff1a;一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统&#xff08;File System&#xff09;所提供的分布式数据存储一样&#xff0c;…

nodejs+vue+ElementUi酒店餐饮客房点餐管理系统

系统非功能需求&#xff0c;只能是为了满足客户需求之外的非功能性要求。系统需要具有数据完整性验证的功能&#xff0c;对界面上非法的数据和不完整的数据进行提示&#xff0c;不能直接保存到数据库中&#xff0c;造成不完整性因素。运行软件:vscode 前端nodejsvueElementUi 语…

VSCode 开发C/C++实用插件分享——codegeex

VSCode 开发C/C实用插件分享——codegeex 一、codegeex 一、codegeex CodeGeeX 智能编程助手是一款编程插件&#xff0c;CodeGeeX支持多种主流IDE&#xff0c;如VS Code、IntelliJ IDEA、PyCharm、Vim等&#xff0c;同时&#xff0c;支持Python、Java、C/C、JavaScript、Go等多…

LeetCode 2477. 到达首都的最少油耗:深度优先搜索(DFS)

【LetMeFly】2477.到达首都的最少油耗&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-fuel-cost-to-report-to-the-capital/ 给你一棵 n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一…

Doris 集成 ElasticSearch

Doris-On-ES将Doris的分布式查询规划能力和ES(Elasticsearch)的全文检索能力相结合,提供更完善的OLAP分析场景解决方案: (1)ES中的多index分布式Join查询 (2)Doris和ES中的表联合查询,更复杂的全文检索过滤 1 原理 (1)创建ES外表后,FE会请求建表指定的主机,获取所有…

Azure Machine Learning - 使用 Azure OpenAI 服务生成文本

使用 Azure OpenAI 服务生成文本 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理专业人士&…

一文读懂中间件

前言&#xff1a;在程序猿的日常工作中&#xff0c; 经常会提到中间件&#xff0c;然而大家对中间件的理解并不一致&#xff0c;导致了一些不必要的分歧和误解。“中间件”一词被用来描述各种各样的软件产品&#xff0c;在不同文献中有着许多不同的中间件定义&#xff0c;包括操…

Linux--初识和基本的指令(3)

目录 1.前言 1.指令 1.1 cat指令 1.2 echo指令 1.3 more 指令 1.4 less指令 1.5 什么时候使用less和more 1.6 head指令 1.7 tail指令 1.8 wc指令 1.9 与时间相关的指令 1.9.1 date指令 1.9.2 cal指令 1.10 16.find指令&#xff1a;&#xff08;灰常重要&#x…

RPG项目01_脚本代码

基于“RPG项目01_场景及人物动画管理器”&#xff0c;我们创建一个XML文档 在资源文件夹下创建一个文件夹&#xff0c; 命名为Xml 将Xnl文档拖拽至文件夹中&#xff0c; 再在文件夹的Manager下新建脚本LoadManager 写代码&#xff1a; using System.Collections; using System…

7、Qt延时的使用

一、说明 平时用到两种延时方式QThread::sleep()和QTimer::singleShot() 1、QThread::sleep() QThread类中如下三个静态函数&#xff1a; QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单&#xff0c;但是会阻…

四.多表查询

多表查询 1.一个案例引发的多表连接1.1案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3案例分析与问题解决 2.多表查询分类讲解分类1&#xff1a;等值连接vs非等值连接分类2&#xff1a;自连接vs非自连接分类3&#xff1a;内连接vs外连接 3.SQL99语法实现多表…

【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验 Vivado IP 核提供了 XADC 软核&#xff0c;XADC 包含两个模数转换器&#xff08;ADC&#xff09;&#xff0c;一个模拟多路复用器&#xff0c;片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压&#xff0c;也可以用来测…

在AWS Lambda上部署标准FFmpeg工具——自定义层的方案

大纲 1 确定Lambda运行时环境1.1 Lambda系统、镜像、内核版本1.2 运行时1.2.1 Python1.2.2 Java 2 打包FFmpeg3 创建Lambda的Layer4 测试4.1 创建Lambda函数4.2 附加FFmpeg层4.3 添加测试代码4.4 运行测试 参考文献 FFmpeg被广泛应用于音/视频流处理领域。对于简单的需求&#…

sizeof()、strlen()、length()、size()的区别(笔记)

​ 上面的笔记有点简陋&#xff0c;可以看一下下面这个博主的&#xff1a; c/c中sizeof()、strlen()、length()、size()详解和区别_csize,sizeof,length_xuechanba的博客-CSDN博客

Linux Docker 图形化工具 Portainer远程访问

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 结束语 前言 Portainer是一个轻量级的容器管理工具&#xff0c;可以通过Web界面对Docker容器进行管理和监控。它提供了…