Chris Bailey STSM, Runtime Technologies Enterprise Node.js: Build, Deploy and Scale
: Key Technologies
: Key Technologies Container
: Key Technologies Container Orchestration
: Key Technologies Container Orchestration Package and Deploy
: Key Technologies Container Orchestration MonitoringPackage and Deploy
: Key Technologies Container Orchestration Monitoring Distributed TracingPackage and Deploy
MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 0 1,150 IO Speed • Performance • Scale MICROSERVICES: Key Performance Characteristics
0 300 600 900 200 0 1,150 IO Speed • Performance • Scale MICROSERVICES: Key Performance Characteristics
0 300 600 900 200 897 1,150 MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 Startup • Availability • Scaling MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 00.9 Startup • Availability • Scaling MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 13.7 0.9 Startup • Availability • Scaling MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 13.7 0.9 Startup • Availability • Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 13.7 0.9 023.6 Startup • Availability • Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
0 300 600 900 200 897 1,150 13.7 0.9 422 23.6 Startup • Availability • Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
Startup • Availability • Scaling Memory • Efficiency • Cost IO Speed • Performance • Scale Release to Release Performance Gains
Startup • Availability • Scaling Memory • Efficiency • Cost 3,049 2,914 2,076 1,866 4.x master6.x 8.x Release to Release Performance Gains IO Speed • Performance • Scale
Startup • Availability • Scaling Memory • Efficiency • Cost 50,42052,640 42,500 71,000 3,049 2,914 2,076 1,866 4.x master6.x 8.x 4.x master6.x 8.x IO Speed • Performance • Scale Release to Release Performance Gains
Startup • Availability • Scaling Memory • Efficiency • Cost 50,42052,640 42,500 71,000 89,024 92,84091,47688,9603,049 2,914 2,076 1,866 4.x master6.x 8.x 4.x master6.x 8.x 4.x master6.x 8.x IO Speed • Performance • Scale Release to Release Performance Gains
Building Scalable Microservices
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore LoopBack/
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore const appName = require('./../package').name; const express = require('express'); const log4js = require(‘log4js'); const logger = log4js.getLogger(appName); const app = express(); app.get('/', function (req, res) { res.send('Hello World!') }) const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); }); LoopBack/
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore FROM ibmcom/ibmnode ENV NODE_ENV production ENV PORT 3000 WORKDIR "/app" # Install app dependencies COPY package.json /app/ RUN cd /app; npm install # Bundle app source COPY . /app EXPOSE 3000 CMD ["npm", "start"]
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore node_modules/ npm-debug.log
$ docker build -t <your username>/node-app .

$ docker build -t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
$ docker build -t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
$ docker build -t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: v1 description: A Helm chart for Kubernetes name: node-app version: 1.0.0
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: extensions/v1beta1 kind: Deployment metadata: name: “node-app-deployment" labels: chart: “node-app-1.0.0” spec: replicas: “5” revisionHistoryLimit: “1” template: metadata: labels: app: “node-app-selector" version: “1.0.0” spec: containers: - name: “node-app” image: “repository:1.0.0” imagePullPolicy: Always livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 3000 periodSeconds: 1000 resources: requests: cpu: "200m" memory: "300Mi" env: - name: PORT value : “3000”
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: autoscaling/v2alpha1 kind: HorizontalPodAutoscaler metadata: name: “node-app-hpa-policy" namespace: default spec: scaleTargetRef: apiVersion: apps/v1beta1 kind: Deployment name: “node-app-deployment" minReplicas: 5 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 70 - type: Resource resource: name: memory targetAverageUtilization: 70
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: v1 kind: Service metadata: name: “node-app“ labels: chart: “node-app-1.0.0” spec: type: NodePort ports: - port: 3000 selector: app: “node-app-selector"
$ helm package ./chart/node-app
$ helm package ./chart/node-app $ helm install ./node-app-1.0.0.tgz
$ helm package ./chart/node-app $ helm install ./node-app-1.0.0.tgz
$ helm package ./chart/node-app $ helm install ./node-app-1.0.0.tgz
Deploying Scalable Microservices
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile #!groovy @Library('MicroserviceBuilder') _ microserviceBuilderPipeline { image = 'node-frontend' }
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml DevOps
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml stages: - name: Build Stage inputs: - type: git branch: master service: ${REPO} jobs: - name: Build type: builder artifact_dir : '' - name: Deploy Stage inputs: - type: job stage: Build Stage job: Build triggers: - type: stage jobs: - name: Deploy type: deployer target: region_id: ${REGION_ID} organization: ${ORGANIZATION} space: ${SPACE} application: ${APP} script: |- #!/bin/bash DevOps
func add(_ a: Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml version: 0.2 required: - deploy - repo toolchain: name: node-app # Github repos repo: service_id: hostedgit parameters: repo_url: "{{zip_url}}" repo_name: "{{toolchain.name}}" type: clone has_issues: true enable_traceability: true # Pipelines build: service_id: pipeline parameters: name: "{{name}}" ui-pipeline: true configuration: content: $file(pipeline.yml) env: DevOps
Understanding Microservices Performance
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
PUBLIC NETWORK CLOUD NETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
BROWSER TIME
BROWSER LOAD BALANCER TIME
BROWSER LOAD BALANCER WEB BFF TIME
BROWSER LOAD BALANCER WEB BFF ORDER SERVICE TIME
BROWSER LOAD BALANCER WEB BFF ORDER SERVICE MongoDB TIME
BROWSER LOAD BALANCER WEB BFF ORDER SERVICE MongoDB INVENTORY SERVICE TIME
MySQL BROWSER LOAD BALANCER WEB BFF ORDER SERVICE MongoDB INVENTORY SERVICE TIME
MySQL BROWSER LOAD BALANCER WEB BFF ORDER SERVICE MongoDB INVENTORY SERVICE MongoDB TIME
• Collects data from each enabled service
 • Propagates correlation ID using HTTP headers
 • Provides sampling, tracing, and debug capabilities • Collects microsecond timestamps
 • Correlates data in Zipkin server • Presents data in Zipkin dashboard Request Tracking: OpenTracing and Zipkin
const zipkin = require(‘appmetrics-zipkin’); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); });
• Collects data from each enabled service
 • Requires /metrics endpoint providing data
 • Provides storage and correlation capabilities • Provide customisable dashboard
 • Integrates with Graphana, Graphite, etc Microservice Metrics: Prometheus
