感谢@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的微服务框架 - 架构分析相关推荐

  1. GIAC 2020 全球互联网架构大会演讲实录:基于TarsGo的微服务技术架构实践

    2020年8月14日-15日,GIAC 2020 全球互联网架构大会于上周五正式在深圳开幕. GIAC(GLOBAL INTERNET ARCHITECTURE CONFERENCE)是长期关注互联网 ...

  2. 基于thrift的微服务框架

    前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...

  3. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中谈谈surging Api 网关 开源地址:https://gith ...

  4. 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

    1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...

  5. 基于.NET CORE微服务框架 -谈谈surging的服务容错降级

    一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation 以方便国内.net core开源项目的推广 ...

  6. Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架

    Jboot是一个基于JFinal.JFinal-Undertow.Dubbo等开发的微服务框架,帮助开发者降低微服务开发门槛.同时完美支持在idea.eclipse下多maven模块,对java代码. ...

  7. 基于.NET CORE微服务框架 -浅析如何使用surging

    1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...

  8. 几个基于jvm 的微服务框架

    一个简单的整理,留待深入学习 micronaut http://micronaut.io/ sparkjava http://saprkjava.com spring cloud http://pro ...

  9. python的flask微服务-flask微服务框架的初步接触

    测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...

最新文章

  1. MySQL的大分页查询该如何优化?
  2. WP8.1程序开发,可视树VisualTreeHelper类的使用
  3. 如何使用notepad运行python程序
  4. 16秋川大计算机基础作业,川大 16秋 《计算机应用基础》第一次作业答案
  5. 构造函数的五种继承方法
  6. 合格的前端不少,优秀的不多
  7. C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
  8. django博客项目7
  9. linux wget 命令_我如何使用wget Linux命令恢复丢失的图像
  10. MySQL server has gone away 问题的解决方法
  11. quatus_sh tcl获取帮助
  12. Yate如何打开不同格式的音乐文件?
  13. Google 今天抽风了!
  14. 日历小程序C语言,微信小程序实现日历功能
  15. git 小乌龟 配置_git 小乌龟安装教程
  16. 盖洛普Q12在团队中的应用
  17. 单片机(51) 什么是编码器?什么是译码器?
  18. 反垃圾邮件智能网关之梭子鱼
  19. 我不是领导,用考虑数字化转型么?
  20. Android图表年度最强总结,一篇文章从入门到精通!

热门文章

  1. 这篇 Linux 总结得很棒啊!
  2. 杨振宁在物理学界的地位和成就
  3. 个人数据在暗网的交易价格是多少?
  4. 成为诺奖热门人选,培养三名院士,他25岁才读研一!
  5. 妙到巅峰的8个简洁数学证明(文科生都能看懂),隐隐触摸到一丝只属于神的智慧气息……...
  6. 那篇让汤普金斯进入梦境的相对论演讲
  7. HTML5清除2个div标签的空白,DIV标签里面IMG图片下方留有空白怎么办
  8. php检查在线用户,php – 检查用户是否在线laravel
  9. 共享内存:mmap函数实现
  10. 程序员从优秀到卓越的几点建议