<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Spring Boot Remoting – Spring RMI 注解示例 > 原文: [https://howtodoinjava.com/spring-boot2/spring-remoting-rmi-hessian/](https://howtodoinjava.com/spring-boot2/spring-remoting-rmi-hessian/) 在此[ Spring boot 2 rmi 示例](https://howtodoinjava.com/spring-boot-tutorials/)中,了解 spring 如何提供不同的機制來調用駐留在不同 JVM 中并且很可能在不同服務器中的遠程方法。 這稱為 RMI(**遠程方法調用**)概念。 RMI 出現在 EJB 的早期。 在當今的 HTTP / HTTPS 世界中,SOAP 和 REST 在實現任何服務中都占主導地位,但是在 Spring 框架中,遠程調用仍然是一種選擇。 今天,我們將在這個領域看到兩個新協議,主要是 **Hessian** 和 **RMI** 。 ## 1\. 什么是遠程調用? Spring 框架提供了一系列工具,這些工具統稱為 **Spring 遠程調用**。 這些工具使我們可以在遠程系統上調用遠程服務,就像它們在本地可用一樣。 通常不需要,但是在某些情況下,我們仍然傾向于使用遠程調用。 使用遠程調用的主要原因是性能和安全性。 基于 HTTP 的服務會影響性能,因為我們必須處理請求和響應(封送/拆組)。 更重要的是,如果僅使用這些技術就已經將服務器公開為遠程服務,則客戶端除了 RMI 別無選擇。 ## 2\. Spring 遠程調用技術 以下主要是 spring 幫助我們實現遠程調用的方法。 * **遠程方法調用(RMI)** – 在 Spring,通過在服務器端使用`RmiServiceExporter`和在客戶端使用`RmiProxyFactoryBean`實現了 RMI。 * **Spring 的 HTTP 調用程序** – 這是通過使用`HttpInvokerProxyFactoryBean`和`HttpInvokerServiceExporter`進行遠程調用的另一種方式。 這基本上是通過 HTTP 的[ Java 序列化](https://howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/),支持任何 Java [接口](https://howtodoinjava.com/oops/exploring-interfaces-and-abstract-classes-in-java/)。 * **Hessian** – 它是 Caucho 提供的基于 HTTP 的輕量級二進制協議。 我們可以使用 Hessian Spring 的`HessianProxyFactoryBean`和`HessianServiceExporter`的 Spring 包裝器來公開和使用遠程服務。 內部在傳輸時使用二進制數據 * **Burlap** – Burlap 是用于遠程處理的基于 XML 的協議。 它也是由 Caucho 開發的。 它類似于 Hessian,唯一的區別是 Hessian 是二進制,而 Burlap 是 XML。 與 Hessian 一樣,Burlap 需要通過 HTTP 托管。與 Hessian 相似,它具有`BurlapServiceExporter`和`BurlapProxyFactoryBean`類。 請注意,由于尚未積極開發 Burlap,自 Spring 4.0 起就不再支持它。 ## 3\. Spring RMI 遠程調用 – 創建 RMI 服務 如上所述,我們將使用 Spring Boot 為 RMI 和 Hessian 開發項目。 我們將創建兩個 Maven 項目。 服務器的第一個項目是托管實現,另一個是客戶端部分。 客戶端應用程序將通過相應的遠程協議與服務器通信,以調用遠程方法。 #### 3.1. 創建 Maven 項目 創建兩個名為`spring-rmi-server`和`spring-rmi-client`的簡單的 Spring Boot 項目,它們具有`spring-boot-web`依賴,以將其托管在 Web 服務器中。 為此,我們需要轉到 https://start.spring.io/ 并提供 Maven 坐標并選擇依賴項。 下載包含框架項目的 zip 文件。 然后,一旦解壓縮到合適的文件夾中,我們就需要將其導入 eclipse 中。 客戶端項目中不需要 Web 依賴項,因為我們將其作為獨立的應用程序運行。 ![](https://img.kancloud.cn/ac/fb/acfb8c55750b85bc692f5c561c3cdf3d_1567x847.jpg) Spring 項目創建 #### 3.2. 創建 Spring RMI 服務 編寫我們要公開的 Java 接口和 RMI 服務的實現。 在本教程中,我們將創建一個簡單的 hello world 應用程序,該應用程序將根據輸入向用戶打招呼。 這是必需的接口及其實現。 `HelloWorldRMI.java` ```java package com.example.springrmiserver.service; public interface HelloWorldRMI { public String sayHelloRmi(String msg); } ``` `HelloWorldRMIimpl.java` ```java package com.example.springrmiserver.service; import java.util.Date; public class HelloWorldRMIimpl implements HelloWorldRMI { @Override public String sayHelloRmi(String msg) { System.out.println("================Server Side ========================"); System.out.println("Inside Rmi IMPL - Incoming msg : " + msg); return "Hello " + msg + " :: Response time - > " + new Date(); } } ``` #### 3.3. Spring RMI 服務配置 在服務器項目中創建一個 spring bean 配置類,以使用`RmiServiceExporter`將接口和實現注冊到 RMI 導出器。 我們需要提供它的端點名稱以進行公開。 這將在基于 rmi 的 url(例如`rmi://localhost:1099?`)中公開實現類。 * `ServiceInterface` – 我們需要提供要發布的接口的類。 * `Service` – 這是服務實現類的實例。 為了簡單起見,在這里我創建了一個新實例,但是我們可以在此處輕松給出我們要公開的另一個 spring bean。 * `ServiceName` – 如上所述,這是我們要與 rmi url 中的服務關聯的服務名稱,客戶端將使用該服務名稱來調用服務。 `Config.java` ```java package com.example.springrmiserver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.remoting.rmi.RmiServiceExporter; import org.springframework.remoting.support.RemoteExporter; import com.example.springrmiserver.service.HelloWorldRMI; import com.example.springrmiserver.service.HelloWorldRMIimpl; @Configuration public class Config { @Bean RemoteExporter registerRMIExporter() { RmiServiceExporter exporter = new RmiServiceExporter(); exporter.setServiceName("helloworldrmi"); exporter.setServiceInterface(HelloWorldRMI.class); exporter.setService(new HelloWorldRMIimpl()); return exporter; } } ``` #### 3.4. 構建和部署 RMI 服務 現在,我們可以完成最終構建并啟動提供的 tomcat 服務器。 確保服務器正常啟動,并記下特別是 RMI 端口的端口,該端口應為`1099`。 我們將在客戶端使用此端口訪問服務。 `Console` ```java 2018-09-07 21:37:22.872 INFO 6452 --- [main] o.s.remoting.rmi.RmiServiceExporter : Binding service 'helloworldrmi' to RMI registry: RegistryImpl[UnicastServerRef [liveRef: [endpoint:[192.168.1.7:1099](local),objID:[0:0:0, 0]]]] ``` ## 4\. Spring 遠程調用 – 創建 RMI 客戶端 #### 4.1. 在客戶端項目中創建完全相同的服務接口 在客戶端應用程序中創建相同的 rmi 接口。 這很重要,rmi 將使用此接口作為服務器端接口的框架,否則我們將獲得異常。 #### 4.2. Spring RMI 客戶端配置 在客戶端項目中配置`RmiProxyFactoryBean` bean 與遠程服務連接。 這是所需的簡單默認配置。 `SpringRmiClientApplication.java` ```java package com.example.springrmiclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.remoting.rmi.RmiProxyFactoryBean; import com.example.springrmiserver.service.HelloWorldRMI; @SpringBootApplication public class SpringRmiClientApplication { @Bean RmiProxyFactoryBean rmiProxy() { RmiProxyFactoryBean bean = new RmiProxyFactoryBean(); bean.setServiceInterface(HelloWorldRMI.class); bean.setServiceUrl("rmi://localhost:1099/helloworldrmi"); return bean; } public static void main(String[] args) { HelloWorldRMI helloWorldRMI = SpringApplication.run(SpringRmiClientApplication.class, args) .getBean(HelloWorldRMI.class); System.out.println("================Client Side ========================"); System.out.println(helloWorldRMI.sayHelloRmi("Sajal")); } } ``` #### 4.3. Spring RMI 遠程調用示例 現在,我們需要創建一個主要方法,在該方法中,我們將從 spring 上下文中查找實現接口 bean。 有了實例后,我們現在就可以像調用任何其他本地 java 方法一樣調用服務器端方法。 如果一切順利,將調用您的服務器端方法,檢查服務器和客戶端中的日志,該日志將可見。 ```java ================Server Side ======================== Inside Rmi IMPL - Incoming msg : Sajal 2018-09-07 21:39:14.776 INFO Registering beans for JMX exposure on startup 2018-09-07 21:39:14.808 INFO Started SpringRmiClientApplication in 1.866 seconds (JVM running for 2.368) ================Client Side ======================== Hello Sajal :: Response time - > Fri Sep 07 21:39:14 IST 2018 ``` ## 5\. Spring Hessian 遠程 Hessian 遠程調用也與 RMI 遠程調用非常相似。 唯一的變化是我們需要服務器端的 Hessian 相關服務導出器和客戶端端的基于 Hessian 的代理 bean 工廠。 #### 5.1. Hessian 的 Maven 依賴 `pom.xml` ```java <dependency> <groupId>com.caucho</groupId> <artifactId>hessian</artifactId> <version>4.0.51</version> </dependency> ``` #### 5.2. Hessian 的服務接口和實現 像 RMI 一樣,我們將創建一對接口及其實現。 我們也可以重用 RMI,但是我在工作區中創建了一個新集。 `HelloWorld.java` ```java package com.howtodoinjava.hessianserver.hessian; public interface HelloWorld { public String sayHelloWithHessian(String msg); } ``` `HelloWorldImpl.java` ```java package com.howtodoinjava.hessianserver.hessian; import java.util.Date; public class HelloWorldImpl implements HelloWorld { @Override public String sayHelloWithHessian(String msg) { System.out.println("=============server side=============="); System.out.println("msg : " + msg); return "Hello " + msg + " Response time :: " + new Date(); } } ``` #### 5.3. Hessian 服務器端配置 – 導出器 這是服務導出程序,它與 RMI 相同。 我剛剛更改了粗麻布相關的課程。 `HessianConfiguration.java` ```java package com.howtodoinjava.hessianserver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.remoting.caucho.HessianServiceExporter; import org.springframework.remoting.support.RemoteExporter; import com.howtodoinjava.hessianserver.hessian.HelloWorld; import com.howtodoinjava.hessianserver.hessian.HelloWorldImpl; @Configuration public class HessianConfiguration { @Bean(name = "/hellohessian") RemoteExporter sayHelloServiceHessian() { HessianServiceExporter exporter = new HessianServiceExporter(); exporter.setService(new HelloWorldImpl()); exporter.setServiceInterface(HelloWorld.class); return exporter; } } ``` #### 5.4. Hessian 的客戶端配置 – 代理 Bean 此處的配置與 RMI 相同,但 URL 不同。Hessian 使用 HTTP 作為傳輸協議。 這是一個二進制協議,意味著所有數據都以二進制格式傳輸到服務器。 其余的復雜性由 Hessian 和 spring 處理。 `HessianConfiguration.java` ```java package com.howtodoinjava.example.hessianclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.remoting.caucho.HessianProxyFactoryBean; import com.howtodoinjava.hessianserver.hessian.HelloWorld; @SpringBootApplication public class HessianClientApplication { @Bean public HessianProxyFactoryBean hessianInvoker() { HessianProxyFactoryBean invoker = new HessianProxyFactoryBean(); invoker.setServiceUrl("http://localhost:8080/hellohessian"); invoker.setServiceInterface(HelloWorld.class); return invoker; } public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(HessianClientApplication.class, args); System.out.println("========Client Side==============="); HelloWorld helloWorld = context.getBean(HelloWorld.class); System.out.println(helloWorld.sayHelloWithHessian("Sajal")); } } ``` #### 5.5. Spring Hessian 遠程調用示例 一旦運行服務器,就運行客戶端應用程序。 我們應該看到已經調用了服務器端方法。 這是來自服務器和客戶端的日志。 `Server logs` ```java 2018-09-07 21:46:09.367 INFO 1264 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2018-09-07 21:46:09.403 INFO 1264 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 36 ms =============server side============== msg : Sajal ``` `Client logs` ```java 2018-09-07 21:46:08.903 INFO 6856 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2018-09-07 21:46:09.197 INFO 6856 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9090 (http) with context path '' 2018-09-07 21:46:09.205 INFO 6856 --- [ main] c.h.e.h.HessianClientApplication : Started HessianClientApplication in 6.069 seconds (JVM running for 7.092) ========Client Side=============== Hello Sajal Response time :: Fri Sep 07 21:46:09 IST 2018 ``` ## 6\. 總結 今天,我們已經看到了如何將遠程方法公開為服務,以及如何使用不同的遠程協議從客戶端使用這些遠程方法。 在此演示中,與網絡服務不同,我們沒有任何這樣的載荷,在網絡服務中,我們需要進行額外的處理以進行封送/編組。 通過這種方法,可以避免載荷處理的開銷,但是需要注意的是,服務器和客戶端都應僅是 Java,而不能從其他語言/運行時調用,例如 REST,我們可以輕松地從 JavaScript 調用。 牢記所有這些,我們可以選擇所需的適當方法。 學習愉快! 參考文獻: [Spring 5 遠程調用文檔](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#remoting) [下載源碼](https://github.com/lokeshgupta1981/SpringExamples/tree/master/spring-rmi)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看