返回 导航

SpringBoot / Cloud

hangge.com

SpringBoot - 远程方法调用RMI使用详解(附样例)

作者:hangge | 2022-12-30 09:20
    RMIRemote Method Invocation)是 Java 的一种远程方法调用技术,它允许你从一个 Java 程序调用另一个 Java 程序的方法,即使这两个程序位于不同的计算机上。之前我写过一篇文章介绍如何使用纯 Java 来实现 RMI点击查看),本文将介绍如何在 Spring Boot 项目中使用 RMI 实现远程方法调用。 

1,服务端项目代码 

(1)首先,我们需要创建一个接口来声明远程调用的方法:
public interface HelloService {
  String sayHello(String name);
}

(2)然后,我们可以创建一个实现了这个接口的类,用于在服务端提供远程调用服务:
public class HelloServiceImpl implements HelloService {
  public HelloServiceImpl() {
    super();
  }

  @Override
  public String sayHello(String name) {
    return "你好, " + name + "!";
  }
}

(3)最后我们声明一个 Exporter 让客户端可以使用该服务,这里我们使用的是 RmiServiceExporter
提示:如果有多个服务,就声明多个 Exporter
@SpringBootApplication
public class RmiserverApplication {

  public static void main(String[] args) {
    SpringApplication.run(RmiserverApplication.class, args);
  }

  @Bean
  public HelloService helloService() {
    return new HelloServiceImpl();
  }

  @Bean
  public RmiServiceExporter rmiServiceExporter(HelloService helloService) {
    RmiServiceExporter exporter = new RmiServiceExporter();
    exporter.setService(helloService);
    exporter.setServiceName("HelloService");
    exporter.setServiceInterface(HelloService.class);
    exporter.setRegistryPort(1099);
    return exporter;
  }
}

2,客户端项目代码

(1)首先,我们同样需要创建一个接口来声明远程调用的方法:
public interface HelloService {
  String sayHello(String name);
}

(2)然后声明一个 RmiProxyFactoryBean,它将创建一个代理对象,该代理对象具有与服务器端运行的服务公开的相同接口,并且透明地将接收到的调用路由到服务器。
提示:如果有多个服务,就声明多个 RmiProxyFactoryBean
@SpringBootApplication
public class RmiclientApplication {

  public static void main(String[] args) {
    SpringApplication.run(RmiclientApplication.class, args);
  }

  @Bean
  public RmiProxyFactoryBean helloService() {
    RmiProxyFactoryBean proxy = new RmiProxyFactoryBean();
    proxy.setServiceUrl("rmi://127.0.0.1:1099/HelloService");
    proxy.setServiceInterface(HelloService.class);
    return proxy;
  }
}

(3)最后,我们可以在客户端的代码中使用这个代理对象调用远程服务:
@RestController
public class TestController {
  @Autowired
  private HelloService helloService;

  @GetMapping("/test")
  public String test(@RequestParam("name") String name) {
    return helloService.sayHello(name);
  }
}

3,运行测试

    先后启动服务端、客户端。然后使用浏览器访问客户端的 test 接口,页面显示如下内容,说明客户端已经成功调用到服务端方法。
评论

全部评论(0)

回到顶部