梳理日常开发涉及的负载均衡

这篇具有很好参考价值的文章主要介绍了梳理日常开发涉及的负载均衡。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

负载均衡是当前分布式微服务时代最能提及的词之一,出于对分层、解耦、弱依赖、可配置、可靠性等概念的解读,一对一的模式变得不再可信赖,千变万化的网络环境中,冗余和备份显得格外重要,稍大型的系统就会存在大量微服务、服务器、中间件资源,如何将各个资源进行平衡调度,在不浪费算力的同时保证服务的可靠性、稳定性来提供基础架构。负载均衡是一个绕不开的话题,这里只列举出开发过程中需要了解到的负载均衡框架或技术,底层涉及的算法就不在此详述。

以web服务为例,从用户侧出发到服务端请求的处理,大概要经过以下四层负载均衡,最终实现用户请求与接口处理的对应。

梳理日常开发涉及的负载均衡,负载均衡,网关

1. DNS解析负载均衡

DNS主要是对域名的解析,正常域名可以添加多条主机记录,例如www二级域名对应记录值的IP地址,同一www二级域名可以添加多条IP地址的记录值,当存在多个IP,可以通过权重配置修改IP的权重,修改完成后,用户发起域名请求时,根据域名应答DNS查询时,所有IP地址按照预先设置的权重进行返回不同的解析结果,将解析流量分配到不同的服务器上,从而达到负载均衡的目的。

梳理日常开发涉及的负载均衡,负载均衡,网关

实现效果

假设www域名解析地址中添加了三条记录,分别对应3台服务器(IP 地址分别为IP-1、IP-2、IP-3)

记录类型

主机记录

解析线路

记录值

A

www

默认

IP-1

A

www

默认

IP-2

A

www

默认

IP-3

  • 未开启权重配置的效果

当Local DNS访问云解析DNS,云解析DNS将这3个解析记录全部返回给Local DNS,Local DNS再将所有的IP地址返回给网站访问者,网站访问者的浏览器会随机访问其中一个IP。在无DNS负载均衡的权威DNS中,这种方法能够在一定程度上减轻单台服务器的压力,但它不能区分服务器的差异,不能反映服务器的当前运行状态。

默认权重效果

权重配置未开启时默认配置的是1:1:1权重,云解析DNS会根据(默认权重1:1:1),轮询3个A记录,依次返回3个IP地址,以响应网站访问者的请求。DNS解析结果如下所示:

用户1 访问,返回 IP-1
用户2 访问,返回 IP-2
用户3 访问,返回 IP-3
用户4 访问,返回 IP-1
用户5 访问,返回 IP-2
用户6 访问,返回 IP-3
……
  • 权重设置效果

权重配置开启后,进行权重设置,在DNS请求应答中,IP地址按照预先设置的权重进行返回,可以实现将解析流量按照权重进行分配。例如,将上述3条解析记录的权重比设置为2:1:1时,则DNS解析结果如下所示:

用户1 访问,返回 IP-1
用户2 访问,返回 IP-2
用户3 访问,返回 IP-3
用户4 访问,返回 IP-1
用户5 访问,返回 IP-1
用户6 访问,返回 IP-2
……

2. Nginx负载均衡

Nginx是日常开发中使用较多的服务器,可以通过不同的负载均衡算法来解决请求量过大情况下的服务器资源分配问题。较为常见的负载均衡算法有轮询、加权轮询、IP 哈希等等。可以用来处理前端请求,或者是代理后端服务接口,通常来说,一个正常的Nginx Linux 服务器可以达到10w次/秒的请求处理性能。

nginx的负载均衡策略配置很简单,在 nginx.conf 文件中配置好需要轮询的服务器,写在 http 中的 upstream 对象里:

upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) 
    server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
} 

3. 微服务网关负载均衡

网关是系统的唯一对外的入口,介于前端端和后端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。承接上面的Nginx,正常微服务集群都有多个网关作为入口,这里可以用nginx做请求分发,将前端请求分发到不同的网关接口上,当请求到达网关并处理完成后,此时网关需要将具体的请求转发到具体微服务,以SpringCloud Gateway为例,spring提供了丰富的路由策略,可以解析到 HTTP层的数据。因此它可以根据请求的 Path 或 Domain 甚至是 Header 作为条件,再通过本地自定义的负载均衡策略,将请求转发到不同的微服务实例上。

