Assumptions

The environment consists of four (4) nodes with JLupin Platform installed:

  • demoapp1 (10.2.3.11)
  • demoapp2 (10.2.3.12)
  • demoapp3 (10.2.3.13)
  • demoapp4 (10.2.3.14)

and five (5) prepared for deployment microservices: from m1 to m5.

The management tasks is done through centrally hosted JLupin Control Center on Linux type server (separated from JLupin Platform nodes).

Use cases

Creating user with admin privileges

1) Login as 'user_admin' (default password: user_admin)

[demouser@demowww1 ~]$ console
Your username: user_admin
Your password: 

+-----------------------------------------------------------+
| Welcome to JLupin Control Center CLI Console 1.6.1.0-beta |
+-----------------------------------------------------------+

NOTICE: The verbose mode is on, if you would like to turned it off please execute 'verbose off' command.

user_admin@/jlupin/zone/default>

2) Create user with proper role (admin)

user_admin@/jlupin/zone/> user create admin1 MASTER_ADMIN
Password:
Repeat password:
user_admin@/jlupin/zone/> user list
Username    Role
admin1      MASTER_ADMIN
user_admin  USER_ADMIN

Preparing the infrastructure: one zone, four nodes

1) Login with administration privileges:

user_admin@/jlupin/zone/> exit
[demouser@demowww1 ~]$ console
Your username: admin1
Your password:

+-----------------------------------------------------------+
| Welcome to JLupin Control Center CLI Console 1.6.1.0-beta |
+-----------------------------------------------------------+

NOTICE: The verbose mode is on, if you would like to turned it off please execute 'verbose off' command.

admin1@/jlupin/zone/default>

2) Create zone 'zone_a'

admin1@/jlupin/zone/default> zone list
Zone     #Nodes
default  0
admin1@/jlupin/zone/default> zone create zone_a
Zone created: zone_a
admin1@/jlupin/zone/default> zone list
Zone     #Nodes
default  0
zone_a   0

3) Connect the nodes (demoapp1 - demoapp4):

admin1@/jlupin/zone/default> verbose off
Verbose mode: off
admin1@/jlupin/zone/default> cd ../zone_a

admin1@/jlupin/zone/zone_a> node connect 10.2.3.11
Node connected: demoapp1
admin1@/jlupin/zone/zone_a> node connect 10.2.3.12
Node connected: demoapp2
admin1@/jlupin/zone/zone_a> node connect 10.2.3.13
Node connected: demoapp3
admin1@/jlupin/zone/zone_a> node connect 10.2.3.14
Node connected: demoapp4

admin1@/jlupin/zone/zone_a> zone list
Zone     #Nodes
default  0
zone_a   4

admin1@/jlupin/zone/zone_a> node status
Zone    Node      IP address  Status
zone_a  demoapp1  10.2.3.11   ENABLED
zone_a  demoapp2  10.2.3.12   ENABLED
zone_a  demoapp3  10.2.3.13   ENABLED
zone_a  demoapp4  10.2.3.14   ENABLED

4) Check the load balancers' configuration:

admin1@/jlupin/zone/zone_a/> node peers
SrcZone SrcNode  SrcIPAddress Zone   Node     IP address Comm Ports
zone_a  demoapp1 10.2.3.11    zone_a demoapp1 localhost  9090,9095,9096,9097
zone_a  demoapp2 10.2.3.12    zone_a demoapp2 localhost  9090,9095,9096,9097
zone_a  demoapp3 10.2.3.13    zone_a demoapp3 localhost  9090,9095,9096,9097
zone_a  demoapp4 10.2.3.14    zone_a demoapp4 localhost  9090,9095,9096,9097

It means that none of the microservices on the given node is able to communication through load balancers with microservices located on other nodes (Only local communication is allowed). The zone connect zone_a * zone_a * command updates nodes configuration within the zone to establish full mesh communication pattern.

5) Activate the nodes in the zone zone_a:

admin1@/jlupin/zone/zone_a> zone connect zone_a * zone_a *
demoapp1: Configuration successfully updated
demoapp2: Configuration successfully updated
demoapp3: Configuration successfully updated
demoapp4: Configuration successfully updated
Zone connected.

