掘金 后端 ( ) • 2024-05-07 09:55

前情提要

51假期结束了,也对自己的项目学习做个小小的总结和分享,最近在学习代码沙箱的开发,又不想把自己线上的宝塔搞崩,于是又把之前攒的VMWare虚拟机相关知识给搬出来,不得不说对比此前的VMWare应用,版本升级优化了许多,很多配置项的东西都可以通过可视化界面进行操作。例如此前的VMWare网络打通还得通过桥接方式配置,之前为了打通虚拟机和宿主机的网络配置还踩了不少的坑,机器带不动甚至可以卡半天,还好这次安装虚拟机稍微比较顺利。

感兴趣的小伙伴可以试着搭建一下自己的虚拟服务器,发现更多好玩的功能,本篇主要介绍基于VMWare虚拟机的安装配置,借助ubuntu构建虚拟机镜像,并且可以打通本地和虚拟机服务器的远程开发模式。

VMWare官网

VMWare Workstation Player

安装完成,创建虚拟机

下载ubuntu镜像:选择18.04.6版本(如果版本已经升级,则另外选择一个相对稳定的版本)

image-20240504103214161

image-20240504111851671

Server版(老手推荐,新手跳过)

Server版本安装参考:

​ 新建虚拟机,选择镜像(ubuntu镜像)

image-20240504110252672

image-20240504110518296

  • 原生版(参考上述配置,安装的是server版本)

image-20240504111422646

桌面版安装(新手建议安装桌面版)

​ 选择镜像文件(desktop版本)输入系统名称、用户名密码,选择镜像安装目录,选择给虚拟机分配的硬盘空间大小,可以选择自定义虚拟机配置(如果电脑配置比较好,可以分配16G内存、4核CPU,其他内容不用变动),然后等待安装

image-20240504124715170

image-20240504124934933

​ 选择ubantu桌面版适用新手入门,安装配置完成后输入密码即可进入系统,然后做一些基础项配置:分辨率、语言、日期时间等

image-20240504125310533

​ 安装完成,系统初始化,配置基础内容。点击win键:配置基本内容

  • 输入resolution(屏幕缩放改为200%,结合实际调整)
  • 输入language(安装语言支持等待安装,然后调整中文,等待下次登录系统就会生效)
  • 增加中文输入法(language添加输入法和语言,区域和语言配置,再次重新登录即可使用中文)
  • 时区修改:输入time(日期和时间),修改时区

配置参考说明

​ 参考本机的CPU配置选择(任务管理器=》详细信息查看【性能】)

image-20240504110929972image-20240504111201751

配置参考

处理器数量:

​ 如果打算同时运行多个虚拟机或者需要高性能,你可以考虑将虚拟机的处理器数量设置为主机的逻辑处理器数量(即 32 个),但要确保不要超过主机的物理核心数量(即 24 个),因为这可能会导致过度分配和性能下降。

每个处理器的内核数量:

​ 对于每个处理器的内核数量,一般来说,设置为 1 或者 2 是比较常见的选择。这取决于虚拟机的工作负载和性能需求。

​ 如果你的虚拟机主要用于轻量级任务或者测试目的,设置每个处理器的内核数量为 1 是足够的。

​ 如果你的虚拟机需要处理较重的工作负载或者需要更高的性能,可以考虑将每个处理器的内核数量设置为 2,以提高虚拟机的处理能力。

​ 常见的设置是将虚拟机的处理器数量设置为主机的逻辑处理器数量,并将每个处理器的内核数量设置为 1 或者 2。

​ 最佳的设置取决于你的具体需求和工作负载,你可能需要进行一些实验和性能测试来找到最适合你的配置

桌面版使用

给系统安装软件:软件商店安装、命令行终端程序安装

系统提供了apt软件包管理器(可通过apt install指令安装)

# 安装docker
sudo apt install docker.io

# 等待安装完成,确认docker版本
docker -v

使用docker测试,如果执行docker创建镜像提示没有权限,则有两种方式:

# 以管理员身份执行
sudo docker run hello-world

# 或者通过systemctl重启docker
systemctl restart docker
docker run hello-world

image-20240504142004210

远程开发

​ 在window下远程开发,操作linux服务器(不改变原有开发习惯,如果要在linux虚拟机中开发可能又要不断切换调整浪费时间),远程开发主要分为两种方式:远程部署、纯远程开发

