RMI 远程方法调用(Remote Method Invoke)
远程和本地都有的接口类:
package com.rmi.service; public interface HelloService { public String say(String name) ; }
远程接口实现类:
package com.rmi.service.impl; import org.springframework.stereotype.Service; import com.rmi.service.HelloService; @Service() public class HelloServiceImpl implements HelloService { @Override public String say(String name) { return name + "-- hpgary " ; } }
远程服务启动类:
package com.rmi.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.annotation.Bean; import org.springframework.remoting.rmi.RmiServiceExporter; import com.rmi.service.HelloService; @SpringBootApplication(scanBasePackages = "com.rmi") public class App extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } public static void main(String[] args) { SpringApplication.run(App.class, args); } /* rmi 服务器暴漏 服务*/ @Bean public RmiServiceExporter rmiServiceExporter(HelloService helloService){ RmiServiceExporter rmiServiceExporter = new RmiServiceExporter(); // 客户端通过rmi调用的端口 rmiServiceExporter.setRegistryPort(1111); // 客户端调用注册调用的服务名 rmiServiceExporter.setServiceName("hello"); // 注册的service rmiServiceExporter.setService(helloService); //注册的接口 rmiServiceExporter.setServiceInterface(HelloService.class) ; return rmiServiceExporter ; } }
本地使用
package com.rmi.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.remoting.rmi.RmiProxyFactoryBean; import com.rmi.service.HelloService; @SpringBootApplication(scanBasePackages = "com.rmi") public class App extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(App.class); } public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(App.class, args); //获取方法 HelloService bean = run.getBean(HelloService.class); //调用接口方法,实际上是远程方法 System.out.println(bean.say("hf")); } /*本地注册远程服务,通过tcp 调用远程方法*/ @Bean public RmiProxyFactoryBean rmiProxyFactoryBean() { RmiProxyFactoryBean rmiProxyFactoryBean = new RmiProxyFactoryBean(); rmiProxyFactoryBean.setServiceUrl("rmi://127.0.0.1:1111/hello"); rmiProxyFactoryBean.setServiceInterface(HelloService.class); return rmiProxyFactoryBean; } }