springcloud原理详解_SpringMVC运行原理

springcloud原理详解_SpringMVC运行原理SpringCloudEureka原理分析一、Eureka的基础架构及服务治理机制  Eureka服务治理的基础架构包含三个核心:服务注册中心、服务提供者、服务消费者。其中服务注册中心,即Eureka提供的服务端,提供服务注册和发现的功能;服务提供者,即将自己的服务注册到注册中心;服务的消费者,从注册中心获取服务列表,从而使消费者知道到何处调用服务,服务消费可以使用Ribbon、Feign等。1、服务提供者:服务注册:服务提供者在项目启动时,会通过发送REST请求的方式将自己注册到eure

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

SpringCloud Eureka原理分析

一、Eureka的基础架构及服务治理机制

  Eureka服务治理的基础架构包含三个核心:服务注册中心、服务提供者、服务消费者。其中服务注册中心,即Eureka提供的服务端,提供服务注册和发现的功能;服务提供者,即将自己的服务注册到注册中心;服务的消费者,从注册中心获取服务列表,从而使消费者知道到何处调用服务,服务消费可以使用Ribbon、Feign等。

1、服务提供者:

  1. 服务注册:服务提供者在项目启动时,会通过发送REST请求的方式将自己注册到eureka server上,同时带上一些自己的元数据,Eureka Server收到请求后,将元数据存储在一个双层map中,第一层的key是服务名称,第二层的key是具体的服务实例。
  2. 服务同步:如果A项目将服务注册到了M注册中心,B项目将服务注册到N注册中心,但是如果M项目和N项目开启了可以注册为服务的配置,那么当A项目将服务注册到M注册中心时,M注册中心会将请求转发到N注册中心,以保证两个注册中心副本中服务同步。
  3. 服务续约:在注册完服务后,服务提供者会维护一个心跳(30s发送一次)来持续告诉注册中心其还活着,以防止注册中心的剔除任务将该服务实例从服务列表中删除。

关于心跳频率与剔除任务认为服务失效时间的配置参数如下所示(配置值均为默认值):

eureka:

  instance:

    # 心跳检测频率

    lease-renewal-interval-in-seconds: 30

    # 服务失效时间

    lease-expiration-duration-in-seconds: 90

 

2、服务消费者:

  1. 获取服务:当启动服务消费者项目时,会向注册中心发送一个REST请求来获取注册中心上注册的服务清单。为了性能的考虑,注册中心自己维护了一份只读的注册服务清单,每30秒更新一次,要调整注册中心中注册服务清单更新频率,可以使用如下参数进行设置(下面示例为默认值),同时,由于获取服务是服务消费的基础,因此需要保证eureka.client.fetch-registry为true

eureka:

  client:

    registry-fetch-interval-seconds: 30

    fetch-registry: true

  1. 服务调用:服务消费者在获取到服务提供清单后,会根据服务名获得具体的实例名和该实例的元数据,然后客户端可以根据自己需要,选择调用哪个实例,在上述代码样例中,我们使用的是Ribbon来做负载均衡,而ribbon默认采用轮询的方式进行调用,从而实现客户端的负载。对于访问实例的选择,Eureka中有Region和Zone的概念,一个Region中可以包含多个Zone,一个客户端会被注册到一个Zone中,所以一个客户端只对应一个Zone和一个Region,在服务调用时,优先访问处于同一个Zone中的服务提供者,若访问不到,再访问其他Zone中的服务提供者。
  2. 服务下线:当客户端实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给注册中心,告诉注册中心其要下线,注册中心收到请求后,将该服务状态置为下线,并把该事件传播出去。

3、服务注册中心

  1. 失效剔除:有时服务实例并不会正常下线,可能是由于内存溢出、网络故障等原因使得服务不能正常运行,所以注册中心并未收到服务下线的请求。为了剔除该类不可用服务提供者实例,Eureka Server在启动时,会创建一个定时任务,每隔一段时间(默认60秒)将当前清单中超时(默认90秒)没有续约的服务剔除出去。
  2. 自我保护:前面提到过,服务提供者启动后,会维护一个心跳,定时向注册中心发送心跳,告诉注册中心自己还活着。注册中心的运行期间,会统计心跳失败的比例。在15分钟内是否低于85%,如果低于85%,注册中心会将该服务的实例保护起来,不让其过期,但是由于在本地测试,所以这个情况非常容易满足(而线上则主要是由于网络不稳定等导致),这就导致在保护期间内,如果服务提供者实例出现问题,那么客户端就会拿到有问题的实例,将会出现调用失败的情况,因此客户端必须要有容错机制,比如说请求重试、断路器等机制。如果我们想关闭自我保护机制,可以使用如下参数。

