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

Grails应用http.server.requests指标数据采集问题排查及解决

问题

遇到的问题:同一个应用,Spring Boot(Java)和Grails(Groovy)混合编程,常规的Spring Controller,可通过Micromete + Pushgateway,
在这里插入图片描述
采集到http.server.requests指标数据,注意下面的指标名称是点号(请忽略下面截图里的接口的uri并不是上面的截图里的)
在这里插入图片描述
在Prometheus页面,会发现指标名称已经变成下划线命名,且增加后缀_seconds_sum
在这里插入图片描述
为啥Grails的UrlMappings和controller,无法采集到http_server_requests指标数据?(请忽略下面的截图是另一个应用)
在这里插入图片描述

源码分析

一开始,我只知道MeterRegistry.registerMeterIfNecessary方法,打个断点,调试可进入断点:
在这里插入图片描述
截图如上,tag里的uri全部变成root,也就是上面截图4中看到的所有接口全变成root,不同的是method方法。

为啥会变成root呢?

只能断点调试。

断点调试的前提是熟悉框架代码。想一想,如果不知道方法调用层级关系,怎么打断点呢?

如何熟悉代码?花时间。或者反复询问ChatGPT、DeepSeek、GitHub Copilot。

总之,这里直接给出原因。

WebMvcMetricsFilter类相关方法如下:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {TimingContext timingContext = TimingContext.get(request);if (timingContext == null) {timingContext = startAndAttachTimingContext(request);}try {filterChain.doFilter(request, response);if (!request.isAsyncStarted()) {// Only record when async processing has finished or never been started.// If async was started by something further down the chain we wait until the second filter invocation (but we'll be using the TimingContext that was attached to the first)Throwable exception = fetchException(request);record(timingContext, request, response, exception);}} catch (Exception ex) {response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());record(timingContext, request, response, unwrapNestedServletException(ex));throw ex;}
}private void record(TimingContext timingContext, HttpServletRequest request, HttpServletResponse response,Throwable exception) {try {Object handler = getHandler(request);Set<Timed> annotations = getTimedAnnotations(handler);Timer.Sample timerSample = timingContext.getTimerSample();AutoTimer.apply(this.autoTimer, this.metricName, annotations,(builder) -> timerSample.stop(getTimer(builder, handler, request, response, exception)));}catch (Exception ex) {logger.warn("Failed to record timer metrics", ex);// Allow request-response exchange to continue, unaffected by metrics problem}
}private Timer getTimer(Builder builder, Object handler, HttpServletRequest request, HttpServletResponse response,Throwable exception) {return builder.description("Duration of HTTP server request handling").tags(this.tagsProvider.getTags(request, response, handler, exception)).register(this.registry);
}

DefaultWebMvcTagsProvider类的相关方法如下:

@Override
public Iterable<Tag> getTags(HttpServletRequest request, HttpServletResponse response, Object handler,Throwable exception) {Tags tags = Tags.of(WebMvcTags.method(request), WebMvcTags.uri(request, response, this.ignoreTrailingSlash),WebMvcTags.exception(exception), WebMvcTags.status(response), WebMvcTags.outcome(response));for (WebMvcTagsContributor contributor : this.contributors) {tags = tags.and(contributor.getTags(request, response, handler, exception));}return tags;
}

WebMvcTags类的相关方法如下:

// 这才是我们最终想要定位的代码行,
private static final Tag URI_ROOT = Tag.of("uri", "root");public static Tag uri(HttpServletRequest request, HttpServletResponse response, boolean ignoreTrailingSlash) {if (request != null) {String pattern = getMatchingPattern(request);if (pattern != null) {if (ignoreTrailingSlash && pattern.length() > 1) {pattern = TRAILING_SLASH_PATTERN.matcher(pattern).replaceAll("");}if (pattern.isEmpty()) {return URI_ROOT;}return Tag.of("uri", pattern);}if (response != null) {HttpStatus status = extractStatus(response);if (status != null) {if (status.is3xxRedirection()) {return URI_REDIRECTION;}if (status == HttpStatus.NOT_FOUND) {return URI_NOT_FOUND;}}}String pathInfo = getPathInfo(request);if (pathInfo.isEmpty()) {return URI_ROOT;}}return URI_UNKNOWN;
}private static String getPathInfo(HttpServletRequest request) {String pathInfo = request.getPathInfo();String uri = StringUtils.hasText(pathInfo) ? pathInfo : "/";uri = MULTIPLE_SLASH_PATTERN.matcher(uri).replaceAll("/");return TRAILING_SLASH_PATTERN.matcher(uri).replaceAll("");
}private static String getMatchingPattern(HttpServletRequest request) {PathPattern dataRestPathPattern = (PathPattern) request.getAttribute(DATA_REST_PATH_PATTERN_ATTRIBUTE);if (dataRestPathPattern != null) {return dataRestPathPattern.getPatternString();}return (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
}

如下截图所示,在HttpServletRequest类里根本就没有pathInfo字段:
在这里插入图片描述
以及
在这里插入图片描述
代码为啥会走到getPathInfo方法呢,那是因为getMatchingPattern方法返回为空。

一个常规的Spring Boot Controller接口是可以获取到pattern的:
在这里插入图片描述
但是Grails框架下的Groovy Controller接口,pattern为null:
在这里插入图片描述
继续看看getMatchingPattern方法:
在这里插入图片描述
这里面尝试从request里获取两个key都失败,都返回null:

  • org.springframework.data.rest.webmvc.RepositoryRestHandlerMapping.EFFECTIVE_REPOSITORY_RESOURCE_LOOKUP_PATH
  • org.springframework.web.servlet.HandlerMapping.bestMatchingPattern

总结一下:Spring Boot Actuator的Filter类WebMvcMetricsFilter类doFilterInternal方法,调用内部方法record,继续调用内部方法getTimer,然后调用DefaultWebMvcTagsProvider的getTags方法,然后调用WebMvcTags的uri方法,调用内部方法getMatchingPattern,获取不到接口的uri信息,则走到内部方法getPathInfo,而HttpServletRequest.getPathInfo方法,也是返回null。导致最后记录到的tag为private static final Tag URI_ROOT = Tag.of("uri", "root");

如果不熟悉框架原理,全局搜索root关键词,根本就定位不到WebMvcTags类的URI_ROOT字段。

自定义指标采集

既然Grails框架下,Micrometer采集http.server.requests数据有问题,DeepSeek等工具告诉我,可以自定义指标数据。

下面的代码片段是DeepSeek给出的:

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** @author johnny*/
@Component
class CustomMetricsFilter implements Filter {private final MeterRegistry meterRegistry;CustomMetricsFilter(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;// 开始计时Timer.Sample sample = Timer.start(meterRegistry);try {// 继续处理请求chain.doFilter(request, response);} finally {// 结束计时并记录指标// DeepSeek给出的是http.server.requests.custom自定义名称sample.stop(meterRegistry.timer("http.server.requests","method", httpRequest.getMethod(),"uri", httpRequest.getRequestURI(),"status", String.valueOf(httpResponse.getStatus())));}}
}

FilterConfig配置类:

package com.johnny.config;import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;/*** @author johnny*/
@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<CustomMetricsFilter> customMetricsFilter(MeterRegistry meterRegistry) {FilterRegistrationBean<CustomMetricsFilter> bean = new FilterRegistrationBean<>();bean.setFilter(new CustomMetricsFilter(meterRegistry));bean.addUrlPatterns("/*");bean.setOrder(Ordered.HIGHEST_PRECEDENCE);return bean;}
}

我没有使用自定义名称,而是使用期望推送的指标名称,http.server.requests。通过断点调试,上面的代码是生效的,但在Prometheus页面并不能看到我请求的接口,也就是说为啥不能覆盖默认的指标名。

原因,经过分析,在Timer类的register方法上:

/*** Add the timer to a single registry, or return an existing timer in that* registry. The returned timer will be unique for each registry, but each* registry is guaranteed to only create one timer for the same combination of* name and tags.* @param registry A registry to add the timer to, if it doesn't already exist.* @return A new or existing timer.*/
public Timer register(MeterRegistry registry) {// the base unit for a timer will be determined by the monitoring system// implementationreturn registry.timer(new Meter.Id(name, tags, null, description, Type.TIMER),distributionConfigBuilder.build(),pauseDetector == null ? registry.config().pauseDetector() : pauseDetector);
}

猜测下来,对于已存在的指标名称http.server.requests,会直接返回,并不会。

既然上面的代码可以断点调试,说明逻辑没有什么问题,为了进一步验证,使用自定义的指标名称http.server.requests.custom

浏览器打开:http://localhost:8867/actuator/metrics
在这里插入图片描述
如上图,除了组件默认采集到的http.server.requests,还有一条自定义的http.server.requests.custom。
打开Prometheus,查询新增的自定义指标,PromQL为:http_server_requests_custom_seconds_sum{job="agent-document"}
在这里插入图片描述
确实有数据。

问题来了:我想要在Grafana页面查询,查询范围当然是所有的应用。

DeepSeek给出的答案:

// 移除默认的 http.server.requests 指标
meterRegistry.remove(meterRegistry.find("http.server.requests").tags().timer());
// 结束计时并记录指标
// 省略代码

确实可以解决问题。

但是,如果一段时间内没有请求,组件自带的默认指标http.server.requests还是会覆盖我推送的。
在这里插入图片描述
代码里定时将数据通过Pushgateway推送到Prometheus(已经保存下来),Grafana可以查询到数据,哪怕被覆盖也没有问题??

另一方面,前面刚刚使用meterRegistry.remove()方法移除,后一脚又采集meterRegistry.timer("http.server.requests")数据,感觉怪怪的。

那能不能禁用默认的http.server.requests指标呢?

Grails

Grails框架下对HttpServletRequest做了各种不知道的封装。
在这里插入图片描述
主要是下面这个:
在这里插入图片描述
以及GrailsDispatcherServlet:
在这里插入图片描述
看到上面这么多Grails的Jar包,是不是要疯掉。

禁用默认指标

management:metrics:enable:http.server.requests: falsehttp: false

不管是http: false,还是http.server.requests: false,并不能将Micrometer默认的http.server.requests指标给屏蔽掉。

真正可以实现屏蔽的配置如下:

management:metrics:web:server:request:autotime:enabled: false

重启应用,请求http://localhost:8867/actuator/metrics,再随便请求一个其他接口,发现不再有http.server.requests指标,即实现禁用。

方案

最终的方案:禁用默认指标,加上CustomMetricsFilter,和FilterConfig配置类。

写在最后

本文如果行文思路还算清晰的话,请一定不要以为排查问题的过程也是思路清晰的。

实际上,在排查问题时,由于对Micrometer组件的源码不熟悉,浪费不少时间。

参考

  • GitHub Copilot
  • DeepSeek
  • ChatGPT

相关文章:

Grails应用http.server.requests指标数据采集问题排查及解决

问题 遇到的问题&#xff1a;同一个应用&#xff0c;Spring Boot(Java)和Grails(Groovy)混合编程&#xff0c;常规的Spring Controller&#xff0c;可通过Micromete Pushgateway&#xff0c; 采集到http.server.requests指标数据&#xff0c;注意下面的指标名称是点号&#…...

使用 WPF 和 C# 将纹理应用于三角形

此示例展示了如何将纹理应用于三角形,以使场景比覆盖纯色的场景更逼真。以下是为三角形添加纹理的基本步骤。 创建一个MeshGeometry3D对象。像往常一样定义三角形的点和法线。通过向网格的TextureCoordinates集合添加值来设置三角形的纹理坐标。创建一个使用想要显示的纹理的 …...

【vue3项目使用 animate动画效果】

vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示&#xff1a;干货篇&#xff0c;不废话&#xff0c;点赞收藏&#xff0c;用到会后好找藕~ 点击这里&#xff0c;直接看官网哦 &#x1f449; 官网地址&#…...

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…...

Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

服务器一次性部署One API + ChatGPT-Next-Web

服务器一次性部署One API ChatGPT-Next-Web One API ChatGPT-Next-Web 介绍One APIChatGPT-Next-Web docker-compose 部署One API ChatGPT-Next-WebOpen API docker-compose 配置ChatGPT-Next-Web docker-compose 配置docker-compose 启动容器 后续配置 同步发布在个人笔记服…...

milvus过滤功能

数据格式: [{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682", "likes": 165},{"id": 1, "vecto…...

JavaScript系列(25)--性能优化技术详解

JavaScript性能优化技术详解 ⚡ 今天&#xff0c;让我们深入探讨JavaScript的性能优化技术。掌握这些技术对于构建高性能的JavaScript应用至关重要。 性能优化基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript性能优化涉及多个方面&#xff0c;包括代码执行效…...

基于vite+vue3+mapbox-gl从零搭建一个项目

下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤&#xff0c;包括环境搭建、依赖安装、配置和代码示例。 1. 初始化项目 首先&#xff0c;使用 Vite 快速创建一个 Vue 3 项目&#xff1a; npm create vuelatest vue3-mapboxgl --template vue cd vue3-mapbo…...

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...

【git】-3 github创建远程仓库,上传自己的项目,下载别人的项目

一、如何使用Github 1、创建远程仓库 2、使用github拉取/推送代码 克隆仓库 向远程仓库推送代码-git push 二、上传我们自己的项目到github 方法一&#xff1a;直接上传 方法二&#xff1a;使用git命令 方法三&#xff1a; 将仓库拉取到本地上传 三、下载别人的项目 …...

[Qt]常用控件介绍-多元素控件-QListWidget、QTableWidget、QQTreeWidget

目录 1.多元素控件介绍 2.ListWidget控件 属性 核心方法 核心信号 细节 Demo&#xff1a;编辑日程 3.TableWidget控件 核心方法 QTableWidgetItem核心信号 QTableWidgetItem核心方法 细节 Demo&#xff1a;编辑学生信息 4.TreeWidget控件 核心方法 核心信号…...

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率&#xff1a;168MHz 工具&#xff1a;STM32CubeMX 本篇仅仅只是提供超频&#xff08;默认指的是主频&#xff09;的简单方法&#xff0c;并未涉及STM32超频极限等问题。原理很简单&#xff0c;通过设置锁相环的倍频系数达到不同的频率&am…...

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…...

Maven 配置本地仓库

步骤 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件&#xff0c;找到 <localRepository> 标签。如果没有该标…...

【PHP】双方接口通信校验服务

请求方 使用 ApiAuthService::buildUrl($domain, [terminal => 1, ts => time()]); //http://域名/adminapi/login/platformLogin?sign=F7FE8A150DEC18BE8A71C5059742C81A&terminal=1&ts=1736904841接收方 $getParams = $this->request->get();$validate…...

mac 安装docker

1、下载docker 进入 /Applications/Docker.app/Contents/MacOS/Docker Desktop.app/Contents/Resources目录 把app.asar 文件备份 将下载的中文包复制进去。修改成一样的名字 [汉化包下载地址](https://github.com/asxez/DockerDesktop-CN)...

ANSYS Fluent学习笔记(七)求解器四部分

16.亚松弛因子 Controls面板里面设置&#xff0c;它能够稳定计算的过程。如果采用常规的迭代算法可能结果就会发生振荡的情况。采用亚松驰因子可以有助于残差的稳定。 他的取值范围是0-1&#xff0c;0代表没有亚松驰&#xff0c;1表示物理量变化很快&#xff0c;一般情况下取…...

【微服务】面试 3、 服务监控 SkyWalking

微服务监控的原因 问题定位&#xff1a;在微服务架构中&#xff0c;客户端&#xff08;如 PC 端、APP 端、小程序等&#xff09;请求后台服务需经过网关再路由到各个微服务&#xff0c;服务间可能存在多链路调用。当某一微服务挂掉时&#xff0c;在复杂的调用链路中难以迅速确定…...

llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型

说明 我需要在昇腾服务器上对Qwen2-72B大模型进行lora微调&#xff0c;改变其自我认知。 我的环境下是8张910B1卡。显存约512GB。 准备&#xff1a;安装llamafactory 请参考官方方法安装llamafactory&#xff1a;https://github.com/hiyouga/LLaMA-Factory 特别强调下&…...

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…...

2Spark Core

2Spark Core 1.RDD 详解1) 为什么要有 RDD?2) RDD 是什么?3) RDD 主要属性 2.RDD-API1) RDD 的创建方式2) RDD 的算子分类3) Transformation 转换算子4) Action 动作算子 3. RDD 的持久化/缓存4. RDD 容错机制 Checkpoint5. RDD 依赖关系1) 宽窄依赖2) 为什么要设计宽窄依赖 …...

【ANGULAR网站开发】初始环境搭建(SpringBoot)

1. 初始化SpringBoot 1.1 创建SpringBoot项目 清理spring-boot-starter-test&#xff0c;有需要的可以留着 1.2 application.properties 将application.properties改为yaml&#xff0c;个人习惯问题&#xff0c;顺便设置端口8888&#xff0c;和前端设置的一样 server:por…...

Vue 页面布局组件-Vuetify、Semantic

在现代 Web 开发中&#xff0c;用户体验是关键&#xff0c;尤其是当我们利用 Vue.js 框架构建用户友好的界面时。今天&#xff0c;我们将深入探讨如何使用 Vuetify 和 Semantic UI 来创建高效、美观的页面布局组件。通过这项技术&#xff0c;你将能够为用户呈现一个流畅的交互体…...

小程序组件 —— 31 事件系统 - 事件绑定和事件对象

小程序中绑定事件和网页开发中绑定事件几乎一致&#xff0c;只不过在小程序不能通过 on 的方式绑定事件&#xff0c;也没有 click 等事件&#xff0c;小程序中绑定事件使用 bind 方法&#xff0c;click 事件也需要使用 tap 事件来进行代替&#xff0c;绑定事件的方式有两种&…...

23种设计模式

23种设计模式 创建型模式&#xff08;Creational Patterns&#xff09;结构型模式&#xff08;Structural Patterns&#xff09;行为型模式&#xff08;Behavioral Patterns&#xff09;总结 Java中的设计模式是解决特定问题的通用、可复用的解决方案。它们不是完成代码&#x…...

