Go语言笔记服务 | 青训营笔记

128 阅读9分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记

软件安装

  1. Docker安装 在Ubuntu20.4上直接使用

    sudo apt install docker.io
    

    进行安装

  2. 安装Postman

    Postman是一个API测试工具,方便后端测试API

工具-Docker,用于配置运行环境

www.runoob.com/docker/dock…

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管理和运行多个容器

www.runoob.com/docker/dock…

运行上面的程序发现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、最后的结果

image.png

Docker-machine创建多个虚拟机并安装Docker,创建并管理swarm集群

www.runoob.com/docker/dock… www.runoob.com/docker/dock…

工具-链路追踪,分析分布式微服务系统性能瓶颈和错误检查

help.aliyun.com/document_de…

doc.ruoyi.vip/ruoyi-cloud…

wu-sheng.gitbooks.io/opentracing…

链路追踪(Tracing Analysis)提供了调用链路、节点流量等信息,可以用来分析分布式微服务系统的性能瓶颈或者错误检查.用于链路追踪的框架有Jarger, OpenTracing等

工具-Postman,测试API服务

Http框架(Web框架)

www.jianshu.com/p/d85d4f480…

developer.mozilla.org/zh-CN/docs/…

www.liaoxuefeng.com/wiki/101695…

Web框架提供的基本功能有:

  • 解析HTTP协议。从Socket链接的基础上解析出HTTP请求
  • 路由请求。将请求转发到对应的函数进行执行
  • 方便从请求中获得数据
  • 集成数据库操作接口方便操作数据库
  • 渲染数据。对于HTML模板,返回的时候根据模板构建一个实例

RPC框架

juejin.cn/post/699286…

www.zhihu.com/question/25…

mikechen.cc/7543.html

juejin.cn/post/684490…

juejin.cn/post/684490…

调用本地进程服务,使用进程间通信;调用远程进程服务,使用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服务注册和服务发现

blog.lerzen.com/post/etcd%E…

segmentfault.com/a/119000002…

www.cnblogs.com/bandaoyu/p/…

RPC模块-传输协议

网络传输协议可以是protobuf和thrift

ORM框架

c.biancheng.net/view/8117.h…

juejin.cn/post/684490…

关系对象映射。ORM框架是一种持久化技术,是自动将对象映射成关系型数据中的记录。Go有Gorm,Java有Mybatis、Hibernate

笔记服务

项目模块

image.png

技术框架

image.png