• 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)

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

  • 相关阅读:
    【JDK源码】从源码看公平锁和非公平锁得区别
    【spring源码解读】spring加载流程refresh之prepareBeanFactory(beanFactory)
    【JDK源码】Synchronized关键字原理,和锁的膨胀过程
    【Spring源码解读】BeanPostProcessor 接口解读
    【spring源码】spring的循环依赖
    JS-04 JS中的函数都是按值传递的
    CSS-03 queue方法
    CSS-02 BFC的理解
    CSS-01 CSS代码标准和规范
    JS-03 牛客网练习
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12823269.html
Copyright © 2020-2023  润新知