前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >thrift/swift/nifty:获取客户端ip的简单方法

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

作者头像
10km
发布2018-01-03 14:39:32
2.1K0
发布2018-01-03 14:39:32
举报
文章被收录于专栏:10km的专栏

一个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相当简单,示例如下:

代码语言:javascript
复制
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初始化代码片段

代码语言:javascript
复制
    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);
   }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年11月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档