SpringCloud五大组件详细分析以及配置


最近项目需要使用SpringCloud,对于SpringCloud的五大服务做了一个整理,并进行了一定的调研,现将整理的内容记录如下。本文所探讨的是是什么,以及怎么用的问题,如果想研究底层实现的同学可以绕道。
首先,介绍一下SpringCloud:
长久以来,开发人员在繁杂的开发过程中,需要做很多基础的配置,同时在引用其他组件时,需要花费大量的时间去研究组件调用方法。导致大量的时间被浪费。
也正在此时,spring横空出世,并经历了spring ->>spring boot ->>SpringCloud的发展。SpringCloud对很多流行的子项目进行了封装,同时提出了约定大于配置的思想。使开发人员逃离了大量繁重的配置任务,进而去更多的关注业务实现。
Spring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。其中,主要的五大组件如下:
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config

1.服务发现——Netflix Eureka

1.1.什么是Eureka

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。功能类似于Dubbo的注册中心Zookeeper。具体的实现逻辑如下图所示:
在这里插入图片描述
Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

1.2.Eureka和Zookeeper的差别

现有市场上主流的服务注册实现方案,主要包括两大类:Eureka和Zookeeper。
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。在此Zookeeper保证的是CP, 而Eureka则是AP。

1.2.1.Zookeeper保证CP

当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。

1.2.2.Eureka保证AP

Eureka看明白了这一点,因此在设计时就优先保证可用性。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台Eureka还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:

  1. Eureka不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
  2. Eureka仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
  3. 当网络稳定时,当前实例新的注册信息会被同步到其它节点中
    因此, Eureka可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像zookeeper那样使整个注册服务瘫痪。

1.3.使用idea搭建eureka注册中心

1.3.1使用Spring Initializr搭建

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3.2修改配置文件和启动类

在这里插入图片描述
配置文件修改为以下内容:

server:
  port: 8081
# 服务名称:在服务发现中,服务名称是一个关键信息,如果同一个服务名称有多个实例,那么,消费者在调用的时候就可以使用ribbon提供的负载均衡来调用
spring:
  application:
    name: server-register
eureka:
  instance:
    #显示IP地址
    prefer-ip-address: true
    #默认值为:机器名称:服务名称:实例得端口,一般需要机器名称,按照以下模式修改即可
    instance-id: ${spring.application.name}:${server.port}
    hostname: localhost
  client:
    service-url:
      #注册中心的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    #单机版可以使用以下配置
    #是否把自己注册到eureka上
    register-with-eureka: false
    #是否从eureka上拉取服务列表
    fetch-registry: false

启动类添加@EnableEurekaServer注解,如下图所示:
在这里插入图片描述
启动后页面展示:
在这里插入图片描述

1.4使用idea搭建eureka Client端

1.4.1搭建框架

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果需要web功能,可以添加web包引用,如上图所示
在这里插入图片描述

1.4.2修改配置文件

在这里插入图片描述
内容如下:

server:
  port: 8090
spring:
  application:
    name: client-1
eureka:
  instance:
    #显示IP地址
    prefer-ip-address: true
    #默认值为:机器名称:服务名称:实例得端口
    instance-id: ${spring.application.name}:${server.port}
  client:
    serviceUrl:
      defaultZone: http://localhost:8081/eureka/

client端不需要在启动类上添加@EnableEurekaServer注解即可启动
启动后可以在eureka中查看到该client端,如下所示:
在这里插入图片描述

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值