這是一個我在github上看到的開源項目,采用的技術都是較新的技術
技術選型
Vue
SpringBoot
mybatis
MybatisGenerator
Redis
rabbitMQ
Docker
Linux(CenOS7)
開發工具
IDEA
HbuilderX
Navicat15
RedisDesktopManager
VirtualBox(開源虛擬機軟件)
ITerm2(遠程連接Linux命令行工具(mac上))
搭建項目過程:
安裝Vue
上vue官網https://vuejs.org/下載vue.js,並且將他復制到項目目錄下,並在script標簽引用
創建SpringBoot項目
首先安裝maven然后在idea創建web項目,並在pom.xml中引入下列依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.7.RELEASE</version> </parent> <dependencies> <!--引入springboot的web支持,幫你封裝好了很多個依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot中集成jsp,下面三個 注意scope屬性影響打war包--> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!--springboot整合mybatis,阿里的數據源,mysql或者Oracle--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!--<dependency>--> <!--<groupId>com.oracle</groupId>--> <!--<artifactId>ojdbc6</artifactId>--> <!--<version>6.0</version>--> <!--</dependency>--> <!--<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>--> <!-- fastjson格式轉換 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> <!--引入springboot測試依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency> <!--引入devtools全局熱部署,謹慎使用,和redis反序列化有緩存沖突,反序列化時報錯--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!--引入jedis--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- 引入一個工具包 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies>
然后啟動項目即可,
安裝Linux:
現在十點半,全部弄完。趁熱打鐵把這片博客的爛尾寫一下。
這篇博客把liunx從下載CenOS7到VirtualBox創建虛擬機並分區寫得非常詳細清楚,只不過我的系統是OS系統,Xshell沒有OS的開源版本,所以找了ITerm2作為替代
但是連接步驟基本一致,沒什么可說的
https://github.com/macrozheng/mall-learning/blob/master/docs/reference/linux_install.md
關鍵是在連接過程中遇到的幾個問題
一,IP地址
一開始還沒有發現,但是后來發現虛擬機一啟動就會ip自動+1,但是ITerm2的連接信息是寫死在配置文件中的,所以就考慮能不能固定ip,必然是可以的
1.查看自己的配置文件名:
$ cd /etc/sysconfig/network-scripts $ ls //展示文件夾下所有文件名
然后選擇第一個,名字會不一樣,選第一個打開編輯
2.修改配置文件
vim ifcfg-enp0s3
3.修改配置文件信息
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" //改為static靜態 dync是動態 NM_CONTROLLED="no" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="enp0s3" UUID="73df0aff-e60c-4907-ba9c-9faf3a444a17" DEVICE="enp0s3" ONBOOT="yes" IPADDR=192.168.3.24 //固定ip地址 NETMASK=255.255.255.0 //子網掩碼 GATEWAY=192.168.0.1 //網關
然后 按esc 再輸入:wq保存編輯
4.重啟網絡服務
service network restart
檢查一下,就完成了
還有一個問題是用戶的,因為root賬號存在安全隱患所以一般都是禁用的,所以創建自己的用戶並禁用root
sudoers這個文件好像一個令牌,只要普通用戶在必要操作時,前面加上sudo 就相當於使用了root賬號的權限,前提是需要在sudoers上登記留下大名
1.首先查看sudoers文件的路徑
# whereis /etc/sudoers
2.查看文件的讀寫權限
# ls -l /etc/sudoers
一般是只有讀的權限rr
3.授權
# chmod -v u+w /etc/sudoers
這樣就變成了讀寫權限
4.編輯文件
# vim /etc/sudoers
找到“root ALL=(ALL) ALL ”這一行,在他下面加上“username ALL=(ALL) ALL”,這樣就算留下大名了
5.回收權限
# chmod -v u-w /etc/sudoers
這下就可以在命令行前加上sudo和使用root是一樣的效果
中途還有一點小插曲,因為是第一次用Linux,在我第一次鍵入密碼時,發現怎么打也打不上,結果發現是不顯示的。。記錄一下,我還頭疼了好一會。。
還有
$ su root
# su username
這是切換用戶操作,$代表當前用戶是普通用戶,切換到root需要鍵入密碼
#代表當前用戶是root用戶,切換到普通用戶不需要鍵入密碼,就是這么霸道
安裝 Docker
昨天晚上把docker在虛擬機上安裝了一下,今早趁熱打鐵來寫一下博客
docker的安裝並不難,cenOS以及就集成了yum,首先看一下用指令看一下工具是否齊全
rpm -qa|grep yum
rpm -qa|grep lvm2
docker首先需要yum-utils來提供yum-config-manager 然后 device mapper 存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
如果工具不齊全,則下載即可
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
然后添加源倉庫,可以選擇官方的或阿里的都可以,我一不小心添加了兩個,然后下載的時候阿里的死活下載不下來,網上查詢也查不到。
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
添加完后可能需要建立一下元數據緩存
$ sudo yum makecache
$ sudo yum install docker-ce
啟動docker,然后使用docker version查看版本,安裝完畢
$ systemctl start docker
$ docker version
最后說一說安裝過程中遇到的問題,首先因為我是第一次使用這個虛擬機,在我下載docker的時候,下載報錯,提示尚未安裝GPG密鑰
$ sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
添加完密鑰后再安裝阿里雲的死活拉不下來,也沒去找為什么拉不下來,因為我添加了兩個源倉庫,所以直接打算刪掉阿里的
yum repolist查看所有的源,發現有阿里的
yum repolist
至於怎么刪除,百度了一下怎么刪除源,也沒有找到,都說用yum remove <包名> 我這個也不是包,壓根沒下載下來
一開始我用yum-config-manager展示所有的倉庫,里面有一條屬性base_persistdir = /var/lib/yum/repos/x86_64/7這是存儲地址
找到阿里雲的倉庫,把對應的存儲地址刪掉,沒用,也對,這應該是下載下來之后的保存地址,我還沒下載下來。
后來我靈機一動,這玩意估計是寫在配置文件里的,只要找到配置文件應該就可以改了。
$ cd /etc
$ ls
下面有
yum yum.conf yum.repos.d
yum.conf是yum的配置文件,另外兩個是文件夾,一看yum.repos.d就很可疑,進去把阿里雲的刪掉
然后再重建元數據緩存,再下載,果然就成功了~~~·
SpringBoot項目創建Docker鏡像
創建鏡像,首先搭建鏡像
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
有時候遇到鏡像下載不下來的情況,可以采用下面這篇博客,使用阿里雲的加速器,親測有效
https://blog.csdn.net/weixin_43569697/article/details/89279225
鏡像下載完畢后我要們開啟遠程API
vi /usr/lib/systemd/system/docker.service
需要修改的部分
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后的樣子
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
讓Docker支持http上傳鏡像
echo '{ "insecure-registries":["192.168.3.101:5000"] }' > /etc/docker/daemon.json
修改配置后需要使用如下命令使配置生效
systemctl daemon-reload
重新啟動Docker服務
systemctl stop docker
systemctl start docker
開啟防火牆的Docker構建端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --reload
再在pom.xml文件中添加以下依賴
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.1.0</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imageName>mall-tiny/${project.artifactId}:${project.version}</imageName> <dockerHost>http://192.168.3.101:2375</dockerHost> <baseImage>java:8</baseImage> <entryPoint>["java", "-jar","/${project.build.finalName}.jar"] </entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
然后點擊maven中的package等跳出success就可以了,可以使用docker images查看鏡像,會發現項目已經添加到鏡像中了
SpringBoot項目在Docker容器中部署
運行項目
docker run -p 8080:8080 --name mall\ --link mysql:db \ -v /etc/localtime:/etc/localtime \ -v /mydata/app/admin/logs:/var/logs \ -d mall-tiny/mall:1.0-SNAPSHOT
可以通過
sudo docker logs f4c6bf7d7b2a8079ff85147a63d1efb4214d2f6c33acb05db3c107ceae592bf5
命令查看日志,f4c6bf7d7b2a8079ff85147a63d1efb4214d2f6c33acb05db3c107ceae592bf5是run之后返回id
這里,我多次打包后,images中出現了<none>鏡像,網上查了一下說是不占用存儲空間,但是基於我的強迫症,一定想要給他弄掉,所以記錄幾個docker常用的命令
因為刪除鏡像需要先把鏡像的運行容器關閉並刪除,列出運行中的容器,后面加上 -a 代表列出所有容器,包括結束的
# docker container ls
然后關閉容器
# docker container stop <name>
移除容器/鏡像
# docker rm <容器名>
# docker rmi <鏡像名>
完成
mybatisGenerator自動生成代碼,集成Mybatis
首相在pom.xml文件中Mybatis的依賴關聯,springboot集成了Mybatis,直接引入即可
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency>
接下來關聯mybatisGenerator,需要關聯連接驅動,創建生成的文件信息
在pom.xml中添加
<!-- mysql連接驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency>
以及
<plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <executions> <execution> <id>Generate MyBatis Artifacts</id> <goals> <goal>generate</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.2</version> </dependency> </dependencies> </plugin>
然后在application.properties同級目錄下創建generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 數據庫驅動:選擇你的本地硬盤上面的數據庫驅動包--> <!-- <classPathEntry location="C:\Users\Administrator\Downloads\mysql-connector-java-8.0.13.jar"/>--> <classPathEntry location="/Users/jinsheng/maven/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar"/> <context id="DB2Tables" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressDate" value="true"/> <!-- 是否去除自動生成的注釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> </commentGenerator> <!--數據庫鏈接URL,用戶名、密碼 1.一般jdbc數據庫的版本6.x以上,都是com.mysql.cj.jdbc.Driver 其他的低版本就是com.mysql.cj.jdbc.Driver --> <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mall?serverTimezone=GMT" userId="root" password="js818157"> </jdbcConnection> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置--> <javaModelGenerator targetPackage="com.modal" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成映射文件的包名和位置--> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 生成DAO的包名和位置--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.dao" targetProject="src/main/java"> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 要生成的表 tableName是數據庫中的表名或視圖名 domainObjectName是實體類名--> <table tableName="tbluser" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> </context> </generatorConfiguration>
這個文件有幾處地方需要根據需要修改
在application.properties中添加
spring.datasource.url=jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=xxxxxx spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml
等配置信息
這里記錄一下幾個比較坑的地方,首先的包的版本沖突,我使用的mybatis是8.0版本,mysql-connection-java.jar的版本如果太低就會報錯
還有驅動名稱:
低版本的驅動名稱是:com.mysql.jdbc.Driver
高版本的驅動名稱是:com.mysql.cj.jdbc.Driver
不過這個你在application.properties中配置了‘spring.datasource.driver-class-name’,springboot會友好的提示你
第二個,@Mapper和@MapperScan注解,@MapperScan放在Springboot的啟動類上告訴springboot到哪里找mapper接口,如果配了這個就不需要再配置@Mapper了
然后掃描不要為了偷懶只寫一個('com'),我就偷懶結果掃描了所有com下的類,注入出現了同名沖突
第三個,掃描mapper.xml不到,出現報錯Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required,這需要在application.properties中加上
mybatis.mapper-locations=classpath:mapper/*.xml,告訴springboot需要到哪里去找xml文件,