【微服务】springboot远程docker进行debug调试使用详解

news2024/12/28 3:05:14

目录

一、前言

二、线上问题常用解决方案

2.1 微服务线上运行中常见的问题

2.2 微服务线上问题解决方案

2.3 远程debug概述

2.3.1 远程debug原理

2.3.2 远程debug优势

三、实验环境准备

3.1 搭建springboot工程

3.1.1 工程结构

3.1.2 引入基础依赖

3.1.3 添加配置文件

3.1.4 添加Dockerfile文件

3.2 服务器环境准备

3.2.1 docker环境

3.2.2 docker-compose环境

3.2.3 java环境

3.2.4 maven环境

四、springboot远程debug操作过程

4.1 增加测试接口

4.2 本地构建jar包并启动服务

4.3 idea配置远程debug

4.3.1 调用接口模拟调试

4.4 配置服务器远程debug

4.4.1 启动服务

4.4.2 idea进行配置

4.4.3 模拟接口调试

五、springboot远程docker容器debug操作过程

5.1 修改Dockerfile文件

5.2 上传工程代码打包

5.3 使用docker-compose命令构建镜像

5.4 启动镜像

5.5 idea配置远程debug

5.6 接口模拟测试

六、写在文末


一、前言

在分布式微服务项目的部署模式下,通常来说,一个系统的运行往往是多个服务共同协作的结果,在这种模式下,系统的灵活性、扩展性、容错性得到了很大程度的提升,但是做过微服务开发的同学应该不陌生,在分布式开发模式中,一旦某个服务出现问题,不管是采用什么手段,问题的排查、分析和定位,以及到最终解决问题,这个过程一定是耗时耗力的,尽管到现在来说出现了很多链路追踪工具可用于排查问题,但是也很难说解决所有场景下的问题,本篇将介绍另一种方式,可用于比较快速的定位线上的问题,即代码的远程debug方式。

二、线上问题常用解决方案

2.1 微服务线上运行中常见的问题

结合实践经验,基于微服务架构模式,在线上运行的微服务可能有下面这些:

  • 服务间通信问题

    • 网络延迟:服务之间的请求响应时间过长,影响用户体验。

    • 超时与重试:服务间调用超时,或因网络不稳定等原因导致请求重试,增加了系统的复杂性和响应时间。

    • 断路器失效:当一个服务暂时不可用时,断路器未能及时打开,导致请求堆积

  • 性能问题

    • 资源争用:多个服务同时访问相同的资源(如数据库、缓存等),导致性能瓶颈。

    • 内存泄漏:服务运行过程中未能正确管理内存,导致内存消耗持续增长。

    • CPU 使用率高:服务处理请求时消耗过多 CPU 资源,导致系统响应缓慢。

  • 容错与恢复问题

    • 服务降级:当部分服务不可用时,未能正确地进行服务降级,影响系统整体可用性。

    • 自动恢复机制:服务故障后未能自动恢复,需要人工干预才能恢复正常运作。

  • 数据一致性问题

    • 分布式事务处理:在多个服务之间进行事务处理时,容易出现数据不一致的情况。

    • 最终一致性实现:在需要保证最终一致性的情况下,设计不当会导致数据状态混乱。

  • 监控与日志问题

    • 监控不足:缺乏足够的监控指标,无法及时发现服务问题。

    • 日志管理:日志格式不一致,或者日志量过大,使得问题排查变得困难。

  • 安全问题

    • 认证授权:服务间通信未正确实施认证授权机制,导致安全隐患。

    • 数据加密:敏感数据传输未加密,存在泄露风险。

    • 攻击防护:缺乏对常见攻击(如 DDoS、SQL 注入等)的有效防护措施。

  • 部署与更新问题

    • 版本兼容性:服务更新后与其他服务版本不兼容,导致功能异常。

    • 灰度发布:在进行灰度发布时出现问题,如流量切换不准确导致部分用户受到影响。

  • 故障隔离问题

    • 服务雪崩:一个服务故障导致连锁反应,引发系统整体崩溃。

    • 资源隔离不足:不同服务之间共享资源时未能有效隔离,导致相互干扰。

  • 扩展性问题

    • 水平扩展限制:服务在水平扩展时遇到瓶颈,如网络带宽限制。

    • 垂直扩展成本:增加单个节点的计算能力变得昂贵或不切实际。

  • 依赖管理问题

    • 依赖版本冲突:不同服务依赖的第三方库版本不一致,导致运行时错误。

    • 依赖升级滞后:未能及时更新依赖库,导致安全漏洞或功能缺失。

