文档章节

Thrift RPC实战(六) spring集成thrift

lemonLove
 lemonLove
发布于 06/23 15:09
字数 697
阅读 13
收藏 0
点赞 0
评论 0

1.服务端设置

通过采用spring配置以及反射的方式来实现.对于一个服务提供者来说,需要提供端口,接口以及接口实现类,因此在接口中spring配置文件中配置如下

<!-- 服务代理列表 -->
<util:list id="serverProxyList">
      <ref bean="resourceMgtProxy" />
</util:list>
<!-- 资源管理 -->
<bean id="resourceMgtServer" class="com.nari.rpc.server.ResourceMgtServer" />
<bean id="resourceMgtProxy" class="com.nari.proxy.RpcServerProxy">
    <property name="port" value="1002"/>
    <property name="serviceInterface" value="com.nari.api.resource.rpc.ResourceMgtRpc"/>
    <property name="serviceImplObject" ref="resourceMgtServer"/>
</bean>

接下来定义ThriftServerProxy类,定义bean中需要用到的3个属性,接下来通过反射来实现服务的启动。

public class RpcServerProxy {

    // 端口
    private int port;

    // 服务接口
    private String serviceInterface;

    //服务实现类
    private Object serviceImplObject;

    /**
     * 启动RPC服务
     */
    public void start() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        cachedThreadPool.execute(() -> {
            try {
                TNonblockingServerTransport serverTransport = new TNonblockingServerSocket(getPort());
                Class processor = Class.forName(getServiceInterface() + "$Processor");
                Class face = Class.forName(getServiceInterface() + "$Iface");
                Constructor con = processor.getConstructor(face);
                TProcessor tProcessor = (TProcessor) con.newInstance(serviceImplObject);
                TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory(true, true);
                TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args(serverTransport);
                args.protocolFactory(factory);
                args.processor(tProcessor);
                TServer server = new TThreadedSelectorServer(args);
                // 启动服务
                server.serve();
            } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException
                    | InvocationTargetException | TTransportException e) {
                e.printStackTrace();
            }
        });
    }

    public Object getServiceImplObject() {
        return serviceImplObject;
    }

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

    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 class RpcServerStartListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
            ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
            // 获取服务代理列表
            List<RpcServerProxy> proxyList = ((List<RpcServerProxy>) context.getBean("serverProxyList"));
            if (!CollectionUtils.isEmpty(proxyList)) {
                // 启动代理服务
                proxyList.forEach(proxy -> proxy.start());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

最后在web.xml中添加listener即可

2.客户端配置

对于客户端,从连接池里面获取一个可用的服务端连接,通过反射的方式获取客户端,在spring-client.xml中配置如下:

<!-- thrift连接池配置 -->
<bean id="connectionProvider" class="com.nari.common.thrift.pool.impl.ConnectionProviderImpl">
   <property name="serviceIP" value="localhost" />
   <property name="servicePort" value="1002" />
   <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="30000" />
</bean>

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

<bean id="thriftClientProxy" class="com.nari.common.thrift.proxy.ThriftClientProxy">
   <property name="connectionManager" ref="connectionManager"/>
</bean>

客户端的代理对象获取client代码:

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);
            //transport.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

使用:

ResourceMgtRpc.Iface client = (ResourceMgtRpc.Iface) thriftClientProxy.getClient(ResourceMgtRpc.class);
// 封装请求参数
QuerySyncStatusRequest requestPo = new QuerySyncStatusRequest();
requestPo.setMasterSourceId(master.getResourceId());
QuerySyncStatusResponse responsePo = client.querySynStatus(requestPo);

当前的不足:
  没有使用订阅服务列表, 使得在配置中, 需要指定ip:port列表,如果有多个指定的ip:port需要配置多个连接池。

© 著作权归作者所有

共有 人打赏支持
lemonLove
粉丝 26
博文 40
码字总数 52660
作品 0
深圳
后端工程师
RPC框架实践之:Apache Thrift

一、概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务。在文章 微服务调用链追踪中心搭建 一文中模拟出来的调用链:...

CodeSheep
05/14
0
0
Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅

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

lemonLove
06/26
0
0
微服务架构实战学习(四):RPC 框架对比

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

雨林_a1d6
06/11
0
0
互联网支付系统--jigsaw-payment

