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端,如下所示:
    在这里插入图片描述

                                    </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/fzp12345/article/details/103685261&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
                <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                                </div>
    
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一个开源的微服务框架,提供了一系列的组件来简化微服务的开发和管理。其中包括了五大组件,分别为:服务注册与发现组件Eureka、分布式配置中心Config、服务消费者组件Feign、断路器组件Hystrix、网关组件Zuul。下面是这五大组件的相关配置详解。 1. 服务注册与发现组件Eureka Eureka是一个基于REST的服务注册与发现组件,用于管理服务的注册和发现。Eureka提供了高可用性、动态扩展、故障转移等特性。在Spring Cloud中,Eureka作为服务注册中心,可以让微服务之间互相发现和调用。 Eureka的相关配置如下: ```yaml eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true # 是否使用IP注册到Eureka,默认为false instance-id: ${spring.cloud.client.hostname}:${server.port} # 设置服务实例ID,默认为主机名:端口 ``` 2. 分布式配置中心Config Config是一个分布式配置中心,用于管理应用程序的配置。Config提供了集中式管理配置的功能,可以让应用程序动态地获取配置信息。在Spring Cloud中,Config可以作为配置中心,让微服务获取配置信息。 Config的相关配置如下: ```yaml spring: cloud: config: uri: http://localhost:8888 profile: dev # 配置文件的环境标识,如dev、prod等 label: master # Git仓库的分支名或标签名,用于多人协作 ``` 3. 服务消费者组件Feign Feign是一个基于HTTP的RESTful服务客户端,用于调用服务。Feign可以让开发人员更方便地调用其他微服务,它将服务接口定义为Java接口,并使用注解进行配置。在Spring Cloud中,Feign可以作为服务消费者组件,让微服务之间进行调用。 Feign的相关配置如下: ```yaml feign: hystrix: enabled: true # 是否启用Hystrix断路器,默认为true ``` 4. 断路器组件Hystrix Hystrix是一个断路器组件,用于处理分布式系统中的延迟和故障。Hystrix可以让服务之间更加健壮,它通过监控服务调用的状态,自动地打开或关闭断路器,从而防止故障在整个系统中扩散。在Spring Cloud中,Hystrix可以作为断路器组件,让微服务更加稳定。 Hystrix的相关配置如下: ```yaml hystrix: command: default: execution: isolation: strategy: SEMAPHORE # Hystrix隔离策略,默认为THREAD,可设置为SEMAPHORE circuitBreaker: enabled: true # 是否启用断路器,默认为true requestVolumeThreshold: 20 # 在时间窗口内的最小请求数,默认为20 errorThresholdPercentage: 50 # 错误百分比阈值,默认为50% sleepWindowInMilliseconds: 5000 # 断路器打开后的休眠时间,默认为5000ms ``` 5. 网关组件Zuul Zuul是一个网关组件,用于路由和过滤微服务请求。Zuul可以让微服务之间更加灵活,它可以对请求进行路由、过滤、转发、聚合等操作。在Spring Cloud中,Zuul可以作为网关组件,让微服务之间的请求更加安全、高效。 Zuul的相关配置如下: ```yaml zuul: routes: user-service: /user-service/** # 定义路由规则,将/user-service/**的请求转发到user-service服务 ignored-patterns: /**/hystrix.stream # 忽略/hystrix.stream请求,避免被Hystrix监控 host: connect-timeout-millis: 20000 # 连接超时时间,默认为20000ms socket-timeout-millis: 20000 # 套接字超时时间,默认为20000ms ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值