2.2 微服务线上问题解决方案

在实际工作中,线上部署的微服务遇到的问题种类非常多,具体的解决方案也不一而足,下面就生产实践总结一些常用的解决方案。

  • 日志分析

    • 查看日志:首先查看服务的日志文件,特别是出问题的时间段的日志,寻找错误信息或异常堆栈。

    • 集中日志平台:使用集中化的日志管理平台(如 ELK Stack、Splunk、Graylog 等)来搜索和分析日志。

    • 结构化日志:确保日志结构化,便于解析和分析,例如使用 JSON 格式。

  • 监控与告警

    • 实时监控:使用监控工具(如 Prometheus、Grafana、Datadog 等)实时监控服务的运行状态,如 CPU、内存使用情况、网络延迟等指标。

    • 告警机制:设置合理的告警阈值,当关键指标超出正常范围时及时通知相关人员。

    • 异常检测:使用异常检测算法自动识别非正常行为。

  • 调用链追踪

    • 分布式追踪:引入分布式追踪系统(如 Zipkin、Jaeger、SkyWalking 等),追踪请求在整个服务间的调用链路。

    • 端到端追踪:确保每个请求都有唯一的追踪 ID,便于追踪请求在各个服务间的流转路径。

    • 异常追踪:关注异常调用链路,分析请求失败的原因。

  • 模拟复现

    • 模拟环境:尝试在测试或预生产环境中重现线上问题,以便更好地理解问题的具体表现。

    • 故障注入:使用混沌工程工具(如 Chaos Toolkit、Litmus 等)模拟故障场景,观察系统的行为。

  • 性能分析

    • 性能剖析:使用性能剖析工具(如 VisualVM、JProfiler、Pinpoint 等)来识别系统中的性能瓶颈。

    • 内存分析:检查是否有内存泄漏或频繁的垃圾回收导致性能下降。

    • CPU 分析:分析 CPU 使用情况,找出是否存在热点方法或死锁等问题。

  • 代码审查

    • 代码审计:检查最近的代码提交记录,寻找可能导致问题的代码变更。

    • 静态代码分析:使用静态代码分析工具(如 SonarQube、FindBugs 等)查找潜在的代码缺陷。

  • 状态检查

    • 健康检查:检查服务的健康状态,确认是否所有服务都在正常运行。

    • 依赖检查:确认外部依赖(如数据库、第三方 API 等)是否正常工作。

  • 数据分析

    • 流量分析:分析请求流量的变化趋势,判断是否由于流量激增导致的问题。

    • 错误率统计:统计错误请求的比例,了解服务的整体稳定性。

2.3 远程debug概述

Spring Boot 应用程序的远程调试是一项非常有用的技能,尤其是在开发阶段需要对部署在远程服务器上的应用程序进行调试时。远程调试允许你在本地开发环境中设置断点、查看变量值以及逐步执行代码,就好像应用程序就在本地一样。这对于诊断线上问题、理解和优化代码逻辑非常有帮助。

2.3.1 远程debug原理

远程调试的基本原理是通过配置应用程序使其能够监听一个特定的端口,然后使用本地的 IDE(如 IntelliJ IDEA 或 Eclipse)连接到该端口进行调试。这种方式可以跨越物理位置的限制,使开发者能够在本地开发环境中调试远程运行的应用程序。在进行远程debug之前,需要做好如下准备:

  • 确保远程服务器与本地计算机之间网络畅通:远程调试需要网络连接。

  • 安装 JDK 与 IDE:确保远程服务器上有 JDK,并且本地计算机上有支持远程调试的 IDE。

  • 代码一致:确保本地代码和待远程debug的服务器上面运行的代码一致。

  • 配置防火墙规则:确保远程服务器上的防火墙允许调试端口的流量通过。

2.3.2 远程debug优势

