martedì 26 aprile 2016

WebLogic 12.2.1 & Multitenancy - (Document in Italian Language)

Definizione:

WebLogic 12.2.1 ha introdotto il concetto di Multitenancy nelle architetture Middleware basate su Application server.

La multi-tenancy si riferisce ad un principio nell’architettura del software o dell’hardware in cui una singola istanza del software viene eseguita su un server, offrendo il proprio servizio a più client (i tenant). Il concetto di multi-tenancy non deve essere confuso con quello di architettura multi-istanza, in cui istanze software separate o sistemi hardware separati sono resi disponibili a diverse organizzazioni. In un’architettura multi-tenant un’applicazione software è progettata per partizionare virtualmente i suoi dati e la sua configurazione, ed ogni tenant opera con una di queste istanze applicative personalizzate.

La multi-tenancy costituisce una conseguenza fondamentale della tecnologia di virtualizzazione, grazie alla quale possiamo concretizzare un approccio multi-tenant sulle risorse infrastrutturali, in quanto si assiste alla creazione di ambienti virtuali logicamente separati sui medesimi componenti fisici condivisi. L’aggettivo virtuale vuole evidenziare come tale tecnologia consenta di costruire una separazione logica delle risorse.
Nonostante il concetto di multi-tenancy indichi che ci sono delle infrastrutture condivise, ciò che fa la differenza è il livello nel quale le risorse diventano multi-tenant, con una infrastruttura Oracle si è multi-tenant sia a livello applicativo che a livello dei dati/DB e, con riferimento al cloud anche a livello Hardware.

Componenti necessari per la Multitenancy in Weblogic 12.2.1:

Per poter configurare ed utilizzare la Multitenancy in Weblogic 12.2.1 è necessario avere solo un JDK 1.8 (consigliato dalla release/patch-set update 65 in su) con il garbage collector G1 configurato.

WLS 12.2.1 sarà in tal modo in grado di rendere “multitenant” la JVM (partizionamento della JVM) e su di essa baserà la sua multitenancy.

L’unione di un tenant su WLS unito ad un tenant su JVM viene chimamato Domain Partition.

Partizionamento della JVM, le Domain Partitions:

Una JVM quando viene eseguita in una Macchina fisica, consumerà, in base al carico,  tutti i core (cpu) presenti su quella macchina.

Per evitare questo problema e con il nuovo HW multicore che si trova sul mercato, solitamente vengono create immagini virtuali, ad ognuna di esse si assegnano risorse HW quali Cpu e Memoria, vi si reinstalla parte del software e vi si esegue almeno una JVM.

Oltre che per suddividere meglio le risorse presenti su una macchina, tali opersazioni risultano necessarie in alcuni contesti applicativi per separare e/o isolare fisicamente e logicamente le applicazioni.

WLS 12.2.1 è in grado di suddividere una singola JVM in piu zone chiamate domain partitions.

Tramite la Console di Amministrazione di WLS 12.2.1, si è in grado di assegnare  la quantità di CPU, Memoria e file descrittori consumabili da ogni Domain Partition.

Ogni domain partition è fisicamente isolata da un’altra ed ha:

·         una o più applicazioni deployate
·         le sue regole di consumo cpu, memoria e file descrittori
·         un suo proprio JNDI, non ci possono essere quindi conflitti se si usano gli stessi nome logici in domain partition differenti
·         il suo web context root
·         le sue librerie ed il suo classloader
·         le sue configurazioni di JMS, JDBC etc
·         il suo sistema di autenticazione

Ne consegue che è possibile deployare una stessa applicazione piu volte su una stessa jvm ma in domain partitions diverse.

Nel caso ad esempio di architetture a microservizi, una stessa applicazione può essere specializzata rideployandola in domain partitions diverse, assegnando ad ognuna di esse un suo datasource ed un suo pluggable database (Oracle DB multitenancy) ed assegnando ad ogni domain partition uno specifico Authentication Provider. In tale modo ogni applicazione avrà un diverso bacino di utenza ed un diverso sistema di persistenza.

Architettura e funzionalità di WLS 12.2.1 & Domain Partitions:


Nella precedente immagine viene rappresentata una tipica architettura basata su Weblogic 12.2.1 con Multitenancy.

Nela caso della presenza di un cluster e di domain partitions configurate, ogni singola jvm di ogni Managed Server del cluster verrà partizionata nella stessa maniera.

Le applicazioni, quindi, saranno in cluster, dentro ogni singola domain partition.

Tramite la console di amministrazione si potranno definire delle policy di resource sharing e di resource consumption.

