RPC

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);

}

原文地址:https://www.cnblogs.com/liyanli-mu640065/p/9232125.html