准备工作

  • 网络联通(ifconfig确认宿主机和虚拟机的网络联通是否正常)
  • SSH环境配置

1.环境准备

🚀网络联通

# 查看虚拟机ip
ifconfig

# 如果没有安装这个命令,则可安装net-tools
sudo apt install net-tools

或者按win键,输入IP(选择网络配置,选择查看网络IP)

image-20240504133439352

本机CMD执行ping指令连接虚拟机IP查看网络是否联通,如果可以ping通则说明本机可以访问到虚拟机。或者虚拟机执行ping指令访问本机IP

image-20240504133619084

🚀SSH 环境

​ 虚拟机中安装SSH服务:

# 安装ssh
sudo apt-get install openssh-server

# 查看ssh服务是否开启
ps -ef | grep ssh

# 打开ssh服务
sudo service ssh start

# 关闭ssh服务
sudo service ssh stop

image-20240504142654995

🚀更新软件包并安装开发环境

# 更新软件包
sudo apt update

# 安装jdk8
sudo apt install openjdk-8-jdk

# 检查java版本
java -version

# 安装java依赖管理工具maven
sudo apt install maven

# 查看maven版本
mvn -v

image-20240504143249428

2.远程部署模式(基于本地 =》 同步到linux服务器部署)

​ 目的:通过本地服务操作完成远程服务器项目的代码同步、调试、运行、构建、部署

针对调试:不建议对线上的项目进行调试、打断点,可能会影响用户的使用,是一个危险的操作

1)本地创建Springboot项目

​ 创建一个干净的Springboot项目,模拟远程开发

image-20240504143916133

​ 配置同步:Tools=》Development=》Configuration (创建一个远程配置)=》添加选择sftp协议=》输入服务器名称(Ubuntu)

​ 然后在相应配置中添加一个SSH连接配置,让软件知道应该去访问哪个linux服务器。点击设置添加一个SSH配置,输入虚拟机的IP、用户名、密码

image-20240504145043252

​ 点击OK之后则可在侧边栏看到对应服务目录,如果没有侧边栏则可以手动打开:Tools=》Development=》Browse Remote Host

image-20240504145615214

​ 配置映射:同步本地文件和远程服务器文件

​ Tools=》Development=》Configuration :选择刚创建好的服务配置,然后点击Mappings选项卡进行配置,需要先理解每个参数的含义

  • Local path:本机项目代码存放位置
  • Deployment path:希望将代码同步到linux服务器的目录位置
  • Web path:/

进入到linux 虚拟机目录(如果虚拟机创建了用户,例如创建了用户noob,则可在/home下有一个noob目录专门用于存放这个用户相关的所有文件),在里面创建一个文件夹专门用于存储项目代码(即同步部署的目标路径)

image-20240504150918643

2)代码同步

​ 🚀手动同步:配置完成,右键选择项目RemoteDemo,选择Deployment=》Sync with Deployed to Ubuntu (一键同步),然后就会自动列举出当前没有同步的文件内容。点击一键同步即可完成同步操作,随后去linux服务器上查看代码是否同步完成(基于手动同步操作)

image-20240504151112118

image-20240504151136238

🚀自动同步:Tools=》Development=》Automatic Upload(自动上传配置),点击该配置则开启自动上传,随后在项目中任意位置创建一个文件,测试是否自动同步即可

image-20240504151807703

​ 本地删除文件的时候会相应提示是否要联动删除远程的文件内容,如果说每次删除一个文件都要询问一次则会比较麻烦,因此可以考虑自行调整配置:Tools=》Development=》Options 可以更改自动上传配置的一些内容(结合自身需求进行调整)

image-20240504152012415

3)远程操控运行代码(运行、构建、部署、调试)

🚀本地终端远程操控linux服务器运行代码

​ 打开【Terminal】窗口,选择服务器后自动连接

​ 然后进入到代码目录,执行指令运行代码【mvn spring-boot:run】,随后程序会自动下载项目依赖并启动项目

​ 等待一段时间之后,可以查看控制台确认项目是否正常启动,启动成功之后则在本地访问linux虚拟机的ip访问项目(linux服务器IP+访问端口+项目路径)

image-20240504160028936

​ 这里有一个小细节,如果执行mvn spring-boot:run指令,项目依赖安装完成之后发现项目并没有启动,虽然显示build success,但是它是将项目所需依赖加载出来,却没有启动项目,因此需要排查原因;

