前言
稍微大一点儿的系统基本都需要分布式部署,分布式部署也有很大方式。我们对基本的部署有一些了解,会引出一些基本的概念,这样方便我们理解其它方案。
单服务器部署
我们先在AWS里部署一个服务,然后引出问题,解决问题。
EC2
我们先创建一台EC2虚拟机,EC2是AWS提供虚拟服务器,可以简单理解和你手头的物理机一样。创建好之之后,我们就可以把服务部署到这台虚拟机了。
这台虚拟机被称为一个实例:
它有独立的IP地址,通过这个IP地址就可以访问你的服务。如果不能访问,还需要理解一个概念。
防火墙
创建每个实例的时候,都需要选择多个安全组,他就类似于你本机的防火墙。我们需要运行流量(数据请求)可以进入这台机器,互联网用户无法访问你的服务。
假设你的服务在这台服务器上监听的是3000端口,如果不设置安全组,别人是无法访问这个端口的。现在我们需要在安全组里添加一个规则,具体如下:
- 类型:根据自己服务的需要选择,http、https、socket都可以选择自定义TCP,指示要注意端口。
- 端口范围:我们的例子中是3000,意思是流量可以进入3000这个端口。
- 源:是运行哪些用户可以访问这个端口,如果你是正常的互联网服务,按如图选择即可(允许所有的互联网用户访问)。
经过这样的设置之后,服务就可以正常的访问了。
负载均衡
由于我们的用户量比较大,一台服务器已经无法满足我们的需求了,于是我们又部署了一个实例。问题来了,现在两个实例有两个IP地址,但是,我们的域名已经绑定到其中一个先前那个IP了,怎么办?
创建负载均衡器
来到这里,创建负载均衡器:
根据需求选择负载均衡器擅长的类型。
安全组
和单台服务器的逻辑一样,需要选择允许流量进入的端口,比如我们允许80和443这两个http相关的端口。
侦听器和路由
我们根据需要创建侦听器和路由,这里我们选择侦听80和443端口。当流量进入这个负载均衡器的80和443端口的时候,我们希望它把流量路由到哪里?
于是,我们需要创建目标组。
目标组
目标组也需要设置端口,在我们这次示例中,我们的目标是3000端口,于是,我们这里设置一个目标组的端口是3000。
这里还需要设置目标状态的检查:
负载均衡会定时检查这个目标组里的实例,是否还能正常提供服务。比如我们提供一个api接口,用户访问的时候,返回的状态码是200,我们就可以在这里配置这些参数。当负载均衡器检查的时候,告诉它,这个服务还活着。
注册目标
配置好目标组的这些参数之后,需要把刚才我们创建的两个EC2实例注册到这个目标组,同样的,设置3000端口。
我们有多个实例,就在这个目标组注册多少个实例,这样负载均衡器就会把流量按规则路由到这些实例里。
证书
在添加侦听器的时候,如果选择TLS(也就是https)的话,会有安全设置的选项,这里主要是证书,选择一个之前创建的证书。或者新建证书:
新建证书
添加一个域名,证书会和这个域名绑定。
这个证书会有域相关的信息:
接下来需要去域名解析服务那里,创建一个CNAME的域名解析:
- 主机记录:把CNAME名称添加到主机记录里(记得去掉后面的域名部分)
- 记录值:把CNAME值复制进去
点击创建就可以了。等待几分钟,等状态完成,就可以在负载均衡那里配置了。
最后结果
当把这些配置完成之后,会得到如下结果的截图:
总结
最后截图里有个DNS名称,这个是可以直接访问。流量流程是这样的:
- 访问这个DNS,比如80端口
- 这个DNS背后是一个负载均衡器
- 负载均衡器侦听了80端口
- 80端口有一个路由的目标组
- 流量被路由到这个目标组
- 目标组配置了两个EC2实例
- 并且目标组把流量路由到了目标组的3000端口
- 这样,整个流程就走通了。
通过这几步,就了解了整个流程,其它云也是大同小异。
还有一点,刚才创建证书的时候,有一个域名,我们还没有利用它。
比如这个域名是a.b.com,如何把这个域名与我们的负载均衡器绑定呢,负载均衡那里提供了一个DNS,上面有说到,它是可以直接访问,这时候,我们就可以把这个域名在域名服务商那里创建一个CANME的记录,具体配置如下:
自此,真个流程都完结了。
因为知识是一棵树,我们总有疑问,比如:
- 域名来自哪里?
- 域名又是如何解析到这个DNS的?
- 证书又是怎么回事?
- 证书和域名怎么就绑定在一起了呢?
- ...
这篇文章不能一一解答,只能按照一个线性的逻辑讲述,稍微有一点点分叉来解决依赖问题,其余需要不断的学习和梳理。