带有DIY的Openshift上的Spring Boot / Java 8 / Tomcat 8

DIY墨盒是一种实验性墨盒,它提供了一种在OpenShift上测试不受支持的语言的方法。 它提供了最小限度的自由形式的支架,将墨盒的所有细节留给了应用程序开发人员 。 这篇博客文章说明了结合了PostgreSQL服务的Spring Boot / Java 8 / Tomcat 8应用程序的使用。

创建新的应用程序

先决条件

在开始构建应用程序之前,我们需要安装一个OpenShift免费帐户和客户端工具。

步骤1:建立DIY应用程式

要使用客户端工具创建应用程序,请键入以下命令:

rhc app create boot diy-0.1

此命令使用DIY盒式磁带创建应用程序引导 ,并将存储库克隆到引导目录。

步骤2:将PostgreSQL墨盒添加到应用

我们正在创建的应用程序将使用PostgreSQL数据库,因此我们需要向该应用程序添加适当的盒式磁带:

rhc cartridge add postgresql-9.2 --app boot

创建盒带后,可以使用以下命令检查其状态:

rhc cartridge status postgresql-9.2 --app boot

步骤3:删除模板应用程序源代码

OpenShift创建一个可以自由删除的模板项目:

git rm -rf .openshift README.md diy misc

提交更改:

git commit -am "Removed template application source code"

步骤4:从GitHub提取源代码

git remote add upstream https://github.com/kolorobot/openshift-diy-spring-boot-sample.git
git pull -s recursive -X theirs upstream master

步骤5:推送变更

基本模板随时可以推送:

git push

初始部署(构建和应用程序启动)将花费一些时间(最多几分钟)。 尽管在小型Gear上启动Spring Boot应用程序可能要花2分钟以上的时间,但随后的部署要快一些:

Tomcat started on port(s): 8080/http
Started Application in 125.511 seconds

现在,您可以浏览到: http : //boot-yournamespace.rhcloud.com/manage/health ,您应该看到:

{"status": "UP","database": "PostgreSQL","hello": 1
}

您也可以浏览API。 要了解您拥有哪些选项,请导航至应用程序的根目录。 您应该看到资源根目录,其中包含指向可用资源的链接:

{"_links" : {"person" : {"href" : "http://boot-yournamespace.rhcloud.com/people{?page,size,sort}","templated" : true}}
}

导航到http://boot-yournamespace.rhcloud.com/people应该返回数据库中的所有人员。

第6步:添加詹金斯

使用詹金斯有一些优势。 其中之一是构建是在自己的Gear中进行的。 要使用Jenkins进行构建,OpenShift需要服务器和连接到应用程序的Jenkins客户端盒。 创建Jenkins应用程序:

rhc app create ci jenkins

并将Jenkins客户端附加到应用程序:

rhc cartridge add jenkins-client --app boot

现在,您可以浏览到: http:// ci- .rhcloud.com并使用提供的凭据登录。 当您进行下一个更改并将其推送时,构建将由Jenkins触发:

remote: Executing Jenkins build.
remote:
remote: You can track your build at https://ci-<namespace>.rhcloud.com/job/boot-build
remote:
remote: Waiting for build to schedule.........

而且,当您观察到构建结果时,该应用程序在Jenkins上的启动速度会更快。

引擎盖下

为什么要DIY?

可以将Spring Boot应用程序部署到OpenShift上的Tomcat盒中。 但是目前没有Tomcat 8和Java 8支持,因此选择了DIY。 DIY有局限性:例如,无法缩放。 但这是尝试和玩新事物的完美选择。

应用结构

该应用程序是常规的Spring Boot应用程序,可以使用http://start.spring.io进行引导。 使用的构建系统是Maven,包装类型是Jar。 使用Java 8的Tomcat 8。 Spring Boot默认使用Tomcat 7,要对其进行更改,添加了以下属性:

<properties><tomcat.version>8.0.9</tomcat.version>
</properties>

之所以选择Maven,是因为目前只能在OpenShift上使用Gradle 1.6。 这是由于Gradle中的错误所致。 Gradle 2.2解决了此问题。

Maven settings.xml

settings.xml文件非常重要,因为它包含Maven存储库的位置: ${OPENSHIFT_DATA_DIR}/m2/repository

在OpenShift上,写权限仅在$ OPENSHIFT_DATA_DIR中。

数据源配置

该应用程序使用Spring Data REST通过REST导出存储库。 所需的依赖项是:

  • spring-boot-starter-data-jpa –存储库配置
  • spring-boot-starter-data-rest –公开基于REST的存储库
  • hsqldb –用于嵌入式数据库支持
  • postgresql –用于PostgreSQL支持。 由于当前OpenShift使用PostgreSQL 9.2,因此使用了适当的驱动程序版本

通用属性– application.properties

默认情况下(默认配置文件src/main/resources/application.properties ),应用程序将使用嵌入式HSQLDB并使用src/main/resources/data.sql 。 数据文件可以在HSQLDB和PostrgeSQL上运行,因此我们不需要提供特定于平台的文件(Spring Boot可以实现)。

  • spring.datasource.initialize = true必须使用spring.datasource.initialize = true ,因此Spring Boot会拾取数据文件并将其加载到数据库中。
  • spring.jpa.generate-ddl = true可确保将导出架构。

OpenShift属性– application-openshift.properties

特定于OpenShift的配置( src/main/resources/application-openshift.properties )允许使用PostgreSQL服务。 该配置使用OpenShift env变量来设置连接属性:

  • $ OPENSHIFT_POSTGRESQL_DB_HOST –用于数据库主机
  • $ OPENSHIFT_POSTGRESQL_DB_PORT –用于数据库端口
  • $ OPENSHIFT_APP_NAME –数据库名称
  • $ OPENSHIFT_POSTGRESQL_DB_USERNAME –用于数据库用户名
  • $ OPENSHIFT_POSTGRESQL_DB_PASSWORD –用于数据库密码

