1、用thrift 或 gRPC 之类的框架做 app 和服务器的通信合适吗
完全可以的。
thrift是Facebook开源出来的项目,现在交给了Apache来管理。thrift是用来针对不同语言系统内之间数据容调用的。thrift支持c,c++,Erlang,java,python,ruby,php等语言。thrift允许定义一个简单的定义文件中的数据类型和服务接口,这个文件就是IDL(Interface Definition Language),以作为输入文件,编译器生成代码。简单的说就是thrift定义了统一的文件(对象或者结构体,服务接口),使用thrift的编译器能够生成对应语言的代码文件。thrft之所以是跨语言的原意就是他通过语言无关的自定义语言来生成语言相关的代码。
2、请教hbase 的thrift 服务器端无故退出的问题
看那个错误,是regionserver挂了,不是thrift的问题
thrift应该是不会经常宕掉的。
3、java怎么连接thrift服务器
package net.johnc.thrift;
import org.apache.thrift.TException;
public class TestImpl implements Test.Iface {
public void ping(int length) throws TException {
System.out.println("calling ping ,length=" + length);
}
}
4、有使用Thrift开发Service服务的吗,有什么要注意的
按使用方式分类:
类别 区别
startService 启动的服务 主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService
bindService 启动的服务 该方法启动的服务要进行通信。停止服务使用unbindService
startService 同时也 bindService 启动的服务 停止服务应同时使用stepService与unbindService
以上面三种方式启动的服务其生命周期也有区别,将在随后给出。
2、Service 与 Thread 的区别
很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service
也方便多了,下面我详细的来解释一下。
1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service
是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote
Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service
理解成线程,它跟线程半毛钱的关系都没有!
既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于
Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run
方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread
的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。
举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity
没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的
Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何
Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。
因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用
Context.startService、Context.stopService、
Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册
BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。
3、Service的生命周期1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService
方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都
在后台运行。如果一个Service被startService
方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建
Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的
Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服 务。
2). 被绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用
bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用
Context.unbindService 断开连接或者之前调用bindService 的 Context
不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。
3).
被启动又被绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate
始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止
Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。
4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启
动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。
特别注意:
1、你应当知道在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(尽管
Activity 被 finish 的时候绑定会自动解除,并且Service会自动停止);
2、你应当注意 使用 startService 启动服务之后,一定要使用
stopService停止服务,不管你是否使用bindService;
3、同时使用 startService 与 bindService 要注意到,Service
的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService
的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService
此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被
finish 的时候)之后服务才会自动停止;
4、当在旋转手机屏幕的时候,当手机屏幕在逗横地逗竖地变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity
的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。
5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart
任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其以后的版本,那么你应当使用 onStartCommand 而不是 onStart。
4、startService 启动服务
想要用 startService 启动服务,不管Local 还是 Remote 我们需要做的工作都是一样简单。当然要记得在
Androidmanifest.xml 中注册 service。
根据上面的生命周期,我们便会给出 Service 中的代码框架:
package com.newcj.test;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class LocalService1 extends Service {
/**
* onBind 是 Service 的虚方法,因此我们不得不实现它。
* 返回 null,表示客服端不能建立到此服务的连接。
*/
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
对应生命周期系统回调函数上面已经说明,在对应地方加上适当的代码即可。下面是启动与停止 Service 的代码:
// 启动一个 Activity
startActivity(new Intent(this, LocalService1.class));
...
// 停止一个 Activity
stopService(new Intent(this, LocalService1.class));
对应的 Intent 为标志服务类的 Intent。
5、Local 与 Remote 服务绑定
同样记得在 Androidmanifest.xml 中注册 service
1). Local 服务绑定:Local 服务的绑定较简单,首先在 Service 中我们需要实现 Service 的抽象方法
onBind,并返回一个实现 IBinder 接口的对象。
5、thrift server 运行2天后,内存暴增,请问可能原因
三台服务器,抄每个regionserver的请求都有袭上千?将thrift的最大线程数再调大,thrift的内存调大看看,ulimit参数调大hbase-env.shexportHBASE_THRIFT_OPTS="-Xmx1g-Xms1g-Xmn512m"这里设的是1g,可以根据情况调大
6、什么是Thrift
thrift是一抄个软件框架,用来进行可扩袭展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
thrift最初由facebook开发用做系统内各语言之间的RPC通信 。
2007年由facebook贡献到apache基金 ,08年5月进入apache孵化器 。
支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S RPC调用 。
thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
7、thrift server 英语怎么说
thrift server
节俭服务器
server
英 [ˈsɜ:və(r)] 美 [ˈsɜ:rvə(r)]
n.
服务器 ;侍者;上菜用具;发球者
复数: servers
双语例句
Now the client and server can communicate securely using SSL.
现在客户端和服务器可内以使用SSL进行通信了容。
8、thrift中众多博客教程中说的服务器端和客户端分别指的是什么?客户端比如我是java语言,是java代码吗?
客户端是客户下载之后用的,比如QQ,服务器端就是后台支持的地方,像WEB项目都是事版情在服务器权端运作的,客户端的就是代码一般在客户下载的客户端里运行服务器那边就是数据库支持,服务器端的程序(web)就是代码程序都在服务器上运行客户负载小
9、有会thrift的吗
thrift中的数据类型
下面是thrift本身对类型的重定义,看一下:
bool Boolean, one byte
byte Signed byte
i16 Signed 16-bit integer
i32 Signed 32-bit integer
i64 Signed 64-bit integer
double 64-bit floating point value
string String
binary Blob (byte array)
map<t1,t2> Map from one type to another
list<t1> Ordered list of one type
set<t1> Set of unique elements of one type
通过上面的说明,我们可以看出,thrift里面有的是各种语言公有的类型,而一些个别语言中才出现的东西,如dictionary,hash等并没有在thrift中出现,这是正常的,对于一种公用语言来说,它不应该包括那些特殊的东西,而它可以为那些特殊的东西建立一个自己的标准,让自己去适应它们,如thrift里的map<t1,t2>类型相当于CSharp里的Dictionary<t1,t2>字典类型,这些在生成目标语言之后,都可以进行验证。
thrift中没有类,但有结构体
我想,这应该是对C语言的一种照顾,在thrift中没有出现class(类)的概念,而有值类型struct,实事上,对于结构的认识我们一直都有偏见,让为某些高级语言里有了类,就不应该有结构了,还说自己的代码中从来没有出现过结构。在这里,我需要对这位同学说,你的代码里之所以没有结构,完成是因为你对这种数据类型的不理解,不深入引起的,对于业务简单,或者没有业务的对象来说,为了将属性进行封装,完成可以使用结构来实现,看看C语言你就知道结构有多重要了,呵呵。
枚举:
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
结构(结构体)
struct DataSync{
1:bool IsSync,/*是否要同步*/
2:string FilePath,/*文件路径*/
3:i64 CurrentSeek,/*当前针*/
}
异常
exception InvalidOperation {
1: i32 what,
2: string why
}
服务,我们的接口定义在服务中,接口是客户端与服务器端通讯的基础,客户端使用自己语言的接口与服务器端通讯,客户端与服务器端的平台,开发环境可以完全不同,只要知识服务端的IP和端口即可实现通讯,这就是across language的thrift的魅力!
service FileTransport{
bool Upload(1:DataSegment dataSegment),/*客户端传入一个byte数组,服务器返回是否上传成功,desPath表示上传后存储的路径*/
binary Download(1:string fileUrl),/*客户端传入一个URL,服务器返回这个URL指向的文件,并为byte数组的形式返回*/
DataSync IsSync(1:string fileName),/*检测文件是否需要进行同步上传*/
bool UpdateDataSync(1:DataSync dataSync)/*从数据库中更新数据同步状态,主键为文件完整名称*/
}
当我们运行thrift命令去生成目标代码后,在指定的gen文件夹中生成,例如生成csharp的代码,它会在thrift同级目录中建立一个gen-csharp文件夹,然后代码生成会以结构,枚举,服务为单位去生成多个文件。如图: