Spring Cloud 组件

news2024/9/9 6:15:04

1.eureka注册中心原理简述

1.服务注册:

        Eureka Client 会通过发送rest请求的方式向eureka服务端注册自身元数据:ip地址,端口,运行状况等信息,服务端会把注册信息存储在一个双层map中。

  • Eureka 的数据存储分了两层:数据存储层和缓存层。

        Eureka Client 在拉取服务信息时,先从缓存层获取,如果获取不到,先把数据存储层的数据加载到缓存中,再从缓存中获取。值得注意的是,数据存储层的数据结构是服务信息,而缓存中保存的是经过处理加工过的、可以直接传输到 Eureka Client 的数据结构。

2.服务续约:

        eureka客户端每30秒发送一次心跳来续约,告知此客户端正常,如果eureka服务端90秒没收到心跳,则将其从注册表删除。

3.获取注册表信息:

        客户端通过rest请求从服务端获取注册表信息,缓存在本地,服务调用的时候,会从注册表查找其它服务,用于服务发现,从而发起远程调用。每30秒更新一次

4.服务调用

        客户端获取到服务清单后,就可以从中查找其它服务地址进行远程调用,会通过ribbon自动进行负载均衡。

5.eureka高可用:服务同步

        配置eureka集群,服务之间会相互注册,客户端的注册信息和续约信息被复制到集群中的所有节点,只要有一个节点活着都可以发挥注册中心的作用。

6.服务剔除

        eureka Client 启动的时候创建一个定时任务,Eureka Server会每60秒遍历一次注册表中的信息,把超过90秒还没有续约的服务剔除。

7.自我保护机制

        当网络一段时间内发生了异常,所有服务都没能够续约,eureka server会把所有服务剔除,显然不太合理,所以就有了自我保护机制。

        服务端如果15分钟内收到的心跳请求率,如果低于85%,可能网络故障,注册表则不再删除,但是提供正89常的服务注册和查询,当恢复正常时,则取消保护机制

8.eureka客户端注册实例为什么这么慢:

(1)默认设置了延时40秒

(2)eureka服务端维护每30秒更新响应缓存

(3)客户端每30秒更新缓存

(4)ribbon从本地获取服务列表时,本身也维护一个缓存,30秒刷新一次

2.Feign远程调用原理

  1. 首先通过@EnableFeignClients注解开启FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描。
  2. 根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。
  3. 程序启动后,会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IoC容器中。
  4. 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象。
  5. 根据RequestTemplate再生成Http请求的Request对象。
  6. Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient和OkHttp。
  7. 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

3.Ribbon负载均衡

1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略,

2.@LoadBalanced

1.当使用RestTemplate进行远程服务调用时,假如需要负载均衡,还可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建名字为loadBalancedRestTemplate的RestTemplate对象:

@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
    return new RestTemplate();
}

2.RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,核心代码如下所示(了解):

public ClientHttpResponse intercept(final HttpRequest request, 
    final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
    final URI originalUri = request.getURI();
    String serviceName = originalUri.getHost();
    return this.loadBalancer.execute(serviceName, 
    requestFactory.createRequest(request, body, execution));
}

总结:@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

4.hystrix容错组件

        hystrix是一个容错组件,实现了超时机制和断路器模式,提供了熔断和降级。

4.1 降级

        降级其实就相当于,当我们向一个服务发起请求,当请求超时了,就会把这次请求记录到服务中,然后就会尝试向其他服务发请求,如果还没成功,就对这次请求进行处理(怎么处理取决于业务需求如)就相当于try catch一样的逻辑,当然hystrix底层使用aop来实现的。

4.2 隔离和限流

        Hystrix采取了bulkhead舱壁隔离技术,将外部依赖进行资源隔离,避免任何外部依赖的故障导致本服务崩溃。

