如何基于SpringBoot+Docker构建公司级别的远程调试

简介: 如何基于SpringBoot+Docker构建公司级别的远程调试

背景:现在很多公司一般分为开发,测试,预发,生产等环境,除了生产其他环境出现一点小问题都要通过查询日志的形式来定位问题非常的费时费力影响开发效率。鉴于很多公司都采用了SpringBoot+Docker的形式来部署微服务,本文提出一套实际可以大大节省排查和定位问题所需时间的方法——远程调试代码

 

1、DockerFile文件

FROM maven:3-jdk-8-alpine
MAINTAINER lzhcode
RUN mkdir -p  /home/admin/myapp
ENV app_name="myapp"
ENV compile_dir="/hyena/$app_name" \
    work_dir="/home/admin/$app_name"
ENV JAVA_OPTS=" -Dcatalina.vendor=ecarx -Djava.security.egd=file:/dev/./urandom -Dlog4j.defaultInitOverride=true -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_EQUALS_IN_VALUE=true -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true -server -Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xmn256m -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.server.gcInterval=2592000000 -Dsun.rmi.dgc.client.gcInterval=2592000000 -XX:ParallelGCThreads=4 -Xloggc:$work_dir/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$work_dir/logs/java.hprof -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=10000 -Dsun.net.client.defaultReadTimeout=30000 -DJM.LOG.PATH=$work_dir/logs -DJM.SNAPSHOT.PATH=$work_dir/snapshots -Dfile.encoding=utf-8 -Dserver.port=8007"
ENV REMOTE_DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=28000"
WORKDIR $work_dir
#把web项目copy到/hyena/$app_name目录下
COPY ./ $compile_dir
#把shell脚本打印出来,观察是否copy成功
RUN  cat $compile_dir/docker-entrypoint.sh
#为shell脚本授权
RUN  chmod 777 $compile_dir/docker-entrypoint.sh
RUN  sh -c ' mkdir -p $work_dir/logs && cp $compile_dir/boot/target/$app_name.jar $work_dir/'
#容器内的web服务端口
EXPOSE 8007
#容器内的远程调试端口
EXPOSE 28000
#启动容器时执行web项目
ENTRYPOINT ["sh","-c","$compile_dir/docker-entrypoint.sh"]

docker-entrypoint.sh文件内容 (和DockerFile在同一级目录下)

#!/bin/bash
set -e
if [ "$ENV_TYPE" = 'development' ] || [ "$ENV_TYPE" = 'testing' ]; then
      java $REMOTE_DEBUG $JAVA_OPTS -jar  $work_dir/$app_name.jar
elif [ "$ENV_TYPE" = 'staging' ] || [ "$ENV_TYPE" = 'production' ]; then
      java  $JAVA_OPTS -jar  $work_dir/$app_name.jar
fi
exec "$@"

关键是  java $REMOTE_DEBUG $JAVA_OPTS -jar  $work_dir/$app_name.jar这句

表示用jdwp远程调试的方式启动myapp.jar(注意这是jdk8的配置,jdk低版本的的配置见下图IDEA里的配置)

其中

1、$REMOTE_DEBUG = -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=28000

在shell脚本里控制只有development和testing环境,才以远程调试的方式启动jar

2、$ENV_TYPE 师配置在k8s里的环境变量,在用k8s启动容器时可以获取到对应的值

 

2、灵雀云配置外部端口映射Docker的内部端口

3、IDEA的配置

    点击Debug后就可以和ip 10.160.11.59 ,端口为28000的服务建立Socket调试连接

   

4、远程调试

   保证本地代码和远程代码一致,直接在前端打开dev或test下的系统,就可直接在本地断点调试不同环境下的代码了,但是需要注意的是当一个断点卡住为释放时,其他断点也无法执行,而且一次只能有一个人打断点。需要团队内部事先协调好,适用于不同环境下疑难问题的快速排查。

日志里出现Debugger failed to attach: recv failed during handshake: Connection reset by peer 出现了这个就表示可以进行远程调试了


相关文章
|
7天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
Java API 数据库
如何使用Spring Boot构建RESTful API,以在线图书管理系统为例
【10月更文挑战第9天】本文介绍了如何使用Spring Boot构建RESTful API,以在线图书管理系统为例,从项目搭建、实体类定义、数据访问层创建、业务逻辑处理到RESTful API的实现,详细展示了每个步骤。通过Spring Boot的简洁配置和强大功能,开发者可以高效地开发出功能完备、易于维护的Web应用。
56 3
|
17天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
95 62
|
10天前
|
Java
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
SpringBoot构建Bean(RedisConfig + RestTemplateConfig)
30 2
|
13天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
81 2
|
15天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
34 2
|
21天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
74 7
|
20天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
55 6
|
19天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
24 4