docker-compose 實現最簡單的微服務架構

什麼是微服務

顧名思義:指的是很小的獨立服務。服務是什麼呢?實現一個簡單的業務邏輯既是一個服務。所以我們說微服務是指一個簡單的業務邏輯用多個獨立的小型服務實現。既然瞭解了什麼是微服務,那我們今天就用docker按照微服務的設置思路來實現一個簡單的業務邏輯。

業務邏輯

簡單說:需要一個web展示頁面,訪問這個web可以輸入名字,根據輸入的名字動態生成一個簡易的像素圖標作為這個名字的頭像。

複雜說:通過python Flask創建一個網頁,要有輸入框和提交按鈕,通過Flask的response返回頭像;當我們輸入名字之後交於dnmonster容器處理,這個容器返回一個頭像給Flask 網頁;使用Redis緩存技術,當輸入的名字已經在緩存中不再重新請求dnmonster容器,直接返回頭像。

業務實現

編寫python文件 identidock.py

mkdir -p identidock/app
cd identidock/app
vim identidock/app/identidock.py
#! coding=utf-8
# 導入要用到的模塊
from flask import Flask, Response, request
import requests
import hashlib
import redis

app = Flask(__name__)
# 建立redis緩存,連接到redis
cache = redis.StrictRedis(host='redis', port=6379, db=0)
# 定義salt值,salted = salt + name
salt = "UNIQUE_SALT"
default_name = 'CGLS Blog'
# 設置route支持get和post兩種請求
@app.route('/', methods=['GET', 'POST'])
def mainpage():
name = default_name

# 提交姓名
if request.method == 'POST':
name = request.form['name']
salted_name = salt + name
# 對姓名進行SHA256加密運算
name_hash = hashlib.sha256(salted_name.encode()).hexdigest()
header = 'Identidock'
body = '''

Hello


You look like a:


'''.format(name, name_hash)
footer = ''
# 返回web頁面
return header + body + footer

@app.route('/monster/')
def get_identicon(name):
# 檢查姓名是否在緩存中
image = cache.get(name)
if image is None:
print ("Cache miss", flush=True)
# 獲取相應的頭像
r = requests.get('http://dnmonster:8080/monster/' + name + '?size=80')
image = r.content
# 將姓名和頭像一起寫到緩存中
cache.set(name, image)
# 返回頭像
return Response(image, mimetype='image/png')

if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')

編寫cmd.sh文件

vim identidock/cmd.sh
#!/bin/bash
set -e

if [ "$ENV" = 'DEV' ]; then
echo "Running Development Server"
exec python "identidock.py"
else
echo "Running Production Server"
exec uwsgi --http 0.0.0.0:9090 --wsgi-file /app/identidock.py --callable app --stats 0.0.0.0:9191

編寫Dockerfile

vim Dockerfile
FROM python:3.4

RUN groupadd -r uwsgi && useradd -r -g uwsgi uwsgi
RUN pip install Flask==0.10.1 uWSGI requests==2.5.1 redis==2.10.3
WORKDIR /app
COPY app /app

COPY cmd.sh /
RUN chmod +x /cmd.sh
EXPOSE 9090 9191
USER uwsgi

CMD ["/cmd.sh"]

編寫docker-compose.yml

vim docker-compose.yml
identidock:
build: .
ports:
- "5000:5000"
environment:
ENV: DEV
volumes:
- ./app:/app
links:
- dnmonster
- redis

dnmonster:
image: amouat/dnmonster:1.0

redis:
image: redis:3.0

簡單說一下上面幾個文件之間的關係

docker-compose.yml自動化管理Dockerfile創建docker identidock鏡像並控制運行identidock容器,dnmonster容器,redis容器。Dockerfile是為了創建identidock鏡像,它用到了cmd.sh腳本,並且使用了identidock.py文件。cmd.sh文件是判斷環境是調試環境還是生產環境,根據環境不同啟用不同的命令。identidock.py文件是為了實現web頁面,並使用redis容器的緩存存儲功能和dnmonster容器的返回頭像功能。

接下來就是生成容器集群了:

# 創建需要的identidock鏡像
cd identidock
docker-compose build
# 生成並啟動容器集群
docker-compose up -d
# 查看自己的集群,如果你開啟了防火牆記得打開5000端口
docker-compose ps
瀏覽器訪問http://:5000

總結

我們創建的業務邏輯應用,使用到了三個微型服務,分別是web服務提供web頁面;nodejs服務提供返回頭像;redis服務提供緩存存儲。通過docker自動化工具docker-compose進行管理,根據實際情況我們可以對這幾個服務進行動態擴展。

docker-compose 實現最簡單的微服務架構


分享到:


相關文章: