这篇教程会使用 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_171
tar -xvzf apache-tomcat-8.5.47.tar.gz -C /opt/
. 那么Tomcat的Home目录就是: /opt/apache-tomcat-8.5.47
todolist-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.css
pom.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_DATABASE
POSTGRESQL_USER
POSTGRESQL_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 json
env": [
{
"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-service
oc
客户端.odo
工具. 这是OpenShift 4新发布的专门针对开发人员的 OpenShift 命令行. 使用方式和git push
非常像, 封装了很多程序员不太了解的容器和K8S的概念. 你要做的就是类似前面写的: init, commit, push就好了. (以后有时间详细说明下)