const zipkin = require(‘appmetrics-zipkin’); const prometheus = require(‘appmetrics-prometheus’).attach(); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); });
• ‘appmetrics-dash’ provides self-hosted monitoring
 • Inbound and Outbound request performance • Resource and event loop monitoring • Request a node-report
 • Enable profiling and flame graphs Deep Analysis: ‘appmetrics-dash’ and Flame Graphs
const zipkin = require(‘appmetrics-zipkin’); const prometheus = require(‘appmetrics-prometheus’).attach(); const dash = require(‘appmetrics-dash’).attach(); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); }); ‘appmetrics-dash’
‘appmetrics-dash’
‘appmetrics-dash’
$ yo nodeserver$ yo nodeserver
DEMO
Common Microservices Approach
Config Fault Tolerance Health Check Health Metrics JWT Propagation externalize configuration to improve portability build robust behavior to cope with unexpected failures common format to determine service availability common REST endpoints for monitoring service health interoperable authentication and role- based access control
Config Fault Tolerance Health Check Health Metrics JWT Propagation externalize configuration to improve portability build robust behavior to cope with unexpected failures common format to determine service availability common REST endpoints for monitoring service health interoperable authentication and role- based access control ibm-cloud-env hystrix-js /health appmetrics-prometheus jsonwebtoken
Microservice Builder for Java: From development to production Development Deployment Runtime Liberty App Accelerator MicroProfile Programming Model Developer CLI Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree
Development Deployment Runtime Liberty App Accelerator Developer CLI Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Microservice Builder for Node.js: From development to production
Development Deployment Runtime Liberty App Accelerator Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Developer CLI (yo nodeserver or IDT) Microservice Builder for Node.js: From development to production
Development Deployment Runtime Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Developer CLI (yo nodeserver or IDT) Cloud App Service Microservice Builder for Node.js: From development to production
Development Deployment Runtime Cloud App Service Express or Loopback Frameworks Developer CLI (yo nodeserver or IDT) Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with IBM Advanced Support for Runtimes or IBM Cloud PrivateFree LoopBack Microservice Builder for Node.js: From development to production
Enterprise Support
85 IBM Foundation Support for Runtimes generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes Enterprise Support: Node.js Runtime
86 LoopBack IBM Foundation Support for Runtimes generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes IBM Advanced Support for Runtime Frameworks Enterprise Support: Frameworks
87 LoopBack IBM Foundation Support for Runtimes IBM Advanced Support for Runtime Frameworks generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes Enterprise Support: Module Ecosystem
developer.ibm.com/node

