docker4 微服务(全链路追踪系统); GIL, IO模型, BIO, NIO, IO多路复(epoll,select模型), AIO; cgi, fastcgi, WSGI, uWSGI, uwsgi, ASGI; pycharm远程连接docker开发

1 微服务(全链路追踪系统)

#  取nginx日志---》 监控网站的并发量
# 轮询、长轮询,websocket---》
# 全链路追踪系统----》微服务---》  记录每个服务功能的时间,以便查出是哪里慢了

# 微服务
# 单体应用---》所有功能都揉到一个项目中---》随着项目越来越大,出现很多问题
    -出现问题:项目越来越大,部署越来越慢,一旦有一个地方有bug,直接影响整个项目
  -拆服务:一个大项目拆成一个个小项目(用户相关,订单相关,支付相关的三个项目) 每个项目3-5人
  -单独开发,单独上线,
  -服务之间通信
      -resful规范,相互调用
    -消息队列kafka,redis,rabbitmq
    -RPC:远程过程调用(调远程的方法,就像调用本地方法一样)(手写一个简易的rpc)gRPC,Dubbo

2 GIL,IO模型,BIO,NIO,IO多路复用,AIO

io操作本质图

# 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多路复用模型

2 cgi,fastcgi,WSGI,uWSGI,uwsgi,ASGI

流程图(先到web服务器,再到各个语言的web服务器)

WSGI原理图

# 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命令的意思

3 上传代码到远端服务器(右上角运行项目处点击,然后点击edit configurations)

此处python解释器一定是docker内部解释器

docker container settings: 本地的代码映射到容器内部的目录,此处不动

下方原理图,本质上需要把本地的代码传到(sftp方式)远端的宿主机映射地址中,下面配置sftp

 4 配置sftp

 5 配置sftp连接(也可以叫ssh),点击+按钮,创建sftp,起个名字(新版本需要里面先创建一个SSH连接,设定一样)

6 配置映射路径(参考原理图,本地文件映射到sftp对应的宿主机文件路径)

Deployment path为远端路径,(前面连接docker)内部可能会自动创建对应相同的路径,没有的话自己创建

 7 把本地代码传到远端

 8 配置自动上传代码

 9 通过本地dockerfile构建远端的镜像(直接在远端安装是一样的)

 10 修改构建镜像的名字(右上角运行项目处点击,然后点击edit configurations)

 之后就能连这个新创建的镜像, 进行编写代码开发

原文地址:https://www.cnblogs.com/ludingchao/p/12823269.html