服务器负载均衡是什么意思 nginx负载均衡原理

1.什么是负载均衡首先我们来看看***对负载均衡的说明:举个例子来解释下负载均衡下图中,一群人在银行排队**业务,假设只有一个服务窗口,那么一个服务窗口来处理所有人员业务**,人少的时候,肯定是能够**完的,如果人特别多的时候恩?一个服务窗口肯定是没有办法处理完这么...

1.什么是负载均衡

首先我们来看看***对负载均衡的说明:

举个例子来解释下负载均衡

下图中,一群人在银行排队**业务,假设只有一个服务窗口,那么一个服务窗口来处理所有人员业务**,人少的时候,肯定是能够**完的,如果人特别多的时候恩?一个服务窗口肯定是没有办法处理完这么多业务**的。于是就出现如下图这样,一大堆人排队。

这时候银行就会多开几个窗口来**业务,将原本堆积在一个窗口上处理的业务,分配到几个窗口上,这样业务**就会加快了,但是仅仅是多开几个窗口是不够的。

为什么?因为没办法保证让某个人在某个窗口**业务。大家可能还是会乱套(举个极端例子:假设A窗口的小姐姐特别的漂亮,会不会她那里会有很多的男客户排队**业务恩?),因此银行除了多开几个窗口以外,还会设置一个排号,你拿到排号在哪个窗口,你就在哪个窗口进行**业务。

在我们负载均衡中 ,客户端(PC/移动/第三方)发起请求,就好比**业务的人员。负载均衡器(load balancer)就好比取号机,当他接收到一个请求的时候,负载均衡器就会给这个请求,分配一个服务来处理请求。就像取号机一样,负载均衡器按照一定规则分配一个窗口来**业务。

因此,在Spring cloud中,如果我们只提供一个服务,那么很可能会出现我们上面所说的一个窗口处理业务,处理不完的情况,导致大量人员排队等候。

2.注册多个服务

在微服务Spring Cloud快速入门中,如果我们的商品服务一个不够用的话,根据负载均衡的理论,那我们就可以多注册几个服务。防止一个服务无法承载高并发时的情况。

启动注册中心、商品服务,订单服务,登录注册中心,查看我们当前的服务

此时,我们的商品服务和订单服务都只是一个服务,那么如何注册多个商品服务呢?

2.1向注册中心注册多个服务

以同样的项目代码,设定端口为8091,其余配置均和之前的商品服务保持一致,然后启动商品服务。

点击如下所示,可以看到我们启动了1个注册中心,1个订单服务,2个商品服务

这时我们可以访问一下注册中心,我们可以发现,注册中心里面,商品服务有两个,一个是8081端口,一个是8091端口,并且他们的服务ID都是:HUTAO-MICROSERVICE-ITEM,这个服务ID和我们在配置文件中,配置的服务ID(spring.application.name)是保持一致的。

也就是说,我们通过服务ID:hutao-microservice-item在注册中心里面,能够找到两个服务

2.2通过服务ID找到服务

在微服务Spring Cloud快速入门中我们定义了如下Feign接口,在这个接口上面,我们添加了一个注解@FeignClient,指定了服务ID:hutao-microservice-item。这个Feign接口会给我发起Http调用。当然在这里我们可能无法看到负载均衡的效果,因此我们需要稍微深入下底层代码。

大家应该还记得,我们的商品服务和订单服务,注册到注册中心的时候,我们在启动类上面添加了一个注解:@EnableDiscoveryClient。

现在我们来看下DiscoveryClient这个接口

2.2.1.DiscoveryClient 解读

DiscoveryClient接口源码如下,他是用来发现服务的,比如发现Netflix服务,其中有个方法List getInstances(String serviceId)是根据服务ID获取服务实例***。

我们可以看到DiscoveryClient 有4个实现,当然这里我们用的肯定是Eureka。

2.2.2.使用DiscoveryClient获取服务实例

现在我们来使用下DiscoveryClient 这个接口

首先把这个接口依赖注入到我们的Controller中,我们看下能获取到什么

通过调试代码,我们发现如我们之前所说,我们可以通过服务ID:hutao-microservice-item,找到两个服务实例。

查看每个实例,我们发现我们能够看到每个服务的地址,端口等信息

如果不使用Feign这种声明式的调用Http请求,那我们来如何调用?

2.2.3.从服务实例中获取服务信息,发起Http请求

那么这个时候,我们怎么去发起请求恩?很简单,就是从服务实例中,获取到服务信息后,将接口的请求地址拼接出来。然后使用restTemplate发起Http请求

可以看到我们的请求是能正常访问的。当然也有问题存在,那就是我们拿到的是多个服务,程序怎么知道我要调用的是哪一个服务呢?

2.2.4.多个服务实例,如何负载均衡

上述案例中,我们获取到的实例是两个,那么每次调用的时候,我们怎么来确定,我要调用的是哪一个服务?,因为这时候我们拿到的两个服务,也就是两个不同的IP地址,这时候就需要一个负载均衡器来帮我们选择一个IP进行访问。

在Spring Cloud中,netfix提供一个负载均衡器Ribbon,该负载均衡器是声明式的,其用法如下所示,在我们注入到Spring容器中的RestTemplate添加注解@LoadBalanced,这时候我们的RestTemplate就具备了负载均衡的功能。

我们可以使用上述的第二个构造方法,使用Okhttp。

在上面的一个案例中,我们通过从服务实例中,获取到服务,然后再从服务中心获取具体的IP地址信息,发起请求。

但是,现在我们不需要这么做了,因为我们对restTemplate声明了是需要负载均衡的,因此我们发起请求的时候,就不需要指定IP地址了,我们可以用服务ID来代替IP地址,然后由restTemplate来帮我选择需要调用的IP。因此上述代码会被简化为如下所示,被注释掉的代码就是被优化的代码。

重启服务后,商品服务仍然可用,那么这时候怎么来验证我们的负载均衡成功了?

2.2.5.简单验证负载均衡

其实最简单的验证方式就是,在商品服务中,添加日志,看看哪个服务记录了日志或者debug调试,看走哪一个服务的代码。即可验证我们的负载均衡是否成功。

当然这里我们就不做上述方式的演示,来做一点高难度的代码分析。

3.分析@LoadBalanced实现负载均衡源码解析

3.1.RestTemplate源码解析

1、首先看org.springframework.web.client.RestTemplate类。

当我们执行如下代码时

最终会执行到如下方法

如上代码根据我们的提供的信息,创建了ClientHttpRequest请求, 我们发现doExecute有如下几个实现,这里由于我们使用的是默认的RestTemplate,因此我们查看org.springframework.http.client.AbstractClientHttpRequest这个类的org.springframework.http.client.AbstractClientHttpRequest.execute()方法。

3.2.LoadBalancerInterceptor源码解析

逐步深入代码,我们找到了如下的***。LoadBalancerInterceptororg.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor

3.3.RibbonLoadBalancerClient源码解析

继续深入代码,我们找到了RibbonLoadBalancerClient这个类org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient通过查看代码,我们发现了getLoadBalancer(String)这个方法通过serviceId找到了两个服务实例,

接着执行完毕getServer这个方法后,我们发现,只有一个服务实例了为8090。第二次调试代码后发现获取的是8091.多次调试后发现是8090和8091是轮询出现的,

也就是说getServer这个方法给我们实现了负载均衡。看源代码知道,如果未设置负载均衡参数,就使用default。否则就根据配置的参数选择服务。

具体的实现的负载均衡算法,本文不做讨论。

4.负载均衡代码验证演示

通过上述源码分析,我们发现如果我们开启了负载均衡,但是没有配置负载均衡参数,则会采用默认的配置,也就是轮询算法来实现负载均衡。

通过上述的debug阅读,我们参照getServer这个方法来写代码测试下负载均衡

5.负载均衡配置

在我们之前调试代码的时候我们发现源码中定义了IRule.choose(Object objet)这个接口,并且如下几个实现。

各个实现如下所示。

如果我们不想要默认的轮询机制,我们可以采用如上实现中的任何一种

比如,我们设置为随机策略。

hutao-microservice-item是我们需要对某个服务设定NFLoadBalancerRuleClassName是我们的策略(也就是实现类的路径)

重启服务后,再看我们的负载均衡,是随机的,而不是轮询的。

6.总结

注册多个服务:将项目部署在不同的服务器,或者同一个服务器不同端口号,然后注册到注册中心的服务ID(serviceId)保持一致即可;负载均衡实现:通过对RestTemplate添加注解@LoadBalanced,使用代理模式,拦截RestTemplate请求时,访问指定的负载服务,从而实现负载均衡。DiscoveryClient接口他是用来发现服务的,比如发现Netflix服务,其中有个方法List getInstances(String serviceId)是根据服务ID获取服务实例***。LoadBalancerInterceptor进行请求拦截处理RibbonLoadBalancerClient首先通过getLoadBalancer根据服务ID获取到负载,然后getServer会从多个负载中获取到适合的服务。其实现chooseServer如果没有设置负载均衡规则,则使用默认的轮询算法。IRule接口定义了choose方法。

本文来自Total.不想长大投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/550056.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 05-16
下一篇 05-16

相关推荐

  • 云服务器管理有哪些功能 云服务器管理的作用

    生活中经常听说云服务器。你知道云服务器的功能是什么吗?如果你不知道,那就和边肖一起看看吧。1.网络服务对于需要有网络站点的中小企业和个人来说,租用服务器是一个不错的选择。因为云服务器的预配置不需要那么多,可以买现成的,也有很多宽带选择,所以每个网站都可以有自

    2023-07-27 21:46:01
    444 0
  • 服务器备份软件有哪些(服务器自动备份及恢复软件)

    SyncBackPro备份软件是由2BrightSparks公司开发的用于备份、同步和恢复数据文件的专业工具。该软件可以在便携式设备之间自动传输媒体文件,并备份数据文件、图片、电子邮件、音乐文件、文档、电子表格和电影。SyncBackPro通过结合运行、创建配置文件脚本和自动驱动器故障检测

    2023-07-27 18:47:01
    531 0
  • 域名怎么用在服务器上,域名使用文档介绍

    购买域名后如何使用?你有什么技能?买了域名之后,就看你用它做什么了。注册后可以用域名申请企业邮箱,大部分用来建网站。我们来看看如何使用域名,购买后有哪些技巧。购买域名后如何使用?你有什么技能?1.企业电子邮件应用程序购买域名后,可以直接申请企业邮箱,进入西数

    2023-07-27 10:41:01
    1059 0
  • 服务器一般多少钱一个月 阿里云服务器租用费用

    目前市场上的网站价格参差不齐,每家公司都没有明码标价,导致很多企业不知道如何选择专业水平的网站建设公司,怕被骗花钱,做出来的网站没有效果。事实上,顾客的担心并非多余。有些公司收钱是为了盈利,但并不是真的为客户服务。这种现象依然存在。今天财利信息分析一下做一

    2023-07-27 09:56:01
    377 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信