admin1@/jlupin/zone/zone_a> node peers
SrcZone SrcNode  SrcIPAddress Zone   Node     IP address Comm Ports
zone_a  demoapp1 10.2.3.11    zone_a demoapp1 127.0.0.1  9090,9095,9096,9097
zone_a  demoapp1 10.2.3.11    zone_a demoapp2 10.2.3.12  9090,9095,9096,9097
zone_a  demoapp1 10.2.3.11    zone_a demoapp3 10.2.3.13  9090,9095,9096,9097
zone_a  demoapp1 10.2.3.11    zone_a demoapp4 10.2.3.14  9090,9095,9096,9097
zone_a  demoapp2 10.2.3.12    zone_a demoapp2 127.0.0.1  9090,9095,9096,9097
zone_a  demoapp2 10.2.3.12    zone_a demoapp1 10.2.3.11  9090,9095,9096,9097
zone_a  demoapp2 10.2.3.12    zone_a demoapp3 10.2.3.13  9090,9095,9096,9097
zone_a  demoapp2 10.2.3.12    zone_a demoapp4 10.2.3.14  9090,9095,9096,9097
zone_a  demoapp3 10.2.3.13    zone_a demoapp3 127.0.0.1  9090,9095,9096,9097
zone_a  demoapp3 10.2.3.13    zone_a demoapp1 10.2.3.11  9090,9095,9096,9097
zone_a  demoapp3 10.2.3.13    zone_a demoapp2 10.2.3.12  9090,9095,9096,9097
zone_a  demoapp3 10.2.3.13    zone_a demoapp4 10.2.3.14  9090,9095,9096,9097
zone_a  demoapp4 10.2.3.14    zone_a demoapp4 127.0.0.1  9090,9095,9096,9097
zone_a  demoapp4 10.2.3.14    zone_a demoapp1 10.2.3.11  9090,9095,9096,9097
zone_a  demoapp4 10.2.3.14    zone_a demoapp2 10.2.3.12  9090,9095,9096,9097
zone_a  demoapp4 10.2.3.14    zone_a demoapp3 10.2.3.13  9090,9095,9096,9097

Now, every node in the zone is able to communicate with any other node in the zone.

Deploying microservices

We are going to deploy four microservices (m1 - m4) on every node in the zone.

1) Check the current environment's configuration

admin1@/jlupin/zone/zone_a> node list
Zone   Name     IPAddress Version #Micro
zone_a demoapp1 10.2.3.11 1.0     0
zone_a demoapp2 10.2.3.12 1.0     0
zone_a demoapp3 10.2.3.13 1.0     0
zone_a demoapp4 10.2.3.14 1.0     0

admin1@/jlupin/zone/zone_a> microservice list
Zone Node Microservice Type Version #Services Context

2) Deploy the first microservice (m1)

admin1@/jlupin/zone/zone_a> microservice upload m1.zip *
Uploading zip file m1.zip.
m1@demoapp1: Microservice uploaded correctly.
m1@demoapp2: Microservice uploaded correctly.
m1@demoapp3: Microservice uploaded correctly.
m1@demoapp4: Microservice uploaded correctly.
>> m1.zip <<

>> microserviceName <<

m1

>> nodes <<

>> demoapp1 <<

uploaded: true

>> demoapp2 <<

uploaded: true

>> demoapp3 <<

uploaded: true

>> demoapp4 <<

uploaded: true

3) Check the current environment's configuration and microservice details

admin1@/jlupin/zone/zone_a> microservice list
Zone   Node     Microservice Type   Version #Services Context
zone_a demoapp1 m1           native 1.0     3         /jlupin/zone/zone_a/demoapp1/m1
zone_a demoapp2 m1           native 1.0     3         /jlupin/zone/zone_a/demoapp2/m1
zone_a demoapp3 m1           native 1.0     3         /jlupin/zone/zone_a/demoapp3/m1
zone_a demoapp4 m1           native 1.0     3         /jlupin/zone/zone_a/demoapp4/m1

admin1@/jlupin/zone/zone_a> microservice status
Zone   Node     Microservice ProcessID Status   Available Activated
zone_a demoapp1 m1           5001      STOPPED* no        yes
zone_a demoapp2 m1           5002      STOPPED* no        yes
zone_a demoapp3 m1           5003      STOPPED* no        yes
zone_a demoapp4 m1           5004      STOPPED* no        yes

admin1@/jlupin/zone/zone_a> microservice details m1
Zone   Node     Microservice Service
zone_a demoapp1 m1           animalsRMCSeleuciaService
zone_a demoapp1 m1           animalsROASeleuciaService
zone_a demoapp1 m1           digestService

4) Start the m1 microservice on all nodes

admin1@/jlupin/zone/zone_a> microservice start m1
Are you sure you want to start microservice 'm1' on all nodes in the zone 'zone_a'? (Y/N): y
Updating microservices on demoapp1:
m1@demoapp1: Microservice started correctly.
Updating microservices on demoapp2:
m1@demoapp2: Microservice started correctly.
Updating microservices on demoapp3:
m1@demoapp3: Microservice started correctly.
Updating microservices on demoapp4:
m1@demoapp4: Microservice started correctly.
>> m1@demoapp1 <<