Ogni regola applicata su una domain partition può attivare degli eventi quali:

· Notify : l’applicazione di una domain partition sta consumando piu di un primo limite fissato e ne viene data notifica
· Slow : l’applicazione di una domain partition sta consumando piu di un secondo limite fissato e viene rallentata dal sistema diminuendogli i thread di esecuzione.
· Shutdown : l’applicazione di una domain partition sta consumando piu di un terzo limite fissato e viene “spenta” dal sistema. E’ infatti possibile fare stop o start di una domain partition senza che le altre ne siano coinvolte

E’ evidente quindi che con un semplice wizard sulla console di Amministrazione si può decidere quante risorse assegnare ad una domain partition ed alla sua (o sue) applicazioni deployate e quindi se una applicazione inizia a dare problemi, può essere disattivata (automaticamente o manualmente) prima che rechi problemi alle altre applicazioni deployate sulla stessa jvm. Inoltre l’applicazione che viene “spenta”, verrà spenta solo su quella partizione dello specifico Managed su cui creava problemi e continuerà a funzionare nel cluster delle altre partizioni sugli altri Managed.

Nel caso di presenza di cluster dinamico e di regole di scale-up (e/o scale-down), per ogni nuovo managed aggiunto la sua jvm verrà automaticamente partizionata e riconfigurata come le precedenti.

Il nuovo bilanciatore software di Oracle denominato Oracle Traffic Director (OTD) viene aggiornato in automatico nel caso di nuove domain partitions create in un dominio.

Grazie a questa funzionalità di autoaggiornamento dell’OTD si può avere la live-migration delle Domain Partitions.

La live-migration delle domain partitions, consente di spostare a caldo le domain partitions configurate su delle jvm, su nuove JVM (sullo stesso o su nuovo HW). Questo consente ad esempio di aggiornare l’HW (o in generale di eseguire operazioni di manutenzione ordinaria e/o straordinaria) senza dare disservizi.

Le domain partitions una volta che sono configurate possono essere esportate in un file zip con un semplice click dalla console di Amministrazione.

In una domain partition esportata è presente oltre che l’applicazione in essa deployata anche tutte le sue configurazioni come ad esempio, JMS, JDBC, Datasources ... etc.

E’ ovviamente anche possibile importare uno di questi file zip e replicare quindi con un semplice click una complessa configurazione di una qualsiasi applicazione configurata in precedenza.

L’export e l’import delle domain partitions semplifica e rende immediato il passaggio di applicazioni da on-premise sul cloud, oppure da ambienti di test ad ambienti di produzione.

Vecchie configurazioni di domini Weblogic, dalla versione 10.3.6 in poi, possono essere trasformate in Domain Partitions ed essere importate su WebLogic 12.2.1, tramite il tool D-PCT (Domain to Partition Conversion Tool) scaricabile da Oracle Technology Network.

Benefici delle Architetture basate sulle Domain Partitions:

Oltre a tutti i benefici descritti in precedenza, una configurazione basata su Domain Partitions rispetto ad una equivalente senza Domain Partitions, risulta leggermente piu veloce ma con un lieve incremento di consumo di memoria.

Solitamente si installa meno software ed in un mondo puramente Java si può evitare di installare ambienti di virtualizzazione (risparmio licenze) e si riduce drasticamente il numero di processi running di JVM, con conseguente minor consumo di RAM e CPU.

Piu domini possono essere consolidati in un unico dominio wls 12.2.1, semplificando nel tempo le eventuali operazioni di patching e/o upgrade.

Nel caso di ambienti di sviluppo, ogni sviluppatore può fare i suoi test su una specifica Domain Partition, sapendo in tal modo di non arrecare problemi o conflitti con Domain Partition dedicate ad altri sviluppatori. Gli ambienti di sviluppo collassano quindi in una unica installazione di prodotto.

sabato 2 aprile 2016

Maven & Oracle: "How To" & "maven.oracle.com"

In the last days a lot of developers/customers, has asked to me how to use maven during the development of projects with Oracle artifacts so I have decided to summarize here some solutions:

In this [POST] I have explained for example:
  1. How to use the local Maven Repository to push/get Oracle Jdbc drivers; The default path value is ${user.home}/.m2/repository/.
  2. Hot to use the remote Maven Repository on DevCS (Developer Cloud Service) to push/get Oracle Jdbc drivers
Now is time to introduce the maven.oracle.com: (Oracle documentation)

Suppose that you are developing an application that requires and uses Oracle Jdbc Driver ojdbc7.jar, and that you would like to get it directly from internet from the remote Maven Repository maven.oracle.com.

