手撸RPC框架 SPI机制扩展轮询负载均衡策略

2023年 7月 14日 50.7k 0

大家好,我是小趴菜,接下来我会从0到1手写一个RPC框架,该专题包括以下专题,有兴趣的小伙伴就跟着我一起学习吧

本章源码地址:gitee.com/baojh123/se…

自定义注解 -> opt-01
服务提供者收发消息基础实现 -> opt-01
自定义网络传输协议的实现 -> opt-02
自定义编解码实现 -> opt-03
服务提供者调用真实方法实现 -> opt-04
完善服务消费者发送消息基础功能 -> opt-05
注册中心基础功能实现 -> opt-06
服务提供者整合注册中心 -> opt-07
服务消费者整合注册中心 -> opt-08
完善服务消费者接收响应结果 -> opt-09
服务消费者,服务提供者整合SpringBoot -> opt-10
动态代理屏蔽RPC服务调用底层细节 -> opt-10
SPI机制基础功能实现 -> opt-11
SPI机制扩展随机负载均衡策略 -> opt-12
SPI机制扩展轮询负载均衡策略 -> opt-13
SPI机制扩展JDK序列化 -> opt-14
SPI机制扩展JSON序列化 -> opt-15
SPI机制扩展protustuff序列化 -> opt-16

前言

在上一章中,我们已经通过SPI机制实现了随机的负载均衡策略,接下来我们实现一下轮询的负载均衡策略

实现

新建模块 xpc-rpc-loadbalancer-round

image.png

  • 实现轮询负载均衡策略:com.xpc.rpc.loadbalancer.round.RoundLoadbalancer
package com.xpc.rpc.loadbalancer.round;

import com.xpc.rpc.annotation.SPIClass;
import com.xpc.rpc.loadbalancer.api.ServiceLoadBalancerApi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@SPIClass
public class RoundLoadbalancer implements ServiceLoadBalancerApi {


    private static final Logger LOGGER = LoggerFactory.getLogger(RoundLoadbalancer.class);

    private volatile AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public T select(List services) {
        LOGGER.info("这是轮询负载均衡策略................");
        if(services == null || services.isEmpty()) {
            return null;
        }
        int count = services.size();
        int index = atomicInteger.incrementAndGet();
        if(index >= (Integer.MAX_VALUE-10000)) {
            atomicInteger.set(0);
        }
        return services.get(index % count);
    }
}

然后在 resources目录下新建一个文件

image.png

文件内容如下:

round=com.xpc.rpc.loadbalancer.round.RoundLoadbalancer

然后在 xpc-rpc-register-zookeeper模块的pom.xml文件引入



    
        xpc-rpc-register
        com.xpc
        1.0-SNAPSHOT
    
    4.0.0

    xpc-rpc-register-zookeeper


    
        
            com.xpc
            xpc-rpc-register-common
            1.0-SNAPSHOT
        
        
            org.apache.curator
            curator-x-discovery
            ${curator.version}
        
        
            org.apache.curator
            curator-framework
            ${curator.version}
            
                
                    log4j
                    log4j
                
            
        
        
            org.apache.curator
            curator-client
            ${curator.version}
        
        
            org.apache.curator
            curator-recipes
            ${curator.version}
        
        
        
        
            com.xpc
            xpc-rpc-loadbalancer-random
            1.0-SNAPSHOT
        
        
        
        
            com.xpc
            xpc-rpc-loadbalancer-round
            1.0-SNAPSHOT
        
        
            com.xpc
            xpc-rpc-spi
            1.0-SNAPSHOT
        
    

测试

先启动服务提供者服务 xpc-rpc-web-provider

image.png

在服务消费者服务 xpc-rpc-web-consumer 的 application.yml修改负载均衡类型为轮询

xpc:
  registerAddress: 127.0.0.1:2181
  registerType: zookeeper
  registerPort: 21770
  packageName: com.xpc
  loadbalancerType: round
server:
  port: 8081

启动服务消费者服务,然后在浏览器上访问 http://localhost:8081/consumer

image.png

可以看到已经通过我们的轮询负载均衡策略去获取一个服务了

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论