系统结构综合实践-第一次作业
(1)课程调查
这学期的系统结构课都是在讲硬件相关的知识,原本以为实验会像上学期组成原理一样做硬件相关的实验,现在看来确实出乎了我的意料。希望这门课能让我接触到一些比较前沿的技术吧,也不需要学的太多,能比较深入的了解一两个我觉得就OK了,毕竟搭环境真的是我一生之敌……
(2)了解微服务
微服务是什么
微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。简而言之,微服务(Microservices)架构把一个庞大的application拆成几个小的独立的服务,再把独立的服务串起来。
微服务的特点
单一职责:对于每个服务而言,在服务架构层面遵循单一职责原则。符合高内聚、低耦合,不同的服务通过“管道”的方式灵活组合,从而构建出庞大的系统。
轻量级通信:服务之间应通过轻量级的通信机制,实现彼此间的互通互联,相互协作。所谓轻量级通信机制,通常指语言无关、平台无关的交互方式。对于微服务而言,通过使用轻量级通信机制,使服务与服务之间的协作变得更加标准化,也就意味着在保持服务外部通信机制轻量级的情况下,团队可以选择更适合的语言、工具或者平台来开发服务本身。
独立性:在单块架构中,功能的开发、测试、构建以及部署耦合度较高,相互影响。而在微服务架构中,每个服务都是一个独立的业务单元,当对某个服务进行改变时,对其它服务不会产生影响。无论是从开发、测试还是部署这些阶段来看,服务与服务之间都是高度解耦的。
进程隔离:所有的功能都运行在同一个进程中,就意味着,当对应用进行部署时,必须停掉当前正在运行的应用,部署完成后,再重新启动进程,无法做到独立部署。但在微服务架构中,应用程序由多个服务组成,每个服务都是一个具有高度自治的独立业务实体。通常情况下,每个服务都能运行在一个独立的操作系统进程中,这就意味着,不同的服务能非常容易地被部署到不同的主机上。
微服务的优点
每个服务足够内聚,足够小,代码容易理解这样能够聚焦一个指定的业务功能或业务需求。
开发简单,开发效率提高,一个服务可能就是专一的只干一件事情。
微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
微服务能够被小团队单独开发。
微服务能使用不同的语言开发。
易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins、Hudson、bamboo。
微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
微服务允许你利用融合最新技术。
微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合。
每个微服务都有自己的存储能力,可以有自己的数据库,也可以统一数据库。
微服务的缺点
开发人员要处理分布式系统的复杂性
多服务运维难度,随着服务的增加,运维的压力也在增大
系统部署依赖
服务间通讯成本
数据一致性
系统集成测试
性能监控
微服务的部署
一台主机部署多服务实例
每个主机一个服务实例
每台容器一个服务实例
松耦合,可独立部署
(3)学习Docker基本知识
Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、暂停等。
仓库(Repository):仓库可看着一个代码控制中心,用来保存镜像
Docker compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
Docker Machine
Docker Machine 是一种可以让您在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。
Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Docker Swarm
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
支持的工具包括但不限于以下各项:
- Dokku
- Docker Compose
- Docker Machine
- Jenkins
K8s
kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效。Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
(4)搭建docker环境
设置仓库
更新 apt 包索引
sudo apt-get update
安装 apt 依赖包,用于通过HTTPS来获取仓库:
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
中间曾出现无法获得锁的情况
删除该目录下的锁即可
添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
sudo apt-key fingerprint 0EBFCD88
显示结果
使用以下指令设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
可能会出现的问题:
/etc/apt/sources.list"第X行有错误
解决办法:
使用vim打开/etc/apt/sources.list文件,将出错的行注释掉,然后执行
sudo apt-get update
安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
测试 Docker 是否安装成功,输入以下指令,打印出以下信息则安装成功:
docker安装成功。
容器的使用
使用前可能会出现如下问题
docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,因此需要root权限才能访问。
解决方法:
sudo groupadd docker #添加docker用户组
sudo gpasswd -a $XXX docker #检测当前用户是否已经在docker用户组中,XXX为用户名,我的是wayne
sudo gpasswd -a $USER docker #将当前用户添加至docker用户组
newgrp docker #更新docker用户组
容器的创建
$ docker run -it ubuntu /bin/bash
容器查看
docker ps -a
容器的启动
docker start xxx#后接容器的ID
容器的停止
删除容器
docker rm -f xxx#容器ID
镜像仓库的使用
这里使用的是阿里云的镜像仓库并按照阿里云镜像仓库的操作指南进行操作
登陆仓库
千万不要像我一样起一个中文的username!!!非常麻烦!!!(错误示范
从Registry中拉取镜像并查看是否成功
第一个nginx就是刚刚拉取的镜像,成功了。
将镜像推送到Registry
查看一下当前的镜像版本
ID是一样的说明上传成功了