Download as pdf or txt
Download as pdf or txt
You are on page 1of 25

Building Bizweb Microservices

with Docker
Nguyễn Minh Khôi
CTO of DKT Technology
dkt.com.vn
Bizweb Tech Stack
Programming Languages Message Queues

Frameworks & Libraries Cloud Services


|S3, EC2, Route53
Databases Web Servers

Others

2
Bizweb Microservices Components
• Based on Spring Boot & Netflix OSS
• Service Discovery: Eureka (Server), Ribbon (Client)
• API Gateway: Zuul
• Centralized Configuration: Spring Cloud Config
• API Security: Spring Security & Spring Security OAuth
• REST API: Spring Boot
• Job Service: Kafka & Spring Boot

3
Bizweb Microservices Architecture

4
Eureka Service Discovery
• Each service has unique serviced
• Service uses Eureka Client to interact
with Eureka Server:
• Register: serviceId, host, port
• Renew: using heartbeats to check status
• Get Registry: return list host:port of
services by serviceId

5
Zuul API Gateway
• Single entry point for clients to call API
• Edge service: not use to call between microservices
• Using Ribbon to call microservices
• Client Load Balancer
• Caching
• Fault tolerance
• Zuul Filter:
• Handle request in pipeline mode
• PRE, ROUTING, POST, ERROR

6
Centralized Configuration
Problems:
- Stored on each service,
hard to control
- Hard to update new
configuration
- Reload config at
runtime

7
Centralized Configuration

8
Problems
• Take times to deploy on new servers:
• Install Java
• Copy fat .jar file (~75-100MB) using FTP/SCP
• Make script to run as a Linux service
• Take times to update services:
• 20 microservices + job services
• Manual update on multiple hosts
• Manual scale & choose server to deploy
• Quite hard to monitor these microservices

9
Solved with Docker & Jenkins

10
Simple Dockerfile for all services
FROM frolvlad/alpine-oraclejdk8:slim
ADD lib lib
ADD product.jar app.jar
RUN sh -c 'touch /app.jar'
ENTRYPOINT ["java","-Xmx128m","-Xms128m","-
Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

11
Docker Swarm Mode
• Built-In Orchestration
• Easy to start
docker swarm init
docker services create --name product product:1.2.0
• Secure by default
docker swarm join --token [manager_token|worker_token]
• Easy to scale
docker service scale product=10
• Rolling updates
docker service update --update-delay 1m --update-parallelism 2
--image product:1.2.1 product

12
Swarm Manager & Worker

13
Swarm Manager & Worker

• Maintaining cluster state


• Scheduling services
• Use RAFT consensus to elect new leader
14
Swarm Manager & Worker

• Pull tasks from Managers


• Receive tasks in batch (100ms or 100 tasks)
• Manager node can be worker, too

15
Combine Netflix OSS with Docker Swarm
• Zuul for API Gateway
• Eureka for Service Discovery
• Ribbon Client for direct call between microservices
• Docker Swarm:
• Manage microservices
• Deploy, scale, update microservices

16
Docker Swarm Deployment
• 3 manager nodes on 3 different physical machines
• Workers on Physical & Virtual Machines
• Using overlay network:
• Communicate with Eureka Server
• Direct call between microservices
• Label for services & environment:
• INFRASTRUCTURE: running Zuul, Eureka, Config, OAuth Service
• SERVICE: running microservices
• JOB: running Job services
• DEV: running all containers of dev environment

17
Docker Swarm Cluster
INFRASTRUCTURE INFRASTRUCTURE INFRASTRUCTURE
oauth server oauth server oauth server
eureka server eureka server eureka server
config server config server config server

zuul server zuul server zuul server redis

swarm manager swarm manager swarm manager server-03


(primary) (secondary) (secondary)

Bizweb Overlay Network redis

server-02
microservice-xx microservice-xx job-xx

microservice-02 microservice-02 job-02 microservices-xx

microservice-01 microservice-01 job-01 job-yy


redis

worker-01 worker-xx worker-job worker-dev server-01


SERVICE SERVICE JOB DEV

Docker Swarm Cluster Redis Cluster

18
CI with Jenkins & Docker
• Environment Prerequisites:
• Gitlab 8.12 (support webhooks)
• Jenkins 2 Data Center Zone
• Docker Registry 2.0
VPN, IP Restriction
• Run on Docker

local dev server

Office Dev Zone

19
1. Developer pushes to Gitlab repo

2. Gitlab webhook 3. Jenkins pull code from Gitlab:


triggers Jenkins - source code
- Dockerfile
- Jenkinsfile

4. Compile source code 5. Push image to 6. Run custom script based on


& build Docker image, Private Docker Registry branch committed
auto tag image

20
CI with Jenkins & Docker
• Using Spotify docker-maven-plugin:
• Save space by caching java libraries image layer (~75MB)
• Reduce network traffic & deploy time (only 200-700KB transferred)
• Docker image auto tag:
{git_commit_short_code}-{branch} -> 4b4a71ef-dev
• Custom script based on branch committed:
• dev: trigger another Jenkins Server to update service
• live: manual update

21
Summary
• Docker is great way to package microservices
• Building HA system is easier with Docker Swarm Mode
• CI with Jenkins will reduce delivery time, increase productivity

22
References
• http://www.slideshare.net/juminchoi/bizweb-microservices-
architecture
• https://docs.docker.com/engine/swarm/
• https://www.docker.com/use-cases/cicd

23
Contact
• Nguyễn Minh Khôi – DKT Technology
• Email: khoinm@dkt.com.vn
• Facebook: https://fb.com/khoinguyen84

24
Thank you!
Q&A

You might also like