
这篇教程会使用 Tomcat + PostgreSQL 创建一个 待办清单 (todolist) 应用. 并部署到OpenShift上.以此来演示完整的java 应用上容器平台(OpenShift)的流程.
oc,并且可以从命令shell该命令,以便可以使用它通过账号和密码登录。Java 应用程序几乎总是与数据库一起使用。对于本地开发,请使用PostgreSQL数据库。(使用MySQL的过程是完全一样的, 只是安装的为MySQL或MariaDB).
步骤:
$ sudo yum install -y postgresql postgresql-server postgresql-devel$ sudo postgresql-setup initdb. 此命令会创建/var/lib/pgsql/data目录, 数据存在这个目录.$ sudo systemctl start postgresql.service$ sudo -u postgres createuser -s jws. 请注意,创建的用户没有密码。如果要从头开始安装java和tomcat,则必须先安装OpenJDK 8 。然后,您可以继续编写应用程序。
步骤:
$ sudo yum install java-1.8.0-openjdk-devel.x86_64$ java -version 输出示例: openjdk version "1.8.0_171tar -xvzf apache-tomcat-8.5.47.tar.gz -C /opt/. 那么Tomcat的Home目录就是: /opt/apache-tomcat-8.5.47todolist-jdbc, 然后进行编码. 工程的结构如下: (源码链接: https://dev.tencent.com/u/east4ming/p/openshift-quickstarts/git/tree/1.2/tomcat-jdbc)$ tree .
.
├── pom.xml
└── src
└── main
├── java
│ └── org
│ └── openshift
│ └── quickstarts
│ └── tomcat
│ ├── dao
│ │ ├── JdbcTomcatDAO.java
│ │ └── TomcatDAO.java
│ ├── model
│ │ └── TomcatEntry.java
│ ├── service
│ │ └── TomcatService.java
│ └── servlet
│ └── MainServlet.java
└── webapp
├── WEB-INF
│ ├── index.html
│ └── web.xml
└── resources
└── css
├── bootstrap-theme.min.css
└── bootstrap.min.csspom.xml: 如JDBC和框架. 构建使用maven./opt/apache-tomcat-8.5.47/conf/context.xml<Resource name="jboss/datasources/defaultDS" auth="Container" type="javax.sql.DataSource"
maxTotal="25" maxIdle="5" maxWaitMillis="5000"
username="root" password="mypassword" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost/test"/> 概述如下, MVC模式:
TomcatEntry类, getSummary() setSummary()等方法. 见https://dev.tencent.com/u/east4ming/p/openshift-quickstarts/git/blob/1.2/tomcat-jdbc/src/main/java/org/openshift/quickstarts/tomcat/model/TomcatEntry.javaindex.html. 包含对Summary 的POST和GET http method. 见https://dev.tencent.com/u/east4ming/p/openshift-quickstarts/git/blob/1.2/tomcat-jdbc/src/main/webapp/WEB-INF/index.htmlMainServlet.java. 包含MainServlet类, 包含doPost()``doGet()等方法用IDE, 配置tomcat运行验证页面是否可用.
通过访问http://localhost:8080 来查看页面. 如果没有看到该页面,可以查看tomcat的输出日志。
为了使您的应用程序与在OpenShift Container Platform中运行的PostgreSQL数据库服务通信,您必须编辑其中的写死的部分以使用环境变量。
最终运行在OpenShift之上的代码和本地代码差别其实很小. 如果最初运行在本地或开发环境. 那么类似以下的代码就会写死, 作为对比, 如果是OpenShift, 则建议使用环境变量ENV:
pom.xml原始版本:
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>pom.xml OpenShift版本: 善用变量 (详见${}内的内容)
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${version.surefire.plugin}</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>JdbcTomcatDAO.java原始版本:
private DataSource lookupDataSource() {
try {
Context initialContext = new InitialContext();
try {
return (DataSource) initialContext.lookup("jboss/datasources/defaultDS");
} catch (NameNotFoundException e) {
Context envContext = (Context) initialContext.lookup("java:comp/env"); // Tomcat places datasources inside java:comp/env
return (DataSource) envContext.lookup(System.getenv("DB_JNDI"));
}
} catch (NamingException e) {
throw new RuntimeException("Could not look up datasource", e);
}
}JdbcTomcatDAO.java OpenShift版本: 善用环境变量 ENV (详见: System.getenv)
private DataSource lookupDataSource() {
try {
Context initialContext = new InitialContext();
try {
return (DataSource) initialContext.lookup(System.getenv("DB_JNDI"));
} catch (NameNotFoundException e) {
Context envContext = (Context) initialContext.lookup("java:comp/env"); // Tomcat places datasources inside java:comp/env
return (DataSource) envContext.lookup(System.getenv("DB_JNDI"));
}
} catch (NamingException e) {
throw new RuntimeException("Could not look up datasource", e);
}
}在OpenShift Container Platform中构建应用程序通常需要将源代码存储在git存储库中(建议),因此如果尚未安装git,则必须进行安装。
前提:
步骤:
$ git init
$ git add .
$ git commit -m "initial commit"git存储库的远程服务器:$ git remote add origin git@github.com:<namespace/repository-name>.git$ git push您可以将应用程序部署到OpenShift容器平台。
在OpenShift上创建java-app项目后,您将自动切换到新的项目namespace。
在OpenShift Container Platform中部署应用程序涉及三个步骤:
JBoss Web Server 3.1 Apache Tomcat 8 builder (REDHAT基于开源版tomcat做了部分定制, 可以和使用开源版tomcat一样使用它) 镜像(docker image)和java源代码创建java服务。步骤:
$ oc new-project java-app --description="Todolist Java application" --display-name="Todolist + JDBC JAVA Application"您的Java 应用程序需要正在运行的数据库服务。对于此服务,使用PostgeSQL数据库镜像来创建。
要创建数据库服务,您将使用oc new-app命令。对于此命令,您必须传递一些必要的环境变量,这些变量将在数据库容器内部使用。这些环境变量是设置数据库的用户名,密码和名称所必需的。您可以将这些环境变量的值更改为所需的任何值。变量如下:
POSTGRESQL_DATABASEPOSTGRESQL_USERPOSTGRESQL_PASSWORD设置这些变量可确保:
步骤:
$ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password$ oc get pods --watch要将应用程序带入OpenShift容器平台,必须指定一个应用程序所在的存储库。
步骤:
$ oc new-app path/to/source/code --name=todolist-jdbc \
-e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=db_name -e DATABASE_SERVICE_NAME=postgresql \
-e DB_JNDI="jboss/datasources/defaultDS"todolist-jdbc。todolist-jdbc的DeploymentConfig 的JSON配置来验证是否已添加环境变量:$ oc get dc todolist-jdbc -o jsonenv": [
{
"name": "POSTGRESQL_USER",
"value": "username"
},
{
"name": "POSTGRESQL_PASSWORD",
"value": "password"
},
{
"name": "POSTGRESQL_DATABASE",
"value": "db_name"
},
{
"name": "DATABASE_SERVICE_NAME",
"value": "postgresql"
}
{
"name": "DB_JNDI",
"value": "jboss/datasources/defaultDS"
}
],$ oc logs -f build/todolist-jdbc-app-1$ oc get pods . 您应该看到以todolist-jdbc-<number>-<hash>开头的pod,这是您的应用程序在OpenShift Container Platform中运行。rsh命令进入到容器中: $ oc rsh <PGSQL_POD_ID>template对象, 在其中添加部署前要执行的hook, 来自动触发.这样您可以公开服务以为您的应用程序创建路由。
步骤:
要给服务提供外部可访问的域名(例如,使用OpenShift容器平台的router提供todolist.apps.example.com)来公开该服务 。您需要输入以下内容来发布前端服务:
$ oc expose service todolist-jdbc --hostname=todolist.apps.example.com❗️ 注意: 前提是
todolist.apps.example.com已经被解析到OpenShift集群的router上了. 一般OpenShift管理员会配置泛域名*.apps.example.com都解析到OpenShift的router上.
以上介绍了java 应用源代码部署的方式. JAVA应用要部署在OpenShift上.
oc new-app这个命令其实除了创建deployment pod外, 一般还会根据基础镜像的EXPOSE 自动创建相关SERVICE.oc expose service <service_name> 将应用发布到某个域名.当然, 其实上边这些步骤下来, 还是有些麻烦的. 另外还会有一些特殊情况无法使用这种方式:
$ oc start-build billing-service --from-file=todolist.war$ oc new-app -e MYSQL_USER=product -e MYSQL_PASSWORD=password --docker-image=172.30.182.75:5000/deploy-project/msa-product --name=product-serviceoc客户端.odo 工具. 这是OpenShift 4新发布的专门针对开发人员的 OpenShift 命令行. 使用方式和git push非常像, 封装了很多程序员不太了解的容器和K8S的概念. 你要做的就是类似前面写的: init, commit, push就好了. (以后有时间详细说明下)