Fatjars,Thinwars以及为什么OpenLiberty很酷

法特哈斯

构建一个Fatjar(或Uberjar),其中包含将应用程序很好地打包在一起运行所需的一切,这意味着您可以:

java -jar myapp.jar

然后离开。 没有应用程序服务器。 没有类路径。

这种方法已经被诸如Springboot之类的微服务架构风格和框架所普及。

简而言之, 微服务架构风格是一种将单个应用程序开发为一组小型服务的方法 ,每个小型服务都在自己的进程中运行并与轻量级机制(通常是HTTP资源API)进行通信。 这些服务围绕业务功能构建,并且可以通过全自动部署机制独立部署 。”

有一堆可执行的jar文件在上面的所有方框中打勾。

Java EE

fatjar概念也已经在Java EE中使用了一段时间。 所有轻量级应用程序服务器均具有“微型”选项:

  • 苍蝇群
  • Payara Micro
  • 汤姆
  • 库穆鲁兹
  • 中波

进行胖子部署有很多优点。 但是,也有一些缺点。

  • 您可以在开发时做出选择(实际上这是部署时的选择)。 我喜欢将开发模型与部署模型分开。
  • 这给您带来了次优的开发周期。 您需要构建一个胖子,然后停止以前的版本(最有可能是将其杀死),然后重新开始。 一段时间后,从“代码更改”到“代码运行”的转变变得令人讨厌。 向运行中的应用程序服务器部署瘦战的好处之一是快速的周转时间。
  • 没有类路径实际上是一个利弊。 即使fatjars的广告优势之一是没有应用程序服务器,但实际上您仍然有一个应用程序服务器,它只是嵌入式的。 只有一个jar文件,意味着您的应用程序和嵌入式应用程序服务器具有相同的依赖关系。 您的应用程序使用的依赖项版本不同于嵌入式服务器时,可能会遇到问题。 这可能会导致一些不错的隐藏错误。 能够将应用程序服务器类路径与应用程序隔离实际上是一件好事。 Java 9可以解决此问题,但是大多数应用程序服务器仍在Java 8上运行。

码头工人

Docker将微服务方法带入了更深的层次,并允许您隔离操作系统级别。 这意味着,构建单独的jar文件变得不那么相关,因为您将构建单独的Docker映像。

实际上,构建一个胖罐来部署为Docker映像比瘦战要慢和重。 通常,您可以对Docker映像进行分层:

(上图:fatjar选项中的最后一层比Thinwar选项重得多,因为它包含嵌入式应用程序服务器)

OpenLiberty很酷!

传统的Websphere庞大,缓慢,昂贵且难以安装。 不是用来构建微服务的东西。 IBM是Websphere Liberty轻量级应用程序服务器解决方案的较晚入门,该解决方案的核心最近在OpenLiberty下开源 。

但是迟到可能是他们正确地做某些事情并且非常干净的原因。 您只能通过功能加载所需零件的方式,以及如何使用自己的功能扩展服务器的方式都很棒。 即使其他应用程序服务器也使用OSGi(或JBoss模块)进行了某种模块化,但使用Liberty则更加容易。 对于Liberty而言,包括Microprofile只是另一个功能。 其他应用程序服务器已将MicroProfile添加到其fatjar(“ Micro”)发行版中,即使我相信也可以将其添加到完整的应用程序服务器版本中,但这并不容易。

另一个很酷的事情是,如何仅在部署时就可以非常轻松地确定部署模型。 因此,您可以拥有世界上最好的。 您可以使用Thinwar模型针对完整的应用程序服务器进行开发,以快速解决问题。 构建时,您可以组装一个胖子,thinwar,泊坞窗映像或所有映像。 您所开发的内容保持不变。

具有MicroProfile的OpenLiberty示例

我创建了一个简单的应用程序来演示这些部署选项。 (代码在GitHub中可用 )