started: yes

>> m1@demoapp2 <<

started: yes

>> m1@demoapp3 <<

started: yes

>> m1@demoapp4 <<

started: yes


admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m1           5001      RUNNING no        yes
zone_a demoapp2 m1           5002      RUNNING no        yes
zone_a demoapp3 m1           5003      RUNNING no        yes
zone_a demoapp4 m1           5004      RUNNING no        yes

5) Deploy the rest of the microservices (m2-m4) - follow the instructions from point 2 to 4 for each microservice.

6) Check the current environment's configuration after deployment

admin1@/jlupin/zone/zone_a> microservice status
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m1           5001      RUNNING no        yes
zone_a demoapp1 m2           5002      RUNNING no        yes
zone_a demoapp1 m3           5003      RUNNING no        yes
zone_a demoapp1 m4           5004      RUNNING no        yes
zone_a demoapp2 m1           5005      RUNNING no        yes
zone_a demoapp2 m2           5006      RUNNING no        yes
zone_a demoapp2 m3           5007      RUNNING no        yes
zone_a demoapp2 m4           5008      RUNNING no        yes
zone_a demoapp3 m1           5009      RUNNING no        yes
zone_a demoapp3 m2           5010      RUNNING no        yes
zone_a demoapp3 m3           5011      RUNNING no        yes
zone_a demoapp3 m4           5012      RUNNING no        yes
zone_a demoapp4 m1           5013      RUNNING no        yes
zone_a demoapp4 m2           5014      RUNNING no        yes
zone_a demoapp4 m3           5015      RUNNING no        yes
zone_a demoapp4 m4           5016      RUNNING no        yes

Maintenance tasks

1) Check node's configuration

admin1@/jlupin/zone/zone_a> goto demoapp1/
admin1@/jlupin/zone/zone_a/demoapp1> show
>> ATTRIBUTES <<

objectType:       node
name:             demoapp1
address:          10.2.3.11
type:             static
context:          /jlupin/zone/zone_a/demoapp1
transmissionPort: 9096

>> RUNTIME <<

status:            ENABLED
jvmFreeMemory:     0.08 GB
jvmMaxMemory:      0.22 GB
jvmProcessCpuLoad: 3.0
jvmTotalMemory:    0.12 GB

>> CONFIGURATION <<

MAIN_SERVER:location: DC1

2) Check microservice's configuration

admin1@/jlupin/zone/zone_a/demoapp1> cd m1
admin1@/jlupin/zone/zone_a/demoapp1/m1> show
>> ATTRIBUTES <<

objectType: microservice
name:       m1
type:       dynamic
context:    /jlupin/zone/zone_a/demoapp1/m1

>> RUNTIME <<

microType:            native
status:               RUNNING
isAvailable:          yes
jlrmcActiveThreads:   0
jlrmcMaxThreads:      8
jvmFreeMemory:        0.05 GB
jvmMaxMemory:         0.11 GB
jvmProcessCpuLoad:    0.1
jvmTotalMemory:       0.08 GB
pid:                  5001
queueActiveThreads:   0
queueMaxThreads:      8
servicePort:          20000
servletActiveThreads: N/A
servletMaxThreads:    N/A

3) Show specific parameter

admin1@/jlupin/zone/zone_a/demoapp1/m1> show RUNTIME:jvmProcessCpuLoad
jvmProcessCpuLoad: 0.0

4) Change the number of threads for JRMC and memory for JVM

admin1@/jlupin/zone/zone_a/demoapp1/m1> show CONFIGURATION:SERVERS:JLRMC_BINARY:threadPoolSize
SERVERS:JLRMC_BINARY:threadPoolSize: 128
admin1@/jlupin/zone/zone_a/demoapp1/m1> show CONFIGURATION:PROPERTIES:jvmOptions1
PROPERTIES:jvmOptions1: -Xms64M -Xmx128M -Dlog4j.configurationFile=${sys:microservice.dir}/log4j2.xml
admin1@/jlupin/zone/zone_a/demoapp1/m1> set CONFIGURATION:SERVERS:JLRMC_BINARY:threadPoolSize to 256
Attribute CONFIGURATION:SERVERS:JLRMC_BINARY:threadPoolSize set to 256 for object /jlupin/zone/zone_a/demoapp1/m1.
admin1@/jlupin/zone/zone_a/demoapp1/m1> set CONFIGURATION:PROPERTIES:jvmOptions1 to "-Xms256M -Xmx384M-Dlog4j.configurationFile=${sys:microservice.dir}/log4j2.xml"
Attribute CONFIGURATION:PROPERTIES:jvmOptions1 set to -Xms256M -Xmx384M-Dlog4j.configurationFile=${sys:microservice.dir}/log4j2.xml for object /jlupin/zone/zone_a/demoapp1/m1.
admin1@/jlupin/zone/zone_a/demoapp1/m1> microservice restart
Updating microservices on demoapp1:
m1@demoapp1: Microservice restarted correctly.
>> m1@demoapp1 <<

