Adam Polak: Architektura oparto o mikroserwisy to temat ogromny. Wszyscy znamy teorię, ale jak to wygląda w praktyce? W jaki sposób ogarnąć kilka niezależnych aplikacji? Co z komunikacją pomiędzy nimi? Podczas prezentacji podzielę się naszymi doświadczeniami, problemami, które napotkaliśmy oraz rozwiązaniami, które znacznie ułatwiły nam cały proces wdrażania tejże architektury.
4. ▸ SPECIALIZED SMALL APPS
▸ SEPARATE REPOS
▸ OWN STRUCTURE, API AND LANGUAGE
▸ INDEPENDENT BUILDS, TESTS AND DEPLOYS
▸ EASY TO MAINTAIN BECAUSE OF SMALL CODE
BASE
THEORY
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
6. ▸ 5 SERVICES AT START
▸ SPA
▸ 6-7 DEVELOPERS AT START
PROJECT
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
7. ▸ WHAT ABOUT REPOSITORIES?
▸ WHAT ABOUT API?
▸ WHAT ABOUT SETTING UP NEW SERVICE?
▸ WHAT ABOUT DEVELOPMENT?
▸ WHAT ABOUT TESTS?
▸ AND MANY MANY MORE
QUESTIONS?
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
10. USE CASE SUMARY
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
▸ 2 “SERVICES” - SPA + API
▸ SEPARATE TEAMS
▸ DIFFERENT PROJECT STRUCTURE
▸ TECH PER PROJECT
▸ PRACTICES PER PROJECT
16. ▸ BEST AVAILABLE TECH FOR GIVEN TASK
▸ ???
PROS
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
17. ▸ 6 DIFFERENT TECH STACKS
▸ NO SHARED CODE = DUPLICATION
▸ 6 DIFFERENT BUILD/DEPLOY PROCESSES
▸ MUCH HARDER TO MOVE DEVS BETWEEN
PROJECTS
CONS
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
19. ▸ LOWER NUMBER OF TECHS = EASIER
MAINTANANCE
▸ SHARED CODE BETWEEN SAME TECH PROJECTS
▸ SHARED BUILD/DEPLOY PROCESS BETWEEN SAME
TECH
▸ SHARED STRUCTURE BETWEEN SAME TECH
PROJECTS
▸ YOU CAN MOVE FREELY BETWEEN PROJECTS OF
SAME TECH
PROS
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
20. ▸ LOWER PERFORMANCE = WE CANNOT USE THE
BEST POSSIBLE TOOLS
▸ HARDER TO KEEP IT UP TO DATE
CONS
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
43. DOCKERFILE
FROM node:10.13-alpine
ARG NPM_TOKEN
RUN echo “registry=https://private-repository.com/repository/npm/“ > /root/.npmrc;
RUN echo "always-auth=true" >> /root/.npmrc;
RUN echo "_auth=${NPM_TOKEN}" >> /root/.npmrc;
WORKDIR /dir
COPY . .
RUN npm config set unsafe-perm true
RUN apk add bash
RUN npm install ts-node ts-node-dev typescript -g
RUN npm i
EXPOSE 50050
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
59. PASS DOCKER SOCKET TO CONTAINER
js:
image: our-app:latest
build:
context: .
dockerfile: docker/dev/Dockerfile
args:
- NPM_TOKEN
volumes: &volumes
- ./:/dir
- /dir/build/
- /var/run/docker.sock:/var/run/docker.sock
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
60. CONTROL CONTAINERS FROM TESTS CONTAINER
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
test('Security integration tests - should reconnect to security service', async (t: test.Test) => {
pause(config.containers.security.name)
const payload = {…}
const authenticate = apiGatewayClient.proxy({
payload,
method: 'authenticate',
service: 'security'
})
const timedOut = await Promise.race([waitForTimeout, authenticate])
timedOut === true ? t.pass() : t.fail()
await ensureAreUpAndUnpaused([config.containers.security])
t.end()
})
61. CONTROL CONTAINERS FROM TESTS CONTAINER
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
test('Security integration tests - should reconnect to security service', async (t: test.Test) => {
pause(config.containers.security.name)
const payload = {…}
const authenticate = apiGatewayClient.proxy({
payload,
method: 'authenticate',
service: 'security'
})
const timedOut = await Promise.race([waitForTimeout, authenticate])
timedOut === true ? t.pass() : t.fail()
await ensureAreUpAndUnpaused([config.containers.security])
t.end()
})
62. CONTROL CONTAINERS FROM TESTS CONTAINER
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE
export const ensureAreUpAndUnpaused = (containers: ContainerConfig[]): Promise<any> => {
const upOrUnpause: Array<Promise<any>> = []
containers.forEach(container => {
if (isPaused(container.name)) {
upOrUnpause.push(unpause(container))
} else if (isDown(container.name)) {
upOrUnpause.push(up(container))
}
})
return Promise.all(upOrUnpause)
}
export const pause = (containerName: string) => shell.exec(`docker pause ${containerName}`)
63. ▸ MONOREPO IS EASIER TO DEVELOP WITH
▸ AUTOMATE PROJECT CREATION
▸ USE CONTRACTS AND GENERATE CODE FROM
THEM
▸ USE DOCKER
▸ FOCUS ON INTEGRATION TESTS
▸ TEST NEGATIVE PATHS
TL/DR
(MICRO?) SERVICES ARCHITECTURE IN PRACTICE