您的位置:首页 > 编程语言 > Java开发

Thrift学习笔记(6)--Spring集成Thrift,实现服务端和客户端代理

2016-11-22 10:25 696 查看

Spring集成Thrift,实现服务端和客户端代理

基于反射实现Thrift的服务注册和客户端调用的代理端,并结合前几节的Hello接口、实现类以及连接池。

1、 创建服务端代理

package com.thrift.serverProxy;

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Constructor;

/**
* Created by ssjk on 2016/10/21.
*/
public class ThriftServerProxy {
private final Logger logger = LoggerFactory.getLogger(getClass());
private int port;// 端口
private String serviceInterface;// 实现类接口
private Object serviceImplObject;// 实现类

public Logger getLogger() {
return logger;
}

public int getPort() {
return port;
}

public void setPort(int port) {
this.port = port;
}

public String getServiceInterface() {
return serviceInterface;
}

public void setServiceInterface(String serviceInterface) {
this.serviceInterface = serviceInterface;
}

public Object getServiceImplObject() {
return serviceImplObject;
}

public void setServiceImplObject(Object serviceImplObject) {
this.serviceImplObject = serviceImplObject;
}

public void start() {
new Thread() {
@Override
public void run() {
try {
TServerSocket serverTransport = new TServerSocket(getPort());
// 实现类处理类class
Class Processor = Class.forName(getServiceInterface() + "$Processor");
// 接口
Class Iface = Class.forName(getServiceInterface() + "$Iface");
// 接口构造方法类
Constructor con = Processor.getConstructor(Iface);
// 实现类处理类
TProcessor processor = (TProcessor) con.newInstance(serviceImplObject);
TBinaryProtocol.Factory protFactory = new TBinaryProtocol.Factory(true, true);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
args.protocolFactory(protFactory);
args.processor(processor);
TServer server = new TThreadPoolServer(args);
logger.info("Starting server on port " + getPort() + " ...");
System.out.println("Starting server on port " + getPort() + " ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
}


2、 服务端spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.thrift.*"/>
<context:component-scan base-package="com.service.*"/>
<!-- 服务端接口配置 -->
<bean id="userServiceServer" class="com.thrift.server.UserServiceServer">
<property name="servicePort" value="7911" />
</bean>
<bean id="helloWorldImpl" class="com.service.demo.impl.HelloServiceImpl"/>
<!-- 服务端注册 -->
<bean id="helloWorld" class="com.thrift.serverProxy.ThriftServerProxy">
<property name="port" value="7911" />
<property name="serviceInterface" value="com.service.demo.Hello" />
<property name="serviceImplObject" ref="helloWorldImpl" />
</bean>
</beans>


3、 创建服务端启动类

package com.thriftServer;

import com.thrift.client.UserServiceClient;
import com.thrift.serverProxy.ThriftServerProxy;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by ssjk on 2016/10/21.
*/
public class ProxyServerTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-server.xml");
ThriftServerProxy thriftServerProxy = (ThriftServerProxy) context.getBean(ThriftServerProxy.class);
thriftServerProxy.start();
}
}


4、 客户端代理

package com.thrift.clientProxy;

import com.thrift.controller.ConnectionManager;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TTransport;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
* Created by ssjk on 2016/10/21.
*/
public class ThriftClientProxy {
private ConnectionManager connectionManager;

public ConnectionManager getConnectionManager() {
return connectionManager;
}
public void setConnectionManager(ConnectionManager connectionManager) {
this.connectionManager = connectionManager;
}
public Object getClient(Class clazz) {
Object result = null;
try {
TTransport transport = connectionManager.getSocket();
TProtocol protocol = new TBinaryProtocol(transport);
Class client = Class.forName(clazz.getName() + "$Client");
Constructor con = client.getConstructor(TProtocol.class);
result = con.newInstance(protocol);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return result;
}
}


6、 客户端spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <description>thrift配置文件 </description>
<context:component-scan base-package="com.thrift.*" />
<!-- 连接池配置 -->
<bean id="connectionProvider" class="com.thrift.ifaceImp.ConnectionProviderImpl">
<property name="serviceIP" value="127.0.0.1" />
<property name="servicePort" value="7911" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="10" />
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
<property name="testWhileIdle" value="true" />
<property name="conTimeOut" value="2000" />
</bean>

<bean id="connectionManager" class="com.thrift.controller.ConnectionManager">
<property name="connectionProvider"  ref="connectionProvider"/>
</bean>

<bean id="thriftClientProxy" class="com.thrift.clientProxy.ThriftClientProxy">
<property name="connectionManager" ref="connectionManager"/>
</bean>
</beans><
c7d1
/span>


8、 客户端启动类

package com.thriftClient;

import com.service.demo.Hello;
import com.thrift.client.UserServiceClient;
import com.thrift.clientProxy.ThriftClientProxy;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by ssjk on 2016/10/21.
*/
public class ProxyClientTest {
public static void main(String[] args) {
try {
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-client.xml");
ThriftClientProxy thriftClientProxy = (ThriftClientProxy) context.getBean(ThriftClientProxy.class);
Hello.Iface client = (Hello.Iface)thriftClientProxy.getClient(Hello.class);
System.out.println(client.helloString("Spring集成Thrift,实现服务端和客户端代理"));
}catch (Exception e){
e.printStackTrace();
}

}
}


参考资料:

http://blog.csdn.net/column/details/slimina-thrift.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thrift RPC