​ 一开始以为是maven依赖没有构建,重新执行mvn clean install还是同样的问题,参考了很多文章也没有解决方案,于是突发奇想去查看mvn这个指令执行的原理,然后再去看对应的问题

image-20240504163734326

​ 使用mvn spring-boot:run命令,可以直接在项目中运行Spring Boot应用程序,无需先打包成jar或war文件。这在开发过程中非常有用,因为它可以快速启动,并允许进行实时编译和自动重启

​ 结合上述执行原理分析,回归到pom.xml项目本身,发现在默认生成的springboot项目中对spring-boot-maven-plugin的执行目标配置添加了一个skip属性,而导致无法扫描RemoteDemoApplication作为启动类配置,因此就会出现上面的问题,虽然依赖加载完成、构建成功,但是没有要启动的内容,因此不会启动项目。解决方案就是修改配置,取消skip,然后重新执行mvn spring-boot:run

image-20240504164019193

image-20240504164158402

​ 这个时候再去访问项目,项目正常访问:虚拟机访问:http://localhost:8080/health、宿主机访问:http://[虚拟机IP]:8080/health

🚀本地终端远程操控linux 服务器构建、部署项目

​ 构建项目:通过【Terminal】终端,执行指令【mvn package】打包项目,确认build success,然后看对应目录生成的jar

​ 部署项目:执行上一步骤生成的jar,java -jar xxx.jar --sping.profiles.active=prod,然后确认项目启动信息,启动成功则可进行访问

java -jar RemoteDemo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

image-20240504164605487

🚀本地终端远程调试linux服务器项目

​ 本地项目打开Run/Debug Configurations,添加一套远程调试的配置(Remote JVM Debug)

Host:填写linux服务器IP、Port:选择不冲突的端口号(默认是5005)、JDK版本(看实际使用的版本,此处选择8),然后会看到配置会自动生成一个启动命令行的参数配置,复制这个命令行参数,然后在启动项目的时候指定参数。记得点击Apply保存配置,然后根据生成的命令行启动项目
# 参考命令行参数配置
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

# 启动程序
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar --sping.profiles.active=prod

# 观察程序启动内容(发现其会额外占用一个5005端口)


# 以debug模式启动
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar RemoteDemo-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

​ 随后在本地点击debug按钮(对应debug选择的是前面配置的ubuntu debug),让它成功连接远程的JVM,然后在本地设置断点进行调试,就会发现可以通过本地调试远程部署的项目(但是这里有一个问题,就是必须保证本地的项目代码和线上部署的项目代码是一致的,不然这种调试毫无意义

image-20240504165359310

image-20240504165316753

3.远程开发模式(基于linux,本地操作远程)

​ 通过idea自带的远程开发模式,实现一个更简单、体验更好的远程开发模式,无需做任何多余配置

​ 远程开发模式:以服务器为主,将所有的代码编辑、运行、部署等操作都是在服务器上运行,而本地电脑只是相当于操作远程服务器(有点类似云游戏概念,本地不存储代码,所有的内容都在服务器上,这种情况适用于本地电脑性能一般、远程服务器性能超强、以及开发环境需要多人协作或者需要统一一套开发环境的场景,类似开发机,连接到统一的开发机上去操作)

如果是多人协作场景,还需考虑多人协作修改冲突问题,要借助Git进行版本管理

​ 借助IDEA的远程开发功能来进行操作,先关闭现有的RemoteDemo项目(所有项目),然后新建选择Remote Development=》SSH(可以选择已有的配置,也可自行填充配置信息)

image-20240504171418121

​ 选择IDE和项目,然后软件就会在linux服务器上安装项目开发所需环境(开发软件),文件路径选择项目所在路径,第一次安装配置可能会比较慢

image-20240504171605591

​ 等待项目加载完成,然后可以本地启动调试项目(这个时候则可直接访问IP测试项目),然后可以查看本地电脑的任务管理器的IDEA的CPU占用情况

image-20240505112857272

​ 本地启动失败,需要配置,settings=》Build,Exception,Development:Compile=》进程VM选项:-Djdk.lang.Process.launchMechanism=vfork

可能是使用了比较新的IDEA版本导致,需要配置一下setting

✨✨✨✨✨至此,完结撒花✨✨✨✨✨

本文由一人の境发布