Oracle Autonomous Database e DevOps: Uma simples abordagem de utilização – Parte 5

Por Bruno Reis Oracle Associate, Carlos Magno
Publicado em Julho 2019

Revisado por Juan Pablo Guizado




Este artigo é a quinta e última parte da série de artigos sobre Oracle Autonomous Database e DevOps. Para um melhor entendimento, recomendo a leitura dos artigos “Oracle Autonomous Database e DevOps: Uma simples abordagem de utilização – Parte 1” , “Parte 2” e “Parte 3” e “Parte 4” antes de prosseguir com os passos deste artigo.

Como no artigo anterior foi tratado a criação do servidor Linux de aplicação dentro do Oracle Cloud, neste artigo prosseguiremos com a criação de microservices utilizando o Docker e a conexão de uma aplicação JAVA com o banco de dados criado na nuvem. Para começar vamos adquirir alguns conceitos:

 

O que são microservices?

Segundo Chris Richardson, (na tradução literal do inglês) "é um estilo de arquitetura que estrutura um aplicativo como uma coleção de serviços que são:

  • Altamente sustentável e testável
  • Francamente acoplada
  • Independentemente implantável
  • Organizado em torno de recursos de negócios.”.


O que é o node.js ?

Segundo o site oficial do fabricante (na tradução literal do inglês) "O Node.js é um ambiente de execução JavaScript de código aberto e de cross-platform.”.


PS: Neste artigo não será tratado a codificação da aplicação e sim somente o carregamento dela.


Agora que já temos uma breve descrição de micricroservices e de node.js, vamos prosseguir com  a criação de nosso microservices:




Criação do node.js microservices: Tenha certeza que o Docker esteja rodando na sua máquina (Para mais informações sobre o Docker veja o primeiro artigo desta série):

[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.



A partir desse momento você pode puxar a imagem da sua aplicação no https://github.com como no exemplo abaixo:

[root@oc8226237722 /]# git clone https://github.com/brunors/appte.git  
(link não estará disponível após a publicação do artigo)

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.



Abra a porta no seu computador para a aplicação iniciar. Como escolhemos no artigo anterior será a porta 3055:

[root@techdatabasketblog /]# firewall-cmd --zone=public --permanent --add-port=3055/tcp
success



Instale o Oracle Client no seu computador, você pode encontrar no site da OTN e efetuar o download:




Copie o wallet utilizado nos artigos anteriores para criar a conexão segura para um diretório que será usado para a imagem do container:

[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]# 



Mude os valores do sqlnet.ora para:

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = 
(DIRECTORY=$TNS_ADMIN)))



Esteja no diretório que contêm o wallet, o Oracle Client e inicie o Docker com o nome da imagem (no caso deste artigo appte) :

$ docker build -t appte  .



Verifique a imagem:

[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 



Inicie a imagem na porta 3055 como escolhemos:

docker run -i -p 3055:3055 -t appte  sh
/ # 



Mude suas credencias de usuário, senha e string de conexão na aplicação.

Rode o script server.js:

node server.js &

O resultado será algo similar a isso:

appte listening on port 3055

Voce poderá observar sua aplicação em um browser de internet como http://{SEUIP}:3055

 

Agora que finalizamos a criação do microservices, vamos fazer uma conexão de uma aplicação JAVA com a ATP:

Conecte no servidor provisionado e como root instale o 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!



Crie um diretório e copie a aplicação:

cd ~

[root@vmlinuxmachine opc]# mkdir javaBLOG

[root@vmlinuxmachine opc]# git clone https://github.com/brunors/appte.git/javaBLOG.git



Baixe e instale os drives JDBC no seu ambiente provisionado:

[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]$ 



Copie e efetue um unzip no wallet do seu banco de dados no diretório da aplicação no servidor:

[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]# 



Mude os valores do arquivo do sqlnet.ora para a seguir:

WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY=$TNS_ADMIN)))
SSL_SERVER_DN_MATCH=yes



Compile a aplicação java:

cd /home/opc/javaBLOG/src


Rode a aplicação java e conecte ao banco de dados ATP:

java -cp .:/home/opc/javaBLOG/lib/ojdbc8-full/ojdbc8.jar javaAPP



Assim finalizamos a série de artigos sobre  a simples abordagem do Oracle Autonomous Database e DevOps. A ideia dessa série de artigos surgiu na minha participação no Oracle Code Rome 2019 na Itália, onde obtive vários conhecimentos que me fizeram explorar mais este campo de DevOps com o banco de dados ATP e como mencionado no primeiro artigo começamos com a configuração do Docker e posteriormente nos artigos seguintes com o provisionamento do banco de dados e do servidor Linux na Oracle Cloud e finalizamos com uma breve representação de microservices e java com o banco de dados ATP. Todavia ainda assim, há uma série de funcionalidades que ainda podem ser exploradas dentro do Oracle Cloud e para isso, crie sua conta e explore o mundo Oracle Cloud.




Referências:

https://www.oracle.com/technetwork/database/availability/trn5515-microserviceswithoracle-5187372.pdf

https://microservices.io/

https://nodejs.dev/

https://blogs.oracle.com/dbcs/building-microservices-on-oracle-autonomous-transaction-processing-service-v2

https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

https://github.com/cloudsolutionhubs

https://www.oracle.com/technetwork/database/application-development/jdbc/documentation/atp-5073445.html

https://www.oracle.com/webfolder/technetwork/tutorials/obe/cloud/apaas/java/getting-started-java-accs/getting-started-java-accs.html




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.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.