一个RPC方法中需要知道客户端的IP要怎么实现?
网上看了一堆关于thrift获取获取client ip的文章,基本都要自己写一个TServerEventHandler或TProcessor来实现。如下,所有的文章讲到的都是这两种方法。

《两种方式获取Thrift调用的客户端IP地址》

虽然没有再深入研究,但我想如果用thrift这应该是正确的办法。
但是看着好烦呐,不就获取个ip么,就没有更简单点的办法?
说明一下:我的项目中并没有直接调用 thrift API,我用是facebook/swift来做RPC框架的,服务端用Nifty(a Netty NIO-based thrift server)实现的。

研究了Niffy代码发现,获取客户端IP相当简单,示例如下:

import java.net.socketAddress;
...
import com.facebook.nifty.core.ConnectionContext;
import com.facebook.nifty.core.RequestContext;
import com.facebook.nifty.core.RequestContexts;
...
    // RPC接口方法
    @Override
    public PersonBean savePerson(PersonBean bean)throws ServiceRuntimeException {
        //...业务代码
        // 获取当前的请求上下文
        RequestContext ctx = RequestContexts.getCurrentContext();
        // 获取连接上下文
        ConnectionContext connect = ctx.getConnectionContext();
        // 获取IP地址
        SocketAddress address = connect.getRemoteAddress();
        System.out.println(address);
        //...业务代码
    }
...

另附上基于nifty的thrift server初始化代码片段

public static final int DEFAULT_PORT = 26411;
    private final ExecutorService executor;
    private final ThriftServer server;
    private final int serverPort;
    private final ThriftServiceProcessor processor;
    public Server(List<?> services,int serverPort,ExecutorService executor) {
        checkArgument(null != services && !services.isEmpty());
        this.serverPort = serverPort>0? serverPort : DEFAULT_PORT;
        this.executor = checkNotNull(executor);
        processor = new ThriftServiceProcessor(
                new ThriftCodecManager(),ImmutableList.<ThriftEventHandler>of(),services
                );
        ThriftServerDef serverDef = ThriftServerDef.newBuilder()
                .listen(serverPort)
                .withProcessor(processor)
                .using(this.executor)
                .build();
        NettyServerConfig serverConfig = NettyServerConfig.newBuilder()
                .setBossthreadExecutor(this.executor)
                .setWorkerThreadExecutor(this.executor)
                .build();
        server = new ThriftServer(serverConfig,serverDef);
   }

thrift/swift/nifty:获取客户端ip的简单方法的更多相关文章

  1. thrift:swift 命令行生成 IDL文件及Client java代码过程

    swift是一个用于创建thrift序列化类型和服务的java工具库,使用swfit可以生成非常简洁的java代码。使用swift提供的工具,可以直接生成IDL,再用IDL生成其他语言的client端代码(java,cpp,python…)下面的TestService.java定义了一个简单的服务接口,本文以实例的例子说明将这个服务接口生成thriftclient端代码的过程:TestService.javaTestBean.java下载Swift2ThriftCodeGenerator我们首先要从Tes

  2. thrift/swift/nifty:获取客户端ip的简单方法

    如下,所有的文章讲到的都是这两种方法。《两种方式获取Thrift调用的客户端IP地址》虽然没有再深入研究,但我想如果用thrift这应该是正确的办法。研究了Niffy代码发现,获取客户端IP相当简单,示例如下:另附上基于nifty的thriftserver初始化代码片段

  3. thrift/swift:ThriftMethodProcessor代码分析

    thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。比如对于null,虽然在java中定义一个字段为Integer类型,那么这个字段就可以为null,但thrift不允许primitive类型的数据字段为null,因为在c/c++的struct的字段中没有null的概念。做为方法的参数传递,primitive类型也是同样的道理。

  4. thrift/swift:对swift2thrift-generator-cli IDL生成工具的改进

    swift2thrift-generator-cli是thrift/swift提供的一个IDL文件命令行生成工具,它可以根据一个java服务接口类生成对应的IDL文件。手工解决办法当然有,地球人都知道的,手工解决办法很简单在服务方法或类定义时加上requiredness.OPTIONAL定义,告诉swift2thrift-generator-cli这个字段是可选的。从IDL生成工具swift2thrift-generator-cli入手改造它!

  5. thrift/swift:服务端数据类型和client端数据类型之间的直接转换

    需求描述我们知道,thrift/swift框架中,服务端的数据类型与client的类型是相互独立的,比如服务端有一个ClassA类型,到了client端,同样也会生成一个同名的类。那么当我们希望client端应用程序与服务端共用同一个数据类型,也就是服务端的ClassA时,就需要一种从clientClassA到服务端ClassA之间的直接转换,thrift/swift框架并没有提供这样的直接转换机制,该怎么办呢?解决方案首先需要找到thrift/swift将数据对象转换成数据流的地方。

  6. thrift/swift:codegen-thrift java代码生成器

    生成thriftclient代码生成IDL文件https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-thrift.bat生成thriftclient端数据类型及接口定义https://gitee.com/l0km/codegen/blob/master/codegen-thrift/gen-client.bat生成client代码:生成的代码中https://gitee.com/l0km/codegen/blob/master/code

  7. 解决Mac安装thrift因bison报错的问题

    今天小编就为大家分享一篇解决Mac安装thrift因bison报错的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  8. Ubuntu Debian Linux快速安装Thrift

    获取Thrift源去ApacheThrift官方网站:https://thrift.apache.org/download:点击tar.gz的包下载链接进入:复制上图其中一个红框中的地址到浏览器:进入debian目录:一个完整的源目录至少包含dists和pool两个目录,否则都是无效的源,进入dist目录:这些就是Thrift的版本,0.9.3正好是我需要的。继续点进去有InReleaseRele

  9. php – 是否可以在常规Web服务器上使用Apache Thrift?

    我已经有一个我支付的网络服务器,我想使用Thrift和PHP公开一些服务.我的问题是:我可以使用正常的PHP托管在默认端口运行Thrift服务器,而不是在一些时髦的晦涩端口上运行单独的程序.这样我就不必更改服务器配置.谢谢编辑:也许我应该澄清一点.一旦我使用.thrift文件定义了我的服务,是否可以:>运行节俭代码生成器>把生成的代码放在我的web服务器上>创建一个index.PHP,它说(伪代码)“创建一个新的服务实例,并处理传入的请求”?

  10. Centos7.2 thrift-0.9.3 安装使用cpp服务端,go客户端

    thrift是什么依赖条件thrift安装thrift使用总结thrift是什么依赖条件thrift安装1.到http://thrift.apache.org/download这里下载的是thrift-0.9.3.tar.gz2.在执行下列操作,可根据需要选择相应的语言支持在终端输入:thrift–version查看是否安装成功。thrift使用定义一个thrift文件,phone.thrift,

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部