文章很长,建议收藏起来,慢慢读! 备注:持续更新中…..


价值连城:2021春招月薪过5万 面试题 总系列

搞定下面这些面试题,2021春招月薪过5万(猛!) 阿里、京东、美团、头条…. 随意挑、横着走!!!
Java基础
1: JVM面试题(史上最强、持续更新、吐血推荐) https://www.cnblogs.com/crazymakercircle/p/14365820.html
2:Java基础面试题(史上最全、持续更新、吐血推荐) https://www.cnblogs.com/crazymakercircle/p/14366081.html
3:死锁面试题(史上最强、持续更新) [https://www.cnblogs.com/crazymakercircle/p/14323919.html]
4:设计模式面试题 (史上最全、持续更新、吐血推荐) https://www.cnblogs.com/crazymakercircle/p/14367101.html
5:架构设计面试题 (史上最全、持续更新、吐血推荐) https://www.cnblogs.com/crazymakercircle/p/14367907.html
还有 10 几篇价值连城 的面试题 具体….. 请参见【 疯狂创客圈 高并发 总目录

万字长文: 疯狂创客圈 springCloud 高并发系列

springCloud 高质量 博文
nacos 实战(史上最全) sentinel (史上最全+入门教程)
springcloud + webflux 高并发实战 Webflux(史上最全)
SpringCloud gateway (史上最全)
还有 10 几篇 万字长文 的高质量 博文 具体….. 请参见【 疯狂创客圈 高并发 总目录

1 什么是vagrant

必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑

Vagrant:是一个比较流行的虚拟机管理软件,使用Vagrant 可以让我们用命令直接从云上下载虚拟机的镜像,然后进行创建和管理等。

刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电脑上都是各种环境了,php,java,python,nodejs等等,非常麻烦,并且经常由于某种原因就把电脑重装了,ORZ,所以环境都要重来。所以打造一个属于自己并且可以移动的环境是非常重要的。

vagrant就是一款构建虚拟开发环境的工具,支持window,linux,mac,总有一款适合你。并且vagrant 可以把配置好的环境打包成一个box,分享给其他人直接使用,非常方便

vagrant 是一个很适合开发者的虚拟环境部署工具,本身集成了主流的虚拟器管理工具,支持 vmvare 和 virtualbox。

vagrant 的精髓在一个 Vagrantfile 里面,和 docker 的 Dockerfile 功能上一样。我们只需要把需要安装部署的步骤写在 Vagrantfile 里面,便可以实现轻松部署。vagrant 还支持把当前系统做成一个.box 后缀命名的镜像,类似 docker 的 image,可轻松实现环境的移植。

所以,使用vagrant可以在运行着多台vm的系统上定义复杂的虚拟框架。可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。是不是很酷?

2 准备工作:

2.1 安装VirtualBox 、vagrant、GitBash

下载安装 VirtualBox ,下载安装 Vagrant ,下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。

还可以在 http://www.vagrantbox.es/ 这里下载更多不同系统甚至是已经配置好环境直接可以用的box,虽然可以直接在Vagrant直接使用网址,由Vagrant自动下载安装,但是考虑到网络情况,还是建议自行先下载好。

此外,还得下载官方封装好的基础镜像:
Ubuntu precise 32 VirtualBox http://files.vagrantup.com/precise32.box
Ubuntu precise 64 VirtualBox http://files.vagrantup.com/precise64.box

如果你要其他系统的镜像,可以来这里下载:http://www.vagrantbox.es/

网友提供的centos 7.2网盘地址:https://pan.baidu.com/s/15S2OZq37FcL9RWWSTWntIw   提取码:3xb0
  • GitBash
    GitBash是windows下的Unix shell,方便向Vagrant输入指令。

    https://git-scm.com/download/win

    一般的java开发,都会使用git进行代码同步,所以此工具默认是已经安装了的

空间:

15G 的硬盘空间

注意:virtualbox 安装时,可以带一个参数:

VirtualBox-5.0.11-104101-Win.exe -msiparams NETWORKTYPE=NDIS5

主要是解决后续可能出现的一个错误

Failed to open/create the internal network \'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter\' (VERR_INTNET_FLT_IF_NOT_FOUND).
Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND).12

解决办法

在百度找了好久,也重装过vbox,但是仍然有问题。

后来在这个网址https://stackoverflow.com/questions/33725779/failed-to-open-create-the-internal-network-vagrant-on-
找到一个回复,里面提到

There is a known issue with the new NDIS6 driver, you can install it to use the old NDIS5 driver

Uninstall Virtualbox and try reinstalling it with a parameter

> VirtualBox-5.0.11-104101-Win.exe -msiparams NETWORKTYPE=NDIS5

