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

来源:互联网 发布:阳江网络问政平台举报 编辑:程序博客网 时间:2024/05/17 00:55

一个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);   }
原创粉丝点击