前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Spring Cloud组件

Spring Cloud组件

原创
作者头像
羽毛球初学者
发布2024-10-22 17:14:37
发布2024-10-22 17:14:37
1150
举报
文章被收录于专栏:JAVA基础知识JAVA基础知识

Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

Netflix eureka(服务发现)

Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。每个微服务都有Eureka Client,负责将这个服务的信息注册到Eureka Server中。Eureka Server是注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号。当服务A想要调用服务B的接口,就会由服务A上的Eureka Client去询问注册中心关于服务B所在的机器和端口,然后再去进行调用。

Fegin(接口调用)

如果对某个接口定义了@FeignClient注解,Feign就会针对这个接口创建一个动态代理,Feign的动态代理会根据你在接口上的@RequestMapping、@PathVariable等注解,来动态构造出你要请求的服务的地址,最后针对这个地址,发起请求、解析响应。

Ribbon(负载均衡)

Ribbon的负载均衡默认使用的最经典的Round Robin轮询算法。简单来说,就是如果订单服务对库存服务发起10次请求,那就先让你请求第1台机器、然后是第2台机器、第3台机器、第4台机器、第5台机器,接着再来—个循环,第1台机器、第2台机器。。。以此类推。

此外,Ribbon是和Feign以及Eureka紧密协作来完成工作的,首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器Feign就会针对这台机器,构造并发起请求。

Hystrix(熔断器)

Hystrix是隔离、熔断以及降级的一个框架。

服务熔断

当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。

在固定时间窗口内(Hystrix默认是10秒),接口调用出错比率达到一个阈值(Hystrix默认为50),会进入熔断开启状态,进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法。

当熔断开启一段时间之后(Hystrix默认是5秒),熔断器会进入半熔断状态,所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率,如果成功率达到了预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。熔断有三个重要参数:

  • 快照时间窗(circurtBreaker.sleepWindowInMilliseconds): 断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
  • 请求总数阈值(circurtBreaker.requestVolumeThreshold): 在快照时间窗内,必须满足请求总数阈值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
  • 错误百分比阈值(circurtBreaker.errorThresholdPercentage):当请求总数在快照时间窗口内超过了阈值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阈值情况下,这时候就会将断路器打开。

服务降级

服务降级,就是当某个服务熔断之后,服务端提供的服务将不再被调用,此时由客户端自己准备一个本地的fallback回调,返回一个默认值来代表服务端的返回保证了服务的可用。可以通过HystrixCommand中的fallbackMethod来指定降级处理方法。

服务限流

Hystrix把一个分布式系统的某一个服务打造成一个高可用的服务最重要的手段之一就是资源隔离,即通过限流来限制对某一服务的访问量,比如说对Mysql的访问,为了避免过大的流量直接请求mysql服务,hstrix通过线程池或者信号量技术进行限流访问。

通常来说线程池资源隔离技术一般用于对依赖服务的网络请求访问,需要解决timeout问题。信号量则适合对内部的一些比较复杂的业务逻辑访问,不涉及任何的网络请求,当并发量超过计数器指定值时,直接拒绝。

线程池隔离的最大优点在于,任何一个依赖服务都可以被隔离在自己的线程池内,即使自己的线程池资源填满了,也不会影响任何其他的服务调用。最大缺点在于增加了cpu的开销,除了tomcat本身的调用线程之外,还有hystrix自己管理的线程池。每个command的执行都依托一个独立的线程,会进行排队,调度,还有上下文切换。

微服务网关

