当前位置: 首页 > news >正文

【gRPC-gateway】是否有拦截器的情况添加健康检查的细节,与多路复用runtime.NewServeMux和gRPC区别讲解,与跨域功能,go案例

健康检查详解

什么是健康检查?

健康检查(Health Checking)是一种机制,用于监控服务的状态,确保服务在运行时是健康的、可用的。通过健康检查,系统可以自动检测服务是否正常工作,并在出现问题时采取相应的措施,如重新启动服务或将其从负载均衡器中移除。

在gRPC中的应用

在gRPC中,健康检查通常用于以下几个方面:

  • 服务发现:负载均衡器或其他服务发现工具可以通过健康检查来判断某个服务实例是否可用。
  • 故障转移:当某个服务实例不可用时,客户端可以自动切换到其他健康的实例。
  • 维护模式:管理员可以手动将服务标记为“不健康”,以便进行维护或更新。

具体实现

grpc_health_v1.RegisterHealthServer(s, health.NewServer())
  • health.NewServer() 创建了一个新的健康检查服务器实例。
  • grpc_health_v1.RegisterHealthServer(s, ...) 将这个健康检查服务器注册到 gRPC 服务器 s 中。

这意味着,一旦有客户端请求健康检查,gRPC 服务器会通过这个健康检查服务器来响应请求,告知客户端当前服务的状态。

控制流图

使用 health.NewServer 创建
使用 RegisterHealthServer 注册到 gRPC 服务器 s
创建健康检查服务器
注册健康检查服务器
完成注册

接下来建立与gRPC服务器的连接,注册健康检查grpc服务器

  1. 建立gRPC连接
   conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {return err}
  • 使用 grpc.Dial 方法连接到指定的 gRPC 服务器地址 *grpcServerEndpoint
  • grpc.WithTransportCredentials(insecure.NewCredentials()) 表示使用不安全的传输凭证(即不启用TLS)。
  • 如果连接失败,返回错误。
  1. 创建HTTP处理多路复用器
   mux := runtime.NewServeMux(inComingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))
  • runtime.NewServeMux 创建一个新的 HTTP 处理多路复用器。
  • inComingOpt 是传入的自定义选项,用于配置 ServeMux。
  • runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)) 指定健康检查的 gRPC 客户端。通过 NewHealthClient(conn) 创建一个健康检查客户端,并将其绑定到默认路径 /healthz
  • 可以使用 WithHealthEndpointAt() 来指定自定义的健康检查路径。

扩展: 多路复用器.yaml配置的http.rules的区别

区别与使用场景

mux.HandlePath("POST", "/upload", uploadHandler) 和通过 .yaml 文件配置 http.rules 的作用并不完全相同,它们适用于不同的场景和需求。下面详细解释两者的区别以及各自的适用场景。

1. mux.HandlePath

功能

mux.HandlePath("POST", "/upload", uploadHandler)
  • 手动注册HTTP路由:直接在代码中为特定的HTTP路径和方法(如 /uploadPOST)注册一个处理函数 uploadHandler
  • 灵活性高:可以在代码中动态添加或修改路由规则,适合需要灵活控制路由逻辑的场景。
  • 独立于gRPC服务定义:不依赖于gRPC服务定义文件(如 .proto.yaml),可以用于处理非gRPC相关的HTTP请求。

使用场景

  • 自定义HTTP API:当你需要实现一些与gRPC服务无关的HTTP接口时,例如上传文件、处理静态资源等。
  • 动态路由:需要根据运行时条件动态注册路由的情况。

2. http.rules in .yaml 文件

功能

http:rules:- selector: user.User.Getget: "/user/{id}"- selector: user.User.AddOrUpdatepost: "/user"body: "*"additional_bindings:- put: "/user"body: "*"- patch: "/user"body: "addr"- selector: user.User.Deletedelete: "/user/{id}"
  • 映射gRPC到HTTP:将gRPC服务的方法映射为HTTP端点,并指定HTTP方法和路径。
  • 基于服务定义:这些规则是基于gRPC服务定义文件(.proto)生成的,确保HTTP接口与gRPC服务保持一致。
  • 自动处理:通过 grpc-gateway 自动生成HTTP处理逻辑,减少手动编写代码的工作量。

区别总结

特性mux.HandlePathhttp.rules in .yaml 文件
注册方式手动在代码中注册在配置文件中定义
依赖关系独立于gRPC服务定义基于gRPC服务定义
灵活性高,适合动态路由较低,但更稳定
适用场景自定义HTTP API、动态路由gRPC网关、HTTP与gRPC接口一致性维护

示例对比

  • mux.HandlePath

    mux.HandlePath("POST", "/upload", uploadHandler)
    

    这段代码仅注册了一个特定的HTTP路由,处理上传文件的请求,与gRPC服务无关。

  • http.rules

    http:rules:- selector: user.User.Getget: "/user/{id}"
    

    这段配置将 user.User.Get 方法映射为HTTP GET请求 /user/{id},并由 grpc-gateway 自动生成相应的处理逻辑。

控制流图

调用 grpc.Dial
Yes
No
配置 ServeMux 和健康检查
建立gRPC连接
连接是否成功
创建HTTP处理多路复用器
返回错误
完成配置

值得一提的是如果之前写了一元请求拦截器,那么,需要设置规则跳过健康检查的验证

在这里插入图片描述


为什么不将 upload 放到 .yaml 里,反而使用多路复用器注册?

1. 功能差异

upload 的特殊性

  • 文件上传upload 通常涉及文件上传操作,这种操作可能需要处理较大的二进制数据流、分块上传、进度跟踪等复杂逻辑。
  • 自定义处理:文件上传可能需要额外的中间件来处理文件存储、验证、转换等操作,这些逻辑不适合直接映射到 gRPC 方法上。

.yaml 中的 HTTP 规则

  • RESTful API 映射.yaml 文件主要用于将 gRPC 方法映射为标准的 RESTful API,适用于结构化数据(如 JSON)的传输。
  • 简单路由:它更适合处理简单的 CRUD 操作和其他基于 JSON 的请求,不擅长处理复杂的文件上传场景。

2. 灵活性与控制

多路复用器的灵活性

  • 动态注册:通过 mux.HandlePath 可以在代码中动态注册路由,适合需要根据运行时条件调整路由逻辑的场景。
  • 独立于 gRPCupload 路由可以完全独立于 gRPC 服务定义,不会影响现有的 gRPC 接口设计。
  • 自定义中间件:可以方便地添加自定义中间件(如认证、日志、限流等),更好地控制文件上传的整个流程。

.yaml 文件的限制

  • 静态配置.yaml 文件是静态配置,修改后需要重新生成代码或重启服务,不如代码中的动态注册灵活。
  • 依赖 gRPC:必须有对应的 gRPC 方法才能映射,而文件上传通常不需要一个专门的 gRPC 方法。

3. 维护与扩展

维护成本

  • 集中管理:如果所有路由都放在 .yaml 文件中,可能会导致文件变得庞大且难以维护。特别是当涉及到复杂的业务逻辑时,代码中的路由注册更易于管理和调试。
  • 分离关注点:将文件上传逻辑与常规的 gRPC 网关路由分开,有助于分离关注点,使代码结构更加清晰。

扩展性

  • 未来扩展:如果你将来需要为 upload 添加更多功能(如支持多种文件类型、版本控制等),代码中的实现会更容易扩展和维护。

如何抉择grpc与多路复用

功能需求适用技术理由企业常用的功能对应
高性能微服务通信gRPC高效、低延迟、强类型检查内部微服务之间的实时数据同步、高频交易系统、实时消息推送
结构化数据传输gRPC固定且复杂的数据格式用户信息管理、商品信息查询、订单处理等业务逻辑
支持多种语言客户端gRPC多语言支持,跨平台通信移动应用与后端服务的通信(iOS 和 Android 应用)、多语言微服务架构
文件上传/下载ServeMux二进制数据传输,自定义中间件文件存储服务、图片和视频上传下载、文档管理系统
自定义HTTP APIServeMux独立于 gRPC,灵活扩展健康检查接口、管理后台API(如用户权限管理、配置管理)、监控和日志接口
动态路由ServeMux运行时动态调整路由动态生成的API路由(如基于用户角色的访问控制)、A/B测试和实验性功能的快速迭代
传统HTTP客户端对接ServeMux向后兼容,第三方集成Web 前端的 AJAX 请求、第三方支付网关、社交媒体API集成

所以健康检查应该放到多路复用里

mux := runtime.NewServeMux(inComingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))  