This worked for me.

尝试使用命令安装,果然解决了问题。应该就是这个 NDIS6搞的鬼,换回NDIS5就没问题了。

2.2 下载预装了很多组件的 springcloud.box 镜像,

疯狂创客圈网盘,为大家准备了springcloud.box镜像,里边预装了java 、 redis 、zookeeper、kafka、Eureka、springcloud config 等必须的组件。网盘地址请参见【博客园总入口

在这里插入图片描述

3 使用vagrant制作Java开发环境

第一步,新建目录

E:\virtual\work

选择新建立的文件夹作,右键 —> Git Bash Here,在Git Bash打开当前目录

在 Git Bash 中可以看到,当前的linux 格式目录,执行指令如下:

$ pwd
/e/virtual/work

第二步,添加镜像到 Vagrant

vagrant box add  centos  /e/virtual/vagrant-centos-7.2.box
centos 表示指定名称,如果使用base,之后可以直接使用 

$ vagrant box add centos /e/virtual/vagrant-centos-7.2.box
==> box: Box file was not detected as metadata. Adding it directly…
==> box: Adding box \’centos\’ (v0) for provider:
box: Unpacking necessary files from: file:///E:/virtual/vagrant-centos-7.2.box
box:
==> box: Successfully added box \’centos\’ (v0) for \’virtualbox\’!

$

vagrant-centos-7.2.box是box的文件名,这里是本地保存box的路径。也可以是可以下载box的网址,如果是网址的话,Vagrant会自动启动下载。

第三步,初始化虚拟机

设置好box之后,在当前工作目录运行

$ vagrant init centos

centos为初始化的时候需要指定box的名称。执行的结果如下:

$ vagrant init centos
A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.

你也可以使用已有的目录,切换到开发目录里,用 centos 镜像初始化当前目录。初始化镜像之后,在当前目录生成一个虚拟机的配置文件 Vagrantfile,通过该配置文件,可以配置端口映射、虚拟机的IP、目录映射等。通过文本编辑器打开Vagrantfile可以进行一些进一步的常用配置,如果配置登录用户名称和密码,虚拟机的ip如下:

config.ssh.username = "root"
config.ssh.password = "vagrant"

config.vm.network :private_network, ip: "192.168.68.128"

重启虚拟机,这样我们就能用 192.168.233.128 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

具体的配置,稍后介绍。

第四步,启动虚拟机

使用如下命令:

$ vagrant up   # 启动虚拟机

你会看到终端显示了启动过程,启动完成后,我们就可以用 SSH 登录虚拟机了,剩下的步骤就是在虚拟机里配置你要运行的各种环境和参数了。

$ vagrant ssh # SSH 登录
$ cd /vagrant # 切换到开发目录,也就是宿主机上的 E:\virtual\work

Windows 用户注意:Windows 终端并不支持 ssh,所以需要安装第三方 SSH 客户端,比如:Putty、Cygwin 、Git Bash等。

有关初始账户和密码:

账户 密码
vagrant vagrant
root vagrant

可以使用其他的终端工具,通过root访问虚拟机了

启动过程中的错误

1 适配器创建失败 : Failed to create the host-only adapter

VBoxManage.exe: error: Failed to create the host-only adapter
VBoxManage.exe: error: Assertion failed: [!aInterfaceName.isEmpty()] at \'F:\tinderbox\win-5.1\src\VBox\Main\src-server\HostNetworkInterfaceImpl.cpp\' (74) in long __cdecl HostNetworkInterface::init(class com::Bstr,class com::Bstr,class com::Guid,enum __MIDL___MIDL_itf_VirtualBox_0000_0000_0038).
VBoxManage.exe: error: Please contact the product vendor!
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp


网上的大部分的解决方案为:


在virtualbox 管理 - > 全局设定 -> 网络 - > tab 仅主机网络 - > 添加
正常情况下是可以添加成功的,但是有可能报
Could not find Host Interface Networking driver!Please reinstall(找不到主机接口网络驱动程序!请重新安装)

如果第一步报错,这是因为之前卸载虚拟网卡的时候把驱动也给删除了。
可以在安装virtualbox目录…/Oracle VM VirtualBox中的 drivers\ network\ netadp6目录下有三个文件
VBoxNetAdp6.cat
VBoxNetAdp6.inf
VBoxNetAdp6.sys
这就是virtualbox虚拟网卡的驱动,右击VBoxNetAdp6.inf,右键点安装即可。
然后再做第二步。应该可以完成了。

4 打包分发

当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:

$ vagrant package

打包完成后会在当前目录生成一个 package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

执行的过程如下:


$ vagrant halt
==> default: Attempting graceful shutdown of VM...
==> default: Forcing shutdown of VM...