舱壁隔离
是说将船体内部空间区隔划分成若干个隔舱,一旦某几个隔舱发生破损进水,水流不会在其间相互流动,如此一来船舶在受损时,依然能具有足够的浮力和稳定性,进而减低立即沉船的危险。

        每当向服务发起一个请求时,就是会发起一个http请求,每一个http请求就要开启一个线程,然后等待服务返回信息,这容易导致线程的堆积,所以就可以用http的URI作为一个标识,然后相同的URI可以开启一个线程池,然后线程池中限定线程数,这样就可以设置拒绝策略,当线程池满了,就可以快速的抛出异常或者拒绝请求,用线程池做到线程隔离来达到限流。

4.3 熔断

        熔断就是有一个阈值,向服务发起请求后,如果不成功,就会记录次数,然后当连续失败次数达到阈值时,下次请求的时候就会直接把这个服务停止。请求有三种状态,可以请求(开),不可请求(关),还有一个中间状态,相当于半开状态,半开状态是什么意思呢,就是可以尝试着去请求,就可以在关闭状态后一段时间,发一个请求尝试一下是否可以请求成功,如果是吧,继续保持关闭状态,如果请求成功,则变成开放状态。

        首先Hystrix发生在请求这一端,所以我们先在consumer端引入Hystrix的依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  <version>2.1.1.RELEASE</version>
</dependency>

然后我们来整合一下Hystrix和feign

        首先呢,feign有两种方式来指定熔断策略,第一种是直接指定一个类,第二种是用fallbackFactory。区别是一种是可以直接熔断,一种是可以根据不同的类型,进行不同的处理。

        首先我们看看第一种,我们可以在@FeignClient注解中加上参数fallback=XXX.class,如下,我们这里的是面向接口编程,可以看我上一篇博客是讲如何用feign的。fallback里面的类也要新建一下。

    //这里name是eureka里的服务名
    @FeignClient(name = "user-provider",fallback = UserProviderBack.class)
    public interface UserAPI extends ProviderApi {
     
    }

        新建UserProviderBack类然后实现我们的UserAPI,把所有的方法都实现一遍,这种熔断策略是针对于每个请求资源的接口。每个接口都是同的。注意这个类要加上@Component注解,就是把这个类给到spring容器去管理。

@Component
public class UserProviderBack implements UserAPI {
    @Override
    public String alive() {
        return "降级了!!!!!!!!!!!!!";
    }
 
    @Override
    public HashMap getMapById(Integer id) {
        return null;
    }
}

        最后一步就是要配置properties文件,因为默认Feign在请求发生错误时,是不会用Hystrix做服务降级处理。

feign.hystrix.enabled=true

        还可以用不用fallback,改用fallbackFactory

@FeignClient(name = "user-provider",fallbackFactory = UserProviderBackFactory.class)
public interface UserAPI extends ProviderApi { 
}

        然后新建UserProviderBackFactory这个类,去实现FallbackFactory接口,这个接口我们可以把我们的接口类型传进去,然后重写create方法,如图,这里的throwable就是具体的异常信息,就可以根据不同的错误类型,进行catch,然后处理。

@Component
public class UserProviderBackFactory implements FallbackFactory<UserAPI> {
    @Override
    public UserAPI create(Throwable throwable) {
        return new UserAPI() {
            @Override
            public String alive() {
               
                return "又又又降级了";
            }
 
            @Override
            public HashMap getMapById(Integer id) {
                return null;
            }
        };
    }
}

5.zuul网关

        该组件是负责网络路由的,假设你后台部署了几百个服务,现在有个前端兄弟,人家请求是直接从浏览器那儿发过来的。打个比方:人家要请求一下库存服务,你难道还让人家记着这服务的名字叫做inventory-service,并且部署在5台机器上,就算人家肯记住这一个,那你后台可有几百个服务的名称和地址呢?难不成人家请求一个,就得记住一个?哈哈哈

        上面这种情况,压根儿是不现实的。所以一般微服务架构中都必然会设计一个网关在里面,像android、ios、pc前端、微信小程序、H5等等,不用去关心后端有几百个服务,就知道有一个网关,所有请求都往网关走,网关会根据请求中的一些特征,将请求转发给后端的各个服务。

