【GRPC】JAVA调用go实现负载均衡(RoundRobin)

【GRPC】JAVA调用go实现负载均衡(RoundRobin)_第1张图片

文章目录

  • 如何实现负载均衡
  • java远程调用实现负载均衡
  • 测试负载均衡

如何实现负载均衡

轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。

import java.util.concurrent.atomic.AtomicInteger;
 
 
public class RoundRobin2 {
 
    /**
     * 线程安全的
     */
    private final static AtomicInteger next = new AtomicInteger(0);
 
    private int select(int S[]) throws Exception {
        if (S == null || S.length == 0)
            throw new Exception("exception");
        else {
            return S[next.getAndIncrement() % S.length];
        }
    }
 
    public static void main(String args[]) throws Exception {
        int S[] = {0, 1, 2, 3, 4};
        RoundRobin2 roundRobin2 = new RoundRobin2();
        for (int i = 0; i < 10; i++) {
            System.out.println(roundRobin2.select(S));
        }
    }
}

【GRPC】JAVA调用go实现负载均衡(RoundRobin)_第2张图片

java远程调用实现负载均衡

  • SimpleClient添加几行代码,配置负载均衡RoundRobinLoadBalancerFactory,以及添加负载均衡的解析策略。
channel = channelBuilder
                //添加负载均衡
                .loadBalancerFactory(RoundRobinLoadBalancerFactory.getInstance())
                //负载均衡策略
                .nameResolverFactory(new LocalNameResolverProvider())
                .build();
  • 创建LocalNameResolverProvider,并且集成NameResolverProvider
// 需要实现NameResolverProvider抽象类中的相关方法
public class LocalNameResolverProvider extends NameResolverProvider {

    // 服务是否可用
    @Override
    protected boolean isAvailable() {
        return true;
    }

    // 优先级默认5
    @Override
    protected int priority() {
        return 5;
    }

    // 服务发现类
    @Nullable
    @Override
    public NameResolver newNameResolver(URI targetUri, Attributes params) {
        return new LocalNameResolver();
    }

    // 服务协议
    @Override
    public String getDefaultScheme() {
        return "localhost";
    }
}

  • 创建LocalNameResolver,ip+端口号的策略实现轮询,这里代码写死了,两个端口,50051和50052。
public class LocalNameResolver extends NameResolver {

    @Override
    public String getServiceAuthority() {
        return "none";
    }

    // 配置可用服务,RPC在调用的时候,轮询选择这里配置的可用的服务地址列表
    @Override
    public void start(Listener listener) {
        ArrayList<EquivalentAddressGroup> addressGroups = new ArrayList<>();
        // 获取rpc地址的配置列表
        List<SocketAddress> socketAddresses = new ArrayList<>();
        socketAddresses.add(new InetSocketAddress("localhost", 50051));
        List<SocketAddress> socketAddresses2 = new ArrayList<>();
        socketAddresses2.add(new InetSocketAddress("localhost", 50052));
        addressGroups.add(new EquivalentAddressGroup(socketAddresses));
        addressGroups.add(new EquivalentAddressGroup(socketAddresses2));
        listener.onAddresses(addressGroups, Attributes.EMPTY);
    }

    @Override
    public void shutdown() {

    }
}

测试负载均衡

  • 注释掉GreeterServer的代码,启动FastCommonGrpcExampleApplication,golang那边启动server.go,注意启动两个端口号,50051和50052。访问http://localhost:8080/world,可以看到,两张图片轮流出现。

在这里插入图片描述
在这里插入图片描述

还有一个问题就是go如何负载均衡的调用java呢?
【GRPC】JAVA调用go实现负载均衡(RoundRobin)_第3张图片
哪个老哥有的,把博客地址放到评论里面,谢谢!

你可能感兴趣的:(grpc)