thrift

Thrift RPC实战(七) 基于zookeeper和thrift的RPC服务发布订阅

亡梦爱人 提交于 2019-12-17 20:42:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 对于Thrift服务化的改造,主要是客户端,可以从如下几个方面进行: 1.服务端的服务注册,客户端自动发现,无需手工修改配置,这里我们使用zookeeper,但由于zookeeper本身提供的客户端使用较为复杂,因此采用curator-recipes工具类进行处理服务的注册与发现。 2.客户端使用连接池对服务调用进行管理,提升性能,这里我们使用Apache Commons项目commons-pool,可以大大减少代码的复杂度。 3.关于Failover/LoadBalance,由于zookeeper的watcher,当服务端不可用是及时通知客户端,并移除不可用的服务节点,而LoadBalance有很多算法,这里我们采用随机加权方式,也是常有的负载算法,至于其他的算法介绍参考: 常见的负载均衡的基本算法 。 4.使thrift服务的注册和发现可以基于spring配置,可以提供很多的便利。 5.其他的改造如: 1)通过动态代理实现client和server端的交互细节透明化,让用户只需通过服务方提供的接口进行访问 2)Thrift通过两种方式调用服务Client和Iface,Client API的方式, 不推荐, 我们推荐Service接口的方式(服务化)。 一、pom.xml引入依赖jar包

Thrift RPC实战(五) thrift连接池