5.1 Zuul 网关主要由以下几个组件构成:

  • Filter:过滤器,可以在请求被路由前或者之后添加一些处理逻辑。
  • Route:路由,将请求路由到不同的后端服务上。
  • Ribbon:负载均衡器,Zuul 默认使用 Ribbon 进行负载均衡。
  • Hystrix:容错处理器,可以实现限流和熔断机制。

Zuul 的过滤器链是整个网关的核心部分,它由多个过滤器构成,每个过滤器都负责不同的处理逻辑,比如请求的鉴权、转发等操作。过滤器链在处理请求的过程中,会依次执行这些过滤器,从而实现对请求的全生命周期管理,具体流程如下图所示。

5.2 Zuul 网关可以应用于各种场景中,主要包括以下几个方面:

  • 负载均衡:Zuul 可以将请求分发到不同的后端服务上,实现负载均衡的功能。
  • 路由转发:Zuul 可以根据请求的 URL,将请求转发到不同的后端服务上,实现路由转发的功能。
  • 鉴权和安全:Zuul 可以对请求进行鉴权和认证,保障系统的安全性。
  • 限流和熔断:Zuul 可以在高并发的情况下,通过限流和熔断机制,保障后端服务的可用性。

6.Apollo配置中心

服务通过app-id与Apollo获取配置,获取到配置后会被缓存到本地。
Apollo可以实现WEB页面对配置进行CRUD操作(SpringCloud Config不具备)。
Apollo的配置存储在MySQL中(SpringCloud Config存储于git)
Apollo轻量级,SpringCloud Config则需要依赖于MQ、BUS消息总线

Apollo分为三个服务:portal、admin、config
portal:UI页面
admin:用户、角色管理,CRUD操作
config:用户和服务进行连接,为服务pull和push配置。config服务内置了Eureka

7、流程总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32嵌入式系统设计与开发拓展】——13_PWM脉宽

目录 1、什么是PWM?用来做什么的&#xff1f;PWM&#xff08;Pulse Width Modulation&#xff09;脉冲宽度调制常见用到 PWM 的情况&#xff1a; 2、什么是输出比较&#xff1f;输出比较模式![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42434920ca0940b1b1083215…

vue el-input 输入框下拉显示匹配数据

1、效果图&#xff1a; 2、需求&实现&#xff1a; 输入条件 下面匹配查询到的数据有多少个 需要调用后端接口展示&#xff0c;后端查询到之后返回条数 前端展示 3、具体代码实现&#xff1a; html&#xff1a; 图片需要自己根据实际情况增加 // 查询 重置 筛选 本文章…

【git】git常用命令提交规范

Git 是程序员工作中不可或缺的版本控制工具&#xff0c;以下是一些优化后的常用 Git 命令列表&#xff0c;旨在帮助你更高效地使用 Git 进行版本控制。 基础操作 拉取代码 git clone xxx.git创建分支 git branch dev切换分支 git checkout dev # 或者 git switch dev创建并切换…

Python酷库之旅-第三方库Pandas(056)

目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…

论报文加密加签场景下如何高效的进行渗透测试

前言 最新的测试中&#xff0c;经常遇到HTTP报文加密/加签传输的情况&#xff0c;这导致想要查看和修改明文报文很不方便。 之前应对这种情况我们有几种常见的办法解决&#xff0c;比如使用burpy插件、在Burp上下游使用mitmproxy进行代理等&#xff0c;但这些使用起来不太方便…

LSTM详解总结

LSTM&#xff08;Long Short-Term Memory&#xff09;是一种用于处理和预测时间序列数据的递归神经网络&#xff08;RNN&#xff09;的改进版本。其设计初衷是为了解决普通RNN在长序列训练中出现的梯度消失和梯度爆炸问题。以下是对LSTM的详细解释&#xff0c;包括原理、公式、…

面向非结构化数据的知迟抽取

文章目录 实体抽取关系抽取事件抽取大量的数据以非结构化数据(即自由文本)的形式存在,如新闻报道、科技文献和政府文件等,面向文本数据的知识抽取一直是广受关注的问题。在前文介绍的知识抽取领域的评测竞赛中,评测数据大多属于非结构化文本数据。本节将对这一类知识抽取技…

Prometheus-部署

