HttpClient特别老,可以采用RPC替换。
Hadoop
Dubbo部署:服务端创建、实现接口
客户端调用接口
Hadoop使用到的底层的RPC
1.RPC(Remote Procedure Call Protocol)--远程过程调用协议
RPC 采用客户机/服务器模式
2.客户端调用的服务端的接口服务。
客户端和服务端有共同的服务接口。
服务接口 interface SomeService{ public long versionID=Long.MAX_VALUE: public String heartBeat(String name); }
服务器接口实现类 class SomeServiceImpl implements SomeService{ @Override public String heartBeat(String name){ System.out.println("接收到客户端"+name+"的心跳。。。"); return "心跳成功"; } }
服务端的实现:
1>.服务端对接口进行实现。
2>.服务端还需要接收客户端的请求,启动一个服务对客户端 端口的监听。
MyServer.java
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
main 方法中: Builder builder=new RPC.Builder(new Configuration()); builder.setBindAddress("localhost"); builder.setPort(5555); builder.setProtocol(SomeService.class);//自己定义的服务器和客户端共同的服务接口 builder.setInstance(new SomeServiceImpl());//服务器端对服务接口的实现类 Server server=builder.build(); server.start();
客户端的实现:
1>.要访问这个协议
MyClient.java main方法中 SomeService someService=RPC.getProxy(SomeService.class,Long.MAX_VALUE,
new InetSocketAddress("localhost",5555),new Cofiguration()); //其中Long.MAX_VALUE,对应SomeService服务接口中的版本号,保持一致。 String ret=someService.heartBeat("wilson"); //客户端通过方法带参数发送给服务端,此时服务端通过builder.build()反射调用服务器接口方法,返回结果给客户端 System.out.println(ret);
2018年7月11日15:55:33
对应模块:rpc-sample-app
创建代理类对象,返回接口兑现
ProxyBoss.java //对接口方法进行代理 package proxyclass; import java.lang.reflect.InvocationHandler; public static <T> T getProxy(final int discountCoupon, final Class<?> interfaceClass , final Class<?> imlementsClass) throws Exception{ return (T) Proxy.newProxyInstance( interfaceClass.getClassLoader(), new Class[]{ interfaceClass}, new InvocationHandler(){ public Object invoke(Object proxy,Method method, Object[] args) throws Throwable{ //调用原始对象以后返回的值 Integer returnValue=(Integer) method.invoke(implementsClass.newInstance(),args); return returnValue-discountCoupon; } } ) }
对应 rpc-sample-server模块
MyReflect.java /** *获取私有的成员函数 */ public void getPrivateMethod() throws Exception{ Object obj=personClass.newInstance();//获取空参的构造函数 Method method=personClass.getDeclaredMethod("getSomeThing"); method.setAccessible(true); Object value=method.invoke(obj); System.out.println(value); }