文档章节

spring与thrift集成

penngo
 penngo
发布于 2015/08/14 11:15
字数 833
阅读 4085
收藏 8

spring与thrift集成,可以使服务调用和发布更方便。

本文代码是在上篇基础上改进,部分代码介绍请参考上一篇Thrift的java和php数据交互(http://my.oschina.net/penngo/blog/489311)

服务器端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"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
				http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
	default-lazy-init="false">

	<!-- 登录服务 -->
	<bean id="loginServiceImpl" class="com.penngo.LoginServiceImpl" />
	<!-- 注册服务 -->
	<bean id="registerServiceImpl" class="com.penngo.RegisterServiceImpl" />
	
	<bean id="thriftServer" class="com.penngo.main.SpringServer" init-method="init" destroy-method="close">
	    <property name="port" value="7911" />
	    <property name="serviceList">  
	        <map>
                <entry key = "LoginService">
                    <ref bean = "loginServiceImpl" />
                </entry>
                <entry key = "RegisterService">
                    <ref bean = "registerServiceImpl" />
                </entry>
            </map>
        </property> 
	</bean>
</beans>

服务发布实现

package com.penngo.main;

import java.lang.instrument.IllegalClassFormatException;
import java.lang.reflect.Constructor;
import java.util.Map;

import org.apache.thrift.TMultiplexedProcessor;
import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class SpringServer {
	private Map<String, Object> serviceList;
	private int port;
	private TServerSocket serverTransport;
	
	public void setServiceList(Map<String, Object> serviceList) {
		this.serviceList = serviceList;
	}

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

	public void init(){
		try {
			serverTransport = new TServerSocket(port);
			TMultiplexedProcessor mprocessor = new TMultiplexedProcessor();
			for(Map.Entry<String, Object> entry : serviceList.entrySet()){
				Object obj = entry.getValue();
				Class<?> serviceClass = obj.getClass();
				// 获取实现类接口
				Class<?>[] interfaces = serviceClass.getInterfaces();
				TProcessor processor = null;
				String serviceName = null;
				for(Class<?> clazz:interfaces){
					System.out.println("ThriftServer=========" + clazz.getSimpleName());
					String className = clazz.getEnclosingClass().getSimpleName();
					serviceName = clazz.getEnclosingClass().getName();
					System.out.println("serviceName=========" + serviceName + " " + className);
					String pname = serviceName + "$Processor";
					try {
						ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
						Class<?> pclass = classLoader.loadClass(pname);
						if (!TProcessor.class.isAssignableFrom(pclass)) {
							continue;
						}
						Constructor<?> constructor = pclass.getConstructor(clazz);
						processor = (TProcessor) constructor.newInstance(obj);
						System.out.println("processor=========" + processor.getClass().getSimpleName());
						mprocessor.registerProcessor(className, processor);
						break;
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				if (processor == null) {
					throw new IllegalClassFormatException("service-class should implements Iface");
				}
				
			}
			TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(
			serverTransport).processor(mprocessor));
			System.out.println("Starting server on port 7911 ...");
			server.serve();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public void close(){
		serverTransport.close();
	}
	
	public static void main(String[] args){
		try {
			new ClassPathXmlApplicationContext("classpath:spring-context-thrift-server.xml");
			//Thread.sleep(3000000);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

客户端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"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
				http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"
	default-lazy-init="false">

	<bean id="thriftServer" class="com.penngo.main.SpringClient" init-method="init" destroy-method="close">
	    <property name="port" value="7911" />
	    <property name="serviceMap">  
	        <map>
                <entry key = "LoginService">
                    <value>com.penngo.LoginService</value>
                </entry>
                <entry key = "RegisterService">
                    <value>com.penngo.RegisterService</value>
                </entry>
            </map>
        </property> 
	</bean>
</beans>

客户端调用例子

package com.penngo.main;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;

import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.penngo.LoginService;
import com.penngo.RegisterService;
import com.penngo.User;

public class SpringClient {
	private int port;
	private Map<String, String> serviceMap;
	private Map<String, Object> clientMap;
	private TTransport transport;
	public void setPort(int port) {
		this.port = port;
	}

	public void setServiceMap(Map<String, String> serviceMap) {
		this.serviceMap = serviceMap;
	}



	public Object getClient(String name){
		return clientMap.get(name);
	}
	
	public void init(){
		clientMap = new HashMap<String, Object>();
		try {
			transport = new TSocket("localhost", port);
			TProtocol protocol = new TBinaryProtocol(transport);
			for(Map.Entry<String, String> entry : serviceMap.entrySet()){
				String obj = entry.getValue();
				System.out.println(entry.getKey() + " " + entry.getValue());
				TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol,
						entry.getKey());
				ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
				Class<?> objectClass = classLoader.loadClass(obj + "$Client");

				Constructor<?> stor = objectClass.getDeclaredConstructor(TProtocol.class);
				Object client = stor.newInstance(mp);
				clientMap.put(entry.getKey(), client);
			}

			transport.open();

		} catch (Exception x) {
			x.printStackTrace();
		}
	}
	public void close(){
		transport.close();
	}
	
	public static void main(String[] args){
		try {
			ApplicationContext context = new ClassPathXmlApplicationContext("spring-context-thrift-client.xml");
			SpringClient springClient = (SpringClient) context.getBean("thriftServer");
			//调用登录服务
			LoginService.Client loginService = (LoginService.Client)springClient.getClient("LoginService");
			User user = loginService.login("penngo", "123");
			if (user != null) {
				System.out.println("登录成功:" + user.getId() + " "
						+ user.getName());
			} else {
				System.out.println("登录失败");
			}
			//调用注册服务
			RegisterService.Client registerClient = (RegisterService.Client)springClient.getClient("RegisterService");
			User user2 = registerClient.createUser("test", "123");
			if (user2 != null) {
				System.out.println("创建用户成功:" + user2.getId() + " "
						+ user2.getName());
			} else {
				System.out.println("创建用户失败");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


源码下载

© 著作权归作者所有

共有 人打赏支持
penngo
粉丝 79
博文 102
码字总数 58167
作品 2
广州
高级程序员
私信 提问
Spring Hadoop 1.0.0 M1 发布

Spring Hadoop 发布了首个里程碑版本,Spring Hadoop 提供了在 Spring 框架下编写 Hadoop 应用的支持。 Spring Hadoop 支持: Hadoop 配置 MapReduce, Streaming Jobs and Tool HBase 配置 ...

红薯
2012/03/01
1K
2
VigorYuan/spring-boot-thrift-server

#spring-boot-thrift-server 2016-05-09 更新 改变实现机制,项目启动后 使用spring ApplicationContextEvent 扫描带有 @EnableThriftServer 的注解 使用 TMultiplexedProcessor 以支持多接口...

VigorYuan
2016/04/30
0
0
Spring Boot,Spring cloud加起来有385个包,学习成本太大了

相比以前的spring,核心包才十来个 虽然入门难 但是慢慢的用下来 还是积累了好多知识。 现在spring出的boot光包就有165个。写第一个hello world确实很快,但是后面的学习成本太高了。想要用好...

湖水没了
2016/11/30
3.8K
10
微服务架构实战学习(四):RPC 框架对比

下面是对市面上比较流行的 RPC 框架的对比 以上对比是我结合各框架的网上资料以及官方文档资源总结的,在实际的使用过程中。我们可以结合我们的业务场景来选择不同的框架。 虽然说没有最好的...

雨林_a1d6
06/11
0
0
Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅

对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使用较...

lemonLove
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

http协议请求头的意义

GET /day31_Http_306/index.jsp HTTP/1.1: GET请求,请求服务器路径为/hello/index.jsp,协议为1.1 请求头 1.Host:localhost:请求的主机名为localhost2.User-Agent:Mozilla/5.0(Windows NT......

潇潇程序缘
26分钟前
4
0
Netty 简单服务器 (三)

经过对Netty的基础认识,设计模型的初步了解,来写个测试,试试手感 上篇也说到官方推荐我们使用主从线程池模型,那就选择这个模型进行操作 需要操作的步骤: 需要构建两个主从线程组 写一个服务器...

_大侠__
37分钟前
7
0
day02:管道符、shell及环境变量

1、管道符:"|" 用于将前一个指令的输出作为后一个指令的输入,且管道符后面跟的是命令(针对文档的操作):cat less head tail grep cut sort wc uniq tee tr split sed awk等) [root@localho...

芬野de博客
48分钟前
11
0
Kubernetes系列——Kubernetes 组件、对象(二)

一、Kubernetes 组件 介绍了Kubernetes集群所需的各种二进制组件。 Master 组件 Master组件提供集群的管理控制中心。Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一...

吴伟祥
57分钟前
16
0
Flink-数据流编程模型

1、抽象等级 Flink提供了不同级别的抽象来开发流/批处理应用程序。 1) 低层级的抽象 最低层次的抽象仅仅提供有状态流。它通过Process函数嵌入到DataStream API中。它允许用户自由地处理来自一...

liwei2000
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部