文章目录
一、Jenkins+Docker+SpringCloud 持续集成流程说明
大致流程说明:
- 开发人员每天把代码提交到 Gitlab 代码仓库。
- Jenkins 从 Gitlab 中拉取项目源码,编译并打成 jar 包,然后构建成 Docker 镜像,将镜像上传到 Harbor 私有仓库。
- Jenkins 发送 SSH 远程命令,让生产部署服务器到 Harbor 私有仓库拉取镜像到本地,然后创建容器。
- 最后,用户可以访问到容器。
二、服务器列表
服务器名称 | IP 地址 | 安装的软件 |
---|---|---|
代码托管服务器 | 192.168.10.20 | Gitlab |
持续集成服务器 | 192.168.10.30 | Jenkins,Maven,Git,JDK,Sonarqube,Docker20.10.12-ce |
Docker 仓库服务器 | 192.168.10.40 | JDK,Tomcat,Docker20.10.12-ce,Harbor1.9.2 |
生产部署服务器 | 192.168.10.50 | Docker20.10.12-ce |
黄色为需要安装的软件
三、SpringCloud 微服务源码概述
- 项目架构:前后端分离
- 后端技术栈:SpringBoot + SpringCloud + SpringDataJpa(Spring 全家桶)
- 微服务项目结构:
tensquare_parent:父工程,存放基础配置
tensquare_common:通用工程,存放工具类
tensquare_eureka_server:SpringCloud 的 Eureka 注册中心
tensquare_zuul:SpringCloud 的网关服务
tensquare_admin_service:基础权限认证中心,负责用户认证(使用 JWT 认证)
tensquare_gathering:一个简单的业务模块,活动微服务相关逻辑
- 数据库结构:
tensquare_user:用户认证数据库,存放用户账户数据。对应 tensquare_admin_service 微服务。
tensquare_gathering:活动微服务数据库。对应 tensquare_gathering 微服务。
- 微服务配置分析:
tensquare_eureka
tensquare_zuul
tensquare_admin_service
tensquare_gathering
四、SpringCloud 微服务部署(后端)
4.1 微服务项目导入 IDEA
本地运行微服务,使用 IDEA 打开项目。
(1) 自动下载相关依赖组件
微服务项目包解压,目录在 idea 中打开,idea 会自动下载相关组件插件(等待时间较长)。
时间很长,耐心等待。
安装完成。
依赖组件真正下载完成不应该有任何红色波浪线。因为引导模板文件和相应服务器在美国,可能下载失败,下载失败点击循环重新下载组件。有 VPN 推荐使用日本节点下载。
(2) 检查 JDK 版本
解决 SpringBoot 启动类报错 can not resolve method 'run(java.lang.class,String [])' 问题
Project 和所有模块都要换成自己的 JDK。
更换 JDK 版本后红色波浪线应该消失。
4.2 本地数据库导入
(1) Windows 安装 MySQL5.7.17
(2) 添加 mysql 环境变量
命令行登录
(3) 创建库并导入表
- tensquare_user.sql
/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.7.4-m14 : Database - tensquare_user
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tensquare_user` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `tensquare_user`;
/*Table structure for table `tb_admin` */
DROP TABLE IF EXISTS `tb_admin`;
CREATE TABLE `tb_admin` (
`id` varchar(20) NOT NULL COMMENT 'ID',
`loginname` varchar(100) DEFAULT NULL COMMENT '登陆名称',
`password` varchar(100) DEFAULT NULL COMMENT '密码',
`state` varchar(1) DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员';
/*Data for the table `tb_admin` */
insert into `tb_admin`(`id`,`loginname`,`password`,`state`) values ('1194281533230419968','admin','$2a$10$PhnLmwA7QarH8M/Wc52Mfekoyqw74Vp619M2p2dnxq0Ltz6xXTWJu','1');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
- tensquare_gathering.sql
/*
SQLyog 企业版 - MySQL GUI v8.14
MySQL - 5.7.4-m14 : Database - tensquare_gathering
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`tensquare_gathering` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `tensquare_gathering`;
/*Table structure for table `tb_city` */
DROP TABLE IF EXISTS `tb_city`;
CREATE TABLE `tb_city` (
`id` varchar(20) NOT NULL COMMENT 'ID',
`name` varchar(20) DEFAULT NULL COMMENT '城市名称',
`ishot` varchar(1) DEFAULT NULL COMMENT '是否热门',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='城市';
/*Data for the table `tb_city` */
insert into `tb_city`(`id`,`name`,`ishot`) values ('1','北京','1'),('2','上海','1'),('3','广州','1'),('4','深圳','1'),('5','天津','0'),('6','重庆','0'),('7','西安','0');
/*Table structure for table `tb_gathering` */
DROP TABLE IF EXISTS `tb_gathering`;
CREATE TABLE `tb_gathering` (
`id` varchar(20) NOT NULL COMMENT '编号',
`name` varchar(100) DEFAULT NULL COMMENT '活动名称',
`summary` text COMMENT '大会简介',
`detail` text COMMENT '详细说明',
`sponsor` varchar(100) DEFAULT NULL COMMENT '主办方',
`image` varchar(100) DEFAULT NULL COMMENT '活动图片',
`starttime` date DEFAULT NULL COMMENT '开始时间',
`endtime` date DEFAULT NULL COMMENT '截止时间',
`address` varchar(100) DEFAULT NULL COMMENT '举办地点',
`enrolltime` datetime DEFAULT NULL COMMENT '报名截止',
`state` varchar(1) DEFAULT NULL COMMENT '是否可见',
`city` varchar(20) DEFAULT NULL COMMENT '城市',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='活动';
/*Data for the table `tb_gathering` */
insert into `tb_gathering`(`id`,`name`,`summary`,`detail`,`sponsor`,`image`,`starttime`,`endtime`,`address`,`enrolltime`,`state`,`city`) values ('1','测试活动6666','喝茶看电影,不亦乐乎','喝茶看电影,不亦乐乎','程序员',NULL,'2019-11-01','2019-11-01','广州市程序员',NULL,'1','6'),('94377594140','aaaa',NULL,NULL,NULL,NULL,'2019-11-01','2019-11-01',NULL,NULL,'1','1'),('943776146707845','aaaa',NULL,NULL,'ssss',NULL,'2019-11-01','2019-11-01','cccc',NULL,'1','1'),('943776663576121344','aaaa',NULL,NULL,NULL,NULL,'2019-11-01','2019-11-01',NULL,NULL,'1','2'),('943783521749700608','2342423',NULL,NULL,'23454534',NULL,'2019-11-01','2019-11-01','545435435',NULL,'1','2'),('944085821768732672','JAVAEE茶话会',NULL,NULL,'kgc',NULL,'2019-11-01','2019-11-01','金燕龙',NULL,'1','2'),('944086086991351808','是',NULL,NULL,'11',NULL,'2019-11-01','2019-11-01','11',NULL,'1','3'),('944090372710207488','大讨论',NULL,NULL,'小马',NULL,'2019-11-01','2019-11-01','消息',NULL,'1','3'),('944105652622594048','测试测试',NULL,NULL,'测试者',NULL,'2019-11-01','2019-11-01','测试地址',NULL,'1','4'),('945227340642914304','111',NULL,NULL,'222',NULL,'2019-11-01','2019-11-01','333',NULL,'1','5'),('945227678527655936','111',NULL,NULL,'222',NULL,'2019-11-01','2019-11-01','333',NULL,'1','5'),('945235087564345344','啊啊',NULL,NULL,'1',NULL,'2019-11-01','2019-11-01','1',NULL,'1','1'),('945235534329024512','1',NULL,NULL,'1',NULL,'2019-11-01','2019-11-01','1',NULL,'1','2'),('945235859786043392','1',NULL,NULL,'1',NULL,'2019-11-01','2019-11-01','1',NULL,'1','3');
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
创建库
mysql> create database tensquare_user;
Query OK, 1 row affected (0.00 sec)
mysql> create database tensquare_gathering;
Query OK, 1 row affected (0.00 sec)
导入表
mysql> use tensquare_user;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> source C:/Users/15205/Desktop/devops 软件包/mysql-5.7.17-windows/tensquare_user.sql;
......
mysql> show tables;
+--------------------------+
| Tables_in_tensquare_user |
+--------------------------+
| tb_admin |
+--------------------------+
1 row in set (0.00 sec)
mysql> use tensquare_gathering;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> source C:/Users/15205/Desktop/devops 软件包/mysql-5.7.17-windows/tensquare_gathering.sql;
......
mysql> show tables;
+-------------------------------+
| Tables_in_tensquare_gathering |
+-------------------------------+
| tb_city |
| tb_gathering |
+-------------------------------+
2 rows in set (0.00 sec)
4.3 启动微服务组件
我们以单机版本启动微服务,修改各个组件的配置文件。
(1) 启动 eureka 服务
Eureka Server 提供服务注册服务,各个节点启动后,会在 Eureka Server 中进行注册,这样 EurekaServer 中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
https://baike.baidu.com/item/Eureka/22402835?fr=aladdin
修改配置文件 application.yml,从集群版修改为单机版
# 单机版
server:
port: 10086
#基本服务器信息
spring:
application:
name: eureka-server #服务ID
#enreka服务器配置
eureka:
client:
fetch-registry: false #单机版关闭enreka相互注册
register-with-eureka: false
service-url:
defaultZone: http://localhost:${server.port}/eureka #暴露eureka服务访问地址
server:
enable-self-preservation: false #关闭自我保护
启动 eureka 服务
访问 eureka 服务
http://localhost:10086
(2) 启动 zuul 服务
zuul 是微服务的网关。
https://www.jianshu.com/p/24a3b67bbab9
https://blog.csdn.net/sinat_32366329/article/details/92023666
修改 application.yml
启动 zuul
查看 zuul 是否在 eureka 上注册成功
(3) 启动权限中心
修改配置文件
启动权限中心
查看是否注册到 eureka
(4) 启动业务模块
修改配置文件
启动业务模块
查看是否注册
4.4 Postman 工具安装与使用
Postman 工具模拟了一个前端,提交请求给后端,后端返回结果,测试后端服务是否正常。
不用创建账号,跳过。
- 使用 post 请求。post 请求和 get 请求的区别在于 post 是加密的,端口为 443,get 是不加密的,端口为 80。
- 请求的 url 地址:
http://localhost:10020/admin/admin/login
在数据库中 123456
是加密字符串表示。
send 发送请求查看结果
微服务连接后端数据库是成功的。我们可以通过获取的令牌得到更多的信息。这些信息也是来自于数据库。
复制 token
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTk0MjgxNTMzMjMwNDE5OTY4Iiwic3ViIjoiYWRtaW4iLCJpYXQiOjE2NDU0MjE1ODQsInJvbGVzIjoiYWRtaW4iLCJleHAiOjE2NDU0MjMzODR9.zy9y8q2aXAiZTeBHVBpcFQDLNkQEPi-mM4QoL9vfq4U
- 获取数据库信息,使用 get 请求
- 请求 url:
http://localhost:10020/gathering/gathering
返回的结果
4.5 Windows 本地配置 maven 环境
Maven官网:https://maven.apache.org/download.cgi
解压到你选择的目录。
添加两个环境变量
添加命令路径
验证
显示 CMD 不存在在系统变量里添加 %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
https://blog.csdn.net/m0_37852904/article/details/79441827
4.6 spring 相关依赖下载失败解决方法
由于服务器和模板文件在美国,国内下载很可能失败,下面将下载地址换成国内地址。
修改配置文件组建下载地址设置
D:\工具\apache-maven-3.8.4\conf\settings.xml
,根据自己文件位置修改。
//配置组建仓库地址,仓库为自建的
<localRepository>E:/repo</localRepository>
//配置下载源
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
自动更新
五、前端环境配置
5.1 安装前端软件 Vscode
- 安装过程默认就行了。
- 启动后会提示是否装中文包,选择安装。
- 实验前端使用的架构:
NodeJS + VueJS + ElementUI
5.2 安装 nodejs
添加环境变量
5.3 安装 python2
添加环境变量
5.4 Vscode 导入前端项目并配置访问
Vscode 终端中运行:npm run dev
会报错
npm 包管理器的服务器在美国,而且是单线程,速度太慢,我们换成国内的 cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm uninstall node-sass
cnpm install node-sass
执行 cnpm run dev
cnpm run dev
…
访问前端页面
账号密码:admin/admin
可以看到前端能拿到后端数据库中的数据,单机微服务部署完成。
六、后端模块如何打 jar 包
6.1 先在 IDEA 里面关掉所有的服务
四个都要关掉
此时 eureka 已经无法访问。
6.2 在 pom.xml 文件中配置 jdk 目录
<build>
<plugins>
<plugin>
<!--提供打包(将应用打包成可执行的jar包)-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<!-- 指定maven编译的jdk版本 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<!--jdk地址-->
<executable>C:/Program Files/Java/jdk1.8.0_152/bin/javac</executable>
</configuration>
</plugin>
</plugins>
</build>
注意 maven 版本是否识别,换成识别的版本
等待下载依赖组件。
6.3 对 eureka 进行打包并运行
执行 mvn clean package
进行打包
如果显示 mvn 不存在重启一下 IDEA,也可以打开 CMD 到指定目录打包
查看 jar 包,target 目录下
运行看是否能访问 eureka 服务
其他模块操作类似,这里不在赘述。