2. 初识go-zero
介绍
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
go-zero 中的 api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力
只需要在生成的代码中填入自己的配置以及逻辑即可。
go-zero 框架具有以下显著特点:
强大的工具支持:尽可能少的代码编写**,通过 goctl 工具一键生成多端代码**。
极简的接口:完全兼容 net/http,支持中间件,方便扩展。
高性能:面向故障编程,弹性设计,内建服务发现、负载均衡、限流、熔断、降载等微服务治理能力。
自动校验:API 参数自动校验,超时级联控制,自动缓存控制。
链路跟踪:统计报警等,稳定保障了疫情期间每天的流量洪峰。
-
基本功能层面
- 并发控制 & 限流,避免服务被突发流量击垮
- 服务注册与服务发现,确保能够动态侦测增减的节点
- 负载均衡,需要根据节点承受能力分发流量
- 超时控制,避免对已超时请求做无用功
- 熔断设计,快速失败,保障故障节点的恢复能力
-
高阶功能层面
- 请求认证,确保每个用户只能访问自己的数据
- 链路追踪,用于理解整个系统和快速定位特定请求的问题
- 日志,用于数据收集和问题定位
- 可观测性,没有度量就没有优化
短链微服务架构
配置相关环境
- 安装etcd(高可用的分布式键值存储系统)工具 https://github.com/etcd-io/etcd/releases(用于 服务发现(Service Discovery);消息发布与订阅;负载均衡;分布式通知与协调;分布式锁)
- 安装protoc工具
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest - 安装goctl工具
go install github.com/zeromicro/go-zero/tools/goctl@latest
使用示例
单RPC服务
- 创建工作目录 shorturl shorturl/api
- 在shorturl/api 目录下运行指令 goctl api -o shorturl.api
- 编辑 api/shorturl.api
syntax = "v1"info (title: "go-zero rpc demo"desc: "单rpc的go-zero使用demo"author: "why151"email: "1758592354@qq.com"
)type expandReq {shorten string `form:"shorten"`
}type expandRes {url string `json:"url"`
}type(shortenReq{url string `form:"url"`}shortenRes{url string `json:"shorten"`}
)// 定义服务名字
service shorturl-api {// 定义了服务端 handler 名字@handler ShortenHandler// 定义了 get 方法的路由、请求参数、返回参数等get /shorten(shortenReq) returns(shortenRes)@handler ExpandHandlerpost /expand(expandReq) returns(expandRes)
}
- 在 shorturl/api目录下运行指令 goctl api go -api shorturl.api -dir .
生成的文件结构如下:
├── api
│ ├── etc
│ │ └── shorturl-api.yaml // 配置文件
│ ├── internal
│ │ ├── config
│ │ │ └── config.go // 定义配置
│ │ ├── handler
│ │ │ ├── expandhandler.go // 实现 expandHandler
│ │ │ ├── routes.go // 定义路由处理
│ │ │ └── shortenhandler.go // 实现 shortenHandler
│ │ ├── logic
│ │ │ ├── expandlogic.go // 实现 ExpandLogic
│ │ │ └── shortenlogic.go // 实现 ShortenLogic
│ │ ├── svc
│ │ │ └── servicecontext.go // 定义 ServiceContext
│ │ └── types
│ │ └── types.go // 定义请求、返回结构体
│ ├── shorturl.api
│ └── shorturl.go // main 入口定义
├── go.mod
└── go.sum - 运行 go mod tidy 整理依赖
- 启动 API Gateway 服务,默认侦听在 8888 端口
go run shorturl.go -f etc/shorturl-api.yaml - 测试 API Gateway 服务
curl -i “http://localhost:8888/shorten?url=https://go-zero.dev”
- 在 shorturl目录下创建 rpc/transform 目录
- 通过 goctl rpc -o transform.proto 生成proto文件模板
- 修改文件结构
syntax = "proto3";package transform;
option go_package="./transform";message expandReq{string shorten = 1;
}message expandRes{string url = 1;
}message shortenReq{string url = 1;
}message shortenRes{string shorten = 1;
}service Transform {rpc expand(expandReq) returns(expandRes);rpc shorten(shortenReq) returns(shortenRes);
}
- 利用下列指令生成rpc结构
goctl rpc protoc transform.proto --go_out=. --go-grpc_out=. --zrpc_out=.
文件结构如下:
rpc/transform
├── etc
│ └── transform.yaml // 配置文件
├── internal
│ ├── config
│ │ └── config.go // 配置定义
│ ├── logic
│ │ ├── expandlogic.go // expand 业务逻辑在这里实现
│ │ └── shortenlogic.go // shorten 业务逻辑在这里实现
│ ├── server
│ │ └── transformerserver.go // 调用入口, 不需要修改
│ └── svc
│ └── servicecontext.go // 定义 ServiceContext,传递依赖
├── transform
│ ├── transform.pb.go
│ └── transform_grpc.pb.go
├── transform.go // rpc 服务 main 函数
├── transform.proto
└── transformer
└── transformer.go // 提供了外部调用方法,无需修改
- 启动etcd server
- 启动rpc服务
go run transform.go -f etc/transform.yaml - 查看服务是否注册
- 修改 API Gateway 代码调用 transform rpc 服务
- 修改配置文件 shorturl-api.yaml, 新增下列内容,通过 etcd 自动去发现可用的 transform 服务
Transform:Etcd:Hosts:- localhost:2379Key: transform.rpc
- 修改 shorturl/api/internal/config/config.go 如下,增加 transform 服务依赖
type Config struct {rest.RestConfTransform zrpc.RpcClientConf // 手动代码
}
- 修改 shorturl/api/internal/svc/servicecontext.go,如下:
type ServiceContext struct {Config config.ConfigTransformer transformer.Transformer // 手动代码
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,Transformer: transformer.NewTransformer(zrpc.MustNewClient(c.Transform)), // 手动代码}
}
通过 ServiceContext 在不同业务逻辑之间传递依赖
- 修改 shorturl/api/internal/logic/expandlogic.go 里的 Expand 方法,如下:
func (l *ExpandLogic) Expand(req types.ExpandReq) (types.ExpandResp, error) {// 手动代码开始 rpcResp, err := l.svcCtx.Transformer.Expand(l.ctx, &transformer.ExpandReq{Shorten: req.Shorten,})if err != nil {return nil, err}return &types.ExpandResp{Url: rpcResp.Url,}, nil// 手动代码结束
}
通过调用 transformer 的 Expand 方法实现短链恢复到 url
- 修改 shorturl/api/internal/logic/shortenlogic.go,如下:
func (l *ShortenLogic) Shorten(req types.ShortenReq) (types.ShortenResp, error) {// 手动代码开始rpcResp, err := l.svcCtx.Transformer.Shorten(l.ctx, &transformer.ShortenReq{Url: req.Url,})if err != nil {return nil, err}return &types.ShortenResp{Shorten: rpcResp.Shorten,}, nil// 手动代码结束
}
通过调用 transformer 的 Shorten 方法实现 url 到短链的变换
- 定义数据库表结构,并生成 CRUD+cache 代码
-
shorturl 下创建 rpc/transform/model 目录:mkdir -p rpc/transform/model
-
在 rpc/transform/model 目录下编写创建 shorturl 表的 sql 文件 shorturl.sql,如下:
CREATE TABLE `shorturl`
(`shorten` varchar(255) NOT NULL COMMENT 'shorten key',`url` varchar(255) NOT NULL COMMENT 'original url',PRIMARY KEY(`shorten`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在 mysql-server 的 go-zero 数据库下新增如上表结构
- 在 rpc/transform/model 目录下执行如下命令生成 CRUD+cache 代码,-c 表示使用 redis cache
goctl model mysql ddl -c -src shorturl.sql -dir .
生成后的文件结构如下:
rpc/transform/model
├── shorturl.sql
├── shorturlmodel.go // 扩展代码
├── shorturlmodel_gen.go // CRUD+cache 代码
└── vars.go // 定义常量和变量
- 修改 shorten/expand rpc 代码调用 crud+cache 代码
- 修改 rpc/transform/etc/transform.yaml,增加如下内容:
DataSource: root:password@tcp(localhost:3306)/gozero # 用户名和密码为你本地 mysql-server 密码,并非完全一致
Table: shorturl
Cache:- Host: localhost:6379
可以使用多个 redis 作为 cache,支持 redis 单点或者 redis 集群
- 修改 rpc/transform/internal/config/config.go,如下:
type Config struct {zrpc.RpcServerConfDataSource string // 手动代码Table string // 手动代码Cache cache.CacheConf // 手动代码
}
增加了 mysql 和 redis cache 配置
- 修改 rpc/transform/internal/svc/servicecontext.go,如下:
type ServiceContext struct {c config.ConfigModel model.ShorturlModel // 手动代码
}
func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{c: c,Model: model.NewShorturlModel(sqlx.NewMysql(c.DataSource), c.Cache), // 手动代码}
}
- 修改 rpc/transform/internal/logic/expandlogic.go,如下:
func (l *ExpandLogic) Expand(in *transform.ExpandReq) (*transform.ExpandResp, error) {// 手动代码开始res, err := l.svcCtx.Model.FindOne(l.ctx,in.Shorten)if err != nil {return nil, err}return &transform.ExpandResp{Url: res.Url,}, nil// 手动代码结束
}
- 修改 rpc/transform/internal/logic/shortenlogic.go,如下:
func (l *ShortenLogic) Shorten(in *transform.ShortenReq) (*transform.ShortenResp, error) {// 手动代码开始,生成短链接key := hash.Md5Hex([]byte(in.Url))[:6]_, err := l.svcCtx.Model.Insert(l.ctx,&model.Shorturl{Shorten: key,Url: in.Url,})if err != nil {return nil, err}return &transform.ShortenResp{Shorten: key,}, nil// 手动代码结束
}
- 在 shorturl 目录下执行 go mod tidy 整理依赖
-
重新依次启动 redis-server,etcd-server,mysql-server, rpc 服务
-
etcd,redis,mysql 自行根据找教程安装启动
-
启动 rpc 服务
cd rpc/transform
go run transform.go -f etc/transform.yaml
- 新开终端启动 api 服务
cd api
go run shorturl.go -f etc/shorturl-api.yaml
- shorten api 调用
新开终端调用
curl -i "http://localhost:8888/shorten?url=https://go-zero.dev"
返回如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-fe81053320bb99d1d924021a110765bd-fa915fae41db454d-00
Date: Thu, 10 Aug 2023 03:32:05 GMT
Content-Length: 20{"shorten":"b0434f"}%
- expand api 调用
shorten 值为上一步返回的值为准,每个人返回的值不一样
curl -i "http://localhost:8888/expand?shorten=b0434f"
返回如下:
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-0b11aab486c47a35586d6ed08236afb2-b12387d8cc1e3508-00
Date: Thu, 10 Aug 2023 03:32:54 GMT
Content-Length: 29{"url":"https://go-zero.dev"}%
多RPC服务
书店微服务架构图
- 生成api结构
- 生成 add check 两个 rpc结构
- 生成model结构
- 为api配置rpc服务(通过etcd自动去发现可用的服务依赖)
Add:Etcd:Hosts:- localhost:2379Key: add.rpcCheck:Etcd:Hosts:- localhost:2379Key: check.rpc
- 配置config增加服务依赖
type Config struct {rest.RestConfAdd zrpc.RpcClientConfCheck zrpc.RpcClientConf
}
- 修改servicecontext.go 在不同业务逻辑之间传递依赖
type ServiceContext struct {Config config.ConfigAdd adder.AdderCheck checker.Checker
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config: c,Add: adder.NewAdder(zrpc.MustNewClient(c.Add)),Check: checker.NewChecker(zrpc.MustNewClient(c.Check)),}
}
- 为RPC服务增加mysql 和 redis 配置
DataSource: root:root@tcp(192.168.145.10:3306)/gozero
Table: book
Cache:- Host: 192.168.145.10:6379
type Config struct {zrpc.RpcServerConfDataSource stringTable stringCache cache.CacheConf
}
- 实现rpc的logic函数代码
- api调用rpc方法
- 验证
相关文章:
2. 初识go-zero
介绍 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。 go-zero 中的 api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力…...
【身份安全】零信任安全框架梳理(一)
目录 零信任网络安全防护理念一、定义零信任原则 二、零信任实现方式三、零信任的核心机制和思想1. 持续验证(Continuous Verification)2. 多因素认证(MFA)与强身份验证3. 细粒度权限控制(最小权限原则)4. …...
Ansys Zemax | 联合Speos实现供应商与OEM交换黑盒光学系统
附件下载 联系工作人员获取附件 本文展示了供应商和OEM如何交换加密光学模型(也称为黑匣子模型),从Ansys Zemax OpticStudio中的光学元件设计到Ansys Speos中的系统分析。 概述 在供应商和OEM之间,有两种类型的黑盒模型可以从…...
简历含金量的描述和注意事项!
背景 最近,在公司负责后端相关面试,简历看了不下 50 份,面试 10,纯手码 2000 多字,说说我对简历的看法,希望给大家一点启发。 教育经历 在众多求职面试中,我发现多数求职者容易忽视教育背景的…...
GPT Researcher 的win docker安装攻略
github网址是:https://github.com/assafelovic/gpt-researcher 因为docker安装方法不够清晰,因此写一个使用方法 以下是针对 Windows 系统 使用 Docker 运行 AI-Researcher 项目的 详细分步指南: 步骤 1:安装 Docker 下载 Docke…...
语言模型理论基础-持续更新-思路清晰
1.预训练 相似的任务A、B,任务A已经用大数据完成了训练,得到模型A。 我们利用-特征提取模型的-“浅层参数通用”的特性,使用模型A的浅层参数,其他参数再通过任务B去训练(微调)。 2.统计语言模型 通过条件…...
【C++指针】搭建起程序与内存深度交互的桥梁(下)
🔥🔥 个人主页 点击🔥🔥 每文一诗 💪🏼 往者不可谏,来者犹可追——《论语微子篇》 译文:过去的事情已经无法挽回,未来的岁月还可以迎头赶上。 目录 C内存模型 new与…...
ElasticSearch常用优化点
关闭交换分区:因为Linux采用了三级页表虚存管理,关闭交换分区可以减少系统IO,页面换入唤出时所耗费的总线时间以及减少系统中断次数;swap的使用会显著增加延迟和降低吞吐量。文件描述符配置:任何网络应用都需要增加文件…...
数据结构每日一题day3(顺序表)★★★★★
题目描述:顺序表L的元素递增有序排列,设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想:在递增有序的顺序表中插入元素 x 并保持有序性,步骤如下: 合法…...
VS Code 中 .history`文件的来源与 .gitignore`的正确使用
引言 在使用 VS Code 进行 Git 版本控制时,有时会发现项目中多出一个 .history 目录,并被 Git 识别为未跟踪文件。本文将解释 .history 的来源,并提供 .gitignore 的正确配置方法,确保开发环境的整洁性。 1. .history 文件的来源…...
2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数,求链式表的表长。 函数接口定义: &…...
element-plus中Cascader级联选择器组件的使用
目录 一.基本使用 二.进阶使用 1.如何获取最后一级选项的值? 2.如何让级联选择器的输入框只展示最后一级? 三.实战 1.场景描述 2.实现步骤 ①设计后端返回值Vo ②编写controller ③编写service ④编写mapper层 ⑤在前端,通过发送…...
性能测试、负载测试、压力测试的全面解析
在软件测试领域,性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。它们各自关注不同的测试目标和应用场景,理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析,探讨其定义、…...
阶段一:Java基础语法
目标:掌握Java的基本语法,理解变量、数据类型、运算符、控制结构等。 1. Java开发环境搭建 安装JDK配置环境变量编写第一个Java程序 代码示例: // HelloWorld.java public class HelloWorld { // 定义类名为 HelloWorldpublic static vo…...
信息安全的数学本质与工程实践
信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...
GPU架构与通信互联技术介绍
文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …...
解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题
一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...
CosyVoice2在Windows系统上本地部署的详细步骤
CosyVoice2在Windows系统上本地部署的详细步骤: 下载源码并初始化: 确保你的设备上安装了Git。打开命令提示符(cmd),执行以下命令来克隆仓库:git clone --recursive https://github.com/FunAudioLLM/CosyVo…...
【拒绝算法PUA】LeetCode 2255. 统计是给定字符串前缀的字符串数目
目录 系列文章目录 专题总结: C刷题技巧总结: 题目 2116. 判断一个括号字符串是否有效 难度 描述 解题方法1 系列文章目录 专题总结: 【拒绝算法PUA】0x00-位运算【拒绝算法PUA】0x01- 区间比较技巧【拒绝算法PUA】0x02- 区间合并技…...
华为HCIE鸿蒙应用开发认证靠谱吗?
在万物互联时代,智能终端设备的多样性与协同需求催生了操作系统的革新。华为HarmonyOS(鸿蒙系统)凭借其分布式架构与全场景能力,正成为打破设备边界、重塑用户体验的核心技术底座。HCIE鸿蒙应用开发认证作为华为认证体系的顶级资质…...
AWE 2025:当AI科技遇见智能家居
3月20日,以“AI科技、AI生活”为主题的AWE2025(中国家电及消费电子博览会)在上海新国际博览中心开幕。作为全球家电行业风向标,本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化,从衣物清…...
CSS选择器
文章目录 基本选择器复合选择器交集选择器并集选择器后代选择器子代选择器兄弟选择器相邻兄弟选择器通用兄弟选择器 属性选择器伪类选择器动态伪类结构伪类:first-child:last-child:nth-child:nth-last-child:first-of-type:last-of-type:nth-of-type:nth-last-of-type:only-ch…...
吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…...
C++11QT复习 (四)
Day6-1 输入输出流运算符重载(2025.03.25) 1. 拷贝构造函数的调用时机 2. 友元2.1 友元函数 3. 输入输出流运算符重载3.1 关键知识点3.2 代码3.3 关键问题3.4 完整代码 4. 下标访问运算符 operator[]4.1 关键知识点4.2 代码 5. 函数调用运算符 operator…...
Allure 报告数据存储结构
Allure 报告数据存储结构 Allure的报告的下有一个data目录,里面存储了全部展示的数据。data目录下面有两种类型的文件一类是csv,一类是json,两个类型的文件中同名的文件数据是一样的,只是不同的展示方法。我们就按照json格式的数据…...
HarmonyOS:基于axios实现文件的下载以及下载进度的监听
#前言:项目开发中,避免不了实现文件下载功能,其他平台的下载都很成熟,网上的例子也比较多,我就自己项目中实现的下载功能做个总结,你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…...
应用服务接口第二次请求一直pending问题
目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境,验证相关服务,查看接口调用日志,发现第一次请求正常,第二次相同接口请求就一直pending,其他服务也是如此 二、问题排查…...
外设的中断控制
如ADC、SPI、I2C、TIM等使用STM32 HAL库时的中断函数调用方式和UART非常类似,都有底层直接使能中断和上层库函数管理两种方式。下面详细说明几种典型外设: 一、ADC外设 (1)直接使能中断(底层控制)…...
云资源开发学习应用场景指南,场景 1 云上编程实践平台
云资源开发学习应用场景指南 云资源开发学习应用场景指南,场景 2:云桌面实验室 云资源开发学习应用场景指南,场景 3:云资源支持的项目实践 场景 1:云上编程实践平台 《如何在云平台上搭建你的第一个编程实践环境》…...
C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因
文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…...
第四届能源、电力与电气国际学术会议(ICEPET 2025)
重要信息 地点:中国-成都 官网:www.icepet.net(了解参会投稿等信息) 时间:2025年4月25-27日 简介 第四届能源、电力与电气会(ICEPET 2025定于2025年4月25-27日在中国成都举办。 本次将围绕能源、电力及…...
【IDEA的个性化配置】
目录: 一:隐藏项目路径二:禁用斜体注释三:重新Maven构建未完待续... 一:隐藏项目路径 😊在IDEA左侧的Project目录中,项目名称后面显示了项目的文件路径地址,如果不喜欢可以隐藏&…...
分享最近前端面试遇到的一些问题
前情提要(分享个人情况,可以直接跳过) 先说一下我的个人情况,我是2026届的,目前是在找前端实习。 3月初,从3月3日开始在Boss上投简历。 分享我的个人故事,不想看可以直接滑到下面,…...
SSH免密登录服务器方法
Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙,使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …...
3.26前端模拟面试
包含 Vue 3、TypeScript、性能优化、工程化等方面,偏八股文。 基础知识 Vue 3 响应式原理:Vue 3 如何实现响应式系统?Proxy 和 Reflect 的作用是什么? TypeScript 类型体操:实现一个 TypeScript 类型 DeepPartial&am…...
23种设计模式-备忘录(Memento)设计模式
备忘录设计模式 🚩什么是备忘录设计模式?🚩备忘录设计模式的特点🚩备忘录设计模式的结构🚩备忘录设计模式的优缺点🚩备忘录设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
六十天Linux从0到项目搭建(第八天)(缓冲区、gitee提交)
一 缓冲区,C中有很多字符a. 可显字符 b.控制字符 在 C 语言 中,字符可以分为 可显字符(Printable Characters) 和 控制字符(Control Characters),它们通常存储在 缓冲区(Buffer&…...
QOpenGLWidget视频画面上绘制矩形框
一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…...
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token http.tsapp.tsvue文件 http.ts import axios from axios // 引入axios import router from /router import Qs from qs import { ElMessage } from element-plusconst { prefixBasePath } requir…...
前端使用WPS WebOffice 做在线文档预览与编辑
先附上官网 WebOffice SDK 1、在下面这个地方找到jdk,然后下载 按照 2、只需要把jdk下载下来,放到项目中,然后引入到项目中就可以了,在wps 官网创建个应用,然后把appId放到代码中就可以了,等待后端把回调…...
在 CentOS 系统中开机自动执行 Shell 脚本
在 CentOS 系统中,可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务(现代 Linux 系统的标准方式),也可以使用传统的 /etc/rc.local 方法。 方法 1:使用 Systemd 服务(推荐)…...
kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?
1. inline、noinline、crossinline 的作用 在 Kotlin 里,inline、noinline 和 crossinline 这几个关键字和高阶函数紧密相关,它们能够对高阶函数的行为进行优化和控制。本文接下来会详细介绍它们的作用和原理。 1.1 inline 关键字 inline 关键字用于修…...
Python电影市场特征:AR模型时间序列趋势预测、热图可视化评分影响分析IMDb数据|附数据代码
原文链接:https://tecdat.cn/?p41214 分析师:Zhiheng Lin 在数字时代,电影产业的数据分析已成为洞察市场趋势与用户偏好的重要工具。本专题合集聚焦印度电影市场,通过IMDb数据集(IMDb Movies Dataset)的深…...
【后端】【Django DRF】从零实现RBAC 权限管理系统
Django DRF 实现 RBAC 权限管理系统 在 Web 应用中,权限管理 是一个核心功能,尤其是在多用户系统中,需要精细化控制不同用户的访问权限。本文介绍如何使用 Django DRF 设计并实现 RBAC(基于角色的访问控制)系统&…...
使用docker部署springboot、Vue分离项目,部署到主路径
这几天写了一个小的应用,牵涉到了使用docker部署问题,中间遇到了一些小问题,此处记录下,为以后遇到类似的问题提供一些解决思路。 1、准备使用的镜像:mysql、redis、nginx、jdk。 镜像地址: docker pull s…...
大疆上云api直播功能如何实现
概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…...
服务器数据恢复—Raid5热备盘同步中断的数据恢复案例
服务器数据恢复环境: 某公司一台存储上有一组由15块硬盘组建的raid5阵列。raid5阵列上层是一个xfs裸分区,起始位置是0扇区。 服务器故障: raid5阵列中有一块硬盘出现故障掉线,热备盘自动上线同步数据,数据同步还没有完…...
FFmpeg开发学习:AVFormatContext结构体
1.AvFormatContext结构体 是ffmpeg中用于处理多媒体文件的核心结构体之一,属于libavformat模块,主要负责描述一个多媒体文件或流的封装格式,用来打开,读取,写入,操作媒体文件(如.MP4 .mkv .flv…...
Ceph集群2025(Squid版)导出高可用NFS集群(上集)
#创建一个CephFS 文件系统 ceph fs volume create cephfs02#创建子卷 ceph fs subvolumegroup create cephfs02 myfsg2#查看子卷 ceph fs subvolumegroup ls cephfs02[{"name": "myfsg2"} ]创建 NFS Ganesha 集群 #例子 $ ceph nfs cluster create <c…...
Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)
一、 高斯滤波 边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后,其实把它们连起来边缘检测就算完了…...