当前位置: 首页 > 网络应用技术

在春季云色带实现源代码和原理的深度分析中

时间:2023-03-07 02:26:17 网络应用技术

  功能区的核心作用是执行请求的负载平衡。它的基本原理如下图所示,也就是说,客户端集成了功能区组件。功能区将计算功能区中配置的服务提供商的地址列表的负载平衡。获得目标地址后,将启动请求。

  然后,我们分析了两个级别的色带原理

  使用RestTemplate时,我们添加了@loadBalance注释,以允许此RESTTEMPLATE在请求时具有客户端负载平衡能力。

  然后,我们打开了@loadbaranced的注释,发现注释仅宣布发表评论。

  当我们使用注释注入bean时,我们都使用 @autowired。每个人都应该知道@autowired可以注入列表或地图。让我给您一个示例(在Springboot应用程序中)

  定义一个测试频道

  声明配置类和注入testClass

  定义用于测试的控制器。请注意,目前我们使用@autowired注入列表集合

  此时访问:http:// localhost:8080/test,结果是

  修改和

  再次访问:http:// localhost:8080/test,结果是

  在理解注释的作用之后,不难理解。

  因为我们需要扫描注释的示例,所以我们可以完成此操作。它的特定实施代码如下:

  从该代码可以看出,在LoadBalancerautoconfiguration的配置类中,将使用相同的方式将注释注入集合中。

  获得它后,在LoadBarancerInterInterinftorConfig配置类中,这些将截获这些,并且代码如下:

  在程序中,当我们使用以下代码启动远程请求时

  它的整个呼叫过程如下。

  RESTTEMPLATE.GETFOROBJECT

  -----> AbstractClientTprequest.execute()

  -----> AbstractBufferingClienttPrequest.executeInternal()

  ----->互联网

  ---->互联网

  interceptingclienthttprequest.execute()方法的代码如下。

  LoadBalancerInterceptor是拦截器。当注释对象启动HTTP请求时,它将被拦截。

  在此方法中,您可以直接通过该方法获取服务名称(因为使用RESTTEMPLATE调用服务时,我们使用服务名称而不是域名,因此您可以直接通过Gethost获得服务名称)

  LoadBalancerClient实际上是一个接口。我们查看其类图。它具有独特的实施类:。

  RibbonLoadBaranclient相对较长。我们主要看他的核心方法执行

  上述代码的实现如下:

  Geterver用于获得特定的服务节点,其实现如下

  可以通过GetServer实际调用IloAdbarancer.ChooseServer方法的代码来查看。IloAdbalancer是一个负载Balanor接口。

  IloadBarancer的分类图如下:

  从整个班级的关系图的角度来看,基本电池班类实现了基本的负载平衡,而DynamicServerListLoadBarancer和ZoneAwareLoadBarans则根据负载平衡策略进行了一些功能扩展。

  Geterver方法中的特定实现类是哪个?我们找到此类

  从上述语句中可以发现,如果没有自定义iLoadbarancer,请直接返回一个

  区域是指该地区的含义。区域是指地理区域的概念。通常,大型互联网公司将进行交叉区域部署。以这种方式有几个好处。首先是为用户提供不同区域的最新访问节点。REDUCE访问延迟,然后确保高可用性和灾难恢复治疗。

  Zoneawareloadbarans为具有区域意识的负载平衡器提供了。它的主要功能是感知区域,以确保每个区域中的负载平衡策略是隔离的。它不能保证A区域的请求将确定与A区域相对应的服务器。真正意识到此要求的内容。

  ZoneawareLoAdbaranceer的核心功能是

  假设我们现在不使用多个区域部署,然后将执行负载策略,

  根据默认负载平衡算法获取指定的服务节点。默认算法是roundbin。

  规则代表负载平衡算法的规则。它有很多实施。

  默认情况下,实现在此配置类中定义了,代码如下:

  因此,在中间呼叫中,将实际输入的方法

  服务器所在区域的性能和服务器的可用性

  主要分析方法。

  从方法名称可以看出,通过过滤算法过滤目标服务群集后,负载平衡用于查询旋转。

  使用主过滤条件过滤所有实例并返回过滤器列表,

  依次使用过滤条件来过滤主要过滤条件的结果*

  实现此处的实现是遍历所有服务器列表,调用方法验证和验证传递节点,这些节点将添加到此列表中并返回。

  ,将输入该方法,代码如下。

  //compositePredicate.apply

  示例是,代码如下!

  换句话说,该方法将通过该方法过滤,这意味着目标服务器群集的特定节点。

  其中,以下是判断谓词的组合,这里的组合是与和预言的关系。

  在上面的代码中,组件由两个谓词组成

  因此,在该方法中,您需要穿越这两个谓词以一个一个判断。

  过滤状态和连接过多的服务中的服务,代码如下:

  确定是否跳过此目标节点并如下实现逻辑。

  服务器是否判断断开状态?

  ServerStats源代码,我们不会在此处发布详细信息,讨论该机制:

  断开连接是通过时间判断实现的,并且每次失败记录上一次。

  计算电路断开的持续时间:如果它大于最大断开时间,请按最大的断开时间。确定当前时间是否大于最后一个故障时间+短路频率持续时间。这里有三个配置(这里您需要将默认值替换为您调用的微服务):

  Zoneavoidance Predicate,在无用的区域中滤除节点,代码如下!

  LoadBalancestats,每次您启动通信时,状态信息都会在控制台中打印出来!

  GetavailableZones方法的代码如下:计算有效的可用区域。

  上述逻辑相对复杂。我们通过一个简单的文本解释:

  回答下面的代码后,在判断可用服务节点后,如果节点不是0是0,则执行方法是旋转的。

  此方法是通过旋转实现的,代码如下!

  在此示例中,我们在application.properties文件中配置了服务列表,这意味着此列表将在某个时候加载并保存在一定位置。什么时候加载?

  在此配置类中,有一个关于以下bean(触发bean)的说明,用于定义默认负载平衡实现。

  如前所述,其分类图如下所示!

  初始化时,可以调用父类,代码如下。

  方法主要做两件事。

  更新服务列表的全部数量。

  上述代码如下解释

  最后致电并将所有服务器更新到本地缓存。

  在色带中,基于PING机制,目标服务地址还将改变动态变化。特定的实现方法是该方法中的方法

  请注意,定时任务将在此处启动,并且定时时间安排的过程是它是一个匿名内部类,在下面定义。

  定时任务的开始方法如下。此任务每30秒每30秒执行一次。

  在30s之后触发该方法后,该方法最终输入该方法

  其中,将调用心跳健康检测。

  在上述分析之后,返回方法!

  目前,这条代码将返回特定的目标服务器。

  其中,在调用该方法之前,它将包装一个可以通过的对象。它的主要功能是记录请求的负载信息。

  请求是LOADBARASECERREQUEST接口。它提供了一种应用方法,但是从代码中我们发现该方法尚未实现。那么它在哪里实现?

  继续再次前进,发现此请求对象是从截距方法传递的。

  创建了请求的传输,因此我们找到了此方法。

  从代码中可以找到它是一个匿名的内部类,该类以lambda表达式实现。

  执行上述代码,并输入代码,并且代码如下。

  现在应该注意,该对象的示例是。

  当您调用目标地址以创建HTTP请求时,该方法被调用。

  在此方法中,呼叫实例中的方法根据服务ID生成目标服务地址。