Dans cet article, je vais vous montrer comment vous pouvez facilement conteneuriser les passerelles .Net/Java.
Pour notre exemple, nous allons développer une intégration avec [Apache Kafka](https://kafka.apache.org/).
Et pour interopérer avec le code Java/.Net, nous utiliserons [PEX](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=EPEX).
## Architecture
Notre solution fonctionnera entièrement dans docker et ressemblera à ceci :
![](https://raw.githubusercontent.com/intersystems-community/pex-demo/master/architecture.PNG)
## Passerelle Java
Tout d'abord, nous allons développer l'opération Java pour envoyer des messages dans Kafka. Le code peut être écrit dans l'IDE de votre choix et il peut [ressembler à ceci](https://github.com/intersystems-community/pex-demo/blob/master/java/src/dc/rmq/KafkaOperation.java).
En bref :
* Pour développer une nouvelle opération commerciale PEX, nous devons implémenter la classe abstraite com.intersystems.enslib.pex.BusinessOperation
* Les propriétés publiques sont les paramètres de l'hôte de l'entreprise
* La méthode OnInit est utilisée pour initier la connexion à Kafka et obtenir un pointeur vers InterSystems IRIS
* OnTearDown est utilisé pour se déconnecter de Kafka (à l'arrêt du processus)
* OnMessage reçoit le [message dc.KafkaRequest](https://github.com/intersystems-community/pex-demo/blob/master/iris/src/dc/KafkaRequest.cls) et l'envoie à Kafka
Maintenant, plaçons-le dans Docker !
Voici notre [dockerfile](https://github.com/intersystems-community/pex-demo/blob/master/java/Dockerfile) :
FROM openjdk:8 AS builder
ARG APP_HOME=/tmp/app
COPY src $APP_HOME/src
COPY --from=intersystemscommunity/jgw:latest /jgw/*.jar $APP_HOME/jgw/
WORKDIR $APP_HOME/jar/
ADD https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/2.5.0/kafka-clients-2.5.0.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar .
ADD https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar .
WORKDIR $APP_HOME/src
RUN javac -classpath $APP_HOME/jar/*:$APP_HOME/jgw/* dc/rmq/KafkaOperation.java && \
jar -cvf $APP_HOME/jar/KafkaOperation.jar dc/rmq/KafkaOperation.class
FROM intersystemscommunity/jgw:latest
COPY --from=builder /tmp/app/jar/*.jar $GWDIR/
Allons-y ligne par ligne et voyons ce qui se passe ici (je suppose que vous connaissez [les constructions docker à plusieurs niveaux](https://docs.docker.com/develop/develop-images/multistage-build/)) :
FROM openjdk:8 AS builder
Notre image de départ est JDK 8.
ARG APP_HOME=/tmp/app
COPY src $APP_HOME/src
Nous copions nos sources du dossier /src dans le dossier /tmp/app.
COPY --from=intersystemscommunity/jgw:latest /jgw/*.jar $APP_HOME/jgw/
Nous copions les sources de la passerelle Java dans le dossier /tmp/app/jgw.
WORKDIR $APP_HOME/jar/
ADD https://repo1.maven.org/maven2/org/apache/kafka/kafka-clients/2.5.0/kafka-clients-2.5.0.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar .
ADD https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar .
ADD https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar .
WORKDIR $APP_HOME/src
RUN javac -classpath $APP_HOME/jar/*:$APP_HOME/jgw/* dc/rmq/KafkaOperation.java && \
jar -cvf $APP_HOME/jar/KafkaOperation.jar dc/rmq/KafkaOperation.class
Maintenant toutes les dépendances sont ajoutées et javac/jar est appelé pour compiler le fichier jar. Pour un projet concret, il est préférable d'utiliser maven ou gradle.
FROM intersystemscommunity/jgw:latest
COPY --from=builder /tmp/app/jar/*.jar $GWDIR/
Et enfin, les jars sont copiés dans l'image de base jgw (l'image de base se charge également du démarrage de la passerelle et des tâches connexes).
## Passerelle .Net
Vient ensuite le service .Net qui recevra les messages de Kafka. Le code peut être écrit dans l'IDE de votre choix et il peut [ressembler à ceci](https://github.com/intersystems-community/pex-demo/blob/master/dotnet/KafkaConsumer.cs).
En bref :
* Pour développer un nouveau service d'entreprise PEX nous devons implémenter la classe abstraite InterSystems.EnsLib.PEX.BusinessService
* Les propriétés publiques sont les paramètres de l'hôte de l'entreprise
* La méthode OnInit est utilisée pour établir une connexion avec Kafka, s'abonner à des sujets et obtenir un pointeur vers InterSystems IRIS
* OnTearDown est utilisé pour se déconnecter de Kafka (à l'arrêt du processus)
* OnMessage consomme les messages de Kafka et envoie des messages Ens.StringContainer aux autres hôtes d'Interoperability
Maintenant, plaçons-le dans Docker !
Voici notre [dockerfile](https://github.com/intersystems-community/pex-demo/blob/master/dotnet/Dockerfile) :
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
ENV ISC_PACKAGE_INSTALLDIR /usr/irissys
ENV GWLIBDIR lib
ENV ISC_LIBDIR ${ISC_PACKAGE_INSTALLDIR}/dev/dotnet/bin/Core21
WORKDIR /source
COPY --from=store/intersystems/iris-community:2020.2.0.211.0 $ISC_LIBDIR/*.nupkg $GWLIBDIR/
# copier csproj et restaurer en tant que couches distinctes
COPY *.csproj ./
RUN dotnet restore
# copier et publier l'application et les bibliothèques
COPY . .
RUN dotnet publish -c release -o /app
# étape/image finale
FROM mcr.microsoft.com/dotnet/core/runtime:2.1
WORKDIR /app
COPY --from=build /app ./
# Configurations pour démarrer le serveur passerelle
RUN cp KafkaConsumer.runtimeconfig.json IRISGatewayCore21.runtimeconfig.json && \
cp KafkaConsumer.deps.json IRISGatewayCore21.deps.json
ENV PORT 55556
CMD dotnet IRISGatewayCore21.dll $PORT 0.0.0.0
Allons-y ligne par ligne :
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
Nous utilisons le SDK complet .Net Core 2.1 pour construire notre application.
ENV ISC_PACKAGE_INSTALLDIR /usr/irissys
ENV GWLIBDIR lib
ENV ISC_LIBDIR ${ISC_PACKAGE_INSTALLDIR}/dev/dotnet/bin/Core21
WORKDIR /source
COPY --from=store/intersystems/iris-community:2020.2.0.211.0 $ISC_LIBDIR/*.nupkg $GWLIBDIR/
Copiez .Net Gateway NuGets de l'image Docker officielle d'InterSystems dans notre image de constructeur
# copier csproj et restaurer comme couches distinctes
COPY *.csproj ./
RUN dotnet restore
# copier et publier l'application et les bibliothèques
COPY . .
RUN dotnet publish -c release -o /app
Construisez notre bibliothèque.
# étape/image finale
FROM mcr.microsoft.com/dotnet/core/runtime:2.1
WORKDIR /app
COPY --from=build /app ./
Copiez les dll de la bibliothèque dans le conteneur final que nous exécuterons réellement.
# Configurats pour démarrer le serveur Gateway
RUN cp KafkaConsumer.runtimeconfig.json IRISGatewayCore21.runtimeconfig.json && \
cp KafkaConsumer.deps.json IRISGatewayCore21.deps.json
Actuellement, la passerelle .Net doit charger toutes les dépendances au démarrage, nous lui faisons donc connaître toutes les dépendances possibles.
ENV PORT 55556
CMD dotnet IRISGatewayCore21.dll $PORT 0.0.0.0
Démarrez la passerelle sur le port 55556 en écoutant sur toutes les interfaces.
Et voilà, c'est tout !
Voici un [docker-compose](https://github.com/intersystems-community/pex-demo/blob/master/docker-compose.yml) complet pour que tout fonctionne (y compris Kafka et Kafka UI pour voir les messages).
Pour exécuter la démo, vous dever :
1. Installer :
* docker
* docker-compose
* git
2. Exécuter :
git clone https://github.com/intersystems-community/pex-demo.git cd pex-demo docker-compose pull docker-compose up -d
**Avis important** : Les bibliothèques Java Gateway et .Net Gateway DOIVENT provenir de la même version que le client InterSystems IRIS.