建论坛网站多少钱,东莞seo服务商,潍坊网站的优化,微网站平台目录
一、前言
二、源码分析
三、负载均衡策略 一、前言
如下图#xff0c;我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求#xff0c;在服务拉取的时候#xff0c;主机名 localhost 是用服务名 userserver 代替的#xff0c;那么该 url 是一个可…目录
一、前言
二、源码分析
三、负载均衡策略 一、前言
如下图我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求在服务拉取的时候主机名 localhost 是用服务名 userserver 代替的那么该 url 是一个可访问的网络地址吗 我们在浏览器中访问一下这个地址果然不可用。 那么它又是怎么访问到 userserver 数据的别忘了我们的服务都是注册在 Eureka 上的那肯定是拿着服务名去找 Eureka 要人了对不对找到服务之后把具体的主机名替换掉就OK了。 实际上我们可能有多个 userserver 同时注册在 Eureka 上这时候 orderserver 要去 Eureka 上拉取服务的时候拉取到的就不只是一个 userserver 服务了它应该是一个服务列表那么最终执行的时候肯定是只交给一个服务去做到底要交给谁呢没错这就是我们本篇要说的 —— Ribbon用它来实现多服务的负载均衡。 二、源码分析 上一篇文章中提到了 LoadBalanced 注解我们说用它可以开启负载均衡。这个注解其实就是一个标记标记 RestTemplate 发起的请求要被 Ribbon 拦截并处理。 那个这个拦截动作具体是谁来做的呢Ctrl Shift N搜索 LoadBalancerInterceptor点击第一个。 我们可以打断点 debug可以看到 request.getURI() 这一步是在获取请求路径也就是我们上面说的那个不可用的 url。 F8 快捷键下一步originalUri.getHost() 应该就是在获取主机名获取到的 host 正是 userserver。 拿到了主机名就该去找 Eureka 拉取服务了继续往下走发现它把该服务名称交给了 loadBalancer.execute 去执行F7 跟进该方法。 服务列表拿到之后就准备负载均衡了F7 进入方法内部我们发现它调用了 chooseServer 方法翻译一下选择服务。从刚才拉取到的服务列表中选择一个出来 继续 F7 进入 chooseServer 方法可以看到它又去调用父类的 chooseServer 方法了。 跟进方法往下走返回一个 rule.choose翻译一下选择规则。说明我们从服务列表中选择一个服务的时候也是有规则的。 光标放到 rule 上Ctrl 加鼠标左键跟进它原来是一个 IRule 类型的。 那么这个 IRule 接口有哪些具体的 Rule 呢光标放在 IRule 上Ctrl H弹出它的实现类。翻译一下有随机规则、轮询规则等等。 拿到了真实的访问地址并且选择了一种负载均衡策略就可以对之前不可访问的 url 进行替换了。 整体流程 orderserver 发起 http 请求 → 请求被 LoadBalancerInterceptor 负载均衡拦截器拦截 → RibbonLoadBalancerClient 拿到服务名并将其作为参数传给 DynamicServerListLoadBalancer → DynamicServerListLoadBalancer 就会去 Eureka 中拉取服务列表 → 随后 DynamicServerListLoadBalancer 又会去请求 IRule 接口做负载均衡根据规则挑一个服务出来并返回 → RibbonLoadBalancerClient 拿到了真实的服务地址就会对之前不可访问的 url 地址进行替换最终请求到目标服务。 三、负载均衡策略 如下图每一个子接口都是一种规则 默认是的负载均衡策略是 ZoneAvoidanceRule它父类的父类是轮询的所以本质上讲 ZoneAvoidanceRule 也是一个轮询策略但是它是以 Zone 对服务器进行划分的这个 Zone 可以理解为一个机房所以在选择服务的时候它会优先选择跟自己在同一个机房里面的服务然后进行轮询。 那么如何修改负载均衡规则呢有两种方式。
① 代码方式在 orderserver 的启动类中定义一个新的 IRule作用于全局
Bean
public IRule randomRule() {return new RandomRule();
}
② 配置文件方式在 orderserver 的 yml 文件中添加新的配置只针对某个微服务而言 Ribbon 的默认加载机制是懒加载所谓懒加载就是不用的时候不加载什么时候要用了才去加载所以服务在第一次被访问的时候速度较慢由于 Ribbon 给我们提供了缓存所以之后的访问速度还是很快的。
相对于懒加载的是饥饿加载顾名思义饥饿加载就是在项目一启动的时候就开始加载所以它的每一次访问速度都很快。那么如何修改 Ribbon 的加载方式呢我们可以通过配置文件的方式进行修改。