SpringBoot - 远程方法调用RMI使用详解(附样例)
作者:hangge | 2022-12-30 09:20
RMI(Remote Method Invocation)是 Java 的一种远程方法调用技术,它允许你从一个 Java 程序调用另一个 Java 程序的方法,即使这两个程序位于不同的计算机上。之前我写过一篇文章介绍如何使用纯 Java 来实现 RMI(点击查看),本文将介绍如何在 Spring Boot 项目中使用 RMI 实现远程方法调用。
(2)然后,我们可以创建一个实现了这个接口的类,用于在服务端提供远程调用服务:
(3)最后我们声明一个 Exporter 让客户端可以使用该服务,这里我们使用的是 RmiServiceExporter:
(2)然后声明一个 RmiProxyFactoryBean,它将创建一个代理对象,该代理对象具有与服务器端运行的服务公开的相同接口,并且透明地将接收到的调用路由到服务器。
(3)最后,我们可以在客户端的代码中使用这个代理对象调用远程服务:
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)