手撸RPC框架 -SPI机制扩展轮询负载均衡策略
大家好,我是小趴菜,接下来我会从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
- 实现轮询负载均衡策略: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<T> implements ServiceLoadBalancerApi<T> {
private static final Logger LOGGER = LoggerFactory.getLogger(RoundLoadbalancer.class);
private volatile AtomicInteger atomicInteger = new AtomicInteger(0);
@Override
public T select(List<T> 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目录下新建一个文件
文件内容如下:
round=com.xpc.rpc.loadbalancer.round.RoundLoadbalancer
然后在 xpc-rpc-register-zookeeper模块的pom.xml文件引入
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xpc-rpc-register</artifactId>
<groupId>com.xpc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>xpc-rpc-register-zookeeper</artifactId>
<dependencies>
<dependency>
<groupId>com.xpc</groupId>
<artifactId>xpc-rpc-register-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-x-discovery</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
<!-- 随机负载均衡策略 -->
<dependency>
<groupId>com.xpc</groupId>
<artifactId>xpc-rpc-loadbalancer-random</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 随机轮询均衡策略 -->
<dependency>
<groupId>com.xpc</groupId>
<artifactId>xpc-rpc-loadbalancer-round</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xpc</groupId>
<artifactId>xpc-rpc-spi</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
测试
先启动服务提供者服务 xpc-rpc-web-provider
在服务消费者服务 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
可以看到已经通过我们的轮询负载均衡策略去获取一个服务了
转载自:https://juejin.cn/post/7254901391955656761