我不想建立一个基本的“ Hello world”,因为我想包含一些MicroProfile功能,因此这是一个“每日报价”应用程序。 它使用工厂加载报价提供程序(目前只有一个)。 当前提供者从forismatic.com获取并缓存报价。 我使用MicroProfile Configuration API来配置诸如HTTP代理,URL和要加载的提供程序之类的东西。 我使用MicroProfile Fault Tolerance API来确保在提供程序源不可用时我们能够生存。

配置OpenLiberty

OpenLiberty上的配置也很干净。 这样可以轻松地将配置包括在项目中。 使用Maven资源过滤,还可以将某些变量提取到构建中。 在server.xml的重要部分下面(您可以在github中看到完整的部分)

src / main / liberty / config / server.xml

<?xml version="1.0" encoding="UTF-8"?>
<server description="${project.build.finalName}"><featureManager><feature>javaee-7.0</feature><feature>microProfile-1.2</feature></featureManager><httpEndpoint id="defaultHttpEndpoint"httpPort="${httpPort}"httpsPort="${httpsPort}"/><application location="${project.build.directory}/${project.build.finalName}.war"/><logging traceSpecification="${log.name}.*=${log.level}"/></server>

现在,我们仅包括Java EE和Microprofile的保护伞功能。 稍后,我们可以进行微调以减少内存占用。

${httpPort}${httpsPort}实际上将来自我们使用liberty maven插件创建的bootstrap.properties 。

当我们在pom.xml中使用此资源过滤进行构建时,将替换server.xml中的所有变量,包括${project.build.directory}${project.build.finalName}

<build><finalName>${project.artifactId}</finalName><resources><resource><directory>${basedir}/src/main/liberty/config</directory><targetPath>${project.build.directory}</targetPath><filtering>true</filtering><includes><include>server.xml</include></includes></resource></resources>
</build>

