日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python sanic orm_基于sanic的微服务框架 - 架构分析

發布時間:2024/9/27 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python sanic orm_基于sanic的微服务框架 - 架构分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

感謝@songcser分享的《基于sanic的微服務基礎架構》https://github.com/songcser/sanic-ms

最近正在學習微服務,發現這個repo不錯,但不完整,跑不起來。所以學習了一下源碼,實際使用Docker部署成功,本文記錄實現過程。

學習用的git: https://github.com/kevinqqnj/sanic-ms

0. sanicms總體框架

image.png

1. 微服務是什么

微服務架構是一種將單應用程序作為一套小型服務開發的方法,每種應用程序都在其自己的進程中運行,并與輕量級機制(通常是HTTP資源的API)進行通信。這些服務是圍繞業務功能構建的,可以通過全自動部署機制進行獨立部署。這些服務的集中化管理已經是最少的,它們可以用不同的編程語言編寫,并使用不同的數據存儲技術。

image.png

http://baijiahao.baidu.com/s?id=1600354904549354089&wfr=spider&for=pc

2. 使用的功能模塊

peewee:用于ORM,使用asyncpg為數據庫異步驅動

opentracing/zipkin:分布式追蹤系統,收集log,分析瓶頸

https://zipkin.io/

使用swagger做API標準,能自動生成API文檔。

Project structure

├── develop # 開發腳本

│ ├── cluster.sh

│ ├── reset.sh # 初始化項目

│ ├── test.sh

│ ├── utils.sh

│ ├── wait-for-it.sh

│ └── wait-service.sh

├── region_service # 微服務之1

│ ├── sanicms

│ ├── info.log

│ ├── migrations.py

│ ├── models.py

│ ├── server.py

│ ├── settings.py

│ └── views.py

├── role_service # 微服務之2

│ ├── ...

├── user_service # 微服務之3

│ ├── ...

├── sanicms # 微服務主框架

│ ├── _init.py

│ ├── client.py

│ ├── config.py

│ ├── db.py

│ ├── doc.py

│ ├── exception.py

│ ├── loggers.py

│ ├── logging.yml

│ ├── _main.py

│ ├── migrations.py

│ ├── openapi.py

│ ├── server.py

│ ├── service.py

│ ├── tests.py

│ └── utils.py

├── docker-compose-cluster.yml

├── docker-compose-service-cluster.yml

├── docker-compose.yml # Docker微服務服務的配置文件,包括db/zipkin/swagger/consul

├── Dockerfile # Docker微服務的基本環境包

├── pylintrc

├── README.md

└── requirements.txt # Python依賴模塊

3. Docker部署

git repo到本地

git clone https://github.com/kevinqqnj/sanic-ms.git

cd sanic-ms

調用腳本來配置docker-compose,初始化數據庫

kevinqq@CN-00009841:/c/Users/xxx/git/sanic-ms$ ./develop/reset.sh

>>> stop existing services

Stopping sanic-ms_user_server_1 ... done

>>> removing existing services

Going to remove sanic-ms_user_server_1, sanic-ms_role_server_1, sanic-ms_region_server_1, sanic-ms_consul-server-2_1, sanic-ms_consul-server-1_1, sanic-ms_swagger_1, sanic-ms_consul-agent-1_1, sanic-ms_consul-agent-2_1, sanic-ms_zipkin_1, sanic-ms_db_1, sanic-ms_consul_1

Removing sanic-ms_user_server_1 ... done

>>> starting db/consul/zipkin

Creating sanic-ms_zipkin_1 ... done

Creating sanic-ms_consul_1 ... done

Creating sanic-ms_db_1 ... done

trying to >>> connect postgres 1

/var/run/postgresql:5432 - no response

trying to >>> connect postgres 2

/var/run/postgresql:5432 - accepting connections

>>> starting services

sanic-ms_consul_1 is up-to-date

sanic-ms_zipkin_1 is up-to-date

sanic-ms_db_1 is up-to-date

Creating sanic-ms_swagger_1 ... done

Creating sanic-ms_region_server_1 ... done

Creating sanic-ms_role_server_1 ... done

Creating sanic-ms_user_server_1 ... done

>>> create tables

Starting sanic-ms_db_1 ... done

Starting sanic-ms_zipkin_1 ... done

Starting sanic-ms_region_server_1 ... done

Starting sanic-ms_role_server_1 ... done

Success Migration

各服務端口:

kevinqq@CN-00009841:/c/Users/xxx/git/sanic-ms$ docker-compose ps

Name Command State Ports