Spring Boot 应用程序的远程调试具有以下几方面的优势:

  1. 实时调试:远程调试允许开发者在应用程序运行时进行实时调试,这比离线分析日志或堆栈转储更为直接有效,特别是在处理复杂业务逻辑或性能问题时。

  2. 无需停止服务:当应用正在生产环境中运行时,通常不希望因为调试而停止服务。远程调试可以在不影响用户的情况下进行问题排查。

  3. 模拟真实环境:远程调试可以让开发者在一个与生产环境尽可能相似的环境下进行测试,这样可以更容易地发现和解决实际运行中可能遇到的问题。

  4. 节省时间和成本:当遇到线上问题时,如果能够在远程服务器上直接调试,就无需将问题复现到本地环境,从而节省了大量时间和资源。

  5. 提高效率:通过远程调试,开发者可以迅速定位问题所在,并且可以立即修改代码进行验证,提高了迭代的速度和开发效率。

  6. 团队协作:当多个开发者需要同时对同一份代码进行调试时,远程调试可以帮助他们更好地协作,特别是对于分布式团队来说,这是一个非常有用的工具。

  7. 减少错误引入的风险:直接在远程环境中调试可以减少因复制环境而导致的新问题出现的可能性。

  8. 便于理解线上数据:有时候,线上数据的状态和本地数据可能会有所不同,远程调试可以让开发者直接观察到线上数据的情况,有助于更准确地分析问题。

需要注意的是,在进行远程调试时也要注意安全性,例如确保调试端口的安全性,防止未经授权的访问。此外,在生产环境中调试时,应该避免在用户活跃时段进行大规模的调试操作,以免影响用户体验。

三、实验环境准备

3.1 搭建springboot工程

3.1.1 工程结构

快速搭建一个springboot工程,工程目录结构如下

3.1.2 引入基础依赖

导入如下必要的依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.4</version>
        <relativePath/>
    </parent>
 
    <properties>
        <docker.image.prefix>dcloud</docker.image.prefix>
    </properties>
 
    <dependencies>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
 
    </dependencies>
 
    <build>
        <finalName>boot-docker</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3.1.3 添加配置文件

在resources目录下添加配置文件,配置信息如下

server:
  port: 8081

3.1.4 添加Dockerfile文件

在工程根目录下添加一个Dockerfile文件,内容如下

  • 该文件用于在服务器上使用docker-compose的方式进行构建服务镜像的时候使用
#FROM java:8
FROM  openjdk:17-jdk-alpine
ADD target/boot-docker.jar boot-docker.jar
ENTRYPOINT ["java","-jar","/boot-docker.jar"]

3.2 服务器环境准备

3.2.1 docker环境

提前在服务器,或虚拟机上安装好docker环境,启动镜像时使用

3.2.2 docker-compose环境

提前安装docker-compose环境,用于构建服务镜像

3.2.3 java环境

提前在服务器安装jdk,运行jar包的时候需要依赖jdk环境

3.2.4 maven环境

对springboot工程进行打包时需要使用maven命令

四、springboot远程debug操作过程

基于上面准备的环境,首先介绍如何基于springboot的工程进行远程debug,在实际线上部署的时候,通过springboot打成jar包之后进行部署也是一种常用的方式,此时可以采用这种方式进行远程debug排查问题。

4.1 增加测试接口

在工程中添加如下测试接口用于测试

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DockerImageController {

    //localhost:8081/docker/v1
    @GetMapping("/docker/v1")
    public Object dockerTest1(){
        return "docker image test";
    }

}

工程运行起来之后,调用一下接口确保功能正常

4.2 本地构建jar包并启动服务

在idea中使用maven命令构建jar包,然后在本地使用java -jar命令启动,最后测试一下效果

正常启动的时候,只需要使用 java -jar jar包名 即可,为了在后续部署到远程服务器上能够调试,需要额外添加监听端口,以这个jar为例,启动命令如下:

  • address后面的端口可以自己指定;
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 boot-docker.jar

本地使用cmd启动,模拟远程服务器环境

再次访问,确保接口访问正常

4.3 idea配置远程debug

通过上面CMD启动窗口,可以看到5005端口准备就绪,然后再在idea做做如下配置

然后再在下面的配置框中填写信息,参考下面的配置

然后点击启动即可,正常启动后,可以看到控制台显示已经开始监听5005端口了

4.3.1 调用接口模拟调试

基于上面启动连接的状态下,再次调用一下接口,可以看到此时就进入代码中的断点了,就可以进行断点调试了

4.4 配置服务器远程debug

将上面的jar包上传到服务器,模拟真实的线上部署jar包进行debug调试

4.4.1 启动服务

使用下面的命令进行启动

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 boot-docker.jar

启动后效果如下

4.4.2 idea进行配置

其他的配置保持不变,只需要修改下Host连接的IP地址为服务器IP地址