restarted: yes
admin1@/jlupin/zone/zone_a/demoapp1/m1> CONFIGURATION:SERVERS:JLRMC_BINARY:threadPoolSize
SERVERS:JLRMC_BINARY:threadPoolSize: 256
admin1@/jlupin/zone/zone_a/demoapp1/m1> show CONFIGURATION:PROPERTIES:jvmOptions1
PROPERTIES:jvmOptions1: -Xms256M -Xmx384M -Dlog4j.configurationFile=${sys:microservice.dir}/log4j2.xml

5) Upgrade the m1 microservice

Let's assume that we have a new version of m1 microservice archived as m1.zip. We want to deploy it carefully that's why the new version initially will be implemented on one node (ex. demoapp1) and after checking the state of the application (out of the scope of this documentation) - on the rest nodes in the zone.

admin1@/jlupin/zone/zone_a/demoapp1/m1> cd ..
admin1@/jlupin/zone/zone_a/demoapp1> cd ..

admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m1           5001      RUNNING no        yes
zone_a demoapp2 m1           5002      RUNNING no        yes
zone_a demoapp3 m1           5003      RUNNING no        yes
zone_a demoapp4 m1           5004      RUNNING no        yes

admin1@/jlupin/zone/zone_a> microservice upload m1.zip demoapp1
Uploading zip file m1.zip.
m1@demoapp1: Microservice uploaded correctly.
>> m1.zip <<

>> microserviceName <<

m1

>> nodes <<

>> demoapp1 <<

uploaded: true

admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status   Available Activated
zone_a demoapp1 m1           5001      RUNNING* no        yes
zone_a demoapp2 m1           5002      RUNNING  no        yes
zone_a demoapp3 m1           5003      RUNNING  no        yes
zone_a demoapp4 m1           5004      RUNNING  no        yes

The asterisk near the status means that the version of the microservice has been changed. Now we should restart the m1 microservice to activate new version. It will be done completely online due to zero downtime deployment mechanisms.

admin1@/jlupin/zone/zone_a> microservice restart m1 demoapp1
Updating microservices on demoapp1:
m1@demoapp1: Microservice restarted correctly.
>> m1@demoapp1 <<

restarted: yes
admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m1           5001      RUNNING no        yes
zone_a demoapp2 m1           5002      RUNNING no        yes
zone_a demoapp3 m1           5003      RUNNING no        yes
zone_a demoapp4 m1           5004      RUNNING no        yes

(Testing new version)

admin1@/jlupin/zone/zone_a> microservice upload m1.zip demoapp2
Uploading zip file m1.zip.
m1@demoapp2: Microservice uploaded correctly.
>> m1.zip <<

>> microserviceName <<

m1

>> nodes <<

>> demoapp2 <<

uploaded: true

admin1@/jlupin/zone/zone_a> microservice upload m1.zip demoapp3
Uploading zip file m1.zip.
m1@demoapp3: Microservice uploaded correctly.
>> m1.zip <<

>> microserviceName <<

m1

>> nodes <<

>> demoapp3 <<

uploaded: true

admin1@/jlupin/zone/zone_a> microservice upload m1.zip demoapp4
Uploading zip file m1.zip.
m1@demoapp4: Microservice uploaded correctly.
>> m1.zip <<

>> microserviceName <<

m1

>> nodes <<

>> demoapp4 <<

uploaded: true


admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status   Available Activated
zone_a demoapp1 m1           5001      RUNNING  no        yes
zone_a demoapp2 m1           5002      RUNNING* no        yes
zone_a demoapp3 m1           5003      RUNNING* no        yes
zone_a demoapp4 m1           5004      RUNNING* no        yes

