这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
软件安装
-
Docker安装 在Ubuntu20.4上直接使用
sudo apt install docker.io进行安装
-
安装Postman
Postman是一个API测试工具,方便后端测试API
工具-Docker,用于配置运行环境
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker应用场景
-
Web 应用的自动化打包和发布。
-
自动化测试和持续集成、发布。
-
在服务型环境中部署和调整数据库或其他的后台应用。
-
从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 架构
Docker 包括三个基本概念:
- 镜像(Image) :Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container) :镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository) :仓库可看成一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker 使用
Docker可以创建程序运行环境的镜像,方便分享和部署开发环境。Docker的ubuntu镜像是最小Linux操作系统,类似Linux0.11一样,是一个可以运行的操作系统,但是许多命令和程序是没有的,比如python、gcc等编译器,一般只有shell指令,其他程序比如python等程序运行环境需要自己安装。
Docker创建容器
# 创建交互式容器,使用ubuntu:15.10镜像创建一个容器,执行/bin/bash指令,-i表示创建交互式容器,-t指定终端,ubuntu 是镜像名称,15.10是镜像的版本
docker run -i -t ubuntu:15.10 /bin/bash
# 创建后台容器,-d表示创建后台容器
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看所有运行的容器
docker ps -a
# 停止运行的容器,其中id是容器的id,可以使用docker ps查看
docker stop id
# 查看容器的输出
docker logs id
# 进入容器,在交互式界面操作容器
docker exec -it 243c32535da7 /bin/bash
# 导入导出容器
docker export 1e560fca3906 > ubuntu.tar
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
# 删除容器
docker rm -f 1e560fca3906
Docker容器通信
网络端口映射
# 创建web容器,绑定容器5000端口到主机5000端口,通过局域网中地址是的容器相互访问,5000:5000中后一个是容器端口,前一个是主机端口
docker run -d -p 5000:5000 training/webapp python app.py
Docker网络
# 创建一个docker网络
docker network create -d bridge test-net
# 创建一个镜像并加入网络
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
# 使用ping访问容器
ping test1 # 在test2中运行
Docker创建镜像
# 进入容器之后更新容器,并重新命名容器
root@cheng: docker exec -it 243c32535da7 /bin/bash # 此处是宿主机
root@243c32535da7: apt-get update # 此处是容器的镜像系统
root@243c32535da7: exit # 退出容器
root@cheng: docker commit -m="has update" -a="runoob" f2ac38172da3 runoob/ubuntu:v2 # 更新镜像为runoob/ubuntu:v2,-a代表作者
root@cheng: docker images # 查看本地所有镜像可以看到我们自己创建的镜像runoob/ubuntu:v2
# 使用Dockerfile创建镜像
先写有个Dockerfile,然后在Dockerfile所在的目录执行下面的命令创建一个镜像
docker build -t runoob/centos:6.7 # runoob/centos:6.7 是新建的镜像名
Docker-compose管理和运行多个容器
运行上面的程序发现Run apk add的时候在安装gcc到容器的时候会发生软连接创建错误,这个时候我重启了虚拟机就好了
1、准备
创建一个测试目录:
$ mkdir composetest
$ cd composetest
在测试目录中创建一个名为 app.py 的文件,并复制粘贴以下内容:
composetest/app.py 文件代码
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis 是应用程序网络上的 redis 容器的主机名,该主机使用的端口为 6379。
在 composetest 目录中创建另一个名为 requirements.txt 的文件,内容如下:
flask
redis
2、创建 Dockerfile 文件
在 composetest 目录中,创建一个名为 Dockerfile 的文件,内容如下:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
Dockerfile 内容解释:
-
FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。
-
WORKDIR /code: 将工作目录设置为 /code。
-
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0设置 flask 命令使用的环境变量。
-
RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。
-
COPY requirements.txt requirements.txt RUN pip install -r requirements.txt复制 requirements.txt 并安装 Python 依赖项。
-
COPY . . : 将 . 项目中的当前目录复制到 . 镜像中的工作目录。
-
CMD ["flask", "run"] : 容器提供默认的执行命令为:flask run。
3、创建 docker-compose.yml
在测试目录中创建一个名为 docker-compose.yml 的文件,然后粘贴以下内容:
docker-compose.yml 配置文件
# yaml 配置\
version: '3'\
services:\
web:\
build: .\
ports:\
- "5000:5000"\
redis:\
image: "redis:alpine"\
该 Compose 文件定义了两个服务:web 和 redis。
- web:该 web 服务使用从 Dockerfile 当前目录中构建的镜像。然后,它将容器和主机绑定到暴露的端口 5000。此示例服务使用 Flask Web 服务器的默认端口 5000 。
- redis:该 redis 服务使用 Docker Hub 的公共 Redis 映像。
4、使用 Compose 命令构建和运行您的应用
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
如果你想在后台执行该服务可以加上 -d 参数:
docker-compose up -d
5、最后的结果
Docker-machine创建多个虚拟机并安装Docker,创建并管理swarm集群
www.runoob.com/docker/dock… www.runoob.com/docker/dock…
工具-链路追踪,分析分布式微服务系统性能瓶颈和错误检查
wu-sheng.gitbooks.io/opentracing…
链路追踪(Tracing Analysis)提供了调用链路、节点流量等信息,可以用来分析分布式微服务系统的性能瓶颈或者错误检查.用于链路追踪的框架有Jarger, OpenTracing等
工具-Postman,测试API服务
Http框架(Web框架)
developer.mozilla.org/zh-CN/docs/…
www.liaoxuefeng.com/wiki/101695…
Web框架提供的基本功能有:
- 解析HTTP协议。从Socket链接的基础上解析出HTTP请求
- 路由请求。将请求转发到对应的函数进行执行
- 方便从请求中获得数据
- 集成数据库操作接口方便操作数据库
- 渲染数据。对于HTML模板,返回的时候根据模板构建一个实例
RPC框架
调用本地进程服务,使用进程间通信;调用远程进程服务,使用RPC框架
远程过程调用(Remote Procedure Call),用于解决分布式系统中服务之间的调用问题。 通俗地讲,就是开发者能够像调用本地方法一样调用远程的服务。 所以,RPC的作用主要体现在这两个方面:
- 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
- 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。
简单来说,RPC框架让开发者可以像调用本地方法一样调用远程函数。
RPC框架解决了三个基本问题(当然还有其他问题,比如网络安全和流量控制等)
- 函数ID到函数指针的映射。网络中每个函数都有一个ID,可以使用哈希表将函数ID和函数指针映射。客户端和服务端都需要维护一个映射表,客户端调用远程过程的时候要将函数指针映射到函数ID,服务端要将函数ID映射到服务端的函数指针
- 序列化和反序列化。本地方法调用的时候我们的参数可以压栈传递,但是远程过程传递参数要通过网络,网络上只能传递字节流,需要我们在客户端将数据序列化成字节流,在服务端反序列化成我们需要的格式。可以使用Protobuf或者FlatBuffers进行序列化和反序列化
- 网络传输。在网络中传递字节流数据。可以自己写Socket,也可以用asio、ZeroMQ‘、Netty等
RPC框架工作流程
- 客户端通过映射表将函数指针映射到函数ID,将函数ID和参数序列化成字节流,通过网络发送给服务端
- 服务端接收到客户端请求,将参数和函数ID反序列化成自己需要的数据,然后映射到需要的函数,之后调用这个函数,将结果返回给客户端。
- 客户端接受到服务端返回结构,反序列化成自己需要的数据。
RPC模块-IDL
IDL是Interface Description Language,接口描述语言。使用IDL是为了定义远程过程调用的函数,让调用者知道远程过程参数类型和返回类型等信息。常用的IDL工具有proto3,thrift(thrift既是IDL,又是序列化和反序列化工具,也是传输工具)
RPC模块-ETCD服务注册和服务发现
RPC模块-传输协议
网络传输协议可以是protobuf和thrift
ORM框架
关系对象映射。ORM框架是一种持久化技术,是自动将对象映射成关系型数据中的记录。Go有Gorm,Java有Mybatis、Hibernate
笔记服务
项目模块
技术框架