保存,然后连接即可,可以看到开始监听远程的5005端口

4.4.3 模拟接口调试

调用一下接口,可以看到也能正常进入到代码断点进行调试

五、springboot远程docker容器debug操作过程

springboot项目实际部署的时候,也可以通过docker的方式进行部署,在这种部署方式下,如果想要远程debug该怎么做呢,下面介绍详细的操作过程。

5.1 修改Dockerfile文件

在上面Dockerfile文件的基础上做一下调整,即在java -jar的启动参数配置中添加一行配置监听的参数信息,参考下面的配置

#FROM java:8
FROM  openjdk:17-jdk-alpine
ADD target/boot-docker.jar boot-docker.jar
#ENTRYPOINT ["java","-jar","/boot-docker.jar"]
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "/boot-docker.jar"]

5.2 上传工程代码打包

将代码上传到服务器指定目录,或者通过git下载代码到服务器指定目录

在当前目录下,执行mvn clean package 进行打包,打完包之后,确保在target目录下能够看到构建出来的工程jar包

5.3 使用docker-compose命令构建镜像

使用docker-compose命令,通过Dockerfile文件对上一步的jar包进行镜像的构建,需要进入到Dockerfile所在的目录进行命令执行

docker build -t boot-docker:1.0 .

执行完成后,通过docker images检查确保镜像正常生成

5.4 启动镜像

使用下面的命令启动容器

docker run -d -it -p 8081:8081 -p 5005:5005 --name=boot-k8s boot-docker:1.0

然后使用docker ps 检查下确保镜像正常启动

5.5 idea配置远程debug

和上面对jar包进行debug配置类似,在idea中启动参数中做下面的配置

然后远程连接一下

5.6 接口模拟测试

在浏览器调用一下测试接口,可以看到断点已经可以正常进入到工程接口代码中了

六、写在文末

本文通过实际操作详细演示了如何对springboot项目进行远程debug的过程,希望对看到的同学有用哦,本篇到此结束,感谢观看。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO11改进 | 注意力机制| 对小目标友好的BiFormer【CVPR2023】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 本文介绍了一种新颖的动态稀疏注意力机制…

C++,STL 029(24.10.13)

内容 一道练习题。 &#xff08;涉及string&#xff0c;vector&#xff0c;deque&#xff0c;sort&#xff09; 题目&#xff08;大致&#xff09; 有五名选手ABCDE&#xff0c;10个评委分别对每一个选手打分&#xff0c;去除最高分和最低分&#xff0c;取平均分。 思路&…

bat脚本banenr

飞出个未来班得 echo off echo .-. echo ( ) echo - echo J L echo ^| ^| echo J L echo ^| ^| echo J L echo …

Node.js概述

1. Node.js简介 Node.js是一个基于Chrome V8引擎的JavaScript运行环境。 地址&#xff1a;Node.js 中文网 1.1 Node.js中的JavaScript运行环境 &#xff08;1&#xff09;浏览器是JavaScript的前端运行环境 &#xff08;2&#xff09;Node.js是JavaScript的后端运行环境 …

vue3之插件

插件plugins是一种能为vue添加全局功能的代码,官网连接&#xff1a;https://cn.vuejs.org/guide/reusability/plugins.html 项目的src文件夹下新建plugins文件夹 新建i18n.js文件 插件是一个拥有install方法的对象 export default {install: (app, options)>{app.config.…

Linux中用java命令运行class文件提示“错误:找不到或无法加载主类”

1.问题&#xff1a; 很多时候&#xff0c;我们需要在Linux终端编译并运行普通Java程序&#xff0c;但是会遇到以下问题&#xff1a; 错误&#xff1a;找不到或无法加载主类” 2.问题原因及解决办法 其实原因很简单&#xff0c;可能由两方面造成。 原因一 java在运行.class文…

进制的介绍

一、进制介绍 对于整数&#xff0c;有四种表示方式&#xff1a;二进制&#xff1a;0,1 &#xff0c;满 2 进 1.以 0b 或 0B 开头。十进制&#xff1a;0-9 &#xff0c;满 10 进 1。八进制&#xff1a;0-7 &#xff0c;满 8 进 1. 以数字 0 开头表示。十六进制&#xff1a;0-9 …

损失函数篇 | YOLOv8更换损失函数之SlideLoss | 解决简单样本和困难样本之间的不平衡问题

