通俗易懂的dubbo学习(三) dubbo里面的负载均衡

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 通俗易懂的dubbo学习(三) dubbo里面的负载均衡

关于dubbo里面的负载均衡部分,实际上是可以通过一定的配置来进行设置的。

关于负载均衡的案例我们还是使用之前的消费者,生产者案例来进行说明:


我们在之前的基础上模拟一下开启两个服务提供者:


分别是服务开关Application1:


package com.lh.pro.server;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
 * 作者:idea
 * 日期:2018/8/11
 * 描述:
 */
public class Application {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"application-context.xml"});
        context.start();
        System.out.println("dubbo的服务生产者1开启了");
        //长期开启应用
        System.in.read();
    }
}
复制代码


服务开关Application2


package com.lh.pro.server;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
 * 作者:idea
 * 日期:2018/8/11
 * 描述:服务开关2
 */
public class Application2 {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"application-context.xml"});
        context.start();
        System.out.println("dubbo的服务生产者2开启了");
        //长期开启应用
        System.in.read();
    }
}
复制代码


注意,两者在开启的时候要调整dubbo的服务端口号。同时在开启


<!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
复制代码


创建好了相应的服务之后,我们就可以进入相应的测试环节了:


首先在服务Application1开启的时候我们对于UserRpcService接口的实现如下:


package com.lh.pro.rpc;
import com.sise.service.UserRpcService;
import org.springframework.stereotype.Service;
/**
 * 作者:idea
 * 日期:2018/8/11
 * 描述:用户service服务调度
 */
@Service("userService")
public class UserService implements UserRpcService{
    /**
     * 返回用户名的服务
     * @param username
     * @return
     */
    public String    getUserName(String username) throws InterruptedException {
        return username+" hello !";
    }
}
复制代码


服务开关2开启的时候,UserRpcService的实现改为以下内容:


package com.lh.pro.rpc;
import com.sise.service.UserRpcService;
import org.springframework.stereotype.Service;
/**
 * 作者:idea
 * 日期:2018/8/11
 * 描述:用户service服务调度
 */
@Service("userService")
public class UserService implements UserRpcService{
    /**
     * 返回用户名的服务
     * @param username
     * @return
     */
    public String getUserName(String username) throws InterruptedException {
        return username+" hello ! cluster test";
    }
}
复制代码


这个时候就呈现了这么一种情况,同一个服务有两个服务提供者来提供。


修改服务实现的好处就在于 能够区分出不同服务的提供方


这个时候我们开启消费者一方,为了能够模拟负载均衡,我们对消费者一方进行了一个服务的循环访问来模拟高压场景:


package com.lh.consume;
import com.sise.service.UserRpcService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
 * 作者:idea
 * 日期:2018/7/29
 * 描述:消费者测试
 */
public class ConsumerTest {
    public static void main(String[] args) throws InterruptedException {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"classpath:application-consumer.xml"});
        context.start();
//        //这里开始模拟疯狂调用服务进行增加压力
        for(int i=0;i<100;i++){
            UserRpcService userService= (UserRpcService) context.getBean("userService");
            System.out.println(userService.getUserName("this is "+i));
        }
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
复制代码


开启两个生产者开关后,在进行消费者的调用,


这个时候我们果然能够通过控制台里面打印的内容看到不一样的效果:



接下来我们去到dubbo-admin平台中心里面进行权重划分,重新调整压力分配的形式:



这个时候就会出现服务端口号为20881的一方负载能力增强。



16:1的负载分配情况截图


在集群负载均衡时,Dubbo提供了多种均衡策略,默认情况下为random随机调用。


Random LoadBalance


随机,按权重设置随机概率。


在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。


RoundRobin LoadBalance


轮循,按公约后的权重设置轮循比率。


存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。


LeastActive LoadBalance


最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。


使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。


ConsistentHash LoadBalance


一致性Hash,相同参数的请求总是发到同一提供者。


当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。


举个例子:


假设要采用轮训的方式来进行负载均衡,需要添加以下配置:



这样子的情况下,接口的响应内容如下:


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
8月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
8月前
|
负载均衡 Dubbo 应用服务中间件
【Dubbo 解析】Dubbo支持几种负载均衡策略?
【1月更文挑战第11天】【Dubbo 解析】Dubbo支持几种负载均衡策略?
|
3月前
|
负载均衡 应用服务中间件 Linux
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
这篇博客文章详细介绍了Nginx的下载、安装、配置以及使用,包括正向代理、反向代理、负载均衡、动静分离等高级功能,并通过具体实例讲解了如何进行配置。
194 4
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件,很全
|
3月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
110 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
3月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
3月前
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
140 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
3月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
194 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
3月前
|
Dubbo IDE Java
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
这篇文章是关于如何下载和部署Dubbo管理控制台(dubbo-admin)的教程,并分析了2.6.1版本及以后版本的变化。
110 0
dubbo学习二:下载Dubbo-Admin管理控制台,并分析在2.6.1及2.6.1以后版本的变化
|
3月前
|
Kubernetes 负载均衡 网络协议
k8s学习--负载均衡器matelLB的详细解释与安装
k8s学习--负载均衡器matelLB的详细解释与安装
209 0
|
5月前
|
负载均衡 Dubbo 算法
Dubbo服务负载均衡原理
该文章主要介绍了Dubbo服务负载均衡的原理,包括Dubbo中负载均衡的实现位置、为什么需要负载均衡机制、Dubbo支持的负载均衡算法以及随机负载均衡策略的源码分析。