SpringBoot+MySql+MongoDB+Spark+Redis+Neo4j+Swagger框架整合Demo【Demo已开源】
1 准备环境(已有可跳过)
-
Docker(推荐Linux下Docker)
-
Windows中的Docker
-
需要电脑支持并开启Hyper-v(注:Hpyer-v与旧版VMware不兼容)
-
-
Linux中的Docker需要:
- VMware Workstation(推荐)或Linux服务器
-
-
IntelliJ IDEA
1.1 VMware Workstation(虚拟机)
1.1.1 概括
- 一台电脑安装多个隔离的操作系统作为自己的服务器
1.1.2 简介
- VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,其更好的灵活性与先进的技术胜过了市面上其他的虚拟计算机软件。对于企业的 IT开发人员和系统管理员而言, VMware在虚拟网路,实时快照,拖曳共享文件夹,支持 PXE 等方面的特点使它成为必不可少的工具。
1.1.3 Getting Started
1.1.4 应用
使用VMware Workstation搭建Ubuntu服务器
-
Vmware安装Ubuntu
1.2 Docker
1.2.1 概括
- 一键部署和管理运行环境
1.2.2 简介
- Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
1.2.3 Getting Started
-
Install Docker Engine on Ubuntu
# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装相关依赖 sudo apt-get update sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release # 添加GPG key curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 安装docker sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # hello-world sudo docker run hello-world
1.2.4 应用
Docker常用命令
# 只要能区分,id:88****可以不写全
docker images
# 删除镜像
docker rmi 88
# 展示所有容器
docker container ls -a
# 停止容器
docker stop 88
# 删除容器
docker rm 88
# 自启动容器
docker update --restart=always 88
# 谨慎操作
# docker中 启动所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
# docker中 关闭所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
# docker中 删除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)
# docker中 删除所有的镜像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)
2 SpringBoot
2.1 概括
- Spring是Java的一个开发框架,Spring Boot是Spring的扩展,更快,更高效
2.2 简介
- 创建独立的Spring应用程序
- 直接嵌入Tomcat、Jetty或Under拖车(不需要部署WAR文件)
- 提供固执己见的“初学者”依赖关系,以简化构建配置
- 尽可能自动配置Spring和第三方库
- 提供生产准备功能,如度量、健康检查和外部化配置。
- 绝对不需要生成代码,也不需要xml配置。
2.3 Quickstart Guide
- 方式有很多,比如
- 通过在线网站,挑选喜欢的模块进行构建(比较规范,仅供参考)
- 通过IDEA,新建Maven工程,自己在pom.xml添加相关依赖(推荐)
- 通过在线网站,挑选喜欢的模块进行构建(比较规范,仅供参考)
2.4 应用
智能推荐Demo步骤一:项目构建
- 依赖:pom.xml
- 配置:resources/application.properties
- 启动类:java/com…/xxxApplication.java
- 包:java/com../
- 配置:config
- 控制:controller
- 实体(neo4j):entity
- 实体(mysql、mongodb):pojo
- 操作映射器(mysql):mapper
- 操作仓库(mongodb、neo4j):repository
- 逻辑:service
- 逻辑实现:service/impl
- 工具:utils
- 测试:test/java/com…/xxxApplicationTests.java
3 MySql(存储FriendInfo)
3.1 概括
- 安装非常方便的关系型数据库
3.2 简介
- MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
- MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
- MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
3.3 Getting Started
-
使用Docker部署Mysql容器
# 建立目录 cd /home/newborne mkdir -p mysql cd mysql mkdir -p conf logs data # 拉取镜像 sudo docker pull mysql:5.7 # 创建容器 sudo docker run -p 3306:3306 \ -v /home/newborne/mysql/conf:/etc/mysql \ -v /home/newborne/mysql/logs:/var/log/mysql \ -v /home/newborne/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=****** \ -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
3.4 应用
智能推荐Demo步骤二:MySql整合
-
表
-
friend_info
/* Navicat Premium Data Transfer Source Server : 192.168.111.133_3306 Source Server Type : MySQL Source Server Version : 50735 Source Host : 192.168.111.133:3306 Source Schema : yizhi Target Server Type : MySQL Target Server Version : 50735 File Encoding : 65001 Date: 22/07/2021 18:53:26 */ SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for friend_info -- ---------------------------- DROP TABLE IF EXISTS `friend_info`; CREATE TABLE `friend_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `mobile` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '电话', `name` varchar(50) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '姓名', `age` int(11) NULL DEFAULT NULL COMMENT '年龄', `remark` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of friend_info -- ---------------------------- INSERT INTO `friend_info` VALUES (1, '17345660628', '邹知', 26, '河南省信阳市罗山县止知始路归翳形社区72号'); INSERT INTO `friend_info` VALUES (2, '14589533442', '萧于', 25, '河南省三门峡市卢氏县意明有路设言社区79号'); INSERT INTO `friend_info` VALUES (3, '18443280035', '傅后学', 20, '河南省信阳市浉河区意德修路来消命留社区93号'); INSERT INTO `friend_info` VALUES (4, '13576126061', '萧天之', 26, '河南省信阳市光山县后欲齐路之荣园往社区43号'); INSERT INTO `friend_info` VALUES (5, '13037652760', '康修', 26, '河南省洛阳市吉利区身而后路为而问求社区76号'); INSERT INTO `friend_info` VALUES (6, '14765905634', '曹后定', 28, '河南省济源市坡头镇意先治路亦觉舟趣社区10号'); INSERT INTO `friend_info` VALUES (7, '13652802885', '叶其', 18, '河南省周口市项城市修治路与实亲社区86号'); INSERT INTO `friend_info` VALUES (8, '14978566974', '叶致者', 29, '河南省濮阳市濮阳县格诚而路请菊怀社区68号'); INSERT INTO `friend_info` VALUES (9, '17017431488', '薛矣', 23, '河南省安阳市林州市之安路以棹社区35号'); INSERT INTO `friend_info` VALUES (10, '15365926127', '田知其', 17, '河南省鹤壁市山城区知身路以尽心社区57号'); SET FOREIGN_KEY_CHECKS = 1;
-
-
依赖:pom.xml
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
-
配置:resources/application.properties
# mysql数据库连接 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.111.133:3306/yizhi?characterEncoding=utf-8&useSSL=false spring.datasource.username=root spring.datasource.password=******
-
包:java/com../
- 控制:controller/FriendInfoController.java
- 实体:pojo/FriendInfo.java
- 操作映射器:mapper/FriendInfoMapper.java
- 逻辑:service/FriendInfoService.java
- 逻辑实现:service/impl/FriendInfoServiceImpl.java
4 MongoDB(存储FriendRecommend)
4.1 概括
- 适合海量数据存储的非关系型数据库
4.2 简介
- MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
4.3 Getting Started
-
使用Docker部署MongoDB容器
# 建立目录 cd /home/newborne mkdir -p mongo cd mongo mkdir -p data backup conf # 拉取镜像 docker pull mongo:4.0.3 docker run -p 27017:27017 \ -v /home/newborne/mongo/data:/data/db \ -v /home/newborne/mongo/backup:/data/backup \ -v /home/newborne/mongo/conf:/data/configdb \ -d mongo --auth docker run -p 27017:27017 \ -d mongo:4.0.3 --auth docker exec -it *** /bin/bash mongo use admin db.createUser( { user: "root", pwd: "Bujidao0", roles: [ "root" ] }) db.auth("root","Bujidao0") use yizhi db.createUser( { user:"root", pwd: "Bujidao0", roles: [ "dbOwner" ] } )
4.4 应用
智能推荐Demo步骤三:MongoDB整合
-
集合
- friend_recommend
-
依赖:pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
-
配置:resources/application.properties
# mongodb spring.data.mongodb.host=192.168.111.133 spring.data.mongodb.port=27017 spring.data.mongodb.database=yizhi spring.data.mongodb.username=root spring.data.mongodb.password=******
-
包:java/com../
- 控制:controller/FriendRecommendController.java
- 实体:pojo/FriendRecommend.java
- 操作仓库:repository/FriendRecommendRepository
- 逻辑:service/FriendRecommendService.java
- 逻辑实现:service/impl/FriendRecommendServiceImpl.java
5 MongoDB-Spark(FriendRecommend计算)
5.1 Spark
5.1.1 概括
- 专为大规模数据处理而设计的快速通用的计算引擎
5.1.2 简介
- Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
- Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
- Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
- 尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
5.2 Spark MLlib
5.2.1 概括
- Spark 的机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模。
5.2.2 简介
-
MLlib 由一些通用的学习算法和工具组成,包括分类、回归、聚类、协同过滤、降维等,同时还包括底层的优化原语和高层的管道 API。
-
组成
名称 说明 数据类型 向量、带类别的向量、矩阵等 数学统计计算库 基本统计量、相关分析、随机数产生器、假设检验等 算法评测 AUC、准确率、召回率、F-Measure 等 机器学习算法 分类算法、回归算法、聚类算法、协同过滤等 -
ALS算法
def train( # 需要训练的数据集 ratings: RDD[Rating], rank: Int, # 模型中隐藏因子数,rank一般选在8到20之间 iterations: Int, # 算法中迭代次数,一般10次即可 lambda: Double, # ALS中的正则化参数,一般设置0.01 blocks: Int, # 并行计算的block数(-1为自动配置) alpha: Double, # ALS隐式反馈变化率用于控制每次拟合修正的幅度 seed: Long # 加载矩阵的随机数 ): MatrixFactorizationModel = { new ALS(blocks, blocks, rank, iterations, lambda , true, alpha, seed).run(ratings) }
5.2.3 应用
智能推荐Demo步骤四:Spark整合
-
依赖:pom.xml
<!-- spark相关 --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_2.12</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>org.mongodb.spark</groupId> <artifactId>mongo-spark-connector_2.12</artifactId> <version>2.4.1</version> </dependency>
-
配置:resources/app.properties
# mongodb配置 spark.mongodb.output.friend.uri = mongodb://192.168.111.133:27017/yizhi.friend_recommend?readPreference=primaryPreferred # mysql配置 jdbc.driver-class-name=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.111.133:3306/yizhi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false jdbc.username=root jdbc.password=******
-
包:java/com../
- spark/MLibRecommend.java
- spark/SparkFriendRecommend.java(手动运行,生成相似度)
-
用户计分规则
字段 权重 年龄差 0-2岁 70分 3-5 60分 5-10岁 50分 10岁以上 0分 性别 异性 10分 同性0分 位置 同城20分 不同0分
6 Redis(缓存)
6.1 概括
- 高性能key-value的非关系型数据库
6.2 简介
- Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
6.3 Getting Started
-
使用Docker建立Redis容器
# 建立目录 cd /home/newborne mkdir -p redis cd redis mkdir -p data conf vim /home/newborne/redis/conf/redis.conf # ============ # 从 https://redis.io/topics/config/ 获取redis.conf # 注释 bind 127.0.0.1 requirepass ****** appendonly yes # ============ # 拉取镜像 docker pull redis:5.0.2 # 部署Redis docker run -p 6379:6379 \ -v /home/newborne/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \ -v /home/newborne/redis/data:/data \ -d redis:5.0.2 redis-server /usr/local/etc/redis/redis.conf docker exec -it *** /bin/bash > auth ****** > set name 1 > get name
-
@Cacheable
属性/方法名 解释 value 缓存名,必填,它指定了你的缓存存放在哪块命名空间 cacheNames 与 value 差不多,二选一即可 key 可选属性,可以使用 SpEL 标签自定义缓存的key -
@CachePut
属性/方法名 解释 value 缓存名,必填,它指定了你的缓存存放在哪块命名空间 cacheNames 与 value 差不多,二选一即可 key 可选属性,可以使用 SpEL 标签自定义缓存的key -
@CacheEvict
属性/方法名 解释 value 缓存名,必填,它指定了你的缓存存放在哪块命名空间 cacheNames 与 value 差不多,二选一即可 key 可选属性,可以使用 SpEL 标签自定义缓存的key allEntries 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存 beforeInvocation 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存
6.4 应用
智能推荐Demo步骤五:Redis整合
-
Key
- 自定义
-
依赖:pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- spring2.X集成redis所需common-pool2--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency>
-
配置:resources/application.properties
# redis spring.redis.host=192.168.111.133 spring.redis.port=6379 spring.redis.database= 0 spring.redis.password=****** spring.redis.timeout=1800000 # 连接池 spring.redis.lettuce.pool.max-active=20 spring.redis.lettuce.pool.max-wait=-1 # 最大阻塞等待时间(负数表示没限制) spring.redis.lettuce.pool.max-idle=5 spring.redis.lettuce.pool.min-idle=0
-
包:java/com../
- 配置:config/RedisConfig.java
7 Neo4j(知识图谱)
7.1 概括
- 通过结点和联系建立图谱的非关系型数据库
7.2 简介
- Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
- Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
7.3 Get Started
-
使用Docker部署Neo4j容器
docker pull neo4j mkdir -p neo4j cd neo4j mkdir -p data plugins logs conf import docker run \ -p 7474:7474 -p 7687:7687 \ -v /home/newborne/neo4j/data:/data \ -v /home/newborne/neo4j/plugins:/plugins \ -v /home/newborne/neo4j/logs:/logs \ -v /home/newborne/neo4j/conf:/var/lib/neo4j/conf \ -v /home/newborne/neo4j/import:/var/lib/neo4j/import \ --name neo4j-apoc \ -e NEO4J_apoc_export_file_enabled=true \ -e NEO4J_apoc_import_file_enabled=true \ -e NEO4J_apoc_import_file_use__neo4j__config=true \ -e NEO4JLABS_PLUGINS=\[\"apoc\"\] \ --env NEO4J_AUTH=neo4j/****** \ neo4j http://192.168.111.133:7474 # 查询结点 match(x:Friend{}) return x
-
Windows下部署
7.4 应用
智能推荐Demo步骤六:Neo4j整合
-
结点
- Friend
-
联系
- FriendRelationship
-
依赖:pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency>
-
配置:resources/application.properties
# neo4j spring.data.neo4j.uri=bolt://192.168.111.133:7687 spring.data.neo4j.username=neo4j spring.data.neo4j.password=******
-
包:java/com../
- 结点:entity/node/FriendNode.java
- 关系:entity/relationship/FriendRelationship.java
- 操作仓库:repository/FriendRelationshipRepository
- 逻辑:service/FriendRelationshipService.java
- 逻辑实现:service/impl/FriendRelationshipServiceImpl.java
8 Swagger
8.1 概括
- 一个接口文档生成工具,同时提供接口测试调用的辅助功能
8.2 简介
- Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。
- Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。
- 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。
- 提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。
8.3 Getting Started
- @Api:修饰整个类,描述Controller的作用
- @ApiOperation:描述一个类的一个方法,或者说一个接口
- @ApiParam:单个参数描述
- @ApiModel:用对象来接收参数
- @ApiModelProperty:用对象接收参数时,描述对象的一个字段
- @ApiImplicitParam:一个请求参数
- @ApiImplicitParams:多个请求参数
8.4 应用
- http://newborne.top:8888/swagger-ui.html(自己的地址)
智能推荐Demo步骤七:Swagger整合
-
依赖:pom.xml
<!--swagger--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.7.0</version> </dependency> <!--swagger ui--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.7.0</version> </dependency>
-
包:java/com../
- config/Swagger2Config.java
9 实现思路流程图
10 项目地址
Demo版:https://gitee.com/newborne/yizhi-demo