- 浏览: 2151411 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
大家都知道在Java里面开发一个web服务非常繁琐,首先需要各种框架,各种配置,完事之后,需要打成一个war包,最后需要一个servlet容器,Tomcat或者Jetty,Jboss,来运行发布,同样的事情,你会发现在其他的语言中,是非常简单的,比如python里面的Django或者tornado,ruby里面的rails等,随着近年来微服务越来越流行,一个简单,强大,灵活,易配置,易开发的web服务迫在眉睫,而它就是Spring Boot,统一了Java web开发的各个需要的框架,提供了大而全的功能支持。 这里就不在具体介绍了,有需要的朋友,可以看散仙写过的几篇关于它的文章http://qindongliang.iteye.com/blog/2205633。
Spring Boot为什么容易开发微服务?当然它也不仅仅限于微服务,它还可以与Dubbo集成,实现企业级服务化,因为Spring Boot内嵌了servlet容器,发布服务时,仅仅需要一个jar包,所有有关的依赖全部在这个jar包中,所以不需要你额外下载一个tomcat或者jetty来运行服务,这个jar包,拷贝到任何含有JDK的环境的机器上,都可以任意运行,除此之外,因为仅仅只有一个jar包,所以与Jekins和Docker的集成都非常方便,这种方式以后会逐渐流行,而以war包+外置容器的发布方式散仙预测以后会逐渐没落,这里就不在具体介绍这种打包方式了。
接着上面谈,由于所有的东西,都在这个jar包中,当你依赖越来越多时,这个jar包的体积,就会上升的厉害,在我们的一个应用场景中,集成了dubbo,redis,solr,hadoop,hbase,最后一个jar包体积,快接近100M了,不过,体积大到是次要的,只要服务能正常运行,可以忽略这个小缺点,之后启动,停止脚本也非常简洁:
启动脚本:
#!/bin/bash JAVA_HOME=/tool/server/jdk CLASSPATH=.:$JAVA_HOME PATH=$JAVA_HOME/bin:$PATH export JAVA_HOME CLASSPATH PATH nohup java -jar work.jar &>task.log & echo $! >pid&
停止脚本:
kill -9 `cat pid`
上面散仙谈到的spring boot能够封装所有的依赖进入一个jar包中,前提是需要提前配置好各个运行参数,然后编译打包,运行这个jar,假如在已经发布到服务器上,我想改一些参数配置,应该如何操作呢? 这时候就会发现面对一个jar,你无法干任何事,除非回到maven工程中,改里面的配置参数,然后重新打包,接着用Jenkins发布到docker里面,假如这时候,你上传到服务器的网速非常慢,几十kb/秒,偏偏你又有一个100M的jar,还不得发布到猴年马月,这里说的不夸张,是实际开发中可能遇到的一种情况。
那么如何比较好的处理这种问题呢?其实也不难,在打包的时候,分离工程,形成一个基本的目录如下:
bin/ //存放处理脚本 lib/ //存放jar包 conf/ //存放配置文件 logs/ //存放log
看到上面的这个目录,大伙是不是有种回到了Ant的年代的感觉呢,其实不然在Maven中,我们可以使用maven-assembly-plugin插件,来完成更优雅的打包
方式,仅需要项目中,改动下面两个部分即可完成:
(1)在pom文件中,添加如下插件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <!--<appendAssemblyId>true</appendAssemblyId>--> <descriptors> <!--描述文件路径--> <descriptor>src/main/assemble/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-zip</id> <!-- 绑定到package生命周期阶段上 --> <phase>package</phase> <goals> <!-- 绑定到package生命周期阶段上 --> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
(2) 在main下面新建一个assemble文件夹,并在该文件夹下新建一个package.xml文件,内容如下:
<?xml version="1.0"?> <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <!--项目标识,设置的话,生成后的zip文件会加上此后缀--> <id></id> <!--打包格式--> <formats> <format>zip</format> </formats> <!--是否包含根目录文件夹--> <includeBaseDirectory>true</includeBaseDirectory> <fileSets> <!--<fileSet>--> <!--<directory>${project.basedir}\src\main\resources</directory>--> <!--<outputDirectory>\</outputDirectory>--> <!--<includes>--> <!--<include>some/path</include>--> <!--</includes>--> <!--<excludes>--> <!--<exclude>some/path1</exclude>--> <!--</excludes>--> <!--</fileSet>--> <!--自定义文件描述集--> <fileSet> <!--自定义脚本目录打包--> <directory>${project.basedir}\src\main\bin</directory> <outputDirectory>\bin</outputDirectory> <includes> <include>*.*</include> </includes> <!--设置权限--> <fileMode>0755</fileMode> </fileSet> <!--<fileSet>--> <!--<!–外部配置文件打包–>--> <!--<directory>${project.basedir}\src\main\config</directory>--> <!--<outputDirectory>\config</outputDirectory>--> <!--<includes>--> <!--<include>*.*</include>--> <!--</includes>--> <!--<fileMode>0644</fileMode>--> <!--</fileSet>--> </fileSets> <dependencySets> <dependencySet> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> <!-- 将scope为runtime的依赖包打包到lib目录下。 --> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
当然这种启动,停止脚本,稍微复杂点,需要把所有的jar包和配置文件cp到一个JVM里面,然后执行:
启动脚本:
cs=`echo /ROOT/tmp/z_check_hbase/lib/*jar | sed 's/ /:/g'` #配置文件的目录 conf="$cdir/conf:" #追加进入cp中 cs=$cs$conf #打印 echo $cs #执行 nohup java -cp $cs com.tools.HbaseDaoImpl &>/dev/null & echo $! >pid&
停止脚本:
kill -9 `cat pid`
总结:
对比spring boot中的单一jar的打包方式,这种方式,则将jar包和配置分离,我们可以随时改配置参数,然后重新启动,这样做灵活性大大提高了,而且在远程传入服务器时,除了第一次需要传所有的依赖文件,以后,改动代码后,只需要传主jar即可,因为依赖的jar基本都不会变,而当使用单一的jar时,任何改动都需要上传整个jar。这在jar包体积比较大时,网速比较慢时,是非常耗时的,但由于分离了配置文件和jar,复杂性会稍微提高,当然这算不了什么,因为我们可以用zip或者tar.gz将它压缩成一个整体,然后可以部署到任意机器上。
在Java里面,除了Spring Boot外,另外一个比较给力的Web服务框架就是Scala的Play2了,目前最新版本是2.5,采用sbt管理依赖,引入Netty实现高性能http服务,不再维持会话状态,如果你需要会话状态,就自己采用redis或者memcache等来实现,它打包后会自动生成压缩包,压缩包里面包含了分离的lib和conf以及win和linux部署脚本,这一点与我们上面说的第二种方式,大致上是一致的,对上线发布非常友好,当然这里并没有绝对的好坏之分:
单一jar的打包方式总体来说对微服务比较友好
分离jar的打包方式总体来说对企业级大型服务比较友好
当然你也可以混搭,只要是适合自己场景的方式,就是最好,最优雅的方式。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1469### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1151如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1037我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2139高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2006将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1596在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 994Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 5938之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 945长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2051计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3347### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1069# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3251# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1089# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1431# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1027### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1332# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1324# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 697### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1460前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
浅谈Java中Mysql数据库的连接与操作.pdf
浅谈Java优势,关于java优势......
浅谈Java软件测试.pdf
浅谈Java串行端口技术协议 浅谈JAVA串行端口技术协议 1 一、串行通讯慨述 2 二、RS232通讯基础 2 三、常见的边线方式 2 四、小技巧:如何辨别TXD和RXD端口? 3 五、安装JAVA COMMUNICATIONS API 3 六、通讯前的准备...
浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数,浅谈java中的几种随机数
浅谈Java的输入输出流.pdf 浅谈Java的输入输出流.pdf
浅谈java代理机制 .txt 浅谈java代理机制 .txt
主要介绍了浅谈java调用Restful API接口的方式,具有一定借鉴价值,需要的朋友可以参考下。
浅谈JAVA技术.pdf
浅谈JAVA语言.pdf
浅谈Java的输入输出流
浅谈Java异常.docx
浅谈Java程序员的存储过程.doc 浅谈Java程序员的存储过程.doc浅谈Java程序员的存储过程.doc
浅谈java面向对象和引用,初学java的一些疑惑点
浅谈Java异常.pdf
浅谈Java软件测试
浅谈Java任务调度.pdf
java培训教程-浅谈java虚拟机.pdf
浅谈Java中的equals和==Java开发Java经验技巧共6页.pdf.zip
浅谈JAVA中多线程的实现