【RPC注册发现框架实战】一个简易的RPC注册发现框架

Java实现 服务端起10个线程ID监听40-49这10个端口,这10个端口注册到注册中心,提供同一个服务,发个A,响应B,客户端起10个线程去注册中心请求
好的,我们可以通过实现一个简单的服务端、注册中心和客户端来达到这个目的。以下是详细的代码示例:

服务端代码

import java.io.*;
import java.net.*;
import java.util.concurrent.*;

public class MultiPortServer {
    private static final int PORT_START = 40;
    private static final int PORT_END = 49;
    private static final ExecutorService executor = Executors.newFixedThreadPool(PORT_END - PORT_START + 1);

    public static void main(String[] args) {
        for (int port = PORT_START; port <= PORT_END; port++) {
            int finalPort = port;
            executor.submit(() -> startServer(finalPort));
            RegistryCenter.registerService(finalPort, "localhost");
        }
    }

    private static void startServer(int port) {
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("Server listening on port " + port);
            while (true) {
                Socket clientSocket = serverSocket.accept();
                handleClient(clientSocket);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void handleClient(Socket clientSocket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
            String message = in.readLine();
            if ("A".equals(message)) {
                out.println("B");
            } else {
                out.println("Unknown message");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注册中心代码

import java.util.*;
import java.util.concurrent.*;

public class RegistryCenter {
    private static final Map<Integer, String> serviceRegistry = new ConcurrentHashMap<>();

    public static void registerService(int port, String address) {
        serviceRegistry.put(port, address);
        System.out.println("Service registered on port " + port + " at address " + address);
    }

    public static String lookupService(int port) {
        return serviceRegistry.get(port);
    }

    public static List<Integer> getAllServicePorts() {
        return new ArrayList<>(serviceRegistry.keySet());
    }
}

客户端代码

import java.io.*;
import java.net.*;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Client {
    private static final int CLIENT_COUNT = 10;
    private static final ExecutorService executor = Executors.newFixedThreadPool(CLIENT_COUNT);

    public static void main(String[] args) {
        List<Integer> servicePorts = RegistryCenter.getAllServicePorts();

        for (int i = 0; i < CLIENT_COUNT; i++) {
            executor.submit(() -> {
                int portIndex = (int) (Math.random() * servicePorts.size());
                int servicePort = servicePorts.get(portIndex);
                queryService(servicePort);
            });
        }

        executor.shutdown();
    }

    private static void queryService(int servicePort) {
        String serviceAddress = RegistryCenter.lookupService(servicePort);
        if (serviceAddress != null) {
            try (Socket socket = new Socket(serviceAddress, servicePort);
                 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                out.println("A");
                String response = in.readLine();
                System.out.println("Response from server on port " + servicePort + ": " + response);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("No service found on port " + servicePort);
        }
    }
}

运行步骤

  1. 启动服务端

    • 运行 MultiPortServer 类。它将启动10个线程,每个线程监听一个端口(40-49),并将这些服务注册到注册中心。
  2. 启动客户端

    • 运行 Client 类。它将启动10个客户端线程,每个线程随机选择一个服务端口,从注册中心获取该端口的服务地址,并发送消息 “A”。

说明

  1. 服务端

    • MultiPortServer 类创建一个线程池,每个线程监听一个特定端口,并将该端口的服务注册到 RegistryCenter
    • 每个服务端口接收到消息 “A” 后,响应消息 “B”。
  2. 注册中心

    • RegistryCenter 类负责管理服务的注册和查询。
    • 提供了 registerService 方法用于注册服务,lookupService 方法用于查询服务地址,getAllServicePorts 方法用于获取所有注册的服务端口。
  3. 客户端

    • Client 类创建一个线程池,启动10个客户端线程,每个线程随机选择一个服务端口,向服务端发送消息 “A”,并打印服务端的响应。

相关推荐

  1. DangerWind-RPC-framework---一、服务注册发现

    2024-07-17 22:26:04       25 阅读
  2. 从零开始实现一个RPC框架(二)

    2024-07-17 22:26:04       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 22:26:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 22:26:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 22:26:04       62 阅读
  4. Python语言-面向对象

    2024-07-17 22:26:04       72 阅读

热门阅读

  1. 常用的设计模式有哪些

    2024-07-17 22:26:04       22 阅读
  2. 2024.07.10校招 实习 内推 面经

    2024-07-17 22:26:04       20 阅读
  3. 常用网络术语或概念

    2024-07-17 22:26:04       19 阅读
  4. 作为ToB市场总监的你 被老板质疑过花销太大吗?

    2024-07-17 22:26:04       19 阅读
  5. 有效应对服务器遭受CC攻击的策略与实践

    2024-07-17 22:26:04       22 阅读
  6. 2024华为云数据库斯享会,扎根技术,向深向实

    2024-07-17 22:26:04       22 阅读
  7. ios CCSqlite3.m

    2024-07-17 22:26:04       23 阅读
  8. OpenLayers学习笔记-点位聚合

    2024-07-17 22:26:04       23 阅读
  9. c++邻接矩阵

    2024-07-17 22:26:04       23 阅读
  10. Mojo 编程语言简介

    2024-07-17 22:26:04       23 阅读
  11. 量化交易策略的优化与回测

    2024-07-17 22:26:04       24 阅读