SIBR详细介绍:基于图像的渲染系统及3DGS实例展示【3DGS实验复现】

文章目录 什么是 SIBR&#xff1f;IBR 技术的优势SIBR 的核心组件SIBR 的应用场景如何使用 SIBR&#xff1f;3D Gaussian Splatting 实验实例展示1. 什么是 3D Gaussian Splatting (3DGS)&#xff1f;2. 实验运行环境步骤&#xff1a;简要说明如何使用 3DGS 的两种渲染方式 3. …...

每天五分钟深度学习框架pytorch:基于vgg块搭建VGG卷积神经网络

本文重点 前面我们使用pytorch搭建了vgg块,本文我们使用vgg块搭建卷积神经网络VGG16,我们先来看一下vgg16的模型结构是什么样的: 搭建vgg16 import torch from torch import nn def vgg_block(num_convs,in_channels,out_channels): net=[nn.Conv2d(in_channels,out_channe…...

【gin】中间件使用之jwt身份认证和Cors跨域,go案例

Gin-3 中间件编程及 JWT 身份认证 1. Gin 中间件概述 中间件是处理 HTTP 请求的函数&#xff0c;可以在请求到达路由处理函数之前或之后对请求进行处理。 在 Gin 框架中&#xff0c;中间件常用于处理日志记录、身份验证、权限控制等功能。 router : gin.Default() router.Us…...

探索 Vue.js 组件开发的新边界:动态表单生成技术

随着前端技术的飞速发展&#xff0c;Vue.js 作为一款灵活、易用且性能优异的框架&#xff0c;一直是开发者心中的不二之选。本文将深入介绍 Vue.js 组件开发中的最新技术之一&#xff1a;动态表单生成技术&#xff0c;并通过具体实例展示如何实现这一高效技术。 为什么选择动态…...

Android 调用系统服务接口获取屏幕投影(需要android.uid.system)

媒体投影 借助 Android 5&#xff08;API 级别 21&#xff09;中引入的 android.media.projection API&#xff0c;您可以将设备屏幕中的内容截取为可播放、录制或投屏到其他设备&#xff08;如电视&#xff09;的媒体流。 Android 14&#xff08;API 级别 34&#xff09;引入…...

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…...

Picocli 命令行框架

官方文档 https://picocli.info/ 官方提供的快速入门教程 https://picocli.info/quick-guide.html 使用 Picocli 创建命令行应用程序 Picocli 是一个用于构建 Java 命令行应用的强大框架&#xff0c;它简化了参数解析和帮助消息生成的过程。 下面是如何使用 Picocli 构建简单命…...

Vscode——SSH连接不上的一种解决办法

一、完整报错: > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ > IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! > Someone could be eavesdropping on you right now (man-in-the...

Stream流

一 : Stream流的介绍 stream不存储数据&#xff0c;而是按照特定的规则对数据进行计算&#xff0c;一般会输出结果&#xff1b; stream不会改变数据源&#xff0c;通常情况下会产生一个新的集合&#xff1b; stream具有延迟执行特性&#xff0c;只有调用终端操作时&#xff…...

开源文件存储分享平台Seafile部署与应用

Seafile 是一款开源的企业云盘,注重可靠性和性能,支持全平台客户端。Seafile 内置协同文档 SeaDoc ,让协作撰写、管理和发布文档更便捷。适用于团队协作、文件存储和同步的开源解决方案,它提供了可靠、安全和易用的云存储服务。主要有以下特点: 文件存储和同步:Seafile 允…...

RAG技术:是将知识库的文档和问题共同输入到LLM中

RAG技术 RAG技术是将知识库的文档和问题共同输入到LLM中 RAG技术是先从知识库中检索出与问题相关的文档片段,然后将这些检索到的文档片段与问题一起输入到LLM中进行回答。具体过程如下: 文本分块 由于LLM的上下文窗口有限,需要将长文本资料分割成较小的块,以便LLM能够有…...

战略与规划方法——深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具

深入解析波士顿矩阵(BCG Matrix):分析产品组合的关键工具 在现代商业管理中,合理地分析和管理产品组合对于企业的成功至关重要。波士顿矩阵(BCG Matrix),又称为成长份额矩阵,是一种由波士顿咨询集团(Boston Consulting Group)在20世纪70年代提出的战略工具,用于帮助…...

GORM(Go语言数据交互库)

GORM&#xff08;Go ORM&#xff0c;即对象关系映射&#xff09;是Go语言中非常流行且功能强大的数据库交互库。它简化了与关系型数据库的交互过程&#xff0c;提供了丰富的API来处理各种数据库操作。下面将详细介绍GORM的功能、使用方法和一些高级特性。 1. 安装 首先&#…...

Spring Boot教程之五十七:在 Apache Kafka 上发布 JSON 消息

Spring Boot | 如何在 Apache Kafka 上发布 JSON 消息 Apache Kafka是一个发布-订阅消息系统。消息队列允许您在进程、应用程序和服务器之间发送消息。在本文中&#xff0c;我们将了解如何在 Spring Boot 应用程序中向 Apache Kafka 发送 JSON 消息。 为了了解如何创建 Spring…...

开发指南091-延迟退休算法

公布平台上人力资源系统有关延迟退休算法&#xff1a; package org.qlm.util;public class busiUtil {/*birthYearMonth 出生年月 yyyy-MMmode 0 男职工 1 女干部 2 女职工*/public static String calculateRetirementDate(String birthYearMonth, String mode){if ("0&…...

Flask-SQLAlchemy 基于一个base表 - 动态创建使用相同字段的其他业务表

1 安装 首先&#xff0c;确保您安装了 Flask 和 SQLAlchemy&#xff0c;以及 MySQL 的驱动程序&#xff08;例如 mysql-connector-python 或 PyMySQL&#xff09;&#xff1a; pip install Flask Flask-SQLAlchemy mysql-connector-python2 创建项目结构 创建一个简单的项目…...

数据结构--二叉树

目录 有序二叉树&#xff1a; 平衡二叉树&#xff1a; 234树&#xff1a; 红黑树 红黑树特点&#xff1a; 为什么红黑树是最优二叉树&#xff1f; 哈夫曼树和哈夫曼编码 有序二叉树&#xff1a; 平衡二叉树&#xff1a; 在有序二叉树的基础上得来的&#xff0c;且左右子…...

【编译构建】用cmake编译libjpeg动态库并实现转灰度图片

先编译出libjepg动态库 1、下载libjpeg源码: https://github.com/libjpeg-turbo/libjpeg-turbo 2、编译出动态库或静态库 写一个编译脚本&#xff0c;用cmake构建。 #!/bin/bash# 定义变量 SOURCE_DIR"/home/user/libjpeg-turbo-main" BUILD_DIR"${SOURCE_…...

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM&#xff08;官方网址&#xff1a;https://www.vllm.ai&#xff09;是一种用于大规模语言模型&#x…...

人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日&#xff0c;演员王星因接到一份看似来自知名公司的拍戏邀约&#xff0c;被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…...

ESP-IDF学习记录(5) 画一块esp32-c3 PCB板

最近看了半个多月&#xff0c;趁着嘉立创官方活动&#xff0c;研究esp32-c3规格书&#xff0c;白嫖PCB 和元器件。原本计划按照官方推荐的搞个四层板&#xff0c;结果打样太贵&#xff0c;火速改成双层板&#xff0c;用了官方的券。小于10*10,也可以使用嘉立创的免费打样。 下面…...

Day04-后端Web基础——Maven基础

目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.2.1 构建生命周期/阶段(Build lifecycle & phases)2.2.2 项目对象模型 (Project Object Model)2.2.3 依赖管理模…...

ASP.NET Core - 日志记录系统(一)

ASP.NET Core - 日志记录系统&#xff08;一&#xff09; 一、日志记录二、ASP.Net Core 的日志记录2.1. 日志记录系统的接入2.2 记录日志2.3 基本配置2.3.1 日志级别2.3.2 全局输出配置2.3.3 针对特定日志提供程序的配置2.3.6 显式设置2.3.4 配置筛选原理2.3.5 日志作用域 一、…...

Linux 各个服务启动命令

目录 redis后台启动rocketMq后台启动mongodb后台启动mysql后台启动 redis后台启动 ./redis-server ./redis.confrocketMq后台启动 #关闭Nameserver sh bin/mqshutdown namesrv #关闭Broker sh bin/mqshutdown broker #启动namesrv nohup sh bin/mqnamesrv -n 127.0.0.1:9876 …...