SpringCloud
前面,我相信各位小伙伴们已经对微服务架构有了一个基本的了解吧,那么现在立即马上,我们正式开始SpringCloud微服务架构实战部分的内容,从这里,我们推开SpringCloud技术架构的第一扇大门,我们一起来探讨一下SpringCloud中最最核心的一个组件——服务治理组件。
分布式系统CAP定理
在正式介绍服务治理组件之前,我们先来聊一聊在分布式系统一个非常重要的理论——CAP定理。
一致性
这里的C就是一致性(Consistency),它指的是在分布式系统中,所有的数据副本,比如你的数据库有主从备份,或者你的Redis是个集群,那么在这个集群当中每个节点它可能都保存着数据的副本。 那一致性在这里的含义就是说,在同一时刻、同一个值,在每一个副本中它的数值都是完全一样的,也就是说这个一致性指的是数据的一致性。
这里既然提到一致性了,那么咱们说一个题外话,大家应该都知道强一致性、弱一致性还有最终一致性吧,我们先拿强一致性来举个例子吧,比如我拿数据做了一个更新的操作,那么在这次更新以后,所有的访问请求必须都能拿到我更新后的值,那这种情况就是强一致性了。而弱一致性就是我更新了这个值后,后续的一部分请求没有拿到更新后的值,或者索性所有请求都没有拿到,那这种情况就是弱一致性。而强一致性就是说我更新后,能保证在经过一段时间最终可以拿到我更新后的数据。
而在大部分的超高并发的应用里,尤其是像我们这种互联网行业应用里,应该都是使用最终一致性居多。
我们这里的C指的是强一致性。
可用性
这里的A指的就是可用性(Availability)。 很多大公司对自己的可用性都有一定的要求,比方说电商业务的核心系统,一般要保证五个九的可用性即99.999%,这个数值其实相当不容易达到,它要求你全年的宕机时间小于5分钟,据小编了解,阿里集团一些业务部门有可能会因为一些小的故障,就会把全年的宕机指标一次性用光。 这里并不是不允许宕机,比如阿里主链路的应用,随随便便一个微服务就有几千太甚至上万台服务器,如果保证让所有服务器不宕机,那是完全不可能的。
那这里的Availability的意思指的是,即便你有部分机器处于宕机状态,但仍要保证整个服务是可用的。也就是说除非你所有机器全部团灭了,不然你就要想方设法的保证这个服务处于可用状态,并且你要尽最大努力将故障机器从故障恢复过来。
分区容错性
CAP这里的P指的是分区容错性(Partition tolerance)。
小编先给举个例子吧,像现在很多大型的应用都会用异地机房来做容灾对吧,两岸三地多机房,而这些机房中的数据是要互相进行同步和备份的。假如在某两个分区之间,这两个数据同步的通信通道被切断了,那这两个机房之间就会停止数据同步,这样就会产生数据不一致的情况,而对于支持分区容错性的系统来说,那就必须要做出一个艰难的二选一的抉择,那如果选择了兼顾可用性,机房会继续提供服务,但是数据会不一致;那不选择可用性而选择一致性呢?那你就要等待阻塞在这里,等数据同步过后才继续提供服务。所以说对于分区容错性的系统必须在可用性以及一致性之间做一个抉择,不可兼得。
由此便引出了一个CAP大定理,也叫CAP原则。 它指的就是,在分布式系统中,一致性、可用性、分区容错性这三个要素中,最多只能实现两个。
但是实际上对于我们的分布式系统中来说,也就是在一致性与分区容错性或者是可用性与分区容错性这两个选择直接二选一。因为我们面对的是一个分布式的系统,而你的分布式系统中服务器的数量一定是大于等于2的,那就不得不去考虑分区容错性。而如果对于单体应用来说,是有可能达到一致性与可用性的,比方说只有一个服务器并且连接一个数据库,那对于这个数据库的读和写我就完全可以既保证一致性又保证可用性,但是如果你后台的这个数据库从单库变成了多库,或者是主从,那你就不能保证这两者进行兼得了,需要必须考虑分区容错性。
服务治理的三大门派
我们来介绍一下服务治理组件中的三大门派,分别是:Eureka、Consul、Nacos 我们知道Eureka是由Netflix公司最初研发的,虽然它是SpringCloud中的一部分,但是它的开发维护都是依托于Netflix公司,而Consul的开发是直接挂牌于SpringCloud名下,由开源力量直接贡献。 最后一个门派,它是近些年来中原五里,异军突起的一只力量,可谓是后起之秀Nacos,它是阿里巴巴开源的一款组件,正式挂牌于Spring Cloud Alibaba组件库之下。 我们都知道,阿里集团在近些年来一直猛力房展开源事业,在开源社区的影响力也是与日俱增。由阿里巴巴集团贡献开发的Spring Cloud Alibaba组件库已经成为SpringCloud中一只冉冉升起的新星,足以媲美Spring Cloud Netflix组件库。
服务治理组件的比较
| Eureka | Consul | Nacos |
---|
一致性 | 弱一致性(AP) | 弱一致性(AP) | AP/CP | 性能 | 快 | 慢(RAFT协议Leader选举) | 快 | 网络协议 | HTTP | HTTP & DNS | HTTP,DNS,UDP | 应用广度 | 目前主流 | 目前非主流 | 尚待观察 |
这里为什么说Nacos尚待观察呢,其中一个原因就是它面向市场开始使用的时间并不长,他还需要更广泛的企业使用它,已经开源社区的力量让它更稳定,所以它需要时间来证明自己。
Eureka
Eureka快速入门
创建一个服务注册中心需要以下步骤:
- 创建Demo顶层pom和子项目eureka-server
- 添加Eureka依赖
- 设置启动类
- Start走起
废话不多说,我们直接开干!
创建父工程并添加依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>
创建子模块,添加eureka依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
创建启动类
添加配置文件
spring:
application:
name: eureka-server
server:
port: 20000
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
启动项目 打开浏览器访问localhost:20000
当看到这个页面的时候,说明我们的注册中心已经成功开启了。
Eureka UI 解读
看到这个页面,相比很多小伙伴们都一脸茫然,不知道什么意思。不必担心,其实小编刚开始接触的时候也是和你们一样,慢慢来,要相信自己一定可以学会的!那么接下来,我们就一起看看这个页面每个部分代表什么吧。
System Status
我们先来看一下System Status这一部分。 这里它包含了两个Field,分别是Environment和Data center,这里我们使用默认值就可以了,这两个其实也是可以自己指定的。
来看右边内容: 第一个Current time是当前时间;
第二个Uptime是指注册中心启动到现在运行了多久,图中代表13分钟;
第三个是Lease expiration enabled 表示是否启用租约过期,它和服务续约、服务剔除、服务自保三个功能都有一些关系。假设当前我的服务自保处于关闭状态,也就是说你的租约过期了,没有及时给服务续约,你的租约过期后,服务中心是可以利用服务剔除把你的服务下线掉的,因此在这种情况下,这个值默认是true,而我们这里显示false,则说明目前自我保护是开启的。
第四个是Renews threshold这代表每分钟最少的续约数,也就是说每分钟要有几个服务续约请求发送到注册中心。
最后一个是Renews(last min) 这个是指过去一分钟的续约数量,每分钟都会更新一次,但是它不包括当前这一分钟的,它是指上一分钟的。
DS Replicas
再来看一下下面部分
这里代表的是你的Eureka注册中心互相相邻的备份副本。 也就是说,如果我定义了不止一个注册中心,我把几个注册中心绑定在一起,形成了一个注册中心集群,那么我们就可以在DS Replicas看到多个注册中心了。
Instances currently registered with Eureka
它是指当前连接到这个注册中心,在注册中心成功注册的应用,这个Application是你的应用名称。
General Info
我们再来看一下General Info中的内容:
- total-avail-memory:表示可用内存
- environment:同上方System Status中的environment
- num-of-cpus:CPU核心数
- current-memory-usage:当前使用的内存百分比
- server-uptime:运行时间
- registered-replicas:相邻的集群复制节点
- unavailable-replicas:不可用节点
- available-replicas:可用节点
另外我们再来看一个新的页面: 左边代表过去已经取消的一千个租约,另一个是新注册的租约。
|