$ vagrant package --output  springcloud-dev.box
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: E:/virtual/work/springcloud-dev

$ vagrant box list
centos (virtualbox, 0)

命令的具体说明:

vagrant package -hUsage: vagrant package [options] [name]

Options:
–base NAME virtualbox程序里面的虚拟机的名称,不是box的名字也不是Vagrantfile里面的虚拟机名称.默认是打包当前目录下面的虚拟机。
–output NAME 要打包成的box名称,不会自动添加.box后缀,要手动加.默认值package.box

–include FILE… 打包时包含的文件名,你可以把.box文件理解为一个压缩包
–vagrantfile FILE 打包时包含的Vagrantfile文件,原理和上面类似
-h, –help Print this help
例子:vagrant package –base virtualbox_vm_name –output newbox_name.box

5 通过Vagrantfile进行虚拟机配置:

网络配置:

Vagrant的网络有三种模式

1、较为常用是端口映射,就是将虚拟机中的端口映射到宿主机对应的端口直接使用 ,在Vagrantfile中配置:

config.vm.network :forwarded_port, guest: 80, host: 8080

guest: 80 表示虚拟机中的80端口, host: 8080 表示映射到宿主机的8080端口。

2、如果需要自己自由的访问虚拟机,但是别人不需要访问虚拟机,可以使用private_network,并为虚拟机设置IP ,在Vagrantfile中配置:

 config.vm.network :private_network, ip: "192.168.1.104"

192.168.1.104 表示虚拟机的IP,多台虚拟机的话需要互相访问的话,设置在相同网段即可

3、如果需要将虚拟机作为当前局域网中的一台计算机,由局域网进行DHCP,那么在Vagrantfile中配置:

config.vm.network :public_network

目录映射:

默认的,vagrant将共享你的工作目录(即Vagrantfile所在的目录)到虚拟机中的/vagrant,所以一般不需配置即可,如你需要可配置:

Vagrant.configure("2") do |config|


  config.vm.synced_folder "src/", "/srv/website"
end

 

“src/”:物理机目录;”/srv/website”虚拟机目录

目录映射(文件夹)详细说明如下:

既然是开发环境,那么开发工作肯定还是需要在本地完成,而不是都要进到虚拟机中去完成,虚拟机就好好在后台运行服务就好了,不然就本末倒置了,所以这里就需要使用目录映射功能,将本地的目录映射到虚拟机的对应目录。

默认情况下,当前的工作目录,会被映射到虚拟机的 /vagrant 目录,当前目录下的文件可以直接在 /vagrant 下进行访问,当然也可以在通过 ln 创建软连接,如

ln -fs /vagrant/wwwroot /var/www

来进行目录映射,当然,从自动化配置的角度,能不进系统就不需要进系统,所以在Vagrant也可以进行目录映射的操作:

config.vm.synced_folder "wwwroot/", "/var/www"

前面的参数 “wwwroot/” 表示的是本地的路径,这里使用对于工作目录的相对路径,这里也可以使用绝对路径,比如: “d:/www/”

后面的参数 “/var/www” 表示虚拟机中对应映射的目录。

当在启动Vagrant后,对于虚拟机有进行过安装环境相关的配置,如果并不希望写在Vagrant的启动shell里面每次都重新安装配置一遍,可以将当前配置好的虚拟机打包成box,

注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:

sudo rm -f /etc/udev/rule.d/70-persistent-net.rules

制作完成之后直接将box文件拿到其他计算机上配置即可使用。

更多信息可以参考官方文档:http://docs.vagrantup.com/v2/

启动的时自运行需要的shell命令或脚本

内部脚本:

Vagrant::Config.run do |config|
  config.vm.provision :shell, :inline => "echo abc > /tmp/test"
end

外部脚本:

 

Vagrant.configure("2") do |config|
  config.vm.provision :shell, :path => "script.sh"   #脚本的路径相对于项目根,也可使用绝对路径
end


附:简单的vagrantfile文件

Vagrant.configure(2) do |config|
	config.ssh.username = "root"
	config.ssh.password = "vagrant"
    config.vm.box = "centos"
    config.vm.network "private_network", ip: "192.168.68.128"

   config.vm.synced_folder "/home/wangkongming/files/works/code/kfz-pm", "/data/webroot/pmv2"
   
end

6 vagrant 常用命令

官网文档:https://docs.vagrantup.com/v2/getting-started/index.html

vagrant init 初始化vagrantfile

vagrant add remove 删除 box,自动帮你生成vagrantfile

vagrant box remove springcloud-dev

vagrant add box 添加 box,自动帮你生成vagrantfile

vagrant box add  springcloud-dev   /e/virtual/workcluster/springcloud-dev-3.box

