• 从零开始教你dubbo自定义负载均衡策略


    前言:官网文档有一重要章节SPI,建立好好阅读,为本文做铺垫

    1.搭建工程,结构如下:

    dubbo-learn —> 父pom

    dubbo-api —> 服务提供者和消费者共同依赖对接口api

    dubbo-provide1,2,3 —> 分别是3个服务提供者

    dubbo-consumer —> 服务消费者

    1.1) dubbo-learn对应pom

    
    
        4.0.0
    
        
            org.springframework.boot
            spring-boot-starter-parent
            2.3.1.RELEASE
             
        
    
        org.example
        dubbo-learn
        1.0.0
        pom
    
        
            dubbo-provide1
            dubbo-provide2
            dubbo-provide3
            dubbo-consumer
            
        
    
        
            
                org.springframework.boot
                spring-boot-starter-data-redis
                2.3.1.RELEASE
            
            
                org.apache.dubbo
                dubbo-spring-boot-starter
                2.7.6
                compile
            
            
            
                redis.clients
                jedis
                2.8.1
                compile
            
            
                com.example
                dubbo-api
                1.0.0
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    1.2) dubbo-api层pom

    
    
        4.0.0
    
        com.example
        dubbo-api
        1.0.0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    1.3) dubbo-consumer层pom

    
    
        4.0.0
        
            org.example
            dubbo-learn
            1.0.0
        
    
        dubbo-consumer
        dubbo-consumer
        Demo project for Spring Boot
    
        
            1.8
        
    
        
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                org.springframework.boot
                spring-boot-starter-aop
                2.2.6.RELEASE
            
    
        
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    1.4) dubbo-privode1,2,3对应pom一样,如下:

    
    
        4.0.0
        
            org.example
            dubbo-learn
            1.0.0
        
        com.example
        dubbo-provide1
        1.0.0
        dubbo-provide1
        Demo project for Spring Boot
    
        
            1.8
        
    
        
            
                org.springframework.boot
                spring-boot-starter-web
            
        
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                
            
        
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    1.5)dubbo-consumer 配置文件application.yml

    dubbo:
      scan:
        base-packages: com.example.dubbo
      registry:
        protocol: redis
        parameters:
          # 指定redis数据库,别问我为什么是这个参数,看源码发现的
          db.index: 15
        # 上面配置了redis故直接取值即可,也可以直接写成 address: root:123456@127.0.0.1:6379
        address: root:${spring.redis.password}@${spring.redis.host}:${spring.redis.port}
        cluster: failover
      protocol:
        # 名字任意
        id: dubbo-executor
        port: 20880
        name: cust
      application:
        # 名字任意
        name: consumer
      consumer:
        # 自定义调用提供者负载均衡模式,再未进行自定义的情况下先注释
        # loadbalance: cust
    spring:
      redis:
        host: 127.0.0.1
        password: 123456
        port: 6379
        database: 3
    server:
      port: 12000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    1.6)dubbo-provide1,2,3 对应pom文件,注意修改端口号

    dubbo:
      scan:
        base-packages: com.example.dubbo
      registry:
        protocol: redis
        parameters:
          # 指定redis数据库,别问我为什么是这个参数,看源码发现的
          db.index: 15
        # 上面配置了redis故直接取值即可,也可以直接写成 address: root:123456@127.0.0.1:6379
        address: root:${spring.redis.password}@${spring.redis.host}:${spring.redis.port}
        cluster: failover
      protocol:
        # 名字任意
        id: dubbo-executor
        port: 20881
        name: dubbo
      application:
        # 名字任意
        name: provide1
    
    spring:
      redis:
        host: 127.0.0.1
        password: 123456
        port: 6379
        database: 3
    server:
      port: 12001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    笔者是本地测试,因此需要修改这2处

    注意:provide1,2,3配置文件有2处需要修改端口号,1)dubbo.protocol.port: xxx ; 2) server.port: xxx ;

    1.7)分别在各个模块入口类在添加注解@EnableDubbo

    示例:

    2.在dubbo-api层新建接口

    3.在dubbo-provide1,2,3模块中分别实现该接口

    4.dubbo-consumer写一个消费接口

    以上就已经完成了一个消费者对应多个提供者骨架,

    编译顺序

    1)dubbo-api —> clear install

    2)dubbo-learn —> clear install

    启动顺序是:

    1)启动redis

    2)启动dubbo-provide1,2,3

    3)启动dubbo-consumer

    4)测试

    5.自定义负载均衡策略

    说明:第4步再建一层dubbo文件夹时,其实也可以建一个名为services文件夹,效果是一样的

    在新建的纯文本文件里输入:

    cust=com.example.dubbo.balance.CustomLoadBalance
    
    • 1

    格式:别名=自定义类全类名

    6.修改dubbo-consumer配置,

    完成,进行测试。

    遇到的问题:

    1)dubbo版本对应的jedis不应太高,否则会报错找不到redis/clients/util/Pool

    解决办法:降低jedis版本到2.8.1(2.8.0也行自行选择,不要高于2.9.0)

    2)自定义负载均衡不生效

    可能原因:

    a)可能是文件层级不对,应该分开建META-INF,在建dubbo文件夹

    b)配置错误,在消费端配置调用到提供端负载,应该配置dubbo.consumer.loadbalance,而不是配置dubbo.provider.loadbalance

    写的很乱有问题可以留言,看到后会回复

    学习源码在gitee上:https://gitee.com/vick-chow/dubbo-learn.git

  • 相关阅读:
    基于Java毕业设计志愿者信息管理系统源码+系统+mysql+lw文档+部署软件
    【nginx代理postgresql】
    使用JLINK给GD32下载程序
    基于stm32的胰岛素泵
    iTOP-RK3588开发板体验RKNN_DEMO
    Linux根文件系统说明和常用命令
    [Linux] Linux 自动挂载mount --bind 实现类似目录硬链的效果 (包含ZFS方案)
    中国人民大学与加拿大女王大学金融硕士——在金融领域里持续探索、成长
    解决Windows环境下的docker中修改了mysql的配置文件之后启动不了的问题
    解决Java 8 date/time type `java.time.LocalDateTime` not supported by default
  • 原文地址:https://blog.csdn.net/m0_67390788/article/details/126553600