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 条评论
登录 后参与评论

相关文章

来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4395
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

38610
来自专栏java 成神之路

使用 NIO 实现 echo 服务器

5567
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8668
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5228
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3702
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

5918
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

7166
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5448

扫码关注云+社区