admin1@/jlupin/zone/zone_a> microservice restart m1
Are you sure you want to restart microservice 'm1' on all nodes in the zone 'zone_a'? (Y/N): y
Updating microservices on demoapp1:
m1@demoapp1: Microservice restarted correctly.
Updating microservices on demoapp2:
m1@demoapp2: Microservice restarted correctly.
Updating microservices on demoapp3:
m1@demoapp3: Microservice restarted correctly.
Updating microservices on demoapp4:
m1@demoapp4: Microservice restarted correctly.
>> m1@demoapp1 <<

restarted: yes

>> m1@demoapp2 <<

restarted: yes

>> m1@demoapp3 <<

restarted: yes

>> m1@demoapp4 <<

restarted: yes

admin1@/jlupin/zone/zone_a> microservice status m1
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m1           5001      RUNNING no        yes
zone_a demoapp2 m1           5002      RUNNING no        yes
zone_a demoapp3 m1           5003      RUNNING no        yes
zone_a demoapp4 m1           5004      RUNNING no        yes

Automation

1) Create a script file containing the list of commands that you would like to execute in one step. In this use case the goal to upgrade the m2 microservices automatically

jcc_script:

interactive off
verbose off
cd /jlupin/zone/zone_a
microservice upload m2.zip *
microservice restart m2
microservice status m2

And then use 'script run' to execute it:

admin1@/jlupin/zone/> script run jcc_script
Interactive mode: off
Verbose mode: off
Uploading zip file m2.zip.
m2@demoapp1: Microservice uploaded correctly.
m2@demoapp2: Microservice uploaded correctly.
m2@demoapp3: Microservice uploaded correctly.
m2@demoapp4: Microservice uploaded correctly.
>> m2.zip <<

>> microserviceName <<

m2

>> nodes <<

>> demoapp1 <<

uploaded: true

>> demoapp2 <<

uploaded: true

>> demoapp3 <<

uploaded: true

>> demoapp4 <<

uploaded: true
Updating microservices on demoapp1:
m2@demoapp1: Microservice restarted correctly.
Updating microservices on demoapp2:
m2@demoapp2: Microservice restarted correctly.
Updating microservices on demoapp3:
m2@demoapp3: Microservice restarted correctly.
Updating microservices on demoapp4:
m2@demoapp4: Microservice restarted correctly.
>> m2@demoapp1 <<

restarted: yes

>> m2@demoapp2 <<

restarted: yes

>> m2@demoapp3 <<

restarted: yes

>> m2@demoapp4 <<

restarted: yes
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m2           5001      RUNNING no        yes
zone_a demoapp2 m2           5002      RUNNING no        yes
zone_a demoapp3 m2           5003      RUNNING no        yes
zone_a demoapp4 m2           5004      RUNNING no        yes

2) You can also execute commands (and scripts) in non-interactive mode using command-console tool, for example for monitoring purposes. In this case we definitely recommend to create username with minimal privileges (in this example: username = oper1, role = viewer).

[demouser@demowww1 ~]$ console -cm -u oper1 -p <password> show RUNTIME:jvmProcessCpuLoad /jlupin/zone/zone_a/demoapp1/m1
jvmProcessCpuLoad: 0.1

3) You can also execute 'script run' command using command-console.

[demouser@demowww1 ~]$ console -cm -u admin1 -p <password> script run jcc_script
Interactive mode: off
Verbose mode: off
Uploading zip file m2.zip.
m2@demoapp1: Microservice uploaded correctly.
m2@demoapp2: Microservice uploaded correctly.
m2@demoapp3: Microservice uploaded correctly.
m2@demoapp4: Microservice uploaded correctly.
>> m2.zip <<

>> microserviceName <<

m2

>> nodes <<

>> demoapp1 <<

uploaded: true

>> demoapp2 <<

uploaded: true

>> demoapp3 <<

uploaded: true

>> demoapp4 <<

uploaded: true
Updating microservices on demoapp1:
m2@demoapp1: Microservice restarted correctly.
Updating microservices on demoapp2:
m2@demoapp2: Microservice restarted correctly.
Updating microservices on demoapp3:
m2@demoapp3: Microservice restarted correctly.
Updating microservices on demoapp4:
m2@demoapp4: Microservice restarted correctly.
>> m2@demoapp1 <<

restarted: yes

>> m2@demoapp2 <<

restarted: yes

>> m2@demoapp3 <<

restarted: yes

>> m2@demoapp4 <<

restarted: yes
Zone   Node     Microservice ProcessID Status  Available Activated
zone_a demoapp1 m2           5001      RUNNING no        yes
zone_a demoapp2 m2           5002      RUNNING no        yes
zone_a demoapp3 m2           5003      RUNNING no        yes
zone_a demoapp4 m2           5004      RUNNING no        yes