基础篇文章目录
一、项目简介
微服务架构图
微服务划分图
二、分布式基础
1、微服务
首先,微服务是一种架构风格。
在一个大型单体应用中,基于业务边界对其服务微化拆分,各个服务独立部署运行在自己的进程中。当
一个服务出现问题时,不影响其他服务,但同时,一旦服务体量过大,服务之间的关系网络和调用就会
非常复杂。
2、集群&分布式&节点
集群是个物理形态,分布式是个工作状态。
《分布式系统原理与规范》定义:
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统
分布式系统(distributed system)是建立在网络之上的软件系统。
从宏观上看,分布式都可以叫集群,分布式是多台机器在多个地方执行相关但不同的业务,而这“多台机器”就可以看做一个大集群,比如京东这个分布式系统,就是一个大型的业务集群。
从微观上看,分布式的某一个服务需要多台机器运行时,也会形成集群,但这运行同一个服务的多台机器不能称之为分布式。
节点:集群中的一个服务器
3、远程调用
分布式系统中,各个服务可能处于不同主机,这些服务之间的相互调用就称为远程调用。
4、负载均衡
分布式系统中,A服务需要调用B服务,B服务存在于多台机器中,A调用任意一个服务器均可完成功能。
所谓负载均衡就是让这个调用过程中的每一台B服务器都不要太忙或太闲,从而提升网站的健壮性。
常见的负载均衡算法:
轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后一次选择,知道最后一个,然后循环。
最小连接:优先选择连接数最少,也就是压力最小的后端服务器。在会话较长的情况下可以考虑采用这种方式。
散列:根据请求元的IP的散列(hash)来选择要转发的服务器。这种方式一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以靠考虑采取这种方式。
5、服务注册/服务发现&注册中心
A服务调用B服务,A服务并不知道B服务当前哪几台服务器有,哪些正常,哪些已经下线。可以通过建立注册中心来解决这个问题。后续维护服务也可通过注册中心的服务清单维护。
B服务在某一台服务器上上线时将服务注册进注册中心即为服务注册,A服务通过注册中心发现某一台服务器上正常运行的B服务称为服务发现。
6、配置中心
当一个服务在多台机器上运行时,一旦需要更改服务的配置,就需要将每一台机器下线并一一更改其配置,而借助配置中心后,我们可以让每个服务在配置中心自动获取自己的配置。
7、服务熔断&服务降级
微服务之间是通过网络通信的,有相互依赖的关系,当其中一个服务不可用时,可能会造成雪崩效应,所以需要有容错机制来保护(健康的服务)。
假设有一系列(高并发)请求需要从订单服务依次调用商品服务、库存服务,当库存服务出现故障时,会造成响应高延时,当请求过多积压就可能导致三个服务都不再可用。
a 服务熔断
当某个服务调用失败达到某个阈值,我们就可以开启断路保护机制(熔断该服务的请求链),即后来的请求将不再去调用该服务,可以本地直接返回默认数据。
b 服务降级
降级是整体把控。
在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理【如抛异常、返回NULL、调用Mock数据、调用Fallback处理逻辑】
8、API网关
网关就是一个入口,它和海关这种入口类似。
在微服务架构中API网关(API Gateway)作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流控制,日志统计等丰富的功能,帮助我们解决很多API管理难题。
三、环境搭建
1、安装linux虚拟机
-
1)开启cpu虚拟化
- 以戴尔笔记本为例,开机后立即按F12即可进入BIOS设置,找到CPU configuration,然后点击Intel Vitualization Technology,使其enable,而后重启电脑即可。但其实当我进入设置时,电脑已经是默认enable的状态。
- 找到CPU configuration
- 找到Intel Vitualization Technology
-
2)利用virtualBox和vagrant安装centos7(本文中linux和发行版centos7将不加以区分)
-
- 进入virtualBox官网:https://www.virtualbox.org/,download该软件,然后傻瓜式安装即可,关于安装目录的选择要注意两点:1)要有足够内存;2)最好不要有中文,以免后续出现问题。
注意:virtualBox可能会与红蜘蛛,360,净网大师等软件冲突,如发生则需要卸载冲突软件重启电脑再安装或者启动虚拟机。
- 进入virtualBox官网:https://www.virtualbox.org/,download该软件,然后傻瓜式安装即可,关于安装目录的选择要注意两点:1)要有足够内存;2)最好不要有中文,以免后续出现问题。
-
- 进入vagrant官网:https://www.vagrantup.com/,同样,download该软件,然后傻瓜式安装即可,安装目录也要注意以上两点。
注:vagrant是一个(配合virtualBox)自动化安装工具,它具有一个中央镜像仓库,里面有很多现成的镜像,比如ubuntu,centos等等。
- 进入vagrant官网:https://www.vagrantup.com/,同样,download该软件,然后傻瓜式安装即可,安装目录也要注意以上两点。
-
cmd
打开命令行,在当前用户目录下输入指令vagrant init centos/7
(centos/7
和镜像站的名称保持一致,该指令只是在当前目录下创建一个“vagrantfile”文件,可自行查看,里面是vagrant的配置信息),有了vagrantfile文件后,按提示输入vagrant up
,这一条指令将会自动配置centos所需要的的环境,并且从镜像站下载对应的linux发行版,也就是centos7。当等到下方所示信息出现时,即表示安装centos成功。
当然,我是没有成功的,对于一个菜鸟来说,这种高度自动化的工具着实时不出问题爽歪歪,一出问题黑人抬棺。最后我经历了非常曲折的过程,仍然没有成功安装,只好退而求其次,利用自己熟悉的VMware来安装centos7。本节末尾“那些我遇到的坑”:就是我遇到的一些问题,及搜罗的解决方案,以及VMware安装centos7的过程。
-
- 安装好centos7后,同样在vagrantfile文件目录(默认当前Windows用户)下使用
vagrant up
就可以在Windows命令行下启动linux了(后续启动同指令)。如下图所示:
然后,使用vagrant ssh
指令连接上linux,作为Windows下的远程登录窗口(说实话,vagrant直接在命令行连接,确实省了下载Xshell以及手动输入主机ip远程登录很多步骤),退出登录使用exit
,此时默认使用的是vagrant账户,此信息在命令行上文中有提。
到此为止,就可以通过此窗口直接敲入linux命令控制该系统,这标志着你是个幸运儿,通过vagrant自动化工具极其简单地安装好了linux并且实现了远程登录(假如你没有出现问题)
3)更改网络地址
- 安装好centos7后,同样在vagrantfile文件目录(默认当前Windows用户)下使用
-
- virtualBox中的虚拟机的网络方式是网络地址转换NAT(端口转发):
- virtualBox中的虚拟机的网络方式是网络地址转换NAT(端口转发):
- 此时如果其他主机要访问虚拟机,必须由windows端口如3333断发给虚拟机端口如3306。
- 这样每在linux里安一个软件都要进行端口映射,对于我们开发很不方便,即每安装一个软件就需要在virualBox里进行一次设置。
我们想要给虚拟机一个固定的ip地址,windows和虚拟机可以互相ping通。方式1是在虚拟机中配置网卡静态ip,老师说这样也比较麻烦,所以我们去更改Vagrantfile配置文件,修改其中的config.vm.network "private_network",ip:"192.168.56.10"
,这个ip需要在windows的ipconfig
中查到vitualbox的网卡ip,然后更改ip地址中第三段为对应的56,(不能是1)。
配置完后vagrant reload
重启虚拟机。在虚拟机中ip addr
就可以查看到地址了。最后再启动一个Windows窗口,使用ping 192.168.56.10。
以及在linux下ping 192.168.3.3
以上信息显示两台机器能够相互ping通,注意ping的ip地址都需要自己机器上特定的或者自己设置的ip地址。
那些我遇到的坑:
1、vagrant安装centos7失败
2、VMware安装centos7以及在上面安装图形化界面
2、在linux上安装docker
docker是一种虚拟化容器技术,它基于镜像(自带镜像站docker hub)来启动各种容器,每一个容器都是一个完整的运行环境,容器之间相互隔离。
安装步骤:
1)进入docker官网,依次选择“resources”–>“Docs”–>“Get Docker”,然后按照下图所示从上往下依次点击,就进入了官方安装文档。
2)根据文档,复制相应的命令到终端执行:
#卸载系统之前的docker (如果有的话)另外sudo命令是防止非root用户权限不够
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 最新的官网文档和视频老版不全一样
sudo yum install -y yum-utils
# 配置镜像
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动docker
sudo systemctl start docker
# 设置开机自启动,以后就不用手动启动了
sudo systemctl enable docker
docker -v #查看docker版本
sudo docker images #查看docker容器的资源
# 配置镜像加速,因为docker是国外网站,所以最好从国内镜像站获取资源,
#如阿里云(https://cr.console.aliyun.com/cn-qingdao/instances/mirrors),配置命令赋值如下:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://chqac97z.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#安装且配置完毕
3、docker安装mysql
1、下载镜像文件
#从docker下载需要的资源,命令格式如下,冒号后面的需要和镜像站的标签一致
sudo docker pull mysql:5.7
sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
# --name指定容器名字
#-v目录挂载
#-p指定端口映射 此处将容器的3306端口映射到主机的3306端口
#-e设置mysql参数 此处设置进入mysqlroot用户的密码为root
#-d后台运行
#开启,关闭指令
docker start mysql
docker stop mysql