跨域

  • 在gateway.go中添加handler := middleware.Cors(mux)
  • Cors示例:func Cors(handler http.Handler) http.Handler {

为什么mux可以传进Cors?

  • Cors接收一个http.Handler

在这里插入图片描述

  • Handler接口只有一个 ServeHTTP方法需要实现

在这里插入图片描述

  • 而mux对应的serveMux 实现了ServeHTTP方法。因此它可以作为 http.Handler 使用

在这里插入图片描述


完整跨域代码

middleware.go

package middlewareimport "net/http"// Cors 是一个中间件函数,用于为HTTP处理器添加跨域资源共享(CORS)支持。
// 它接受一个 http.Handler 类型的参数,并返回一个新的 http.Handler。
// 这个新的处理器会在每个响应中添加CORS相关的HTTP头部,以允许跨域请求。
func Cors(handler http.Handler) http.Handler {// 创建一个新的http.HandlerFunc,它实现了http.Handler接口。// 这个匿名函数将原始处理器和CORS逻辑结合在一起。return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {// 获取请求的方法。method := r.Method// 获取请求的Origin头部,用于判断是否需要添加CORS支持。origin := r.Header.Get("Origin")// 如果Origin头部不为空,则添加CORS相关的HTTP头部。if origin != "" {// 允许所有来源的跨域请求(* 表示通配符)。// 也可以根据需要替换为指定的域名,以提高安全性。w.Header().Set("Access-Control-Allow-Origin", "*")// 指定允许的HTTP方法,以支持跨域请求。w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE, PATCH")// 指定允许的HTTP头部,以支持跨域请求。w.Header().Set("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")// 指定允许暴露的HTTP头部,以支持跨域请求。w.Header().Set("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")// 允许跨域请求带上用户凭证(如Cookies)。w.Header().Set("Access-Control-Allow-Credentials", "true")}// 如果请求的方法是OPTIONS,且设置了Origin头部,则返回204状态码,// 表示预检请求成功,实际请求可以继续进行。if method == "OPTIONS" {w.WriteHeader(http.StatusNoContent)return}// 调用原始的处理器函数,继续处理请求。handler.ServeHTTP(w, r)})
}

gateway.go

package gatewayimport ("context""flag""github.com/grpc-ecosystem/grpc-gateway/v2/runtime"gw "golang19-grpc-gateway/user/proto""golang19-grpc-gateway/user/user-server/gateway/middleware""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""google.golang.org/grpc/health/grpc_health_v1""net/http"
)var (// grpc服务器端点grpcServerEndpoint = flag.String("grpc-server-endpoint", "localhost:50051", "gRPC server endpoint")
)// Run 启动一个 HTTP 服务器,用于将 HTTP 请求转发到 gRPC 服务器。
// 该函数配置了一个 HTTP 多路复用器以处理不同的 HTTP 路径,并将这些路径与 gRPC 方法关联起来。
// 它还设置了一个不安全的 gRPC 连接选项,仅适用于开发环境。
// 返回值: 如果 HTTP 服务器启动失败或在处理请求时遇到错误,则返回错误。
func Run() error {// 初始化一个上下文对象,用于取消操作和传递请求范围的值。ctx := context.Background()// 创建一个可取消的上下文,以便在函数退出时取消可能的挂起操作。ctx, cancel := context.WithCancel(ctx)// 确保在函数退出时取消上下文。defer cancel()// inComingOpt 配置了一个处理传入的http请求头的选项// 该选项使用一个函数来检查和转换请求头的键// 该匹配器函数决定哪些传入的HTTP头应该被传递给gRPC上下文,以及是否应该修改这些头的键。inComingOpt := runtime.WithIncomingHeaderMatcher(func(s string) (string, bool) {// 如果matcher返回true,则该标头将传递给gRPC上下文。要在传递给gRPC上下文之前转换标头,匹配器应返回修改后的标头。switch s {// 对于"Service-Authorization"头,将其转换为"service-authorization"并传递给gRPC上下文。case "Service-Authorization":return "authorization", true// 不修改请求头的键,不传递给上下文default:return "", false}})// 使用 gRPC 拨号函数连接到 gRPC 服务器端点。// 参数 grpcServerEndpoint 是服务器地址,WithTransportCredentials 指定使用不安全的凭据进行传输。// 如果连接失败,返回错误。conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {return err}// 创建一个 HTTP 处理多路复用器,用于将 HTTP 请求分发到不同的处理程序。// inComingOpt 是传入的自定义选项,用于配置 ServeMux。// WithHealthzEndpoint 选项用于指定健康检查的 gRPC 客户端,通过 NewHealthClient 创建。// WithHealthzEndpoint默认路径"/healthz"  WithHealthEndpointAt()可以自己指定路径mux := runtime.NewServeMux(inComingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))// 为 "/upload" 路径添加一个处理程序,处理 POST 请求。mux.HandlePath("POST", "/upload", uploadHandler)// handler变量用于处理跨域请求,通过将mux传递给middleware.Cors来实现。// 这里使用了中间件Cors来处理跨域问题,以确保应用程序的安全性和功能性。handler := middleware.Cors(mux)// 配置一个不安全的 gRPC 连接选项,这仅适用于开发环境。opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}// 将 gRPC 方法映射为 HTTP 请求,使 HTTP 客户端可以与 gRPC 服务器通信。err = gw.RegisterUserHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)// 如果注册处理程序时发生错误,返回该错误。if err != nil {return err}// 启动 HTTP 服务器,监听端口 8081,使用配置好的多路复用器处理请求。return http.ListenAndServe(":8081", handler)
}

https://github.com/0voice

相关文章:

【gRPC-gateway】是否有拦截器的情况添加健康检查的细节,与多路复用runtime.NewServeMux和gRPC区别讲解,与跨域功能,go案例

健康检查详解 什么是健康检查? 健康检查(Health Checking)是一种机制,用于监控服务的状态,确保服务在运行时是健康的、可用的。通过健康检查,系统可以自动检测服务是否正常工作,并在出现问题时…...

vue开发时,用localStorage常用方法及存储数组方法。

localStorage 可以让你在浏览器中存储键值对,并且在页面关闭后数据依然保留。localStorage 中存储的数据会一直保存在客户端,直到被手动删除或者清除浏览器缓存。 localStorage 中存储的数据在同一浏览器的不同窗口之间是共享的,而 sessionSt…...

HashMap详解+简单手写实现(哈希表)

1. 什么是 HashMap? HashMap是Java集合框架中的一种数据结构,它实现了Map接口,用于存储键值对(Key-Value Pair)。HashMap允许null键和null值,并且不保证元素的顺序。 --- 2. HashMap 的工作原理 2.1 内…...

解决Did not find dashscope_api_key问题——jupyter设置环境变量

jupyter中使用通义千文langchain 报错 Value error, Did not find dashscope_api_key, please add an environment variable DASHSCOPE_API_KEY which contains it, or pass dashscope_api_key as a named parameter.我本来以为这样就是已经加上了: #导入相关包 i…...

尚硅谷爬虫note003

一、函数 1. 函数的定义 def 函数名(): 代码 2.函数的调用 函数名() 3. 定义参数(不调用函数不执行) def sum(a,b) #形参 c a b print(c&…...

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…...

NO.17十六届蓝桥杯备战|do-while循环|break和continue语句|三道练习(C++)

do-while循环 do-while语法形式 在循环语句中 do while 语句的使⽤最少,它的语法如下: //形式1 do 语句; while( 表达式 );//形式2 do { 语句1; 语句2; ... } while( 表达式 );while 和 for 这两种循环都是先判断,条件如果…...

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点&#xff1a…...

Spring Cache 详细讲解

Spring Cache 是 Spring 框架提供的缓存抽象层,通过统一的 API 和注解简化缓存操作,支持多种缓存实现(如 Redis、EhCache、Caffeine 等)。其核心目标是减少重复计算,提升系统性能,同时保持代码简洁性。 1. …...

CPT205 计算机图形学 OpenGL 3D实践(CW2)

文章目录 1. 介绍2. 设计3. 准备阶段4. 角色构建5. 场景构建6. 交互部分6.1 键盘交互6.2 鼠标交互6.3 鼠标点击出多级菜单进行交互 7. 缺点与问题7.1 程序bug7.2 游戏乐趣不足7.3 画面不够好看 8. 完整代码 1. 介绍 前面已经分享过了关于CPT205的CW1的2D作业,这次C…...

Netty的基本架构详解

EventLoopGroup基本认识 我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱: 我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是Multithre…...

2025前端面试题超全面解析(附答案与深度扩展)

文章目录 一、HTML篇(扩展版)1. **HTML5语义化标签的实际应用场景**2. **Web Components实战:如何封装一个自定义按钮组件?**3. **Web Worker的用途与限制** 二、CSS篇(扩展版)1. **CSS盒模型详解&#xff…...

自己搭建可以和deepseek对话的WEB应用

第一步 下载安装anaconda,地址:https://repo.anaconda.com/ 第二步 打开anaconda客户端,打开conda命令行窗口 第三步 创建一个open-webui专属的python专属的虚拟环境,并且指定python具体的版本 conda create --name open…...

Linux系统运行模式和链接

一、系统运行模式 centos6 0 关机模式 1 单用户模式 2 字符模式,无网络连接 3 字符模式 4 预留 5 图形模式 6 重启模式 查看系统当前处于的运行模式 切换为图形模式 init 5 centos7 字符模式 multi-user…...

.NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项

一、执行过程中,要刷新 进度条 的显示,需要 延时、释放,否则进度条不 实时 更新,最后一下到 100% // 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100await Task.D…...

头歌实验--面向对象程序设计

目录 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 第2关:公司支出计算 任务描述 答案代码 第3关:棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 #incl…...

IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up

问题 IoTDB 1.3.2 版本,断电后 IoTDB 的 DataNode 无法启动,日志如下: 2024-12-16 14:45:41,350 [main] ERROR o.a.i.db.service.DataNode:562 - Meet error while starting up. org.apache.iotdb.commons.exception.StartupException: Fo…...

2024华为OD机试真题-最大报酬(C++)-E卷B卷-100分

2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 示例一 解题思路 考点 代码 c++ 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为…...

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…...

HCIA项目实践--RIP相关原理知识面试问题总结回答

9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…...

用大模型学大模型04-模型与网络

目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…...

浏览器扩展实现网址自动替换

作为一个开发爱好者,不能顺畅访问github是很痛苦的,这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况,我此前知道有一个网站kkgithub,基本上把github的静态内容都搬了过来,我们如果需要访问某个githu…...

适配器模式详解(Java)

一、引言 1.1 定义与类型 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为客户期望的另一个接口。这种模式使得原本因为接口不匹配而不能一起工作的类可以一起工作,从而提高了类的复用性。适配器模式分为类适配器和对象适配器两种类型。类适配器使用继承关…...

C语言表驱动法

最近了解到一种C语言的写法,故记录下来,内容来自deepseek。 表驱动法 表驱动法(Table-Driven Approach)是一种编程技术,通过使用表格(数组、结构体数组、哈希表等)来存储数据或逻辑&#xff0…...

【鸿蒙Next】优秀鸿蒙博客集锦

鸿蒙基础开发:多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客...

Django REST Framework:如何获取序列化后的ID

Django REST Framework:如何获取序列化后的ID 😄 嗨,小伙伴们!今天我们来聊一聊Django REST Framework(简称DRF)中一个非常常见的操作:如何获取序列化后的ID。对于那些刚入门的朋友们&#xff…...

deep seek

1.介绍:DeepSeek是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解并回答问题,还能辅助写代码、整理资料和解决复杂的数学问题。免费开源,媲美ChatGPT 最近最火爆的AI对话程序。 www.deepseek.com…...

前端设计模式介绍及案例(单例模式、代理模式、工厂模式、装饰者模式、观察者模式)

概要 本文主要介绍了前端设计模式的定义、分类以及常用设计模式的具体案例。 前言 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦…...

开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1

文章目录 开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1一、环境要求1.1 操作系统1.1.1 Ubuntu1.1.2 CentOS 1.2 数据库1.2.1 JumpServer 需要使用的数据库1.2.2 创建数据库 SQL 参考1.2.2.1 PostgreSQL1.2.2.2 MySQL…...

电源测试和测量系统的创新遥感方法可以消除哪些潜在问题

传统的遥感方法 远程感测是一种行之有效的方法,通过消除连接电缆中压降的影响来调节负载点的直流功率。这在测试和测量应用中尤其重要,在这些应用中,电源电压在一系列负载条件下的准确性和一致性通常对于获得准确且可重复的测试结果至关重要…...

10、《Thymeleaf模板引擎:动态页面开发全攻略》

Thymeleaf模板引擎:动态页面开发全攻略 一、Thymeleaf核心价值解析 天然HTML亲和力:Thymeleaf允许直接使用.html文件作为模板,支持浏览器直接预览静态原型,同时通过属性标签(如th:text)实现动态渲染&…...

Day1 25/2/14 FRI

【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p3&v…...

untiy3D 让角色动起来,角色动画的使用

1.untiy 商店下载动画模型 2.导入项目 模型拖入到场景中 3.创建动画器控制器 4.动画控制器挂载到plarer上 5.把动画idle和pickup拖入到动画器 6.右键动画创建过渡效果(Make Transition) 6.设置参数用条件控制 7.当选中参数时启动过渡 运行效果 119 (二)用脚本控制动画…...

Word 里面嵌入DeepSeek

目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档,按 AltF11,进入VB界面。 2、选中文档,右键->插入->模块。 3、进入模块,粘入…...

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…...

exr 格式下 全景图(经纬图、panorama)转 cubemap

先上效果 (X, -X, Y, -Y, Z, -Z) 下载 exr 经纬图 笔者用的这张:https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky 使用 Openexr 的 exrenvmap 工具 下载 我 build 了一份 3.3.2 版本的,免积分下载。 https:/…...

解锁建造者模式:Java 编程中的对象构建秘籍

系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品(Product)2.2.2 建造者(Builder)2.2.3 具体建造者(ConcreteBuilder)2.2.4 指挥者(Director)2.3 工作流程与交互机制三、建造者模式在 Java 中的优势3.1 …...

ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全

ArcGIS Pro对于显示缓存有32GB的限制,所以当缓存设置中,缓存将达到32GB时,会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置,然后单击选项; 2.在选项窗口中&…...

大数据、云计算、人工智能等技术深度融合的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法,用于对范围内的元素进行归并操作。它…...

Python爬虫实战:获取笔趣阁图书信息,并做数据分析

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备与反爬策略 python import requests from bs4 import BeautifulSoup import pandas as pd import re import time import random from fake_useragent …...

win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录

DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法,以及后续使用夜神模拟器,关闭了Hyper-V时&am…...

c# sqlite 批量生成insert语句的函数

函数开始 using System; using System.Collections.Generic; using System.Text;public class SqliteHelper {public static List<string> GenerateInsertStatements(string tableName, List<string> columns, List<List<object>> data){List<stri…...

ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类

使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像&#xff0c;包括创建散点图和直方图&#xff0c;以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包&#xff08;版本 3.1.x&#xff09;添…...

湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构

导读&#xff1a;浙江霖梓早期使用 CDH 产品套件搭建了大数据系统&#xff0c;面临业务逻辑冗余、查询效率低下等问题&#xff0c;基于 Apache Doris 进行整体架构与表结构的重构&#xff0c;并基于湖仓一体和查询加速展开深度探索与实践&#xff0c;打造了 Doris Paimon 的实…...

【AI-34】机器学习常用七大算法

以下是对这七大常用算法的浅显易懂解释&#xff1a; 1. k 邻近算法&#xff08;k - Nearest Neighbors&#xff0c;KNN&#xff09; 想象你在一个满是水果的大广场上&#xff0c;现在有个不认识的水果&#xff0c;想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...

2025年金三银四经典自动化测试面试题

概述 觉得自动化测试很难&#xff1f; 是的&#xff0c;它确实不简单。但是学会它&#xff0c;工资高啊&#xff01; 担心面试的时候被问到自动化测试&#xff1f; 嗯&#xff0c;你担心的没错&#xff01;确实会被经常问到&#xff01; 现在应聘软件测试工程师的岗位&…...

遵循规则:利用大语言模型进行视频异常检测的推理

文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly &#xff08;正常与异常&#xff09;Abstract and Concrete &#xff08;抽象与具体&#xff09;Human and Environment &#xff08;人类与环境&#xff09; 3…...

RFM模型-数据清洗

在进行数据清洗时&#xff0c;主要的目标是确保数据质量良好&#xff0c;以便后续的分析和建模工作能够顺利进行。针对你使用粒子群优化算法改进RFM模型来对电商数据进行用户群像划分的实验&#xff0c;数据清洗环节尤其重要&#xff0c;因为不干净的数据会影响模型的精度和效果…...

文件系统惹(细)

目录 块概念 分区 inode ext2文件系统 Boot Sector Super Block GDP&#xff08;group descriptor table&#xff09; Block Bitmap&#xff08;块位图&#xff09; Inode Bitmap &#xff08;inode位图&#xff09; Data Block inode和Datablock映射 目录和文件名 …...