Spring允许直接使用${}语法在属性中使用env变量,例如:

spring.datasource.username = ${OPENSHIFT_POSTGRESQL_DB_USERNAME}

为了让Spring Boot激活OpenShift配置文件,将spring.profiles.active属性在启动时传递给应用程序: java -jar <name>.jar --spring.profiles.active=openshift

登录OpenShift

日志文件将存储在$ OPENSHIFT_DATA_DIR中:

logging.file=${OPENSHIFT_DATA_DIR}/logs/app.log

执行器

执行器的默认管理上下文路径为/ 。 更改为/manage ,因为OpenShift公开了/health端点本身,该端点涵盖了Actuator的/health端点。

management.context-path=/manage

OpenShift action_hooks

OpenShift在部署过程中的特定位置执行动作挂钩脚本文件。 所有挂钩都放置在应用程序存储库的.openshift/action_hooks目录中。 文件必须是可执行的。 在Windows中,可以在Git Bash中使用以下命令:

git update-index --chmod=+x .openshift/action_hooks/*

部署应用程序

deploy脚本将下载Java和Maven,创建一些目录并导出正确运行Java 8 / Maven构建所需的几个环境变量。

部署的最后命令是运行Maven目标:

mvn -s settings.xml clean install

启动应用程序

deploy脚本成功完成后, target目录将包含一个组装了Spring Boot应用程序的jar。 该应用程序已启动,并绑定到OpenShift提供的服务器地址和端口。 另外,提供了概要文件名称,因此将创建有效的数据源。 运行该应用程序的最终命令:

nohup java -Xms384m -Xmx412m -jar target/*.jar --server.port=${OPENSHIFT_DIY_PORT} --server.address=${OPENSHIFT_DIY_IP} --spring.profiles.active=openshift &

停止应用

stop脚本正在寻找Java进程,并且找到它时…您知道会发生什么。

摘要

我对“自己动手做”墨盒对OpenShift的评估感到非常满意。 并非所有事情都像我预期的那样顺利,主要是由于小型Gear的内存限制。 我花了一些时间弄清楚并进行了正确的配置。 但是,带有DIY的OpenShift值得尝试一小会儿。 尤其是,完全免费开始。

参考文献

  • 贯穿本文的项目源代码可在GitHub上找到: https : //github.com/kolorobot/openshift-diy-spring-boot-sample 。
  • Spring Boot文档: http : //docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#cloud-deployment-openshift
  • 创建本文时使用了一些OpenShift参考:
    https://blog.openshift.com/run-gradle-builds-on-openshift
    https://blog.openshift.com/tips-for-creating-openshift-apps-with-windows

翻译自: https://www.javacodegeeks.com/2014/10/spring-boot-java-8-tomcat-8-on-openshift-with-diy.html

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

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

相关文章

zabbix监控docker容器

1、环境说明 由于最近zabbix进行过一次迁移&#xff0c;所以zabbix-server系列采用docker方式安装&#xff0c;参考zabbix官网&#xff1a;https://github.com/zabbix/zabbix-docker。为适应本地环境和需求&#xff0c;docker-compose.yml文件有改动&#xff0c;具体内容如下&a…

全角半角转换

#region 全角半角转换 /// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name"input">任意字符串</param> /// <returns>全角字符串</returns> ///<remarks> ///全角空格为12288&#xff0c;半角空格…

jquery中的left和top

left 和 top /*1. 获取元素基于定位容器的位置*//*返回的是对象 属性 left top */var position $(.inner).position();console.log(position.left);console.log(position.top);/*2. 获取元素基于页面容器的位置 基于页面的偏移*/var offset $(.inner).offset();console.l…

让我们用jOOλ在Java 8中流式传输地图

我想找到一种简单的方法来用Java 8流式传输Map 。猜猜是什么&#xff1f; 没有&#xff01; 为了方便起见&#xff0c;我期望的是以下方法&#xff1a; public interface Map<K, V> {default Stream<Entry<K, V>> stream() {return entrySet().stream();} …

双向链表的快速排序

#include <stdio.h> #include <stdlib.h> #include <time.h> //定义类型 所有的排序例子中都是用的int作为data typedef int elemType; //返回值 #define RET_SUCCESS ( 1 ) #define RET_FAILED ( 0 ) //定义链表的长度 #define LIST_MAX_SIZ…

Hibernate应用程序级可重复读取

介绍 在我以前的文章中&#xff0c;我描述了应用程序级事务如何为长时间的对话提供合适的并发控制机制。 所有实体都在Hibernate会话的上下文中加载&#xff0c;充当事务后写式缓存 。 Hibernate持久性上下文可以包含给定实体的一个引用和一个引用。 一级缓存可确保会话级可重…

HDU-2732 Leapin' Lizards 最大流

题目意思是有一些蜥蜴在一个迷宫里面&#xff0c;求这些蜥蜴还有多少是无论如何都逃不出来的。题目只给定一个行数&#xff0c;一个最远能够跳跃的距离&#xff0c;列数是不确定的&#xff08;题目告知列数小于等于20&#xff09;&#xff0c;但是数据一定会是一个矩阵。每只蜥…

canvas动画简单操作

canvas动画 小球滚动效果 关键api&#xff1a; window.requestAnimationFrame(draw) 会递归调用draw函数&#xff0c;替代setIntervalvar x 20; var speed 4; //电脑的帧率是1秒钟60Hz&#xff0c; 就相当于一秒钟可以播放60张图片&#xff0c;就相当于播放一张图片使用16.…

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…