----------------------------------------------------------------------------------------------------------------------------------------------------------------

sanic-ms_consul-agent-1_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 8500/tcp, 8600/tcp, 8600/udp

sanic-ms_consul-agent-2_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 8500/tcp, 8600/tcp, 8600/udp

sanic-ms_consul-server-1_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 8500/tcp, 8600/tcp, 8600/udp

sanic-ms_consul-server-2_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 8500/tcp, 8600/tcp, 8600/udp

sanic-ms_consul_1 docker-entrypoint.sh agent ... Up 8300/tcp, 8301/tcp, 8301/udp, 8302/tcp, 8302/udp, 0.0.0.0:8400->8400/tcp,

0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/tcp, 0.0.0.0:8600->8600/udp

sanic-ms_db_1 docker-entrypoint.sh postgres Up 0.0.0.0:55432->5432/tcp

sanic-ms_region_server_1 python -m server Up 0.0.0.0:8050->8050/tcp

sanic-ms_role_server_1 python -m server Up 0.0.0.0:8020->8020/tcp

sanic-ms_swagger_1 sh /usr/share/nginx/docker ... Up 0.0.0.0:8090->8080/tcp

sanic-ms_user_server_1 python -m server Up 0.0.0.0:8030->8030/tcp

sanic-ms_zipkin_1 /bin/sh -c test -n "$STORA ... Up 0.0.0.0:9410->9410/tcp, 0.0.0.0:9411->9411/tcp

檢查各個服務是否已正常運行

- consul服務發現

已經發現consul自己的集群,還有基于sanic的3個服務

image.png

consul集群,可以看到5個nodes:在docker-compose文件里定義了consul-server-bootstrap x 1, server x 2, client x 2

image.png

- sanic服務

目前演示了3個服務:user-service, role-service, region-service

添加一些測試數據:

kevinqq@CN-00009841:/c/Users/xxx/git/sanic-ms$ curl -X POST "http://localhost:8020/roles" -H "accept: application/json" -H "content-type: application/json" -d "{ \"name\": \"admin\"}"

{"code":0,"data":{"id":1}}

kevinqq@CN-00009841:/c/Users/xxx/git/sanic-ms$ curl -X POST "http://localhost:8030/users" -H "accept: application/json" -H "content-type: application/json" -d "{\"name\": \"Kevinqqnj\",\"age\":11,\"role_id\":1}"

{"code":0,"data":{"id":1}}

訪問各個端口API:

user-service服務器:

image.png

role-service服務器:

image.png

演示跨服務器異步訪問:

# user_service/views.py

@user_bp.get('/', name="get_user")

async def get_user(request, id):

async with request.app.db.acquire(request) as cur:

records = await cur.fetch(

""" SELECT * FROM users WHERE id = $1 """, id)

records = records[0]

datas = [

[records, 'role_id', get_role_by_id(request, records['role_id'])]

]

await async_request(datas)

return records

async def get_role_by_id(request, id):

cli = request.app.role_client.cli(request)

async with cli.get('roles/{}'.format(id)) as res:

return await res.json()

image.png

- zipkin分布式追蹤系統

查看剛才的訪問記錄:

可以清晰地看到訪問user_server/user/1,微服務里各節點的記錄、消耗時間等

image.png

- Swagger API文檔自動生成

通過修改右上角server地址,可以查看其它sevice的API

image.png

幾個要點:

服務啟動順序非常重要!

consul, zipkin必須在其它service之前啟動,否則發現不了其它服務

user_server啟動須安排在role_server/region_server之后,不然Client服務創建會失敗:

@app.listener('before_server_start')

async def before_srver_start(app, loop):

app.region_client = Client('region-service', app=app) # service name is APP-ID

app.role_client = Client('role-service', app=app)

原repo,sanicms模塊是作為python包安裝的,不方便經常更新sanicms里的內容。所以我的repo里,sanicms是作為一個內部模塊了,跟其它模塊在同一級目錄。

后續計劃

添加www服務

Sanic_session管理模塊

Cache: 選用aiocache + aioredis

Sanic_JWT鑒權模塊

異步數據庫操作進階: 超快的asyncpg + peewee/gino?

任務隊列管理Celery

sanic add_task feature is just wrapper on asyncio loop.create_task and nothing more. Asyncio tasks more like short processing and not for long background jobs.

Sanic_WebSocket

more...

點一下“喜歡”哦,大家的鼓勵才是我寫作的動力!

總結

以上是生活随笔為你收集整理的python sanic orm_基于sanic的微服务框架 - 架构分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。