具体代码实现过程中,可以从注册中心查询当前微服务注册的实例列表,并缓存到redis中间隔几秒进行更新,防止网关流量过大打垮注册中心,网关每次拿到实例列表后根据内部实现的负载均衡策略进行分发。

  	@Autowired
    private LoadBalanceHandler loadBalance;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpResponse response = exchange.getResponse();
        //获取原来的请求路径
        String requestPath = exchange.getAttribute(FilterDict.SYSTEM_REQUEST_PATH);
      	//自实现负载均衡策略
        String instanceInfo = loadBalance.randomSelectInstance();
        //如果没有服务,则直接返回报错
        if (StrUtil.isEmpty(instanceInfo)) {
            return response.writeWith(Mono.just(GateWayFilterUtils.writeData(exchange, RecoError.GEN_SERVER_BUSY)));
        }
        //用于测试负载均衡算法对IP分配是否均衡
//        redisUtil.zIncrementScore("test:gateway:load:ip",instanceInfo,1);
        //分割地址中IP和端口
        String[] serviceAddress = instanceInfo.split(StrUtil.COLON);
        String requestSchema = exchange.getRequest().getURI().getScheme();
        //拼接URL的数据
        assert ObjectUtil.isNotNull(requestPath);
        URI uri = UriComponentsBuilder.
                newInstance().scheme(requestSchema).
                host(serviceAddress[0].trim()).port(Integer.parseInt(serviceAddress[1].trim()))
                .path(requestPath).query(exchange.getRequest().getURI().getRawQuery()).build(true)
                .toUri();
        //将拼接好的URL装入新的exchange
        ServerWebExchange mutateExchange = exchange.mutate().request(builder -> builder.uri(uri).build()).build();
        Optional<Route> route = Optional.of(exchange.getAttribute(GATEWAY_ROUTE_ATTR));
        Route newRoute = Route.async()
                .asyncPredicate(route.get().getPredicate())
                .filters(route.get().getFilters())
                .id(route.get().getId())
                .order(route.get().getOrder())
                .uri(uri).build();
        mutateExchange.getAttributes().put(GATEWAY_ROUTE_ATTR, newRoute);
        mutateExchange.getAttributes().put(FilterDict.SYSTEM_APP_IP_ADDR, serviceAddress[0]);
        return chain.filter(mutateExchange);
    }

4. 微服务接口负载均衡

上面提到的网关负载是找到具体微服务来承接,不同于微服务之间接口调用的负载均衡,如SpringCloud feign中对Robbin进行了封装,在使用Feign时提供负载平衡的http客户端,如果需要配置自己的负载算法,可以自定义Ribbon的算法即可。

还有dubbo的接口中也提供了负载均衡功能,类似于官方文档中提供的使用方式,只需要调整 loadbalance 相应取值即可,每种负载均衡策略取值请参见文档负载均衡 | Apache Dubbo。

服务端服务级别
<dubbo:service interface="..." loadbalance="roundrobin" />
客户端服务级别
<dubbo:reference interface="..." loadbalance="roundrobin" />
服务端方法级别
<dubbo:service interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
客户端方法级别
<dubbo:reference interface="...">
    <dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:reference>

5. 总结

借用dubbo文档中对负载均衡的场景解释,负载均衡的好处有以下方面

  • 高可用性:部署服务的多个实例以确保即使一个或多个实例失败服务保持可用,负载均衡功能可用于在这些实例之间分配传入的请求确保以负载均衡方式使用每个实例的方式,还能最大限度地降低服务停机的风险。
  • 流量管理:限制指向特定服务实例的流量,以防止过载或确保公平的资源分配,负载均衡特性提供了 Round Robin、Weighted Round Robin、Random、Least Active Load Balancing 等多种负载均衡策略,可以用来实现流量控制。
  • 服务划分:将一个服务划分成多个逻辑组件,每个逻辑组件可以部署在不同的实例上,使用负载平衡以确保每个分区平衡的方式在这些实例之间分配请求,同时在实例发生故障的情况下提供故障转移功能。
  • 性能优化:负载平衡可用于优化服务的性能,通过跨多个实例分发请求可以利用可用的计算资源来缩短响应时间并减少延迟。

但有好处就有坏处,比起以往一条龙服务的形式,负载均衡的引入必然会增加系统复杂度,如果说微服务增加系统的宽度,那负载均衡无疑将这种宽度进一步放大,容易造成资源的浪费。


 