微服务网关在微服务架构中扮演着至关重要的角色,它主要负责请求的路由、组成服务间的通信桥梁、聚合不同服务的数据以及提供跨服务的统一认证机制。以下是微服务网关的几个主要作用:

  • 请求路由: 微服务网关充当所有入站请求的入口点,它负责将外部请求路由到适当的微服务上。这意味着客户端只需要知道网关的地址,而不需要知道所有微服务的位置和端口号。这简化了客户端的配置,并隐藏了内部服务的结构。
  • 服务聚合: 微服务网关可以将来自不同微服务的数据聚合成一个统一的响应发送给客户端。这对于前端应用尤为重要,因为它减少了网络请求的数量,提高了性能和用户体验。
  • 认证和授权: 通过在网关层实施认证和授权机制,所有进入系统的请求都可以在到达目标服务之前进行安全检查。这种方法可以提高安全性,因为它避免了在每个服务中重复实现认证逻辑。
  • 负载均衡: 微服务网关可以在多个服务实例之间分配请求,从而实现负载均衡。这有助于优化资源的使用,提高系统的可靠性和可用性。
  • 限流和熔断: 网关可以实现限流策略,以防止过多的请求压垮后端服务。同时,熔断机制可以在下游服务失败时保护系统,通过在一定条件下“断开”对特定服务的调用,防止故障蔓延。
  • 日志和监控: 在微服务网关处集中记录日志和监控数据,可以提供系统级别的请求跟踪和性能指标,这对于发现和诊断问题非常重要。
  • 跨域资源共享 (CORS): 微服务网关可以处理跨域请求,允许或拒绝来自不同源的请求。这对于支持前后端分离的现代web应用非常重要。
  • 协议转换: 微服务网关可以在不同的通信协议之间进行转换。例如,它可以接收外部的HTTP请求,并将其转换为内部服务可能使用的其他协议(如AMQP、gRPC等)。这种灵活性允许不同的服务使用最适合它们的通信协议,同时对外部客户端隐藏这些细节。
  • 服务版本控制和灰度发布: 网关可以管理不同版本的服务并实现灰度发布,这意味着新版本的服务可以逐渐向用户发布,而不是一次性替换旧版本。这有助于减少引入新版本可能带来的风险。
  • API管理: 微服务网关常常与API管理平台结合使用,提供API版本控制、文档生成、使用策略定义等功能。这有助于组织和管理大量的服务API,并确保它们的一致性和可用性。
  • 连接保护: 微服务网关可以为通信提供SSL终端化,确保数据在传输过程中的安全。这对于保护敏感数据和遵守数据保护法规非常重要。
  • 错误处理和响应转换: 网关可以统一处理来自后端服务的错误响应,并将其转换为客户端期望的格式。这有助于提供一致的错误处理机制,改善用户体验。
  • 请求和响应的修改: 在某些情况下,网关可以根据需要修改进出的请求和响应。例如,它可以添加、删除或修改请求头或响应头,或者根据客户端的需求调整响应体的内容。
  • 微服务网关的这些功能和优势有助于构建高度可扩展、灵活且易于管理的微服务架构。它不仅简化了服务之间的交互,而且提高了整个系统的安全性、可靠性和性能。

Spring Cloud Gateway

Spring Cloud Gateway 是基于 Spring Framework 5、Project Reactor 和 Spring Boot 2 构建的,旨在提供一种简单而有效的方式来路由 API 请求到微服务。它是Spring生态系统中的一个API网关框架,利用非阻塞API和异步编程模型,为微服务架构提供了一个强大的网关。Spring Cloud Gateway 的工作流程主要包含以下步骤:

  • 客户端请求: 客户端发送请求到 Spring Cloud Gateway。
  • 路由匹配: 网关接收到请求后,会根据配置的路由规则来匹配请求。每个路由规则定义了一个或多个断言(Predicates)和一个或多个过滤器(Filters)。
  • 断言评估: 网关对请求进行评估,判断它是否符合路由断言。如果请求满足所有断言,网关就会认为这个请求匹配了该路由。
  • 过滤器链执行: 一旦请求被路由匹配,它会通过一系列预定义的和自定义的过滤器链。过滤器可以在发送下游请求之前或之后修改请求和响应。
  • 代理请求: 经过过滤器处理后,网关会将请求代理到匹配路由的目标微服务。
  • 目标服务响应: 目标微服务处理请求并返回响应。
  • 响应过滤: 网关可以在将响应发送回客户端之前,再次通过一系列过滤器进行处理。
  • 客户端响应: 最终,客户端接收到来自网关的响应,该响应可能已被过滤器修改。

Zuul

Zuul 是 Spring Cloud 生态系统中的一部分,它是一个基于 Java 的网关,可以实现负载均衡、路由转发、鉴权、限流等功能。通过在前端拦截请求、缓存响应和过滤请求,Zuul 网关可以帮助我们更好地保护和服务微服务。但是Zuul仅支持同步,不支持长链接。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Netflix eureka(服务发现)
  • Fegin(接口调用)
  • Ribbon(负载均衡)
  • Hystrix(熔断器)
    • 服务熔断
    • 服务降级
    • 服务限流
  • 微服务网关
    • Spring Cloud Gateway
    • Zuul
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档