前言:Hello大家好,我是小哥谈。SlideLoss是一种新颖的损失函数,可以有效地解决YOLO算法在处理小目标和密集目标时的问题。本文所做出的改进是在YOLOv8算法中引入SlideLoss损失函数。🌈 目录 🚀1.基础概念 🚀2.更换方法 🍀🍀步骤1:loss.py文件修改 🍀�…

C#源码安装ZedGraph曲线显示组件

在软件开发里,数据的显示,已经是软件开发的大头。 如果让数据更加漂亮地、智能地显示,就是软件的核心价值了。 因为不管数据千万条,关键在于用户看到图。因为一个图表,就可以表示整个数据的趋势, 或者整个数据的走向,数据频度和密码。所以图表显示是软件的核心功能,比如…

25.1 降低采集资源消耗的收益和无用监控指标的判定依据

本节重点介绍 : 降低采集资源消耗的收益哪些是无用指标&#xff0c;什么判定依据 通过 grafana的 mysql 表获取所有的 查询表达式expr通过 获取所有的prometheus rule文件获取所有的 告警表达式expr通过 获取所有的prometheus 采集器接口 获取所有的采集metrics计算可得到现在…

SpringBoot——静态资源访问的四种方式

1.默认的静态资源目录 /static /public /resources /META-INF/resources 动态资源目录&#xff1a;/templates 2.resources静态资源目录图片存放 3. 静态资源访问 3.1.通过路径访问静态资源 http://localhost:8080/a.jpg http://localhost:8080/b.jpg …

《深度学习》OpenCV 物体跟踪 原理及案例解析

目录 一、物体跟踪 1、什么是物体跟踪 2、步骤 1&#xff09;选择跟踪算法 2&#xff09;初始化跟踪器 3&#xff09;在每个视频帧上执行跟踪 4&#xff09;可选的重新初始化 3、原理 二、案例实现 1、完整代码 1&#xff09;使用方式 2&#xff09;运行结果 2、关…

用python做一个简单的画板

一&#xff0c;画板的介绍 画板&#xff08;Paint Board&#xff09;是一个提供用户绘图、涂鸦和创作的平台。现代数字画板通常是由软件程序实现的&#xff0c;具有多种功能。以下是画板的一些主要特征和功能&#xff1a; 1. 基本绘图工具 画笔和铅笔&#xff1a;用户可以选…

Java——数组的定义与使用

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;数组的概念以及定义,初始化 1.1&#xff1a;数组概念以及定义 数组概念&#xff1a;可以看成…

红黑树:c++实现

1. 红⿊树的概念 红⿊树是⼀棵⼆叉搜索树&#xff0c;他的每个结点增加⼀个存储位来表⽰结点的颜⾊&#xff0c;可以是红⾊或者⿊⾊。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路 径⻓出2倍&#xff0c;因⽽是接近平…

用LaTeX写一篇帅帅的算法学习题解

前言 先来看看用 LaTeX \text{LaTeX} LaTeX 写出来的题解是啥样&#xff0c;内容是瞎写的。 前提知识与环境 默认已经掌握了 LaTeX \text{LaTeX} LaTeX 的一些用法&#xff0c;特别是公式如何写&#xff0c;如果你对这块还是很了解&#xff0c;可以先学着使用 Typora \…

DEEP TEMPORAL GRAPH CLUSTERING.md

ICLR23 推荐指数&#xff1a; #paper/⭐ 原因的话&#xff0c;可以找找前人的一篇文章(可以看&#xff0c;但是当你阅读前人文章会发现。) 动机/优点 很明确&#xff0c;时序图只需要考虑时间相近的点&#xff0c;因此开销特别小。但是邻接矩阵&#xff0c;就要考虑所有点的关…

Dockerfile最佳实践:如何创建高效的容器

在微服务和云计算时代&#xff0c;Docker就已经成为应用开发和部署不可或缺的工具。如今虽处大模型时代&#xff0c;但这些基础技术仍然是我们需要掌握的。 容器化允许开发者将应用程序及其依赖打包到一个单一的、可移植的单元中&#xff0c;确保了可预测性、可扩展性和快速部…

反射机制(Reflection)

1. 反射 Java的反射机制(reflection)是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反…

创建一个c#程序,实现字符串类型转整数类型

首先&#xff0c;创建一个c#程序 在代码编辑器中编写代码&#xff0c;点击Run按钮或者按下F5键来运行程序。 下面&#xff0c;编写将字符串类型转换为整数类型的代码。 sing System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…