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...

点一下“喜欢”哦,大家的鼓励才是我写作的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拒做背锅侠!如何利用网站性能优化驱动产品体验提升

简介: 对于运维工程师而言,如果要票选五大最抓狂运维支撑场景,花样繁多的各种促销活动一定榜上有名。每个促销季上线都是忐忑不安的不眠夜。大量内容更新、大量客户涌入,大量数据读写,虽有着各种技术方案或工具服务保障…

阿里云飞天论文获国际架构顶会 ATC 2021最佳论文:全球仅三篇

简介: 近日,计算机系统结构国际顶级学术会议 USENIX ATC在线上举行。ATC 始办于1992年,是由USENIX组织的计算机系统领域的顶级会议,至今已成功举办31届,计算机系统领域中Oak语言(JAVA语言的前身&#xff09…

Quorum 和唱票那回事

作者 | 奇伢来源 | 奇伢云存储关于 Quorum 的两个维度前几回说了那么多框架,设计思想的文章。今天分享一个很小的点,etcd 的 quorum 是怎么实现的?Quorum 机制本质就是一个关于多数派的事情,这个多数派应用的有两个方面&#xff1…

java 迷你桌面地图_求教贴,Java桌面小游戏的地图怎么做

展开全部小游戏地e5a48de588b63231313335323631343130323136353331333365656566图一般都是各种图片的拼接,然后保存到2维数组里面比如//数值常量public static final int EMPTY0;//空地什么也没有public static final int BRICK1;//土墙public static final int STONE2;//石头p…

python相对引用_Python 模块相对引用

文件结构如下python_directory/├── __init__.py└── app├── __init__.py├── sub1│ ├── __init__.py│ └── mod1.py└── sub2├── __init__.py├── mod2.py除了 mod1.py,其他文件内容都为空。mod1.pyprint(__name__: {}.format(__name__…

快速界定故障:Socket Tracer网络监控实践

简介: Socket Tracer定位是传输层(Socket&TCP)的指标采集工具,通过补齐网络监控的这部分盲区,来达到快速界定网络问题的目标。 作者 | 四忌 来源 | 阿里技术公众号 一 背景 随着软件应用的集群化、容器化、微服务化,产品的…

剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境

简介: 云原生趋势下,应用容器化比例正在快速增长,Kubernetes 也已成为云原生时代新的基础设施。 据 Forrester 预测,到 2022 年, 全球企业及组织在生产环境运行容器化应用。观察今天的容器和 Kubernetes 的应用现状&am…

Log4j 第三次发布漏洞补丁,漏洞或将长存

整理 | 郑丽媛、禾木木出品 | CSDN这几天,Apache Log4j 2 绝对是众多 Java 程序员提到的高频词之一:由于 Apache Log4j 2 引发的严重安全漏洞,令一大批安全人员深夜修 Bug、打补丁。此次漏洞更是因为其触发简单、攻击难度低、影响人群广泛等特…

mysql 常见密码设置_设置mysql用户密码(5.6/5.7)、远程连接数据库、常用命令

注: 以上命令均需要在mysql下执行;在mysql中每行命令末尾加上分号,表示该行命令执行结束。 tb_name即table name()表名。示例:[rootcentos-01inux mysql]# mysql -uroot -p123456Warning: Using a password on the command line i…

二分法求数组最大最小_js-求数组的最大值和最小值

取出数组中的最大值或者最小值是开发中常见的需求,但你能想出几种方法来实现这个需求呢?Math.maxJavaScript 提供了 Math.max 函数返回一组数中的最大值,用法是:Math.max([value1[,value2, ...]])值得注意的是:如果有任…

TailwindCSS v3.0 正式发布!一大波新特性来袭!

作者 | 一只图雀来源 | 程序员巴士今天给大家介绍一篇关于 Tailwind 最新发布的 v3.0 相关的内容。2021 年 12 月 10 日,TailwindCSS 的创始人 Adam Wathan 宣布 TailwindCSS v3.0 正式发布,带来了一系列性能上的改进、对开发工作流的改善以及大量的新特…

scala seq java_Scala中的两个Seq比较

如果我理解你的话,你已经通过覆盖 equals 完成了大部分的努力 - 当然你 MUST 也相应地覆盖 hashCode 例如:case class Thing(id:Long, foo:String, bar:Int) {override def equals(that:Any):Boolean {that match {case Thing(_, f, b) > (f this.f…

曦智科技发布最新光子计算处理器PACE

成功验证光子计算优越性,以光子技术突破集成电路产业边界 2021年12月15日,全球领先的光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器——PACE(Photonic Arithmetic Computing Engine&…

python 下载图片到内存卡_python - 获取图像大小而不将图像加载到内存中

如果您不关心图像内容,PIL可能是一种过度杀伤力。我建议解析python magic模块的输出:>>> t magic.from_file(teste.png)>>> tPNG image data, 782 x 602, 8-bit/color RGBA, non-interlaced>>> re.search((\d) x (\d), t).g…

搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品

12月21日消息,阿里云发布多款基于自研神龙架构的弹性计算新品,包括RDMA增强型实例、800G GPU超算实例、FPGA计算型实例、GPU图形计算型实例等,在性能方面大幅提升,同时增加了多种服务形态,将计算延伸至客户身边&#x…

最新光子计算处理器面世:单个光子芯片集成超万个光子器件,频率达1GHz

12月15日,光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器:PACE(Photonic Arithmetic Computing Engine,光子计算引擎)。该处理器单个光子芯片中集成超过10,000个光…

Snowflake如日中天是否代表Hadoop已死?大数据体系到底是什么?

简介: 本文作者关涛是大数据系统领域的资深专家,在微软(互联网/Azure云事业群)和阿里巴巴(阿里云)经历了大数据发展20年过程中的后15年。本文试从系统架构的角度,就大数据架构热点,每…

java编写管理系统_用java编写学生信息管理系统

《用java编写学生信息管理系统》由会员分享,可在线阅读,更多相关《用java编写学生信息管理系统(7页珍藏版)》请在人人文库网上搜索。1、用java编写学生信息管理系统import .*;importimport .*;import .*;import .*;class Stude nt impleme ntsString nu …

金蝶携手工商银行完成首单数字人民币费用报销业务

2021年12月17日,金蝶业务系统成功完成首单使用数字人民币进行的公转私支付业务。据悉,这是中国工商银行股份有限公司(以下简称“工商银行”)第一笔使用“数字人民币银企直连”进行的公转私支付费用报销业务,也是金蝶成…

Java对象转换方案分析与mapstruct实践

简介: 随着系统模块分层不断细化,在Java日常开发中不可避免地涉及到各种对象的转换,如:DO、DTO、VO等等,编写映射转换代码是一个繁琐重复且还易错的工作,一个好的工具辅助,减轻了工作量、提升开…