Prometheus-部署 Server端安装配置部署Node Exporters监控系统指标监控MySQL数据库监控nginx安装grafana Server端安装配置 1、上传安装包&#xff0c;并解压 cd /opt/ tar xf prometheus-2.30.3.linux-amd64.tar.gz mv prometheus-2.30.3.linux-amd64 /usr/local/prometheus…

【音频识别】十大数据集合集,宝藏合集,不容错过!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 1 RenderMe-360 发布方&#xff1a; 上海人工智能实验室 发布时间&#xff1a; 2023-05-24 简介&#xff1a; RenFace是一个大规模多视角人脸高清视频数据集&#xff0c;包含多样的…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题前排提示&#xff1a;文末有CSDN官方认证Python入门资料包 &#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语…

Redis内存管理

文章目录 Redis内存管理删除策略淘汰策略LRU算法 Redis内存管理 长期把Redis做缓存用&#xff0c;总有一天Redis内存总会满的。有没有思考过这个问题&#xff0c;Redis内存满了会怎么样&#xff1f;在redis.conf中把Redis内存设置为1个字节&#xff0c;做一个测试&#xff1a;…

【随机链表的复制】python刷题记录

R3-哈希表 参考k神题解 哈希表法&#xff1a; """ # Definition for a Node. class Node:def __init__(self, x: int, next: Node None, random: Node None):self.val int(x)self.next nextself.random random """class Solution:def copy…

“打破常规:评估八股文对工作的真正影响“

“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试考什…

基于深度学习的结肠炎严重度诊断

基于深度学习的结肠炎严重度诊断 本文所涉及所有资源均在传知代码平台可获取 文章目录 基于深度学习的结肠炎严重度诊断1.概述1.1 数据集展示1.2 Resnet50介绍1.2.1结构与特点1.2.2关键优势1.2.3总结 2.创新点3.结果可视化展示结果展示4.核心逻辑5.部署及使用方式5.1 环境配置5…

彻底搞清楚SSR同构渲染的首屏

作为.NET技术栈的全干工程师&#xff0c;Blazor、Vue/Nuxt.js和React/Next.js都会接触到。它们&#xff08;准确的说是Blazor、Nuxt和Next&#xff09;&#xff0c;都实现了SSR同构渲染。要了解同构渲染&#xff0c;需要从服务端渲染开始。 传统的服务端渲染 如下图所示&…

开放式耳机什么牌子的好?看这6大品牌就够了

移动互联网时代&#xff0c;听歌、追剧、网课、短视频……这几年全球青年人对于耳机和耳朵的依赖程度&#xff0c;可谓前所未有的提升。但选择一款好的耳机&#xff0c;也不是一件容易的事&#xff0c;入耳式耳机戴久了耳道会疼&#xff0c;还可能引起一系列不必要的炎症&#…

【C语言】C语言期末突击/考研--数据的类型

目录 一、编程环境的搭建 二、数据的类型、数据的输入输出 2.1.数据类型 2.2.常量 2.3.变量 2.4.整型数据 2.4.1.符号常量 2.4.2.整型变量 2.5.浮点型数据 2.5.1.浮点型常量 2.5.2.浮点型变量 2.6.字符型数据 2.6.1字符型常量 2.6.2.字符数据在内存中的存储形式及…

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3&#xff08;含分析过程&#xff09; 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 | 1/3&#xff08;含分析过程&#xff09; 一、简单介绍 二、机器学习 1、为什么使用机器学习&a…

react antd upload custom request处理多个文件上传

react antd upload custom request处理多个文件上传的问题 背景&#xff1a;第一次请求需要请求后端返回aws 一个link&#xff0c;再往link push文件&#xff0c;再调用另一个接口告诉后端已经上传成功&#xff0c;拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环…

字体表绘制的理解

下载字体到项目根目录下&#xff0c;我们通过一些在写预览本地字体的网站&#xff0c;简单看一下 通过图片不难看出阴书与原文的对应关系&#xff0c;接下来通过程序去完成这一过程&#xff0c;通过 fonttools 处理 ttf&#xff0c;然后获取字体和文字对应的 xml 文件 下面简单…