2020系统综合实践 第1次实践作业

1、课程调查


目前来说这门课让我了解了更多关于软件架构的知识。期待通过这次实践能加强我对计算机系统结构的的学习。

2、了解微服务


定义

微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、著名的"2 pizza 团队"很好的诠释了这一解释(2 pizza 团队最早是亚马逊 CEO Bezos提出来的,意思是说单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来 只需要2个披萨就够了 )。 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。简而言之,微服务(Microservices)架构把一个庞大的application拆成几个小的独立的服务,再把独立的服务串起来。

特点

  1. 每个微服务可独立运行在自己的进程里;

  2. 一系列独立运行的微服务共同构建起了整个系统;

  3. 每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理,用户管理等;

  4. 微服务之间通过一些轻量级的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。

优点

1、易于开发和维护

  • 由于微服务单个模块就相当于一个项目,开发这个模块我们就只需关心这个模块的逻辑即可,代码量和逻辑复杂度都会降低,从而易于开发和维护。

2、启动较快

  • 这是相对单个微服务来讲的,相比于启动单体架构的整个项目,启动某个模块的服务速度明显是要快很多的。

3、局部修改容易部署

  • 在开发中发现了一个问题,如果是单体架构的话,我们就需要重新发布并启动整个项目,非常耗时间,但是微服务则不同,哪个模块出现了bug我们只需要解决那个模块的bug就可以了,解决完bug之后,我们只需要重启这个模块的服务即可,部署相对简单,不必重启整个项目从而大大节约时间。

4、技术栈不受限

  • 比如订单微服务和电影微服务原来都是用java写的,现在我们想把电影微服务改成nodeJs技术,这是完全可以的,而且由于所关注的只是电影的逻辑而已,因此技术更换的成本也就会少很多。

5、按需伸缩

  • 我们上面说了单体架构在想扩展某个模块的性能时不得不考虑到其它模块的性能会不会受影响,对于我们微服务来讲,完全不是问题,电影模块通过什么方式来提升性能不必考虑其它模块的情况。

缺点

1、运维要求较高

  • 对于单体架构来讲,我们只需要维护好这一个项目就可以了,但是对于微服务架构来讲,由于项目是由多个微服务构成的,每个模块出现问题都会造成整个项目运行出现异常,想要知道是哪个模块造成的问题往往是不容易的,因为我们无法一步一步通过debug的方式来跟踪,这就对运维人员提出了很高的要求。

2、分布式的复杂性

  • 对于单体架构来讲,我们可以不使用分布式,但是对于微服务架构来说,分布式几乎是必会用的技术,由于分布式本身的复杂性,导致微服务架构也变得复杂起来。

3、接口调整成本高

  • 比如,用户微服务是要被订单微服务和电影微服务所调用的,一旦用户微服务的接口发生大的变动,那么所有依赖它的微服务都要做相应的调整,由于微服务可能非常多,那么调整接口所造成的成本将会明显提高。

4、重复劳动

  • 对于单体架构来讲,如果某段业务被多个模块所共同使用,我们便可以抽象成一个工具类,被所有模块直接调用,但是微服务却无法这样做,因为这个微服务的工具类是不能被其它微服务所直接调用的,从而我们便不得不在每个微服务上都建这么一个工具类,从而导致代码的重复。

部署

应用程序的每个功能区域现在都由自己的微服务实现。此外,Web 应用程序被分为一组更简单的 Web 应用程序。例如,以我们的出粗车为例,一个专门是乘客的,一个专门是司机的。这使得它更容易地为特定的用户、司机、设备或者专门的用例部署不同的场景。每个后端服务暴露一个 REST API,大部分的服务消费由其他服务提供的 API。例如,司机管理使用了通知服务器来告知一个可用司机关于一个潜在路程。UI 服务调用了其他服务来渲染页面。服务也可以使用异步、基于消息的通信

3、学习docker技术


镜像(Image)
简单来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

容器(Container)
简单来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

仓库(Repository)
简单来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

docker
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

docker compose
docker compose可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

Dockerfile
Dockerfile是一个Docker镜像的描述文件,其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

docker machine
docker machine是一个工具,它允许你在虚拟宿主机上安装Docker,并使用docker-machine命令管理这个宿主机,可以使用Docker Machine在本地的MAC或者windows box、公司网络,数据中心或者AWS这样的云提供商上创建docker。

Swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。

k8s
k8s是基于容器的集群管理平台,它的全称,是kubernetes。

 

系统环境:Ubuntu18.04

 

 

运行容器

 docker run :是运行容器的命令

--it :这是两个参数,一个是 -i :交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端

--rm : 这个参数是说容器退出后随之将其删除。默认情况下,为了保障需求,退出的容 器并不会立即删除,除非手动 docker rm 。我们这里只是随便执行个命令,看看结果, 不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。

ubuntu:16.04 :这是指用 ubuntu:16.04 镜像为基础来启动容器。
bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash

输入 exit 则可以退出容器

测试

1.拉取一个镜像并打tag(以busybox为例,因为busybox比较小)并提交tag镜像到自己的本地镜像仓库

sudo docker pull busybox:latest //拉取镜像
sudo docker tag busybox:latest 172.17.0.1:5000/busybox
sudo docker push 172.17.0.1:5000/busybox

2.删除所有的关于busybox镜像并查看

sudo docker rmi busybox 172.17.0.1:5000/busybox //删除busybox镜像
sudo docker images //查看是否还有busybox镜像的信息

3.从本地镜像仓库pull busybox镜像并查看

sudo docker pull 172.17.0.1:5000/busybox
sudo docker images //查看172.17.0.1:5000/busybox镜像的信息

出现的问题

(1)本身网速太慢,无法下载;
(2)在Docker容器中配置的镜像有误,或镜像太水,比如下面两款镜像,分别是阿里云和中科院的镜像

  {         "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]     } //中科院
{ "registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"] } //阿里云

解决办法

创建daemon.json文件,并将上面的镜像复制粘贴进去

sudo vim /etc/docker/daemon.json 

2.2 重启docker

systemctl daemon-reload  systemctl restart docker 
原文地址:https://www.cnblogs.com/gallium697/p/12677745.html