We need to write/update 2 files:
  1. pom.xml (inside your maven project)
  2. settings.xml
    • this file is inside the conf directoy of your maven installation.
    • can be also in  ${user.home}/.m2/) - Tools like Eclipse are searching it in this directory
To access to the Oracle Maven Repositoy - maven.oracle.com you need an user and a password, if you are already registered on OTNOracle Technology Network you can use the same user and password.

For the autentication we need to use HTTP Wagon, this is already inside Maven:

You must verify that the Maven that you are using has in his lib directory the wagon-http-shared-x.xx.jar and that the version (x.xx) is > 2.8

For examples I have installed Maven 3.3.9 and I'm using wagon-http-shared-2.10.jar.


If you are using an old version of Maven you cal download the HTTP Wagon (2.8) from [HERE] and put the jar in MAVEN_HOME/lib/ext/.

This is a sample of minimal pom.xml that you must use for example to get from the remote maven.oracle.com the ojdbc7.jar version 12.1.0.2

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  <modelVersion>4.0.0</modelVersion>  
  <groupId>demo</groupId>  
  <artifactId>maven1</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <repositories>  
   <repository>  
    <id>maven.oracle.com</id>  
    <releases>  
     <enabled>true</enabled>  
    </releases>  
    <snapshots>  
     <enabled>false</enabled>  
    </snapshots>  
    <url>https://maven.oracle.com</url>  
    <layout>default</layout>  
   </repository>  
  </repositories>  
  <pluginRepositories>  
   <pluginRepository>  
    <id>maven.oracle.com</id>  
    <url>https://maven.oracle.com</url>  
   </pluginRepository>  
  </pluginRepositories>  
  <dependencies>  
   <dependency>   
    <groupId>com.oracle.jdbc</groupId>   
    <artifactId>ojdbc7</artifactId>   
    <version>12.1.0.2</version>   
   </dependency>  
  </dependencies>  
 </project>  

You must write also a settings.xml where you must insert your user and password:

edit your settings.xml that is inside the directory MAVEN_HOME/conf

  <!-- servers  
   | This is a list of authentication profiles, keyed by the server-id used within the system.  
   | Authentication profiles can be used whenever maven must make a connection to a remote server.  
   |-->  
  <servers>  
   <server>  
   <id>maven.oracle.com</id>  
   <username>username</username>  
   <password>password</password>  
   <configuration>  
    <basicAuthScope>  
     <host>ANY</host>  
     <port>ANY</port>  
     <realm>OAM 11g</realm>  
    </basicAuthScope>  
    <httpConfiguration>  
     <all>  
      <params>  
       <property>  
        <name>http.protocol.allow-circular-redirects</name>  
        <value>%b,true</value>  
       </property>  
      </params>  
     </all>  
    </httpConfiguration>  
   </configuration>  
   </server>  
  </servers>  

That's all :)

Now some Tips & Tricks:
  1. Setting a proxy in Maven
  2. Setting your Maven installation on Eclipse
  3. Browsing the remote maven.oracle.com
- [1] - If you are using a proxy update the pre-configured part <proxies>...</proxies> in the file settings.xml

- [2] - If you are working with Eclipse and you have also maven installed it is convenient to says to Eclipse to use your maven installation and not the embedded one. 

How to use from Eclipse an external maven installation:

I have created a simple maven project and I have dragged inside the previous described pom.xml file with the ojdbc7 dependency:


Righy click with the mouse on the pom.xml file and select: Run As-> Maven build ...
Choose a name (maven1 - package) and a Goal (package):
As you can see we are using the embedded Maven Runtime, click on Configure to change it:


Click the Add button:


Select the Directory where you have installed Maven on your local disk:
Click on Finish:


Check only the local maven installation:
Click on Apply then on OK:


Now your maven Runtime is changed, you can click on Run to execute the package goal:


In the console you can see that you are dowloading some files:


If you go in the ${user.home}/.m2/repository/ directory you can find what you have downloaded:


- [2] - How to browse the remote maven.oracle.com:

I suggest to use: Nexus Repository OSS - I have downloaded and installed the version : nexus-2.12.1-01-bundle.zip (light, fast and simple)

Unzip it in a directory:


Go into the directory nexus-2.12.1-01:
Open a Command Console and execute "nexus console", this will start an http server on port 8081:


Open in a Broser the URL: http://localhost:8081/nexus


Login with the default user admin/admin123:


Click the Add button and select Add Proxy Repository:


Copy the following configuration (next 2 images) and insert your OTN User and Password:



Now you can browse the repository maven.oracle.com:


You can also search on it, try to search ojdbc7:


</end>