(您可以在github中看到完整的pom.xml

因此,当我们执行mvn clean install ,会将server.xml复制到目标目录,并替换变量。

部署选项

我使用maven配置文件允许我在构建时选择所需的部署选项:

在pom.xml的<build>

<plugins><plugin><groupId>net.wasdev.wlp.maven.plugins</groupId><artifactId>liberty-maven-plugin</artifactId><version>${openliberty.maven.version}</version><configuration><assemblyArtifact><groupId>io.openliberty</groupId><artifactId>openliberty-runtime</artifactId><version>${openliberty.version}</version><type>zip</type></assemblyArtifact></configuration></plugin>
</plugins>

即时选项

此选项与fatjar周期遵循相同的开发周期(尽管它不会创建jar文件)。 如果执行mvn clean install -Pfatjar ,它将安装,配置(来自server.xml )并在前台启动服务器。 换句话说,由于服务器启动是mvn进程的一部分,因此mvn进程不会完成。 要停止服务器,您需要按ctrl-c进程。

<profile><id>fatjar</id><activation><property><name>fatjar</name></property></activation><build><plugins><plugin><groupId>net.wasdev.wlp.maven.plugins</groupId><artifactId>liberty-maven-plugin</artifactId><executions><execution><phase>install</phase><goals><goal>install-server</goal><goal>create-server</goal><goal>run-server</goal>    </goals><configuration><configFile>${project.build.directory}/server.xml</configFile><bootstrapProperties><httpPort>${openliberty.http.port}</httpPort><httpsPort>${openliberty.https.port}</httpsPort></bootstrapProperties><jvmOptions><param>-Xmx${openliberty.Xmx}</param></jvmOptions></configuration></execution></executions></plugin></plugins></build></profile>

当然,使用NetBeans之类的IDE(或任何其他IDE),实际上这只是您单击的按钮:

完整的应用程序服务器选项:

使用此选项,我们要安装,配置和启动服务器,然后在编写代码时连续进行一次精打细算。 每次启动服务器时,我们仍然从头开始安装和配置服务器,但并非每次部署时都如此。

mvn clean install -Pstart-liberty将在/tmp文件夹中安装,配置(从server.xml )并启动一个自由服务器:

<profile><id>start-liberty</id><activation><property><name>start-liberty</name></property></activation><build><plugins><plugin><groupId>net.wasdev.wlp.maven.plugins</groupId><artifactId>liberty-maven-plugin</artifactId><executions><execution><id>1</id><phase>pre-integration-test</phase><goals><goal>install-server</goal></goals><configuration><assemblyInstallDirectory>${openliberty.installDir}</assemblyInstallDirectory></configuration></execution><execution><id>2</id><phase>pre-integration-test</phase><goals><goal>create-server</goal><goal>start-server</goal></goals><configuration><installDirectory>${openliberty.installDir}/wlp</installDirectory><serverName>${project.artifactId}</serverName><configFile>${project.build.directory}/server.xml</configFile><bootstrapProperties><httpPort>${openliberty.http.port}</httpPort><httpsPort>${openliberty.https.port}</httpsPort></bootstrapProperties> <jvmOptions><param>-Xmx${openliberty.Xmx}</param></jvmOptions></configuration></execution></executions></plugin></plugins></build></profile>

现在,您可以连续部署Thinwar了:

mvn clean install -Pdeploy

<profile><id>deploy</id><activation><property><name>deploy</name></property></activation><build><plugins><plugin><groupId>net.wasdev.wlp.maven.plugins</groupId><artifactId>liberty-maven-plugin</artifactId><executions><execution><phase>pre-integration-test</phase><goals><goal>deploy</goal></goals><configuration><appArchive>${project.build.directory}/${project.artifactId}.war</appArchive><serverName>${project.artifactId}</serverName><installDirectory>${openliberty.installDir}/wlp</installDirectory></configuration></execution></executions></plugin></plugins></build>
</profile>

停止服务器也很容易:

mvn clean install -Pstop-liberty

Fatjar分布

使用mvn clean install -Ppackage-liberty创建一个Fatjar发行版非常容易:

<profile><id>package-liberty</id><activation><property><name>package-liberty</name></property></activation><build><plugins><plugin><groupId>net.wasdev.wlp.maven.plugins</groupId><artifactId>liberty-maven-plugin</artifactId><executions><execution><phase>package</phase><goals><goal>package-server</goal></goals><configuration><packageFile>${project.build.directory}/${project.artifactId}.jar</packageFile><include>runnable</include><serverName>${project.artifactId}</serverName><installDirectory>${openliberty.installDir}/wlp</installDirectory></configuration></execution></executions></plugin></plugins></build></profile>

在目标目录中,我现在可以执行一个可执行的(fat)jar文件: java -jar quote-service.jar

在上述所有profiles您可以使用以下命令测试示例应用程序:

mvn -Dtest=com.github.phillipkruger.quoteservice.QuoteApiIT surefire:test

那应该给您当天的报价:

{"author":"Naguib Mahfouz","text":"You can tell whether a man is clever by his answers. You can tell whether a man is wise by his questions."
}

微调内存占用量。

首先,我使用了伞形的javaee-7.0microProfile-1.2功能,即使我的应用程序仅使用这些规范的一部分。

使用jconsole我测量了正在运行的服务器的内存占用量(在GC之后):

50691 KB

在我的示例中,您可以更改server.xml以仅包括应用程序正在使用的功能:

<feature>jaxrs-2.0</feature>
<feature>ejb-3.2</feature>
<feature>cdi-1.2</feature>
<feature>jsonp-1.0</feature>
<feature>jaxrsClient-2.0</feature>
<feature>mpConfig-1.1</feature>
<feature>mpFaultTolerance-1.0</feature>

再次使用jconsole我测量了正在运行的服务器的内存占用量(在GC之后):

30,198 KB

理想情况下,您还可以对pom.xml进行微调,使其仅包含您使用的规范。

结论

我们可以争辩说,做胖子大战vs瘦身大战以及拥有应用程序服务器的利弊是否更好。 但是,在我们开始开发(即下载微型发行版或完整发行版)时不必做出此决定,而只有在我们进行构建时才允许有更多选择。 也许可以使用其他应用程序服务器来做到这一点,但是OpenLiberty使其变得容易。

更多信息

还可以阅读Pavel Pscheidl的精彩博客

  • 在2017年构建,打包和分发Java EE应用程序
  • OpenLiberty.io:简单指南

并观看亚当·比恩 ( Adam Bien)的这段视频

  • 精简WAR,Java EE 7,Docker和生产力

翻译自: https://www.javacodegeeks.com/2017/12/fatjars-thinwars-openliberty-cool.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Config Server简介

1.概述 在本教程中&#xff0c;我们将回顾Spring Cloud Config Server的基础知识。 我们将设置一个Config Server &#xff0c;然后构建一个客户端应用程序 &#xff0c;该客户端应用程序在启动时会消耗配置 &#xff0c;然后刷新配置而不重新启动。 我们正在构建的应用程序与《…

朴素贝叶斯算法实现分类以及Matlab实现

开始 其实在学习机器学习的一些算法&#xff0c;最近也一直在看这方面的东西&#xff0c;并且尝试着使用Matlab进行一些算法的实现。这几天一直在看得就是贝叶斯算法实现一个分类问题。大概经过了一下这个过程&#xff1a; 看书→算法公式推演→网上查询资料→进一步理解→搜…

编写自定义的AssertJ断言

AssertJ是广泛使用的Hamcrest匹配器的替代匹配库。 实际上&#xff0c;对于我自己的项目&#xff0c;我已经更改为仅使用AssertJ-我只是发现流畅的界面和可扩展性非常吸引人。 您可以编写自定义断言&#xff0c;如下所示&#xff1a; 想象一下一种具有强度和饮料类型的咖啡 &…

LintCode-A + B 问题

文章转载 http://blog.csdn.net/wangyuquanliuli/article/details/47755461 给出两个整数a和b, 求他们的和, 但不能使用 等数学运算符。 您在真实的面试中是否遇到过这个题&#xff1f; Yes样例 如果 a1 并且 b2&#xff0c;返回3 注意 你不需要从输入流读入数据&#xff0c;…

位操作基础篇之位操作全面总结

转载自 http://blog.csdn.net/morewindows/article/details/7354571 Title: 位操作基础篇之位操作全面总结 KeyWord: C/C 位操作 位操作技巧 判断奇偶 交换两数 变换符号 求绝对值 位操作压缩空间 筛素数 位操作趣味应用 位操作笔试面试 位操作篇共分为基础篇和提高…

机器学习中的算法-支持向量机(SVM)基础

机器学习中的算法-支持向量机(SVM)基础 版权声明&#xff1a; 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用&#xff0c;但请注明出处&#xff0c;如果有问题&#xff0c;请联系wheeleastgmail.com。也可以加我的微博: leftnotea…

使用JDK 8轻松进行细粒度排序

Java的8的推出流和有用的静态 / 默认的方法比较接口可以很容易地根据个人的领域两个对象比较“值&#xff0c;而不需要实现一个比较&#xff08;T&#xff0c;T&#xff09;在其对象的类方法被比较。 我将使用一个简单的Song类来帮助演示这一点&#xff0c;接下来显示其Song.j…

主成分分析以及应用:企业综合实力排序

这段时间一直在学习数据挖掘的一些算法&#xff0c;今天通过不断查阅资料&#xff0c;学习整理了一下主成分分析这个数据降维算法。并且结合一个实例进行matlab编程实现。 主成分基本原理 在数据挖掘中&#xff0c;经常会遇到一个问题就是一个问题出现了n多个变量&#xff0c;…

自定义MongoDB的Spring Social Connect框架

在上一篇文章中 &#xff0c;我谈到了我面临的第一个挑战是更改数据模型并添加连接框架。 在这里&#xff0c;我想提供有关我如何做的更多详细信息。 Spring Social项目已经提供了基于jdbc的连接存储库实现&#xff0c;以将用户连接数据持久保存到关系数据库中。 但是&#xff…

算法题:输入aaaabbbcccccc输出a4b3c6。

今日在地铁上浏览今日头条的时候看到这么个小题目&#xff0c;说是输出一长串字符串&#xff0c;输出字母串类别并且统计其出现次数&#xff0c;然后按照顺序将其输出来。例如输入aaaabbbcccccc&#xff0c;输出a4b3c6。 最近也一直在学习&#xff0c;所以就想着就Matlab来试了…

Java World中的GraphQL简介

许多人认为GraphQL仅适用于前端和JavaScript&#xff0c;它在Java等后端技术中没有定位&#xff0c;但事实确实如此。 还经常将GraphQL与REST进行比较&#xff0c;但是这种比较是否合理&#xff1f; 首先&#xff0c;让我开始回答其中最重要的问题。 什么是GraphQL&#xff1…

算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。

今天的算法学习还是和字符串有关&#xff0c;这个题目据说是以前的某公司面试的笔试题目。题目意思就是说&#xff0c;在一个字符串中找到只出现了一次的那些字符&#xff0c;并且输出来。 作为非IT的我&#xff0c;平时使用Matlab比较多。不是科班出身&#xff0c;对于这个题…

Kafka的Spring Cloud Stream

总览 该示例项目演示了如何使用事件驱动的体系结构 &#xff0c; Spring Boot &#xff0c;Spring Cloud Stream&#xff0c; Apache Kafka和Lombok构建实时流应用程序。 在本教程结束时&#xff0c;您将运行一个简单的基于Spring Boot的Greetings微服务 从REST API获取消息 …

使用JShell的Java 9 Streams API

这篇文章着眼于使用JShell的Java 9 Streams API。 Streams API的更改以Java 8中Streams的成功为基础&#xff0c;并引入了许多实用程序方法– takeWhile&#xff0c;dropWhile和iterate。 这篇文章延续了My Top Java 9功能&#xff0c;并使用Jshell探索了这些方法。 流API Str…

常见的股票技术因子学习以及计算

最近在看《量化投资数据挖掘技术与实践&#xff08;MATLAB版&#xff09;》。学习了其中的常见的股票衍生变量&#xff0c;并且利用WIND金融数据终端的matlab借口windmatlab导出一些数据进行了一个简单的学习。特此记录。 下面是我对于书中提到的几个因子的学习总结&#xff1…

算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”

今天这道算法题比较简单&#xff0c;主要考察的思考问题的全面性。这个需要考虑的几种情况。 如果输入的整数字符串是个负数&#xff0c;怎么处理&#xff1f; 如果输入的第一个字符是0&#xff0c;则怎么处理&#xff1f; 如果输入的是非0~9之间的字符怎么处理&#xff1f;…

排序算法一:冒泡排序,插入排序以及选择排序原理与MATLAB实现

最近在学习排序算法的一些知识。还是比较有趣的。所以好好研究了一下各个算法。并且使用matlab进行了个基本的实现&#xff0c;目前仅仅是实现吧&#xff0c;优化什么的可能目前的水平达不到吧&#xff0c;毕竟是用matlab实现&#xff0c;还是比较简单。以后还是希望使用C/C&am…

Java – HashMap详细说明

HashMap基于哈希算法工作&#xff0c;根据Java文档HashMap具有以下四个构造函数&#xff0c; 建设者 描述 HashMap ​() 构造一个空的 具有默认初始容量&#xff08;16&#xff09;和默认加载因子&#xff08;0.75&#xff09;的HashMap 。 HashMap ​(int initialCapaci…

Python实现石头-剪刀-布小游戏

近日在学习Python的一些基础知识&#xff0c;觉得还是很有趣的一个一门语言&#xff01;就目前的学习的一些知识&#xff0c;编写了一些一个简单的石头剪刀布的游戏。主要是熟悉一些Python的一些控制语句。 import random while 1:sint(random.randint(1,3))print(s)print()if…

Python:递归输出斐波那契数列

今天学习Python的时候做一道练习题&#xff0c;题目是这样的&#xff1a; 题目 导入 问题 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子总对数为多…