一、环境准备
本项目为springboot2.0+spring-data-elasticsearch+elasticsearch集成项目,开发环境为java,开发工具为Idea,项目构建工具maven。
1.1maven下载安装
maven下载地址 http://maven.apache.org/download.cgi
选择 Binary zip archive 对应的link进行下载。
下载完成后在本机解压缩即可,如下图解压缩到D盘
设置maven 的settings.xml,修改本地仓库目录的位置。
设置环境变量
JAVA_HOME环境变量,设置成jdk安装的目录。
设置CLASSPATH为 %JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;
编辑环境变量path,添加java和maven的bin目录
在其最前面添加 .;%JAVA_HOME%\bin;%M2_HOME%\bin;
检验环境变量是否设置完成
开启cmd命令窗口
输入图中1、2命令后能看到对应的版本信息代表设置成功。
1.2idea下载安装
下载地址 https://www.jetbrains.com/idea/download/#section=windows
点上述连接下载
下载后解压缩即可试用。
进入idea,将激活码复制到上图2所示的文本框内激活。
依次点菜单File > New > Project创建一个新的空项目。
点设置进入设置菜单
安装必要的插件,maven helper
1.3rose-data项目导入
将rose-data.zip复制到idea项目目录下,解压缩。
重启下idea即可。
二、项目运行测试
先修改项目所连接的elasticsearch的群集和服务器地址
打开开发环境配置档rose-web/src/main/resources/application-dev.properties
修改elasticsearch的群集名称为你要连接的群集,以及群集节点IP和端口(多个用逗号隔开)
spring.data.elasticsearch.cluster-name=test-cluster
spring.data.elasticsearch.cluster-nodes=192.168.0.189:9300
清理maven,选择clean或者clean package,没有对应的命令则点New Goal… 新建对应命令。
新建goal,先输入 clean package,然后点下上图中2所示按钮,再补齐打包的环境,如dev,最后点OK按钮保存并执行。
goal建立好后,可以直接在Run Maven的子菜单中选择对应的命令运行。
打包完成后,就可以运行程序了,找到本项目的springboot执行程序RoseApplication。
入口程序位置 rose-web/src/main/java/com/rose/RoseApplication,双击打开这个程序源代码,其main函数就是入口程序。
Idea自带了springboot插件,右上角会自动加载有springboot注解 @SpringBootApplication 的程序到执行序列中,直接点2点所示的执行或debug按钮即可运行程序。
然后再浏览器中输入 http://localhost:9093
看到此错误页面代表系统运行成功,错误页面时因为系统并未设置首页的缘故。
开发环境可以直接输入 http://localhost:9093/swagger-ui.html 查看API接口。
点开查询接口,测试下查询。
三、项目结构讲解
3.1本项目采用Maven构建,项目名称rose-data,根目录同项目名称,每个Maven项目根目录都有pom.xml文件。
3.2子模组项目rose-common,存放的是通用API代码,含4个子包common, domain, service, util。
common包封装了一些通用的组件,如API的返回结果Result,分页Page,核心抽象类,常用参量等。
domain包下为es数据库上对应的索引文档对应的POJO类。
Position类对应索引pst下的position文档类型(相当于表)
PositionDTO为DTO类,跟Position类似,只是没有ID属性,其目的是用来保证写入时没有id值,而使用es自带的GUID,保证高并发。
service包为服务层API包,存放操作es文档库的对应服务接口。其实现类在rose-web项目里。
util包存放的是一些工具类,如字符串工具类,日期转换工具类,集合工具类,反射工具类,JSON工具类等。
3.3 rose-web子模组项目包含了项目提供API的具体运行程序及具体实现程序,包含看DAO层、服务层实现类、控制层等MVC各核心层的代码。服务层实现类为最核心的业务代码。
Springboot启动入口类,凡是有@SpringBootApplication注解且有main函数调用SpringApplication.run的类都是Springboot的启动入口类。
Springboot配置类,配置springboot启动时初始化或加载的组件。如下为webmvc配置类,加载了swagger-ui组件。
控制层的类PositionController,对es索引进行相关的增删改查web响应。
服务层实现类,实现对es索引库上数据进行增删改查操作的核心业务层。
DAO层接口类,主要继承spring-data-elasticsearch组件的接口实现。可采用其内部实现的关键字模式进行操作ES,类似JPA。
四、项目代码讲解
项目核心业务代码为Position、PositionController、PositionService、PositionServiceImpl。
4.1 Position为es索引库pst的position文档对应的javabean类;
Javabean的属性对应索引库中要存储的字段名称。属性上面的注解@NotBlank为检查字段内容为空时的提示信息。
4.2 PostionController类为WEB响应控制器类,即API的入口程序,其带有@GetMapping、@PostMapping、@DeleteMapping注解的公共方法都是API的响应入口,代表提供特定功能的API响应程序。
如insertBatch方法为批量写入的API,对应web请求路径为/rose/position/insert-batch,系PostionController类上面@RequestMapping注解的值拼接上insertBatch方法的@PostMapping注解上的value值。其它API的web请求路径依此类推。
4.3 PositionService类为业务服务核心类,它是一个Interface,实现类为PositionServiceImpl。
4.4 PositionServiceImpl类为业务服务核心类的实现类,业务核心代码都在这个类里面。
如下bulkIndex方法即为批量新增位置信息的具体业务实现代码。调用底层的spring-data-elasticsearch类实现对es索引库上对应文档的批量新增,每次批量写入的记录数即在此控制,maxBulkSize就是每次最多写入的记录数。
批量更新方法bulkUpdate类似批量写入,如有其它类似业务照着代码改即可。
查询方法的代码相对其它方法较复杂,但也很简单,代码流程就是先构造查询所有数据的查询执行序,再用filter传入对应条件过滤数据即可,最后在加上排序。值得注意的是:固定值条件用TermQueryBuilder做过滤;范围值条件用RangeQueryBuilder做过滤条件。它跟es本身提供的restful API是一一对应的。Es文档可参考https://es.xiaoleilu.com/054_Query_DSL/75_Queries_with_filters.html
五、项目打包部署
在项目上点右键,选择右键菜单的Run Maven对应的子菜单打包,如下打包生产环境。
复制打好的jar包到服务器上。
写个shell脚本方便运行项目。
vi /etc/init.d/rose
#! /bin/sh -x
# chkconfig: 345 99 10
# description: app auto start-stop script.
echo ""
echo ""
JAVA_HOME=/home/data/jdk1.8.0
APP_HOME=/home/data/app-home
export JAVA_HOME APP_HOME
case $1 in
'start')
#cd $APP_HOME
nohup $JAVA_HOME/bin/java -Xms1024m -Xmx1024m -Xmn1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:NewRatio=1 -Dfile.encoding=UTF-8 -jar $APP_HOME/rose-data.jar &
;;
'stop')
kill -9 `ps aux | grep 'rose-data' | awk '{ print $2 }' ` > /dev/null
;;
*)
echo "usage: $0 {start|stop}"
exit
;;
esac
#
exit
给/etc/init.d/rose授权
chmod 777 /etc/init.d/rose
运行程序
service rose start
ps查看进程
ps -axu|grep rose
停止程序
service rose stop
附1:springboot启动时读取外部设定档
在启动命令最后面加上 --spring.config.additional-location= 指定附加的外部设定档目录即可。如下配置,代表将优先读取当前目录下的config/2/目录中的properites文件。
--spring.config.additional-location=file:./config/2/
./代表相对jar包的目录
如果是绝对目录则用如下指定方式
--spring.config.additional-location=file:d:/app-home/config/2/
file:后面的内容为配置档所在路径,根据个性喜好设置即可。
以rose-data项目为例,/etc/init.d/rose启动脚本的nohup行加上附件配置档路径(蓝色部分)即可。
nohup $JAVA_HOME/bin/java -Xms1024m -Xmx1024m -Xmn1024m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -XX:NewRatio=1 -Dfile.encoding=UTF-8 -jar $APP_HOME/rose-data.jar --spring.config.additional-location=file:/home/data/app-home/config/2/ &
附2:附加配置最佳实践及设置context-path
附加配置中的设置优先与jar包中已存在的默认配置,因此附加配置的最佳实践就是配置不同于默认设置的项目即可。
如果我想让端口为8002,context-path为/2,则application.properties配置内容如下:
server.port=8002
server.servlet.context-path=/2
如果我想更改es连接的测试数据库,则application-prd.properties配置内容如下:
spring.data.elasticsearch.cluster-name=es-test
spring.data.elasticsearch.cluster-nodes=192.168.1.227:9300
更改后重启rose应用,api的访问路径应该为 http://localhost:8888/2/swagger-ui.html
附3:用nginx代理API的各个端口服务,避免开放太多端口给外部应用程序
在nginx的配置档/usr/local/nginx/conf/nginx.conf 的 server{…} 内加入下述配置。
location /1/ {
proxy_pass http://localhost:8002;
}
重启nginx
/usr/local/nginx/sbin/nginx -s reload
然后就可以用80端口访问api了,http://localhost/2/swagger-ui.html