package hdfs.proxy.java;
public interface MyService {
public void method1();
public void method2();
}
package hdfs.proxy.java;
public class MyServiceImpl implements MyService {
@Override
public void method1() {
System.out.println("************ method1 ***************");
}
@Override
public void method2() {
System.out.println("************ method2 ***************");
}
}
package hdfs.proxy.java;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestMain {
public static void main(String[] args) {
MyService obj = new MyServiceImpl();
MyService proxy = (MyService) Proxy.newProxyInstance(TestMain.class.getClassLoader(),
obj.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("method2")){
System.out.println("in proxy:method2");
return null;
}else{
return method.invoke(obj, args);
}
}
});
proxy.method1();
proxy.method2();
}
}
HDFS的底层原理
1、Java的动态代理对象
再举一个例子:数据库的连接池 ----> 返回的Connection,不是真正的Connection,而是一个代理对象
实现一个接口:DataSource
准备环境:安装一个MySQL数据库
Hive的安装
在虚拟机上安装MySQL:
yum remove mysql-libs
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.19-1.el7.x86_64.rpm (可选)
启动MySQL:service mysqld start
或者:systemctl start mysqld.service
查看root用户的密码:cat /var/log/mysqld.log | grep password
登录后修改密码:alter user 'root'@'localhost' identified by 'Welcome_1';
MySQL数据库的配置:
创建一个新的数据库:create database hive;
创建一个新的用户:
create user 'hiveowner'@'%' identified by 'Welcome_1';
给该用户授权
grant all on hive.* TO 'hiveowner'@'%';
grant all on hive.* TO 'hiveowner'@'localhost' identified by 'Welcome_1';
2、RPC:RPC(Remote Procedure Call)——远程过程调用,类似Web Service
package hdfs.proxy.datasource;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class MyDataSourcePool implements DataSource {
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.157.11:3306/hive";
private static String user = "hiveowner";
private static String password = "Welcome_1";
private static LinkedList<Connection> dataSource = new LinkedList<>();
static{
try{
Class.forName(driver);
for(int i=0;i<10;i++){
dataSource.add(DriverManager.getConnection(url, user, password));
}
}catch(Exception ex){
ex.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
if(dataSource.size() > 0){
Connection conn = dataSource.removeFirst();
Connection proxy = (Connection) Proxy.newProxyInstance(MyDataSourcePool.class.getClassLoader(),
conn.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("close")){
System.out.println("将链接还池");
dataSource.add(conn);
return null;
}else{
return method.invoke(conn, args);
}
}
});
return proxy;
}else{
throw new SQLException("系统忙,请稍后......");
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
}
@Override
public int getLoginTimeout() throws SQLException {
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
return null;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
return false;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return null;
}
}
package hdfs.proxy.datasource;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDataSourceMain {
public static void main(String[] args) throws Exception {
MyDataSourcePool pool = new MyDataSourcePool();
for(int i=0;i<11;i++){
Connection conn = pool.getConnection();
System.out.println("第"+i + "个:"+ conn);
conn.close();
}
}
}
package hdfs.rpc.server;
import org.apache.hadoop.ipc.VersionedProtocol;
public interface MyBusiness extends VersionedProtocol {
public static long versionID = 1;
public String sayHello(String name);
}
package hdfs.rpc.server;
import java.io.IOException;
import org.apache.hadoop.ipc.ProtocolSignature;
public class MyBusinessImpl implements MyBusiness {
@Override
public ProtocolSignature getProtocolSignature(String arg0, long arg1, int arg2) throws IOException {
return new ProtocolSignature(MyBusiness.versionID, null);
}
@Override
public long getProtocolVersion(String arg0, long arg1) throws IOException {
return MyBusiness.versionID;
}
@Override
public String sayHello(String name) {
System.out.println("调用到了Server端的方法");
return "Hello " + name;
}
}
package hdfs.rpc.server;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class RPCServer {
public static void main(String[] args) throws Exception {
RPC.Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("localhost");
builder.setPort(7788);
builder.setProtocol(MyBusiness.class);
builder.setInstance(new MyBusinessImpl());
Server server = builder.build();
server.start();
}
}
package hdfs.rpc.client;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import hdfs.rpc.server.MyBusiness;
public class RPCClient {
public static void main(String[] args) throws Exception {
MyBusiness proxy = RPC.getProxy(MyBusiness.class,
MyBusiness.versionID,
new InetSocketAddress("localhost", 7788),
new Configuration());
System.out.println(proxy.sayHello("Tom"));
}
}