springboot2.0+spring-data-elasticsearch+elasticsearch集成开发项目示例

一、环境准备
本项目为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;


设置M2_HOME环境变量为maven安装目录


编辑环境变量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创建一个新的空项目。

点设置进入设置菜单


将系统编辑器的编码设置成utf-8


将maven设置成本机安装的maven目录和设置档案。


点项目构建菜单


确定下项目的jdk版本是否为jdk1.8。

安装必要的插件,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包


或者按上述方式进入打包的目录。

复制打好的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


 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值