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

目录

一、前言

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

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.mzph.cn/news/881924.shtml

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

相关文章

400行程序写一个实时操作系统(九):替换FreeRTOS的内存管理算法

前言 通过前面几章&#xff0c;笔者带领大家完成了内存管理算法的编写。 我们完成的内存管理算法&#xff0c;被称为小内存管理算法。我们也可以将它作为一个库&#xff0c;在后续的嵌入式开发中&#xff0c;使用我们自己编写的malloc&#xff0c;不仅效率会更高&#xff0c;…

机器学习笔记-2

文章目录 一、Linear model二、How to represent this function三、Function with unknown parameter四、ReLU总结、A fancy name 一、Linear model 线性模型过于简单&#xff0c;有很大限制&#xff0c;我们需要更多复杂模式 蓝色是线性模型&#xff0c;线性模型无法去表示…

如何匿名浏览网站,保护在线隐私?

在现如今的网络世界&#xff0c;在线隐私已不复存在。你总是被跟踪&#xff0c;即使你使用隐身模式也无济于事。隐身模式会阻止浏览器保存你的浏览历史记录。但它并不能阻止你的互联网服务提供商 (ISP)、雇主、学校、图书馆或你访问的网站看到你在网上做什么。 更有不法分子在未…

Lumerical学习——资源管理和运行模拟

一、资源管理&#xff08;Resource Manager&#xff09; 在模拟计算前必须对计算资源进行配置。采用资源管理器可以完成这项任务。单击主工具条的“资源&#xff08;Resources&#xff09;”按钮&#xff08;见上图&#xff09;就可以打开资源管理器。通常每个计算机只需设置一…

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售&#xff0c;因此内部会再细分为多个管理单位&#xff0c;包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上&#xff0c;大型生物制药企业会设立实验室、研发…

摇人摇人, JD内推岗位(社招+校招)

摇人摇人, 有找工作的家人们看过来啊~ 虚位以待, 快到碗里来 算法开发工程师岗 京东云 北京|T7, 5-10年 岗位职责&#xff1a; 参与基于RAG知识库平台和ChatBI产品打造和商业化落地&#xff0c;进行相关技术&#xff1a;包括OCR、文档拆分、意图理解、多轮对话、NL2SQL、Embed…

mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

Linux性能调优,还可以从这些方面入手

linux是目前最常用的操作系统&#xff0c;下面是一些常见的 Linux 系统调优技巧&#xff0c;在进行系统调优时&#xff0c;需要根据具体的系统负载和应用需求进行调整&#xff0c;并进行充分的测试和监控&#xff0c;以确保系统的稳定性和性能。同时&#xff0c;调优过程中要谨…

万界星空科技:智能称重打标系统

万界星空科技的称重系统是其为制造业&#xff0c;特别是线缆、漆包线、食品等行业提供的重要解决方案之一。以下是对该系统的详细介绍&#xff1a; 一、系统概述 万界星空科技称重系统是集成在其MES&#xff08;制造执行系统&#xff09;中的一个功能模块&#xff0c;专门用于…

基于springboot实习管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写&#xff0c;挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…

2020年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型网络协议的三要素 网络协议的三要素&#xff1a;语法 &#xff0c;语义&#xff0c;同步&#xff08;时序&#xff09; 语法&#xff1a;定义收发双方所交换信息的格式 语法&#xff1a;定义收发双方所要完成的操作 网页的加载 …

深入理解队列(Queue)的实现(纯小白进)

目录&#xff1a; 前言一、 什么是队列?1.1、 队列的特性1.2、 队列的图解 二、 队列的详细实现2.1、 队列不同的实现方式2.2、 队列结构体2.3、 队列的初始化2.4、 入队列2.5、 出队列2.6、 获取对头元素2.7、 获取队尾元素2.8、 队列的判空2.9、 队列有效的元素个数2.10、 队…

Kind部署的K8s证书过期后的解决方案

证书通常有效期为1年&#xff0c;一年后服务将不可用解决方案就是更新证书 1. 找到 Kind 集群的控制平面容器名称,容器名称不一定是这个 docker ps --filter "namekind-control-plane"2. 进入 Kind 控制平面的容器&#xff1a; docker exec -it kind-control-plane…

洛谷入门刷题Day5(想刷水题结果被水题刷了)

P1304 哥德巴赫猜想 题目描述 输入一个偶数 N N N&#xff0c;验证 4 ∼ N 4\sim N 4∼N 所有偶数是否符合哥德巴赫猜想&#xff1a;任一大于 2 2 2 的偶数都可写成两个质数之和。如果一个数不止一种分法&#xff0c;则输出第一个加数相比其他分法最小的方案。例如 10 10…

论文笔记:Ontology-enhanced Prompt-tuning for Few-shot Learning

论文来源&#xff1a;WWW 2022 论文地址&#xff1a;https://arxiv.org/pdf/2201.11332.pdfhttps://arxiv.org/pdf/2201.11332.pdf 论文代码&#xff1a;暂未公开 笔记仅供参考&#xff0c;撰写不易&#xff0c;请勿恶意转载抄袭&#xff01; Abstract 小样本学习旨在基于…

Linux——传输层协议

目录 一再谈端口号 1端口号范围划分 2两个问题 3理解进程与端口号的关系 二UDP协议 1格式 2特点 3进一步理解 3.1关于UDP报头 3.2关于报文 4基于UDP的应用层协议 三TCP协议 1格式 2TCP基本通信 2.1关于可靠性 2.2TCP通信模式 3超时重传 4连接管理 4.1建立…

数据挖掘学习笔记:朴素贝叶斯 | Python复现

数据挖掘学习笔记&#xff1a;朴素贝叶斯 机器学习系列&#xff08;四&#xff09;&#xff1a;朴素贝叶斯&#xff08;华强买瓜版&#xff09; - yyxy的文章 - 知乎 十分钟&#xff0c;让你再也忘不掉贝叶斯分类 - VoidHaruhi的文章 - 知乎 《机器学习》&#xff08;西瓜书&am…

基于Arduino的简易收音机

DIY FM收音机&#xff1a;使用Arduino和Si4703模块打造 引言 在本项目中&#xff0c;我们将使用Arduino Nano和Si4703 FM调谐模块来构建一个功能完备的FM收音机接收器。这个易于跟随的指南非常适合想要深入无线电频率和无线通信世界的业余爱好者和电子爱好者。 Si4703模块是…

说下SSL/TLS四次握手过程?

参考自&#xff1a;SSL/TLS四次握手过程是怎么样的&#xff1f;HTTPS、SSL、TLS三者之间的联系和区别 一.SSL/TLS 简介 SSL(Secure Socket Layer 安全套接层)是基于 HTTPS 下的一个协议加密层&#xff0c;用于解决 HTTP 在传输数据时使用明文而导致的不安全问题。 SSL 是 HT…