eureka:

  server:

    enable-self-preservation: false

二、Jersey (熟悉而又陌生的Contoller)

Springcloud是典型的Servlet应用,服务端与客户端之间通过Restful接口交互。

EurekaSever 与EurekaClient 之间也是跟我平时做系统之间交互差不多。我们写了这么多Controller,业务系统之间怎么通过接口交互,应该很明确了。

与我们熟悉的代码不同的是

我们用的是SpringMVC框架, 写的是Controller.

Eureka 用的是Jersey框架,Jersey框架里类Controller的组件叫做ApplicationResource概念。

接口包:

  • 我们通常定义一个 xxx.controller ,里面存放的就是我们的接口
  • Eureka有个resources包,里面存放的就是EurekaServer的对外的接口com.netflix.eureka.resources包。

springcloud原理详解_SpringMVC运行原理

 

接口 接口有哪些呢?

从其wiki文档中,你会看到这样一个目录Eureka-REST-operations,

springcloud原理详解_SpringMVC运行原理

 

Google的guava框架(瓜娃子)

Eureka里用到的很多工具类,都是来自Google的guava项目。

列如:

缓存:Eureka里面使用了很多缓存都是使用Google的guava缓存构建的。

HTTP通信

EurekaSever 与EurekaClient 之间的通信协议是HTTP.

我们常用的Resttemplate发起一个Post/GET请求。

EurekaClient 在与EurekaSever 通信时,用的是一个叫做EurekaTransport的HTTP工具。

 

EurekaServer的设计思想

  • 读写分离思想(缓存分级):当出现频繁的读与写时,此时想到的应该就是读写分离思想。EurekaSever也是这么做的
  • 定时刷新
  • 定时驱逐
  • STW

InstanceInfo域值(DTO)

EurekaSever 与EurekaClient 之间的通信的基本单位是InstanceInfo

客户端组装一个代表自己的信息的InstanceInfo, 注册到EurekaSever ,EurekaSever 将这个InstanceInfo缓存起来,

 

 

参考:

https://www.cnblogs.com/liconglong/p/13223182.html

https://www.lagou.com/lgeduarticle/131536.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179376.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 网络流媒体协议之——RTSP协议

    网络流媒体协议之——RTSP协议RTSP(Real-TimeStreamProtocol)协议是一个基于文本的多媒体播放控制协议,属于应用层。RTSP以客户端方式工作,对流媒体提供播放、暂停、后退、前进等操作。该标准由IETF指定,对应的协议是RFC2326。RTSP作为一个应用层协议,提供了一个可供扩展的框架,使得流媒体的受控和点播变得可能,它主要用来控制具有实时特性的数据的发送,但其本身并不用于传送流媒体数据,而

  • 【转载】一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)

    【转载】一张“神图”看懂单机/集群/热备/磁盘阵列(RAID)

    2021年11月20日
  • java反转数组_Java中如何将数组反转?Java数组反转的2种方法(代码示例)「建议收藏」

    java反转数组_Java中如何将数组反转?Java数组反转的2种方法(代码示例)「建议收藏」数组操作Java数组如何反转输出?下面本篇文章就给大家介绍2种在java中实现数组反转的简单方法。有一定的参考价值,希望对大家有所帮助。【视频教程推荐:java教程】方法一:使用循环,交换数组中元素的位置使用循环,在原数组中交换元素的位置:第一个元素与最后一个元素交换,第二个元素与最后一个元素交换,依此类推,直到结束。例如,在数组[1,2,3,…,n-2,n-1,n]中,我们可以将1和n进行交…

  • matlab griddata nan,请教Matlab的griddata的用法

    matlab griddata nan,请教Matlab的griddata的用法请教Matlab的griddata的用法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!请教Matlab的griddata的用法MATLAB散乱点插值函式griddata函式语法:ZI=griddata(x,y,z,XI,YI)[XI,YI,ZI]=griddata(x,y,z,XI,YI)[…]=gri…

  • 什么是SOAP,有哪些应用

    什么是SOAP,有哪些应用SOAP是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。SOAP利用XML技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。转载于:ht…

  • 微信小程序即时聊天对话窗口静态源码[通俗易懂]

    微信小程序即时聊天对话窗口静态源码[通俗易懂]实例描述:静态的源码,需要自己二次开发适用范围:所有版本微信小程序库日期:2019/9/2前端:<scroll-viewstyle=”height:{{height}}vh;width:100vw;display:flex;position:relative;flex-direction:column;top:{{top?top:0}}px;”…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号