非 Y 不嫁゛ 提交于 2019-12-17 20:42:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class TProtocolFactory extends BasePooledObjectFactory<TProtocol> { private String host; private int port; private boolean keepAlive =true; public TProtocolFactory(String host, int port, boolean keepAlive) { this.host = host; this.port = port; this.keepAlive = keepAlive; } /** * 创建对象 * @return * @throws Exception */ @Override public TProtocol create() throws Exception { TSocket socket = new TSocket(host,port); //使用

池技术之common-pool2

自古美人都是妖i 提交于 2019-12-17 20:27:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 是什么 apache commons-pool 是apache基金会的一个开源对象池组件,我们常用的数据库连接池dpcp和redis的java客户端jedis都使用commons-pool来管理连接 优化对象的创建,和设计模式中的享元模式思路一样 类解析 PooledObject 池化后的对象 ObjectPool 对象池, PooledObjectFactory 池对象工厂 GenericObjectPool 实现了对对象池的管理,是一个基本的对象池实现 borrowObject 从对象池中获取一个对象 returnObject 对象使用完之后,归还到对象池 PooledObjectFactory 根据自己的业务创建和管理要对象池化的对象 makeObject 创建对象 destroyObject 销毁对象 对象的空闲时间(idle)超时 使用完被检测到对象已经无效时 当调用这个方法之后,对象的生命周期必须结束。如果是对象是线程,线程必须已结束,如果是socket,socket必须已close,如果是文件操作,文件数据必须已flush,且文件正常关闭. validateObject 检测一个对象是否有效,无效会被销毁 activateObject 激活一个对象或者说启动对象的某些操作 检测空闲对象的时候

Thrift RPC实战(四) common-pool2连接池

梦想的初衷 提交于 2019-12-17 20:22:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响。一种办法就是使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,下次使用的时候,不用再重新创建,直接从对象池的缓存中取即可。Thrift本身没有提供连接池,我们可以用Apache Commons Pool来实现一个,它对对象池化操作进行了很好的封装,我们只需要根据自己的业务需求重写或实现部分接口即可,使用它可以快速的创建一个方便,简单,强大对象连接池管理类。 一,common-pool2简介 Common-pool2中的代码不是太多,有几个种要的接口和实现类,common-pool2使用的是面向接口的编程,它为我们提供的是一个抽象的对象池管理方式,所以根据我们业务的不同,我们需要重写或实现一些方法和接口 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.5.0</version> </dependency> 1,GenericObjectPool

TNonblockingServer, TThreadedServer and TThreadPoolServer, which one fits best for my case?

馋奶兔 提交于 2019-12-17 18:54:18
问题 Our analytic server is written in c++. It basically queries underlying storage engine and returns a fairly big structured data via thrift. A typical requests will take about 0.05 to 0.6 seconds to finish depends on the request size. I noticed that there are a few options in terms of which Thrift server we can use in the c++ code, specifically TNonblockingServer, TThreadedServer, and TThreadPoolServer. It seems like TNonblockingServer is the way to go since it can support much more concurrent

使用Nginx代理thrift NIO实现SSL链路加密

北慕城南 提交于 2019-12-17 18:35:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1 目标说明 1.1 调研目的 本次调研主要为了解决两个问题: thrift提供的SSL API只支持BIO(阻塞式IO),而我们使用的是NIO API,希望能在不改变IO模型的前提下对链路进行加密; 未来系统可能需要对thrift服务进行扩展,采用多个thrift服务进行负载均衡,以提升吞吐量。 结合这两点,通过调研是否可以使用nginx ssl代理来解决。同时熟悉下nginx对tcp代理的配置。 1.2 目标网络模型 希望达到的目标网络模型如下: 1.3 SSL说明 通过对SSL的学习,结合自身业务的考虑,对SSL的使用做如下说明: 我这里SSL使用TLSv1,并且服务端不需要校验客户端的身份合法性,则使用SSL单向认证方式,只需要服务端证书。另外我们只需要用到SSL的链路加密,所以可以设置客户端对服务端证书保持永久信任 2 调研步骤 由于对网络相关的知识比较欠缺,所以采用如下步骤一一尝试可行性。先测试nginx对普通tcp的代理,再测试nginx ssl代理在bio 和 nio IO模型下的使用,最后使用nginx ssl代理Thrift NIO。 BIO:同步阻塞IO;NIO:同步非阻塞IO nginx代理 tcp bio socket server(Server -> BIO,Client ->

How to use thrift generator as maven dependency(how to avoid reference to .exe file)?

社会主义新天地 提交于 2019-12-17 16:54:19
问题 I have following content in pom.xml : ... <dependencies> ... <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.11.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.thrift.tools</groupId> <artifactId>maven-thrift-plugin</artifactId> <version>0.1.11</version> <configuration> <thriftExecutable>D:/work/thrift-folder/thrift-0.11.0.exe</thriftExecutable> <thriftSourceRoot>../thrift-files</thriftSourceRoot>

http 与 rpc 对比

僤鯓⒐⒋嵵緔 提交于 2019-12-16 18:11:28
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 总结:RPC主要用于公司内部服务调用,传输效率高(TCP,报文小),性能消耗低(高效的二进制传输、字节小、序列化耗时少),服务治理方便: 1、传输协议:   RPC:可以基于HTTP协议,也可以基于TCP协议   HTTP:基于HTTP协议 从网络协议来说,Http协议与Rpc同属于应用层, 他们的底层都是tcp协议。RPC(即Remote Procedure Call,远程过程调用)和HTTP(HyperText Transfer Protocol,超文本传输协议)他们最本质的区别,就是RPC主要工作在TCP协议之上,而HTTP服务主要是工作在HTTP协议之上,我们都知道HTTP协议是在传输层协议TCP之上的,所以效率来看的话,RPC当然是要更胜一筹。 2、传输效率:   RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减小报文体积,提高传输效率   HTTP:如果是基于http1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装下可以作为一个RPC来使用,这时标准的RPC框架更多的是服务治理。 http协议其实是属于面向桌面浏览器的一个通信协议,对于缓存,幂等或者Cookies相关的方面做了很多的事情。但是对于服务器之间直接的交互

python thrift demo

风流意气都作罢 提交于 2019-12-16 12:45:43
原文链接: https://www.bigdatasafe.org/post/41334.html 简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml都支持。Thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服务端的语言,这种语言就是IDL(Interface Description Language) SRE实战 ,互联网时代守护先锋!让网站飞一会, 阿里云优惠促销大全。 thrift使用流程 明确要交互的数据格式和具体的方法,定义出thrift接口描述文件(英文叫做IntefaceDescription File) 调用thrift工具,依据thrift接口文件,生成RPC代码; 你的服务器端程序引用thrift生成的RPC代码,并实现其中的Search动作的逻辑,然后启动监听,等待客户端发来请求。 客户端同样引入并调用RPC代码来与服务器端通信 thrift IDL 1. 基本类型

Gradle Thrift Plugin by Example

不想你离开。 提交于 2019-12-14 02:00:23
问题 Please note: Although this question specifically calls out the Gradle Thrift plugin, I believe this is just a general Gradle question that any battle-weary Gradle veteran could help me with. I am new to Apache Thrift and only quasi-familiar with Gradle (2.4.x). I am trying to get the Gradle Thrift plugin to work and am encountering a few issues that are likely just gaps in my Gradle knowledge. Here is my sample project: thrifty If you clone it and run ./gradlew compileThrift , you'll see it