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相关文章推荐
- Spring集成Thrift,实现服务端和客户端代理
- springboot与thrift集成实现服务端和客户端
- SpringBoot学习笔记之CXF集成(实现用户验证)
- WebService学习笔记:使用CXF+Spring搭建WebService服务端和客户端
- Spring学习笔记:使用代理实现AOP
- MyBatis学习笔记-Spring集成DAO层实现方式记录
- Thrift学习笔记(4)--实现Thrift客户端连接池
- 学习笔记--代理与AOP及实现类似SPRING的可配置的AOP框架
- SpringBoot学习笔记(5) Spring Boot集成Redis实现自动配置
- 有关DataForm组件的研究_基础知识和实现服务端批量CURD——Silverlight学习笔记[23]
- 持续集成学习笔记-入门篇(6)持续集成自动化(三):具体实现方式二
- spring 学习基础笔记 包括spring 的代理 JDK CGLIB 事物 AOP 以及各种注入
- osgi学习笔记3之集成Spring-DM的cxf-DOSGI HelloWorld
- Spring学习笔记 使用annotation配置实现Bean的auto-wiring (自动绑定)
- JAX-RPC学习笔记(2)-通过动态代理客户端访问webservice
- 有关DataForm组件的研究_基础知识和实现服务端批量CURD——Silverlight学习笔记[23]
- 分享下我学习Thrift的入门例子helloworld,客户端用php,服务端用python:
- Spring学习笔记(14)----使用Spring的注解方式实现AOP
- iOS学习系列 - 在iOS客户端实现google oauth2登录以及在asp.net服务端上form认证
- Spring.Net实现AOP以及AOP相关概念(学习笔记四)