IBM Cloud University: Build, Deploy and Scale Node.js Microservices

  • 1.
    Chris Bailey STSM, RuntimeTechnologies Enterprise Node.js: Build, Deploy and Scale
  • 2.
  • 3.
  • 4.
  • 5.
    : Key Technologies ContainerOrchestration Package and Deploy
  • 6.
    : Key Technologies ContainerOrchestration MonitoringPackage and Deploy
  • 7.
    : Key Technologies ContainerOrchestration Monitoring Distributed TracingPackage and Deploy
  • 8.
    MICROSERVICES: Key PerformanceCharacteristics IO Speed • Performance • Scale
  • 9.
    0 300 600 900 200 0 1,150 IO Speed • Performance •Scale MICROSERVICES: Key Performance Characteristics
  • 10.
    0 300 600 900 200 0 1,150 IO Speed • Performance •Scale MICROSERVICES: Key Performance Characteristics
  • 11.
    0 300 600 900 200 897 1,150 MICROSERVICES: Key PerformanceCharacteristics IO Speed • Performance • Scale
  • 12.
    0 300 600 900 200 897 1,150 Startup • Availability • Scaling MICROSERVICES:Key Performance Characteristics IO Speed • Performance • Scale
  • 13.
    0 300 600 900 200 897 1,150 00.9 Startup • Availability • Scaling MICROSERVICES:Key Performance Characteristics IO Speed • Performance • Scale
  • 14.
    0 300 600 900 200 897 1,150 13.7 0.9 Startup • Availability •Scaling MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
  • 15.
    0 300 600 900 200 897 1,150 13.7 0.9 Startup • Availability •Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
  • 16.
    0 300 600 900 200 897 1,150 13.7 0.9 023.6 Startup •Availability • Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
  • 17.
    0 300 600 900 200 897 1,150 13.7 0.9 422 23.6 Startup • Availability •Scaling Memory • Efficiency • Cost MICROSERVICES: Key Performance Characteristics IO Speed • Performance • Scale
  • 18.
    Startup • Availability • Scaling Memory •Efficiency • Cost IO Speed • Performance • Scale Release to Release Performance Gains
  • 19.
    Startup • Availability • Scaling Memory •Efficiency • Cost 3,049 2,914 2,076 1,866 4.x master6.x 8.x Release to Release Performance Gains IO Speed • Performance • Scale
  • 20.
    Startup • Availability • Scaling Memory •Efficiency • Cost 50,42052,640 42,500 71,000 3,049 2,914 2,076 1,866 4.x master6.x 8.x 4.x master6.x 8.x IO Speed • Performance • Scale Release to Release Performance Gains
  • 21.
    Startup • Availability • Scaling Memory •Efficiency • Cost 50,42052,640 42,500 71,000 89,024 92,84091,47688,9603,049 2,914 2,076 1,866 4.x master6.x 8.x 4.x master6.x 8.x 4.x master6.x 8.x IO Speed • Performance • Scale Release to Release Performance Gains
  • 22.
  • 23.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore LoopBack/
  • 24.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore const appName = require('./../package').name; const express = require('express'); const log4js = require(‘log4js'); const logger = log4js.getLogger(appName); const app = express(); app.get('/', function (req, res) { res.send('Hello World!') }) const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); }); LoopBack/
  • 25.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore
  • 26.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore FROM ibmcom/ibmnode ENV NODE_ENV production ENV PORT 3000 WORKDIR "/app" # Install app dependencies COPY package.json /app/ RUN cd /app; npm install # Bundle app source COPY . /app EXPOSE 3000 CMD ["npm", "start"]
  • 27.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore node_modules/ npm-debug.log
  • 28.
    $ docker build-t <your username>/node-app .

  • 29.
    $ docker build-t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
  • 30.
    $ docker build-t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
  • 31.
    $ docker build-t <your username>/node-app .
 $ docker run -p 49160:3000 -d <your username>/node-app
  • 32.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS
  • 33.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: v1 description: A Helm chart for Kubernetes name: node-app version: 1.0.0
  • 34.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: extensions/v1beta1 kind: Deployment metadata: name: “node-app-deployment" labels: chart: “node-app-1.0.0” spec: replicas: “5” revisionHistoryLimit: “1” template: metadata: labels: app: “node-app-selector" version: “1.0.0” spec: containers: - name: “node-app” image: “repository:1.0.0” imagePullPolicy: Always livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 3000 periodSeconds: 1000 resources: requests: cpu: "200m" memory: "300Mi" env: - name: PORT value : “3000”
  • 35.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: autoscaling/v2alpha1 kind: HorizontalPodAutoscaler metadata: name: “node-app-hpa-policy" namespace: default spec: scaleTargetRef: apiVersion: apps/v1beta1 kind: Deployment name: “node-app-deployment" minReplicas: 5 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 70 - type: Resource resource: name: memory targetAverageUtilization: 70
  • 36.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Dockerfile Dockerfile-tools .dockerignore chart/node-app/Chart.yaml chart/node-app/templates/deployment.yaml chart/node-app/templates/hpa.yaml chart/node-app/templates/service.yaml chart/node-app/values.yaml HELM CHARTS apiVersion: v1 kind: Service metadata: name: “node-app“ labels: chart: “node-app-1.0.0” spec: type: NodePort ports: - port: 3000 selector: app: “node-app-selector"
  • 37.
    $ helm package./chart/node-app
  • 38.
    $ helm package./chart/node-app $ helm install ./node-app-1.0.0.tgz
  • 39.
    $ helm package./chart/node-app $ helm install ./node-app-1.0.0.tgz
  • 40.
    $ helm package./chart/node-app $ helm install ./node-app-1.0.0.tgz
  • 41.
  • 42.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile
  • 43.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile #!groovy @Library('MicroserviceBuilder') _ microserviceBuilderPipeline { image = 'node-frontend' }
  • 44.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml DevOps
  • 45.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml stages: - name: Build Stage inputs: - type: git branch: master service: ${REPO} jobs: - name: Build type: builder artifact_dir : '' - name: Deploy Stage inputs: - type: job stage: Build Stage job: Build triggers: - type: stage jobs: - name: Deploy type: deployer target: region_id: ${REGION_ID} organization: ${ORGANIZATION} space: ${SPACE} application: ${APP} script: |- #!/bin/bash DevOps
  • 46.
    func add(_ a:Int, to b: Int) -> Void { print(a + b) } let a = ”5” let b = 3 public/* test/* server/server.js package.json README.md .gitignore Jenkinsfile .bluemix/deploy.json .bluemix/pipeline.yml .bluemix/toolchain.yml version: 0.2 required: - deploy - repo toolchain: name: node-app # Github repos repo: service_id: hostedgit parameters: repo_url: "{{zip_url}}" repo_name: "{{toolchain.name}}" type: clone has_issues: true enable_traceability: true # Pipelines build: service_id: pipeline parameters: name: "{{name}}" ui-pipeline: true configuration: content: $file(pipeline.yml) env: DevOps
  • 47.
  • 48.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 49.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 50.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 51.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 52.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 53.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 54.
    PUBLIC NETWORK CLOUDNETWORK CATALOG ORDER INVENTORY USER MySQL MongoDB SPARK ELASTICSEARCH BACKEND FOR
 FRONTEND MICROSERVICES SERVICES LOAD
 BALANCER
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
    BROWSER LOAD BALANCER WEB BFF ORDERSERVICE MongoDB INVENTORY SERVICE TIME
  • 61.
    MySQL BROWSER LOAD BALANCER WEB BFF ORDERSERVICE MongoDB INVENTORY SERVICE TIME
  • 62.
    MySQL BROWSER LOAD BALANCER WEB BFF ORDERSERVICE MongoDB INVENTORY SERVICE MongoDB TIME
  • 63.
    • Collects datafrom each enabled service
 • Propagates correlation ID using HTTP headers
 • Provides sampling, tracing, and debug capabilities • Collects microsecond timestamps
 • Correlates data in Zipkin server • Presents data in Zipkin dashboard Request Tracking: OpenTracing and Zipkin
  • 64.
    const zipkin =require(‘appmetrics-zipkin’); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); });
  • 66.
    • Collects datafrom each enabled service
 • Requires /metrics endpoint providing data
 • Provides storage and correlation capabilities • Provide customisable dashboard
 • Integrates with Graphana, Graphite, etc Microservice Metrics: Prometheus
  • 67.
    const zipkin =require(‘appmetrics-zipkin’); const prometheus = require(‘appmetrics-prometheus’).attach(); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); });
  • 70.
    • ‘appmetrics-dash’ providesself-hosted monitoring
 • Inbound and Outbound request performance • Resource and event loop monitoring • Request a node-report
 • Enable profiling and flame graphs Deep Analysis: ‘appmetrics-dash’ and Flame Graphs
  • 71.
    const zipkin =require(‘appmetrics-zipkin’); const prometheus = require(‘appmetrics-prometheus’).attach(); const dash = require(‘appmetrics-dash’).attach(); const rest = require(‘rest'); const express = require('express'); const app = express(); app.get('/', (req, res) => { rest('http://localhost:9000/api') .then(response => res.send(response.entity)) .catch(err => console.error('Error', err.stack)); }); const port = process.env.PORT || 3000; app.listen(port, function(){ logger.info(`Express listening on: ` + port); }); ‘appmetrics-dash’
  • 72.
  • 73.
  • 74.
    $ yo nodeserver$yo nodeserver
  • 75.
  • 76.
  • 77.
    Config Fault ToleranceHealth Check Health Metrics JWT Propagation externalize configuration to improve portability build robust behavior to cope with unexpected failures common format to determine service availability common REST endpoints for monitoring service health interoperable authentication and role- based access control
  • 78.
    Config Fault ToleranceHealth Check Health Metrics JWT Propagation externalize configuration to improve portability build robust behavior to cope with unexpected failures common format to determine service availability common REST endpoints for monitoring service health interoperable authentication and role- based access control ibm-cloud-env hystrix-js /health appmetrics-prometheus jsonwebtoken
  • 79.
    Microservice Builder forJava: From development to production Development Deployment Runtime Liberty App Accelerator MicroProfile Programming Model Developer CLI Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree
  • 80.
    Development Deployment Runtime LibertyApp Accelerator Developer CLI Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Microservice Builder for Node.js: From development to production
  • 81.
    Development Deployment Runtime LibertyApp Accelerator Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Developer CLI (yo nodeserver or IDT) Microservice Builder for Node.js: From development to production
  • 82.
    Development Deployment Runtime JenkinsPipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with WAS ND or IBM Cloud PrivateFree Express or Loopback Frameworks LoopBack Developer CLI (yo nodeserver or IDT) Cloud App Service Microservice Builder for Node.js: From development to production
  • 83.
    Development Deployment Runtime CloudApp Service Express or Loopback Frameworks Developer CLI (yo nodeserver or IDT) Jenkins Pipeline Zipkin Distributed Trace Server Certificate key and trust store key.jks trust.jks IBM Cloud private Entitled with IBM Advanced Support for Runtimes or IBM Cloud PrivateFree LoopBack Microservice Builder for Node.js: From development to production
  • 84.
  • 85.
    85 IBM Foundation Support forRuntimes generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes Enterprise Support: Node.js Runtime
  • 86.
    86 LoopBack IBM Foundation Support forRuntimes generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes IBM Advanced Support for Runtime Frameworks Enterprise Support: Frameworks
  • 87.
    87 LoopBack IBM Foundation Support forRuntimes IBM Advanced Support for Runtime Frameworks generator-nodeserver appmetrics monitoring generator-swiftserver swiftmetrics monitoringjavametrics monitoring IBM Support for Runtimes Enterprise Support: Module Ecosystem
  • 88.