vagrant halt 关闭虚拟机

vagrant destroy 销毁虚拟机

vagrant ssh 连接虚拟机

vagrant reload 修改vagarntfile文件后,重启虚拟机,重新加载

vagrant suspend 暂时挂起虚拟机

vagrant status 查看虚拟机运行状态

vagrant package 打包 box文件

vagrant package --base cdh1 --output  springcloud-dev-4.box


vagrant box list 首先查看已经添加的box:

$ vagrant box list
centos (virtualbox, 0)

vagrant destroy 销毁当前虚拟机,不需要的虚拟机最好销毁,释放存储空间

7 虚拟机集群

建立虚拟机目录

先建立一个目录: /e/virtual/workcluster,通过 Git Bash进入 /e/virtual/workcluster,然后

添加镜像到 Vagrant

把下载的镜像springcloud-dev.box放入目录,添加镜像到 Vagrant

vagrant box add  springcloud-dev  springcloud-dev.box

springcloud-dev 表示指定名称,如果使用base,之后可以直接使用

初始化镜像

$ vagrant init springcloud-dev

输出以下日志:

A Vagrantfile has been placed in this directory. You are now
ready to vagrant up your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
vagrantup.com for more information on using Vagrant.
在当前目录生成了 Vagrantfile 文件。

修改Vagrantfile

修改文件以下:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don\'t touch unless you know what you\'re doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  (1..3).each do |i|
    config.vm.define vm_name = "cdh#{i}"  do |config|
        config.vm.provider "virtualbox" do |v|
            v.customize ["modifyvm", :id, "--name", vm_name, "--memory", "2048",\'--cpus\', 1]
        end
        config.vm.box = "springcloud-dev"
        config.vm.hostname =vm_name
        config.ssh.username = "root"
        config.ssh.password = "vagrant"
        config.vm.network :private_network, ip: "192.168.56.12#{i}"
								config.vm.provision :shell, :path => "bootstrap.sh"
    end
  end
end

上面的文件中定义了三个虚拟机,三个虚拟机的名字和 hostname 分别为cdh一、cdh二、cdh3,网络使用的是 host-only 网络。

在启动成功以后,会运行 bootstrap.sh 脚本,你能够编写你本身的脚本。

bootstrap.sh 脚本

#!/usr/bin/env bash

# The output of all these installation steps is noisy. With this utility
# the progress report is nice and concise.

echo "Update /etc/hosts"
cat > /etc/hosts <<EOF
127.0.0.1       localhost

192.168.56.121 cdh1
192.168.56.122 cdh2
192.168.56.123 cdh3
EOF

echo "Disable iptables"
setenforce 0 >/dev/null 2>&1 && iptables -F

### Set env ###
echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 设置hosts文件
  • 关掉防火墙
  • 设置虚拟机时区

启动集群

$ vagrant init springcloud-dev
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant up
....省略一大堆的输出

8 推倒重来

在使用的过程中,如果遇到问题,不好解决。 可以直接推倒重来,做好镜像的及时备份即可。

首先使用 vagrant status 查看一下状态

$ vagrant status
Current machine states:

cdh1                      running (virtualbox)
cdh2                      not created (virtualbox)
cdh3                      not created (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

然后使用vagrant halt 关机

$ vagrant halt cdh1
==> cdh1: Attempting graceful shutdown of VM...
The configured shell (config.ssh.shell) is invalid and unable
to properly execute commands. The most common cause for this is
using a shell that is unavailable on the system. Please verify
you\'re using the full path to the shell and that the shell is
executable by the SSH user.

可能关不了,因为ssl 坏了上不去了, 直接在virtualbox的界面去关,完了在看状态;

$ vagrant status
Current machine states:

cdh1                      poweroff (virtualbox)
cdh2                      not created (virtualbox)
cdh3                      not created (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

vagrant destroy 销毁虚拟机

$ vagrant destroy
==> cdh3: VM not created. Moving on...
==> cdh2: VM not created. Moving on...
    cdh1: Are you sure you want to destroy the \'cdh1\' VM? [y/N] y
==> cdh1: Destroying VM and associated drives...

vagrant up cdh1 重新启动

$ vagrant up cdh1
Bringing machine \'cdh1\' up with \'virtualbox\' provider...
==> cdh1: Importing base box \'springcloud-dev\'...
==> cdh1: Matching MAC address for NAT networking...
。。。。。
    cdh1: Update /etc/hosts
    cdh1: Disable iptables

成功了

回到◀疯狂创客圈

疯狂创客圈 – Java高并发研习社群,为大家开启大厂之门

版权声明:本文为crazymakercircle原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/crazymakercircle/p/14194688.html