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的微服务框架 - 架构分析相关推荐
- GIAC 2020 全球互联网架构大会演讲实录:基于TarsGo的微服务技术架构实践
2020年8月14日-15日,GIAC 2020 全球互联网架构大会于上周五正式在深圳开幕. GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)是长期关注互联网 ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中谈谈surging Api 网关 开源地址:https://gith ...
- 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation 以方便国内.net core开源项目的推广 ...
- Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架
Jboot是一个基于JFinal.JFinal-Undertow.Dubbo等开发的微服务框架,帮助开发者降低微服务开发门槛.同时完美支持在idea.eclipse下多maven模块,对java代码. ...
- 基于.NET CORE微服务框架 -浅析如何使用surging
1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...
- 几个基于jvm 的微服务框架
一个简单的整理,留待深入学习 micronaut http://micronaut.io/ sparkjava http://saprkjava.com spring cloud http://pro ...
- python的flask微服务-flask微服务框架的初步接触
测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...
最新文章
- MySQL的大分页查询该如何优化?
- WP8.1程序开发,可视树VisualTreeHelper类的使用
- 如何使用notepad运行python程序
- 16秋川大计算机基础作业,川大 16秋 《计算机应用基础》第一次作业答案
- 构造函数的五种继承方法
- 合格的前端不少,优秀的不多
- C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
- django博客项目7
- linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
- MySQL server has gone away 问题的解决方法
- quatus_sh tcl获取帮助
- Yate如何打开不同格式的音乐文件?
- Google 今天抽风了!
- 日历小程序C语言,微信小程序实现日历功能
- git 小乌龟 配置_git 小乌龟安装教程
- 盖洛普Q12在团队中的应用
- 单片机(51) 什么是编码器?什么是译码器?
- 反垃圾邮件智能网关之梭子鱼
- 我不是领导,用考虑数字化转型么?
- Android图表年度最强总结,一篇文章从入门到精通!