1 微服务(全链路追踪系统)
# 取nginx日志---》 监控网站的并发量 # 轮询、长轮询,websocket---》 # 全链路追踪系统----》微服务---》 记录每个服务功能的时间,以便查出是哪里慢了 # 微服务 # 单体应用---》所有功能都揉到一个项目中---》随着项目越来越大,出现很多问题 -出现问题:项目越来越大,部署越来越慢,一旦有一个地方有bug,直接影响整个项目 -拆服务:一个大项目拆成一个个小项目(用户相关,订单相关,支付相关的三个项目) 每个项目3-5人 -单独开发,单独上线, -服务之间通信 -resful规范,相互调用 -消息队列kafka,redis,rabbitmq -RPC:远程过程调用(调远程的方法,就像调用本地方法一样)(手写一个简易的rpc)gRPC,Dubbo
# 1 GIL:只针对cpython解释器,只适用于cpython解释器,(pypy:没有gil锁)python出的时候,是单核cup,开启线程,垃圾回收,让其他线程停掉,只走垃圾回收线程,不会有并发问题 -同一时刻,实际上只有一条线程在执行,有一把全局锁,只要线程执行,必须获得这把锁,才能执行 -多核cpu出现,cpython,只能有一条线程执行,就是由于GIL锁的原因 -python不能利用多核优势 -想要分到不同cpu上执行,需要开进程(解释器进程),进程里最少有一条线程,开进程,非常耗资源 -在某些情况下,并不是进程开的越多,程序执行越快 -IO密集型,开线程,计算密集型,开进程 只适用于python # 2 线程是cpu调度的最小单位 # io -内核缓冲区,用户缓冲区 ps:用户应用程序只能拿用户缓冲区的数据,网络request回来的数据或硬盘加载等IO操作数据先到内核缓冲区,再拷贝给用户缓冲区,软件才可以拿到 -BIO – 阻塞模式I/O -NIO - 非阻塞模式I/O -IO多路复用 大部分都是用这个,如nginx,redis -AIO 总结:BIO,NIO,IO多路复用都是同步io(nginx,tornado:epoll模型),windows平台不支持epoll,用的是select AIO:真正的异步io,用的很少 # epoll和select (都是IO多路复用的模型) -1个老师检查10个学生写作业 -select:小明,你写好了么?小红你写好了么?....... -epoll:同学写好了,举手告诉老师来检查 ps:参考io多路复用模型图,select:轮询检查数据是否准备好了,好了,发给应用程序(最多1024个); epoll:事件驱动,数据准备好了,就直接发给应用程序
io多路复用模型
# 1 CGI:通用网关接口,一句话总结: 一个标准,定义了客户端服务器之间如何传数据 # 2 FastCGI:快速通用网关接口,一句话总结: CGI的升级版,更快,Nginx:符合快速通用网关接口的web服务器 -apache,nginx web服务器 -lamp:linux+apache+mysql+php -lnmp:linux+nginx+mysql+php -tomcat ,nginx ,apache,uwsgi,php,gunicorn -nginx ,apache -tomcat,jboss,weblogic(java),uwsgi,gunicorn(python),php(php服务器)(php的web服务器) # 3 WSGI:协议,Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI),只针对python Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口 #####----为Python定义的web服务器和web框架之间的接口标准 ## 规定了什么?规定了http请求来了后,如何拆,拆成一个一个key和value 放到一个字典中,env对象 from wsgiref.simple_server import make_server # wsgiref为django自带web服务容器,性能低 def mya(environ, start_response): # django,flask框架就相当于写这个函数,调两个参数 print(environ) #request对象:environ包装成了一个对象 start_response('200 OK', [('Content-Type', 'text/html')]) if environ.get('PATH_INFO') == '/index': with open('index.html','rb') as f: data=f.read() elif environ.get('PATH_INFO') == '/login': with open('login.html', 'rb') as f: data = f.read() else: data=b'<h1>Hello, web!</h1>' return [data] if __name__ == '__main__': myserver = make_server('', 8011, mya) # 请求来了,执行后面的可调用对象 mya(environ:http请求拆了,拆成字典, start_response:响应对象(即发送HTTP响应的函数) print('监听8010') myserver.serve_forever() # 4 uWSGI/gunicorn/wsgiref/用tornado部署(tornado可能是服务器,可能是框架) #性能有差距 ----一个是符合wsgi协议的web服务器 ####一句话总结: 一个Web Server,即一个实现了WSGI的服务器,大体和Apache是一个类型的东西,处理发来的请求 ps:tornado性能高就是因为wsgi协议(服务器)部分是自己写的,用了IO多路复用 一旦用异步,后面都要用异步 uwsgi是c写的,用了多线程多进程,比异步io效率低些。django和flask是同步框架,如果要变异步,pymysql要变为aiomysql sanic,fastapi,tornado异步框架 # 5 uwsgi - ###一句话总结: uWSGI自有的一个协议 uWSGI uwsgi的区别
uWSGI:web服务器,等同于wsgiref
uwsgi:uWSGI自有的协议
pip install uwsgi(真正装的uWSGI)
ps:下图nginx非必须,只是做请求的转发,
uWSGI服务器可以接受HTTP或uwsgi协议(socket)请求,如果是uwsgi协议,前面NGINX要将http协议转为uwsgi协议,设置socket=0.0.0.0:8080(参数自改)
# 6 ASGI (WSGI的升级---》性能更高,支持的更多,websocket,异步): -异步网关协议接口,一个介于网络协议服务和Python应用之间的标准接口,能够处理多种通用的协议类型,包括HTTP,HTTP2和WebSocket ps:因为WSGI不支持websocket,所以代码发布django,channels模块要有asgi的东西,或者websocket模块(麻烦) -uWSGI如果没有改 +asgi服务器----》django3.0 以后支持异步
3 pycharm远程连接docker开发
1 配置docker服务端(c/s架构)
-允许远程客户端连接 -1 vim /lib/systemd/system/docker.service ... # ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock #只允许本地连接 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock #tcp远程连接配置,后者本地连接配置 ... -2 保存退出 -3 systemctl daemon-reload && systemctl restart docker #systemctl daemon-reload重载所有修改过的配置文件 -4 验证 内部能访问到: curl 127.0.0.1:2376/version 外部访问不到(防火墙,入网规则) 比如阿里云打开安全组端口,自己虚拟机关防火前 http://10.0.0.200:2376/version
2 配置pycharm
1 设置中--》搜索--》docker---》点+按钮 ---》填入:tcp://10.0.0.200:2376 (走的是socket连接,本质是docker客户端连接。注pycharm2018.2.8版本不支持)
2 设置---》解释器 (改为远程docker的解释器)
image name:内部的镜像,因为之前django镜像环境也装python3.6,选django1.11.9也可以 python interpreter path:默认python,敲python命令的意思
此处python解释器一定是docker内部解释器
下方原理图,本质上需要把本地的代码传到(sftp方式)远端的宿主机映射地址中,下面配置sftp
4 配置sftp
5 配置sftp连接(也可以叫ssh),点击+按钮,创建sftp,起个名字(新版本需要里面先创建一个SSH连接,设定一样)
Deployment path为远端路径,(前面连接docker)内部可能会自动创建对应相同的路径,没有的话自己创建
7 把本地代码传到远端
8 配置自动上传代码
9 通过本地dockerfile构建远端的镜像(直接在远端安装是一样的)
10 修改构建镜像的名字(右上角运行项目处点击,然后点击edit configurations)
之后就能连这个新创建的镜像, 进行编写代码开发