SLB负载均衡实践 - 云起实验室-在线实验-上云实践-阿里云开发者社区-阿里云官方实验平台-阿里云文章来源地址https://www.toymoban.com/news/detail-633542.html

到了这里,关于梳理日常开发涉及的负载均衡的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [ 云计算 Azure ] Chapter 07 | Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

    本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx 【Azure】微软 Azure 基础解析(四)Azure核心体系结构组件之数据中心、区域与区域

    2024年02月06日
    浏览(65)
  • 【Azure】微软 Azure 基础解析(七)Azure 网络服务中的虚拟网络 VNet、网关、负载均衡器 Load Balancer

    本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx 【Azure】微软 Azure 基础解析(四)Azure核心体系结构组件之数据中心、区域与区域

    2024年02月07日
    浏览(102)
  • 【SpringCloud系列】开发环境下重写Loadbalancer实现自定义负载均衡

            spring-cloud-starter-netflix-ribbon已经不再更新了,最新版本是2.2.10.RELEASE,最后更新时间是2021年11月18日,详细信息可以看maven官方仓库:https://search.maven.org/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon,SpringCloud官方推荐使用spring-cloud-starter-loadbalancer进行负载均衡

    2024年02月07日
    浏览(37)
  • TCP协议在IM场景中涉及核心问题以及解决方案梳理

    TCP工程问题扫盲先看下这个 [TCP连接的状态详解以及故障排查_tcp 连接时断时续_hguisu的博客-CSDN博客] 核心:TCP保证可靠的前提是链接能正常保持,如果各种原因导致链接断开。那链接会重置,之前承载的业务需要业务方自己保证可靠性、一致性;另外,在此基础上TCP只保证传

    2023年04月22日
    浏览(41)
  • 基于grpc-java开发的普通工程在k8s内部署多实例,如何实现客户端流量的负载均衡

    本文主要讨论通过grpc-java开发的普通的java grpc工程,以多实例的方式部署在容器编排平台kubernetes(以下简称k8s)上,如何能够实现让同样部署在k8s 集群内的客户端请求流量均衡的分发到多个grpc应用部署实例上去。 grpc服务端程序在k8s内部署的多个实例通过headless service暴露服

    2024年01月17日
    浏览(47)
  • SpringCloud(3) Ribbon负载均衡,负载均衡策略,自定义负载均衡

    假设我们有一台 order-service 订单服务,两台 user-service 用户服务,当订单服务需要调用用户服务获取用户信息的时候,应该怎么分配调用哪台服务呢? 这时候就需要用到 Ribbon 组件了。 首先,我们发起远程调用的时候,指定的是需要调用的服务名称,然后我们会调用 Ribbon 组

    2024年02月11日
    浏览(46)
  • 【负载均衡】常见的负载均衡策略有哪些?

    负载均衡策略是实现负载均衡器的关键,而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性,同时支持系统的扩展和故障容忍性。对于处理大量请求的应用程序和微服务架构来说,负载均衡器是不可或缺的重要

    2024年02月09日
    浏览(40)
  • Kong工作原理 - 负载均衡 - 负载均衡算法

    负载均衡器支持以下负载均衡算法: 1. 轮询(Round-robin) 2. 一致性哈希(Consistent Hashing) 3. 最少连接(Least Connections) 4. 延迟(Latency) 这些算法仅在使用upstream实体时可用,详见高级负载均衡。 注意:对于所有这些算法,重要的是要了解如何设置每个后端的权重和端口。

    2024年01月25日
    浏览(43)
  • LVS负载均衡(web网站负载均衡)

        一、概述         功能强大         转发策略比较多         适合大型的网络高可用      二、作用         使用keepalived解决lvs的单点故障高可用集群      三、环境         1.准备6台虚拟机,2台做LVS主备调度器,2台做web服务器,1台做存储,1台客户机验证

    2024年02月09日
    浏览(41)
  • Kong工作原理 - 负载均衡 - 高级负载均衡

    通过upstream实体可用高级负载均衡算法。 使用这些负载均衡器时,后端服务的添加和删除将由Kong处理,不需要进行DNS更新。Kong将充当服务注册表的角色。 通过上游和目标实体进行负载均衡器的配置。 upstream:一个“虚拟主机名”,可以在服务主机字段中使用,例如,一个名

    2024年01月25日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包