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

一给  金牌会员 | 2024-7-18 12:34:55 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 985|帖子 985|积分 2955

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.concurrent.*;
  4. public class MultiPortServer {
  5.     private static final int PORT_START = 40;
  6.     private static final int PORT_END = 49;
  7.     private static final ExecutorService executor = Executors.newFixedThreadPool(PORT_END - PORT_START + 1);
  8.     public static void main(String[] args) {
  9.         for (int port = PORT_START; port <= PORT_END; port++) {
  10.             int finalPort = port;
  11.             executor.submit(() -> startServer(finalPort));
  12.             RegistryCenter.registerService(finalPort, "localhost");
  13.         }
  14.     }
  15.     private static void startServer(int port) {
  16.         try (ServerSocket serverSocket = new ServerSocket(port)) {
  17.             System.out.println("Server listening on port " + port);
  18.             while (true) {
  19.                 Socket clientSocket = serverSocket.accept();
  20.                 handleClient(clientSocket);
  21.             }
  22.         } catch (IOException e) {
  23.             e.printStackTrace();
  24.         }
  25.     }
  26.     private static void handleClient(Socket clientSocket) {
  27.         try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  28.              PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
  29.             String message = in.readLine();
  30.             if ("A".equals(message)) {
  31.                 out.println("B");
  32.             } else {
  33.                 out.println("Unknown message");
  34.             }
  35.         } catch (IOException e) {
  36.             e.printStackTrace();
  37.         }
  38.     }
  39. }
复制代码
注册中心代码

  1. import java.util.*;
  2. import java.util.concurrent.*;
  3. public class RegistryCenter {
  4.     private static final Map<Integer, String> serviceRegistry = new ConcurrentHashMap<>();
  5.     public static void registerService(int port, String address) {
  6.         serviceRegistry.put(port, address);
  7.         System.out.println("Service registered on port " + port + " at address " + address);
  8.     }
  9.     public static String lookupService(int port) {
  10.         return serviceRegistry.get(port);
  11.     }
  12.     public static List<Integer> getAllServicePorts() {
  13.         return new ArrayList<>(serviceRegistry.keySet());
  14.     }
  15. }
复制代码
客户端代码

  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.List;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. public class Client {
  7.     private static final int CLIENT_COUNT = 10;
  8.     private static final ExecutorService executor = Executors.newFixedThreadPool(CLIENT_COUNT);
  9.     public static void main(String[] args) {
  10.         List<Integer> servicePorts = RegistryCenter.getAllServicePorts();
  11.         for (int i = 0; i < CLIENT_COUNT; i++) {
  12.             executor.submit(() -> {
  13.                 int portIndex = (int) (Math.random() * servicePorts.size());
  14.                 int servicePort = servicePorts.get(portIndex);
  15.                 queryService(servicePort);
  16.             });
  17.         }
  18.         executor.shutdown();
  19.     }
  20.     private static void queryService(int servicePort) {
  21.         String serviceAddress = RegistryCenter.lookupService(servicePort);
  22.         if (serviceAddress != null) {
  23.             try (Socket socket = new Socket(serviceAddress, servicePort);
  24.                  PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
  25.                  BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
  26.                 out.println("A");
  27.                 String response = in.readLine();
  28.                 System.out.println("Response from server on port " + servicePort + ": " + response);
  29.             } catch (IOException e) {
  30.                 e.printStackTrace();
  31.             }
  32.         } else {
  33.             System.out.println("No service found on port " + servicePort);
  34.         }
  35.     }
  36. }
复制代码
运行步骤


  • 启动服务端

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

  • 启动客户端

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

阐明


  • 服务端

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

  • 注册中心

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

  • 客户端

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表