不知不觉现在已经是16年5月的月底了,春天悄悄的过去,夏天正蹒跚的走来,坐在办公室,穿着春天的衣服,感受着从空调中吹出来的阵阵冷风,盯着眼前电脑上的代码,突然发现,写了多少年的代码都是这样的,写一个接口,再写一个接口的实现类,再写一个方法,在中调用这个类,想起前几天学习的时候,看到的服务这个名词,再看看我写的代码,其实也就是一个服务,他提供方和消费方,提供方就是我写的接口+接口实现,消费方就是那个调用实现类中的方法,只不过是我是在本地调用罢了。
在看我们整个互联网公司,我们经常遇到这样的情况,公司提供很多个大大小小的服务,各个服务不在同一个机器上,也可能不在同一个IP上,也可能由不同的团队来负责着。但是服务同服务之间总有有的地方需要通信,总有这个团队需要调用另外一个团队服务的时候,可是我该怎么调用别人的服务?又该怎么发布自己的服务让别人来调用?如果,我需要调用别人的服务,这就避免不了网络通信的过程吧,那我是不是需要写好多关于网络通信的代码,可是网络通信我不懂怎么办,从网上找找,出错了,还得调试好久怎么办?有没有一种方式就像我调用本地服务那样简单呢?
在众多这种服务提供与调用的方式中,像什么WebService,现在新型的Rest,Hprose也是一种能方便提供服务与服务之间调用的协议,Hprose作为一种RPC调用方式,它让通信整个透明化,对通信的细节进行封装,我们不需要再像Rest那样去关心通信协议。而且Hprose轻量级、跨语言、跨平台,简单易用,功能强大,你能在官网找到java的Hprose,也能找到JS的Hprose,不行你可以去查官网,感觉Hprose的功能强大的不要不要的。
都说了这么多,那Hprose作为服务端是如何工作的呢?
第一:引入Hprose的对应的jar包,叫hprose-java-1.4.0.jar;
第二:新建Service类
public class Services {
public String Hello(String name){
return "hello" +name;
}
}
第三:新建Servlet
import hprose.common.HproseMethods;
import hprose.server.HproseServlet;
public class HproseServletDemo extends HproseServlet {
private static final long serialVersionUID = 1L;
@Override
public void setGlobalMethods(HproseMethods methods) {
super.setGlobalMethods(methods);
//new出service对象,发布类里面所有的公共方法
Services ss = new Services();
methods.addMethod("Hello", ss);
}
}
第四:配置WebXml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xm l/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.s un.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" versi on="3.0">
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-*.xml</param-value>
</context-param>
<servlet>
<servlet-name>HproseServlet</servlet-name>
<servlet-class>
com.bobjy.demo.HproseServletDemo
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HproseServlet</servlet-name>
<url-pattern>/hproseservice</url-pattern>
</servlet-mapping>
</web-app>
就这样,Hprose的服务端就建立了,这同我们如同平时构建Springmvc+Spring+Hibernate架构,往框架中填写细节有什么区别呢?只需要建立对应的Hprose的客户端就可以了。
客户端的建立:
客户端的建立,通过invoke方法来调用服务端,访问服务端的服务,如下所示,你没有发现多余的关于网络通信的东西。
public static void main(String[] args) {
HproseHttpClient client = new HproseHttpClient();
client.useService("http://localhost:8080/HproseDemo/hproseservice");
try {
String str = (String) client.invoke("Hello", new Object[]{"hprose"});
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
}
}
就这样,Hprose的服务端和客户端的建立就这样完成了。话说客户端能够这样自由不管网络通信,直接像调用本地方法一样调用远程服务,我在想那么客户端是不是在接收到调用的方法名称,方法参数后,将其经过特殊包装后成为一个消息体,让其能够通过网络传输,而且还要负责找到使用的服务地址,然后将消息体发送给服务端,服务端在收到这些消息体后,应该有个解码的过程,将消息体拆开,然后根据调用的方法地址进行方法调用。方法调用返回的结果再次经过服务端的特殊包装传回客户端,客户端也需要对应的进行解码,然后得到相应的结果。我在想,这大概就是Hprose中网络通信的透明化内容吧。