项目中发现了Hprose,通过这个开源组件可以轻松通过Web应用的形式发布WebService,实现远程过程调用,真的是非常强大!!!看了几篇博文,也自己动手实现了一下,现总结过程如下:
一、Hprose的Maven依赖
<dependency>
<groupId>org.hprose</groupId>
<artifactId>hprose-java</artifactId>
<version>2.0.32</version>
</dependency>
二、编写服务端
首先创建一个Web项目,编写一个POJO的Service类,这个类将对外提供服务:
package com.lin.pr;
public class Service {
public String sayHello(String name) {
return "Hello," + name;
}
}
然后继承HproseServlet,编写一个定制的Servlet,从而对外暴露服务接口:
package com.lin.pr;
import hprose.common.HproseMethods;
import hprose.server.HproseServlet;
@WebServlet(urlPatterns = {"/hprose/service"})
public class ServicePublish extends HproseServlet{
@Override
protected void setGlobalMethods(HproseMethods methods) {
super.setGlobalMethods(methods);
//发布sayHello方法
Service service = new Service();
methods.addMethod("sayHello", service);
}
}
入口方法要做适当修改
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan //启动器启动时,扫描本目录以及子目录带有的webservlet注解的
@SpringBootApplication
public class HproseApplication {
public static void main(String[] args) {
SpringApplication.run(HproseApplication.class, args);
}
}
至此,服务端已经编写完毕!
三、编写客户端
客户端只需要创建一个简单的Maven项目,引入hprose依赖的jar包即可。
可通过invoke和编写Service接口两种形式调用远程服务,具体看代码即可:
package org.lin.userhprose;
import hprose.client.HproseHttpClient;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
HproseHttpClient client = new HproseHttpClient();
client.useService("http://localhost:8080/hprose/service");
//通过接口调用
IService service = client.useService(IService.class);
String content = service.sayHello("Jack");
System.out.println("rpc调用,返回:" + content);
// try {
// //通过invoke调用
// String content = client.invoke("sayHello", new Object[]{"Jack"}, String.class);
// System.out.println("rpc调用,返回:" + content);
// } catch (Throwable e) {
// e.printStackTrace();
// }
}
}
package org.lin.userhprose;
public interface IService {
public String sayHello(String name);
}
至此,客户端编写完毕!
测试结果
rpc调用,返回:Hello,Jack
四、总结
可以看到,客户端可以通过接口调用服务,而服务端甚至不需要有此接口。同时Hprose是跨语言的,其他语言通过相应的类库就可调用我们使用Java编写的服务,是不是很简单??