This article is the fifth and final part of the Oracle Autonomous Database and DevOps article series. For a better understanding, I recommend you read the articles “Oracle Autonomous Database and DevOps: A Simple Approach to Use – Part 1”, “Part 2”, “Part 3” and “Part 4” before proceeding with the steps in this article.
As the previous article dealt with the creation of the Linux application server within Oracle Cloud, in this article we will proceed with the creation of microservices using Docker and connecting a JAVA application to the cloud database. To start let’s get some concepts:
What are microservices?
According to Chris Richardson, “is a style of architecture that structures an application as a collection of services that are:
- Highly sustainable and testable
- Frankly coupled
- Independently deployable
- Organized around business resources. ”
What is node.js?
According to the manufacturer’s official website, “Node.js is an open source, cross-platform JavaScript execution environment.”
PS: This article will not show the coding of the application, but only the loading of it.
Now that we have a brief description of micricroservices and node.js, let’s proceed with the creation of our microservices:
Creating node.js microservices: Make sure Docker is running on your machine (For more information on Docker see the first article of this series):
[root@techdatatechdatabasketblogblog /]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Wed 2019-04-24 20:03:28 CEST; 7s ago Docs: http://docs.docker.com Main PID: 27946 (dockerd-current) Tasks: 20 CGroup: /system.slice/docker.service ├─27946 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=... └─27952 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/co... Apr 24 20:03:27 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:27.250219328+02:00" level=warning msg="failed to cleanup ipc mounts:\nfailed to umount /var/lib/docker/co...id argument" Apr 24 20:03:27 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:27.250885514+02:00" level=warning msg="8172d6ebc0303d372883143207467260cd2ea708b300ba23c736b36777be0d3b c...id argument" Apr 24 20:03:27 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:27.350320351+02:00" level=info msg="Firewalld running: true" Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.063094521+02:00" level=info msg="Removing stale sandbox f98e8fe2671acc61090bbed5f985266ded27adf2e19e27...6777be0d3b)" Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.466076919+02:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16... IP address" Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.627644418+02:00" level=info msg="Loading containers: done." Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.687620173+02:00" level=info msg="Daemon has completed initialization" Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.687645914+02:00" level=info msg="Docker daemon" commit="8633870/1.13.1" graphdriver=overlay2 version=1.13.1 Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com dockerd-current[27946]: time="2019-04-24T20:03:28.691636427+02:00" level=info msg="API listen on /var/run/docker.sock" Apr 24 20:03:28 techdatatechdatabasketblogblog.tech.com systemd[1]: Started Docker Application Container Engine.
At this moment you can pull your app image at https://github.com as in the example below:
[root@oc8226237722 /]# git clone https://github.com/brunors/appte.git ((link will not be available after this article is published)) Cloning into 'appte'... remote: Enumerating objects: 1045, done. remote: Total 1045 (delta 0), reused 0 (delta 0), pack-reused 1045 Receiving objects: 100% (1045/1045), 3.49 MiB | 1.95 MiB/s, done. Resolving deltas: 100% (173/173), done.
Open the port on your computer for the application to start. As we chose in the previous article will be port 3055:
[root@techdatabasketblog /]# firewall-cmd --zone=public --permanent --add-port=3055/tcp success
Install Oracle Client on your computer, you can find it on the OTN website and download it:
Copy the wallet used in previous articles to create the secure connection to a directory that will be used for the container image:
[root@techdatabasketblog wallet_APPtechdatabasket]# unzip /tmp/wallet/Wallet_techdatabasket.zip -d /wallet_APPtechdatabasket/ Archive: /tmp/wallet/Wallet_techdatabasket.zip inflating: /wallet_APPtechdatabasket/cwallet.sso inflating: /wallet_APPtechdatabasket/tnsnames.ora inflating: /wallet_APPtechdatabasket/truststore.jks inflating: /wallet_APPtechdatabasket/ojdbc.properties inflating: /wallet_APPtechdatabasket/sqlnet.ora inflating: /wallet_APPtechdatabasket/ewallet.p12 inflating: /wallet_APPtechdatabasket/keystore.jks [root@techdatabasketblog wallet_APPtechdatabasket]# Change the sqlnet.ora values to: WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY=$TNS_ADMIN)))
Be in the directory containing the wallet, the Oracle Client and start Docker with the image name (in this article is appte):
$ docker build -t appte .
Check the image:
[root@techdatabasketblog]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> d9369bacadb8 14 minutes ago 562 MB <none> <none> d9d8bb9b0d49 14 minutes ago 562 MB <none> <none> 7e7286d50f76 14 minutes ago 550 MB <none> <none> 6746bf7618ac 14 minutes ago 173 MB <none> <none> 6c6022e9f288 14 minutes ago 110 MB <none> <none> 05c85eda1ac8 14 minutes ago 110 MB <none> <none> 6c628092a5a8 14 minutes ago 110 MB <none> <none> f24dfd98c67a 15 minutes ago 14.9 MB appte latest 65463ysdbe26 3 weeks ago 171 MB
Start the image on port 3055 as we chose:
docker run -i -p 3055:3055 -t appte sh / #
Change your user credentials, password and connection string in the application.
Run the server.js script:
node server.js &
The results will be something like this:
appte listening on port 3055
You can see your application in a web browser as
http://{SEUIP}:3055
Now that we have created the microservices, let’s make a connection of a JAVA application to the ATP:
Connect to the provisioned server and as root install java:
[root@techdatabasketblog ATPDocker]# ssh root@129.146.128.2 Enter passphrase for key '/root/.ssh/id_rsa': Please login as the user "opc" rather than the user "root". Connection to 129.146.128.2 closed. [root@techdatabasketblog ATPDocker]# ssh upc@129.146.128.2 Permission denied (publickey,gssapi-keyex,gssapi-with-mic). [root@techdatabasketblog ATPDocker]# ssh opc@129.146.128.2 Enter passphrase for key '/root/.ssh/id_rsa': Enter passphrase for key '/root/.ssh/id_rsa': Last login: Wed Apr 24 19:27:11 2019 from ua-85-226-141-154.bbcust.telenor.se [opc@vmlinuxmachine ~]$ su - root [root@vmlinuxmachine ~]#yum install java Loaded plugins: langpacks, ulninfo ol7_UEKR5 | 2.5 kB 00:00:00 ol7_addons | 2.5 kB 00:00:00 ol7_developer | 2.5 kB 00:00:00 ol7_developer_EPEL | 2.5 kB 00:00:00 ol7_ksplice | 2.5 kB 00:00:00 ol7_latest | 3.0 kB 00:00:00 ol7_optional_latest | 2.5 kB 00:00:00 ol7_software_collections | 2.5 kB 00:00:00 (1/6): ol7_ksplice/primary_db | 131 kB 00:00:00 (2/6): ol7_optional_latest/x86_64/updateinfo | 688 kB 00:00:00 (3/6): ol7_latest/x86_64/updateinfo | 899 kB 00:00:00 (4/6): ol7_developer_EPEL/x86_64/primary_db | 10 MB 00:00:00 (5/6): ol7_latest/x86_64/primary_db | 16 MB 00:00:00 (6/6): ol7_optional_latest/x86_64/primary_db | 3.5 MB 00:00:00 Resolving Dependencies --> Running transaction check … Installed: java-1.8.0-openjdk.x86_64 1:1.8.0.212.b04-0.el7_6 Dependency Installed: alsa-lib.x86_64 0:1.1.6-2.el7 atk.x86_64 0:2.28.1-1.el7 avahi-libs.x86_64 0:0.6.31-19.el7 cairo.x86_64 0:1.15.12-3.el7 copy-jdk-configs.noarch 0:3.3-10.el7_5 cups-libs.x86_64 1:1.6.3-35.el7 dejavu-fonts-common.noarch 0:2.33-6.el7 dejavu-sans-fonts.noarch 0:2.33-6.el7 fontconfig.x86_64 0:2.13.0-4.3.el7 fribidi.x86_64 0:1.0.2-1.el7 gdk-pixbuf2.x86_64 0:2.36.12-3.el7 giflib.x86_64 0:4.1.6-9.el7 graphite2.x86_64 0:1.3.10-1.el7_3 gtk-update-icon-cache.x86_64 0:3.22.30-3.el7 gtk2.x86_64 0:2.24.31-1.el7 harfbuzz.x86_64 0:1.7.5-2.el7 hicolor-icon-theme.noarch 0:0.12-7.el7 jasper-libs.x86_64 0:1.900.1-33.el7 java-1.8.0-openjdk-headless.x86_64 1:1.8.0.212.b04-0.el7_6 javapackages-tools.noarch 0:3.4.1-11.el7 jbigkit-libs.x86_64 0:2.0-11.el7 libICE.x86_64 0:1.0.9-9.el7 libSM.x86_64 0:1.2.2-2.el7 libX11.x86_64 0:1.6.5-2.el7 libX11-common.noarch 0:1.6.5-2.el7 libXau.x86_64 0:1.0.8-2.1.el7 libXcomposite.x86_64 0:0.4.4-4.1.el7 libXcursor.x86_64 0:1.1.15-1.el7 libXdamage.x86_64 0:1.1.4-4.1.el7 libXext.x86_64 0:1.3.3-3.el7 libXfixes.x86_64 0:5.0.3-1.el7 libXft.x86_64 0:2.3.2-2.el7 libXi.x86_64 0:1.7.9-1.el7 libXinerama.x86_64 0:1.1.3-2.1.el7 libXrandr.x86_64 0:1.5.1-2.el7 libXrender.x86_64 0:0.9.10-1.el7 libXtst.x86_64 0:1.2.3-1.el7 libXxf86vm.x86_64 0:1.1.4-1.el7 libdrm.x86_64 0:2.4.91-3.el7 libfontenc.x86_64 0:1.1.3-3.el7 libglvnd.x86_64 1:1.0.1-0.8.git5baa1e5.el7 libglvnd-egl.x86_64 1:1.0.1-0.8.git5baa1e5.el7 libglvnd-glx.x86_64 1:1.0.1-0.8.git5baa1e5.el7 libjpeg-turbo.x86_64 0:1.2.90-6.el7 libpciaccess.x86_64 0:0.14-1.el7 libthai.x86_64 0:0.1.14-9.el7 libtiff.x86_64 0:4.0.3-27.el7_3 libwayland-client.x86_64 0:1.15.0-1.el7 libwayland-server.x86_64 0:1.15.0-1.el7 libxcb.x86_64 0:1.13-1.el7 libxshmfence.x86_64 0:1.2-1.el7 libxslt.x86_64 0:1.1.28-5.0.1.el7 lksctp-tools.x86_64 0:1.0.17-2.el7 mesa-libEGL.x86_64 0:18.0.5-4.el7_6 mesa-libGL.x86_64 0:18.0.5-4.el7_6 mesa-libgbm.x86_64 0:18.0.5-4.el7_6 mesa-libglapi.x86_64 0:18.0.5-4.el7_6 pango.x86_64 0:1.42.4-2.el7_6 pcsc-lite-libs.x86_64 0:1.8.8-8.el7 python-javapackages.noarch 0:3.4.1-11.el7 python-lxml.x86_64 0:3.2.1-4.el7 ttmkfdir.x86_64 0:3.0.9-42.el7 tzdata-java.noarch 0:2019a-1.el7 xorg-x11-font-utils.x86_64 1:7.5-21.el7 xorg-x11-fonts-Type1.noarch 0:7.5-9.el7 Complete!
Create a directory and copy the application:
cd ~ [root@vmlinuxmachine opc]# mkdir javaBLOG [root@vmlinuxmachine opc]# git clone https://github.com/brunors/appte.git/javaBLOG.git
Download and install JDBC drives in your provisioned environment:
[root@vmlinuxmachine lib]# tar xzfv ojdbc8-full.tar.gz ojdbc8-full/ ojdbc8-full/ojdbc8.jar ojdbc8-full/oraclepki.jar ojdbc8-full/osdt_core.jar ojdbc8-full/xdb6.jar ojdbc8-full/ons.jar ojdbc8-full/ojdbc.policy ojdbc8-full/orai18n.jar ojdbc8-full/osdt_cert.jar ojdbc8-full/README.txt ojdbc8-full/ucp.jar ojdbc8-full/simplefan.jar [root@techdatabasketblog]# sudo ssh -i /path_to/sshkeys/id_rsa opc@129.146.128.2 Enter passphrase for key '/root/.ssh/id_rsa': [opc@vmlinuxmachine ~]$ cd javaBLOG [opc@vmlinuxmachine javaBLOG]$
Copy and unzip your database wallet to the application directory on the server:
[opc@vmlinuxmachine ~]$unzip /tmp/wallet/Wallet_techdatabasket.zip -d /wallet_APPtechdatabasket/ Archive: /tmp/wallet/Wallet_techdatabasket.zip inflating: /wallet_APPtechdatabasket/cwallet.sso inflating: /wallet_APPtechdatabasket/tnsnames.ora inflating: /wallet_APPtechdatabasket/truststore.jks inflating: /wallet_APPtechdatabasket/ojdbc.properties inflating: /wallet_APPtechdatabasket/sqlnet.ora inflating: /wallet_APPtechdatabasket/ewallet.p12 inflating: /wallet_APPtechdatabasket/keystore.jks [root@techdatabasketblog wallet_APPtechdatabasket]#
Change the sqlnet.ora file values to the following:
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY=$TNS_ADMIN))) SSL_SERVER_DN_MATCH=yes
Set the TNS_ADMIN variable to the wallet path:
export TNS_ADMIN=/home/opc/javaBLOG
Compile the java application:
cd /home/opc/javaBLOG/src
Execute the java application and connect to the ATP database:
java -cp .:/home/opc/javaBLOG/lib/ojdbc8-full/ojdbc8.jar javaAPP
This has finished the series of articles on the simple approach of Oracle Autonomous Database and DevOps. The idea for this series of articles came from my participation in Oracle Code Rome 2019 in Italy, where I got a lot of knowledge that made me explore this DevOps field further with the ATP database and as mentioned in the first article we started with the Docker setup and later in the following articles on Oracle Cloud database and server provisioning on Oracle Cloud and we end with a brief representation of microservices and java with the ATP database. However, there are a number of features that can still be explored within Oracle Cloud, so create your account and explore the Oracle Cloud world.
References:
https://www.oracle.com/technetwork/database/availability/trn5515-microserviceswithoracle-5187372.pdf
https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
https://github.com/cloudsolutionhubs
Bruno Reis da Silva is a Database Cloud Support Engineer and professionally Certified Oracle Database Administrator who has worked on the South American continent and is now working on the European continent. He was awarded the first Oracle Ace Associate of Hungary in 2017. His interests are in RDBMS, mainly Oracle, operating systems (Linux, AIX, HPUX and Solaris) and High Availability Solutions implementations. In his free time he enjoys playing sports , going to the gym and traveling. His blog www.techdatabasket.com is dedicated to his sister Laura Vitoria and the main reason for blogging is because he believes in the quote “giving back to get back” . He also enjoys continuous learning and the interaction with others who share his interest.
Carlos Magno de Andrade Júnior is an Database Architect at eProseed Europe, with more than 15 years of experience in Oracle database on complex projects in countries such as Brazil , India , the Netherlands, Luxembourg , France and Italy, having worked in companies such as Oracle Corporation, IBM, HSBC, among others. Also share information on your blog ezdba.wordpress.com. Certifications : OCM 12c OCP 10g , 11g OCP , OCP 12c, OCE RAC , Exadata , ITIL and OEM 12c Cloud Control Implementation Specialist.
Hi! I am Bruno, a Brazilian born and bred, and I am also a naturalized Swedish citizen. I am a former Oracle ACE and, to keep up with academic research, I am a Computer Scientist with an MSc in Data Science and another MSc in Software Engineering. I have over ten years of experience working with companies such as IBM, Epico Tech, and Playtech across three different countries (Brazil, Hungary, and Sweden), and I have joined projects remotely in many others. I am super excited to share my interests in Databases, Cybersecurity, Cloud, Data Science, Data Engineering, Big Data, AI, Programming, Software Engineering, and data in general.
(Continue reading)