jigsaw payment 支付系统,面向互联网商户提供的支付系统。 支付系统几乎是互联网应用必不可少的模块,也是各个互联网应用中少数可以标准化的系统。本系统是基于凤凰牌老熊的系列文章 而设计...

匿名
2017/10/01
537
1
spring与thrift集成

spring与thrift集成,可以使服务调用和发布更方便。 本文代码是在上篇基础上改进,部分代码介绍请参考上一篇Thrift的java和php数据交互(http://my.oschina.net/penngo/blog/489311) 服务器...

penngo
2015/08/14
0
0
thrift使用介绍

原文出处:http://gemantic.iteye.com/blog/1199214 一、About thrift 二、什么是thrift,怎么工作? 三、Thrift IDL 四、Thrift Demo 五、Thrift 协议栈 以及各层的使用(java 为例) 六、与...

ponpon_
2014/07/07
0
0
(11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)

一、 什么是 RPC Restful 采用 Http 进行通讯,优点是开放、标准、简单、兼容性升级容易; 缺点是性能略低。在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote Procedure Call)...

情话布墨
06/28
0
0
PHP Thrift Rpc 远程调用框架 --workerman-thrift

workerman thrift rpc 是一个以workerman作为服务器容器,使用Thrift协议及其传输层模块搭建起来的跨语言的RPC远程调用框架。 workerman-thrift-rpc的目标是解决异构系统之间通信的问题,wor...

domr
2014/04/13
2.4K
1
Thrift框架学习整理

简单RPC: https://github.com/1011641270/ThriftStudy/tree/master/RpcDemo 单线程BIO Thrift: https://github.com/1011641270/ThriftStudy/tree/master/ThriftSimpleDemo BIO多线程Thrif......

Java_Coder
2016/01/07
539
0
VigorYuan/spring-boot-thrift-server

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

VigorYuan
2016/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

垃圾回收算法

一 如何判断对象可以回收 1 引用计数法 思路大概为:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计算器为0的对象就是不可能再被使用...

sen_ye
11分钟前
0
0
Activiti简介(学习总结一)

一、介绍 activiti是使用命令模式设计基于bpmn2.0的一款开源工作流引擎。 工作流简单举例:提交请假申请->经理审批->结束。这就是一个简单流程。activiti支持用户自定义流程。配置各个流程对...

沙shasha
11分钟前
0
0
VCL界面控件DevExpress VCL Controls发布v18.1.3|附下载

DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速开发出完美、...

Miss_Hello_World
12分钟前
0
0
加米谷大数据培训:云计算、大数据和人工智能之间的关系

一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成又不可分割。 一、云计算最初的目标 云计算最初的目标是对资源的管理,管...

加米谷大数据
17分钟前
1
0
java集合元素的默认大小

当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使...

竹叶青出于蓝
19分钟前
1
0
Java快速开发平台,JEECG 3.7.7闪电版本发布,增加多套主流UI代码生成器模板

JEECG 3.7.7 闪电版本发布,提供5套主流UI代码生成器模板 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板(Bootstrap表单+BootstrapTable列表\ ElementUI列表表单)...

Jeecg
23分钟前
0
0
export 和 module.export 的区别

在浏览器端 js 里面,为了解决各模块变量冲突等问题,往往借助于 js 的闭包把左右模块相关的代码都包装在一个匿名函数里。而 Nodejs 编写模块相当的自由,开发者只需要关注 require,exports,...

孟飞阳
25分钟前
1
0
技术教育的兴起

技术教育的兴起 作者: 阮一峰 1、 有一年,我在台湾环岛旅行。 花莲的海边,我遇到一对台湾青年夫妻,带着女儿在海滩上玩。我们聊了起来。 当时,我还在高校当老师。他们问我,是否觉得台湾...

吕伯文
25分钟前
0
0
Linux服务器下的HTTP抓包分析

说到抓包分析,最简单的办法莫过于在客户端直接安装一个Wireshark或者Fiddler了,但是有时候由于客户端开发人员(可能是第三方)知识欠缺或者其它一些原因,无法顺利的在客户端进行抓包分析,...

mylxsw
30分钟前
0
0
mybatis3-javaapi

sqlSessionFactoryBuilder->sqlSessionFactory->sqlSession<-rowbound<-resultHandler myBatis uses a Java enumeration wrapper for transaction isolation levels, called TransactionIsol......

writeademo
33分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部