1 准备环境(已有可跳过)SpringBoot+MySql+MongoDB+Spark+Redis+Neo4j+Swagger框架整合Demo
Docker(推荐Linux下Docker)
Windows中的Docker
Docker Desktop
需要电脑支持并开启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
安装
Workstation 16 Pro for Windows
1.1.4 应用使用VMware Workstation搭建Ubuntu服务器
Ubuntu
镜像文件:Download Ubuntu Desktop
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 updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release# 添加GPG keycurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 安装dockersudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io# hello-worldsudo 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/newbornemkdir -p mysqlcd 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
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
配置:resources/application.properties
# mysql数据库连接spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://192.168.111.133:3306/yizhi?characterEncoding=utf-8&useSSL=falsespring.datasource.username=rootspring.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/newbornemkdir -p mongocd mongomkdir -p data backup conf# 拉取镜像docker pull mongo:4.0.3docker 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 --authdocker run -p 27017:27017 -d mongo:4.0.3 --authdocker exec -it *** /bin/bashmongouse admindb.createUser( { user: "root", pwd: "Bujidao0", roles: [ "root" ] })db.auth("root","Bujidao0")use yizhidb.createUser( { user:"root", pwd: "Bujidao0", roles: [ "dbOwner" ] } )
4.4 应用智能推荐Demo步骤三:MongoDB整合
集合
friend_recommend
依赖:pom.xml
配置:resources/application.properties
# mongodbspring.data.mongodb.host=192.168.111.133spring.data.mongodb.port=27017spring.data.mongodb.database=yizhispring.data.mongodb.username=rootspring.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。
组成
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
配置: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.Driverjdbc.url=jdbc:mysql://192.168.111.133:3306/yizhi?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=falsejdbc.username=rootjdbc.password=******
包:java/com../
spark/MLibRecommend.javaspark/SparkFriendRecommend.java(手动运行,生成相似度)
用户计分规则
高性能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/newbornemkdir -p rediscd redismkdir -p data confvim /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# 部署Redisdocker 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
@CachePut
@CacheEvict
智能推荐Demo步骤五:Redis整合
Key
自定义
依赖:pom.xml
配置:resources/application.properties
# redisspring.redis.host=192.168.111.133spring.redis.port=6379spring.redis.database= 0spring.redis.password=******spring.redis.timeout=1800000# 连接池spring.redis.lettuce.pool.max-active=20spring.redis.lettuce.pool.max-wait=-1# 最大阻塞等待时间(负数表示没限制)spring.redis.lettuce.pool.max-idle=5spring.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 neo4jmkdir -p neo4jcd neo4j mkdir -p data plugins logs conf importdocker 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下部署
Download Neo4j Desktop
7.4 应用智能推荐Demo步骤六:Neo4j整合
结点
Friend
联系
FriendRelationship
依赖:pom.xml
配置:resources/application.properties
# neo4jspring.data.neo4j.uri=bolt://192.168.111.133:7687spring.data.neo4j.username=neo4jspring.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
包:java/com../
config/Swagger2Config.java 9 实现思路流程图
10 项目地址
码云:https://gitee.com/newborne/yizhi-demo