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

一个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);
   }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

深入浅出事件流处理NEsper(一)

    对实时信息分析和处理,常常需要客户应用程序的开发相应功能。一般地,这些功能需要提供以下的处理流程,分析获取的数据,筛选数据,提取出有用的信息,然后将其通...

1949
来自专栏宋凯伦的技术小栈

【Node.js】初识Node.js

  因组里项目需要,我和另外一名同事要学习Node.js。之前接触过Javascript,都是前台处理html时用到,现在要用Javascript做后端,学习N...

1769
来自专栏星流全栈

React + Redux 最佳实践

1275
来自专栏更流畅、简洁的软件开发方式

当OO遇到了持久化?!

最近在看设计模式方面的资料,看了一些帖子和两本书,一个是《Head first》,另一个是《大话设计模式》。这两本书都只看了一部分。 发现他们都有一个共同的特...

1799
来自专栏微服务

微服务实践分享与探讨

服务调用关系 ? API网关优缺点 简化沟通方式 API网关对所有微服务提供单一的访问点 安全性 对客户端隐藏了服务发现和服务版本 阻止大规模攻击,包括S...

3177
来自专栏逍遥剑客的游戏开发

UE4学习笔记(一): 基本概念

2416
来自专栏纯洁的微笑

本周新鲜事:开源那些事

752
来自专栏ThoughtWorks

微服务下使用GraphQL构建BFF | 洞见

微服务架构,这个在几年前还算比较前卫的技术在如今遍地开花。得益于开源社区的支持,我们可以轻松地利用 Spring Cloud 以及 Docker 容器化快速搭建...

3936
来自专栏九彩拼盘的叨叨叨

玩转 Github 徽章

我们如果希望和某个 Github 项目开发者沟通,比如给这个项目提个 bug 之类。传统的方式是在该项目创建一个 issue ,等开发者看到后(可能是很久之后~...

832
来自专栏Kevin-ZhangCG

前后端分离原理

  前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个Node.js)有效的进行解耦,并且前后端分离会为以后...

641

扫码关注云+社区