栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用Java从Nginx转发端口

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用Java从Nginx转发端口

Redis旨在在后端应用程序后面的安全网络上工作。客户端应用程序不应直接连接到Redis。对于2层应用程序,它使Redis成为糟糕的选择。

现在,如果您仍要使用Redis,则有几种选择。您可以将Redis服务器封装在HTTP接口中。这就是nginx
redis2模块所提供的。您可能还想看看webdis,这是相似的(并且不依赖于nginx)。Webdis提供了一些访问控制机制。请参阅文档。

另一个解决方案是按照您的建议建立隧道。我不会为此使用nginx,而只会使用普通的旧SSH。假设Redis服务器在计算机B(端口6379)上运行,而客户端在计算机A上运行。

在机器A上,我可以运行:

ssh user@host_B -L 7008:host_B:6379 -N

它将打开从本地端口7008(任意选择)到A到B的隧道,并等待。应该在主机B上声明该用户,并且知道其密码。在仍然位于主机A上的另一个会话中,我们现在可以运行:

redis-cli -p 7008 ping

请注意,使用的是标准Redis客户端。隧道以透明的方式为客户端处理身份验证,加密和可选的压缩。

现在,您的客户端是一个Java应用程序,您可能不想运行SSH命令来设置隧道。希望您可以使用Jsch包直接从Java打开隧道。这是Jedis的示例:

import redis.clients.jedis.*;import java.util.*;import com.jcraft.jsch.*;public class TestTunnel {    Jedis jedis;      Session session;    JSch jsch = new JSch();     int port;    // None of the following should be hardpred    static String USER = "user";          // SSH user on the redis server host    static String PASSWD = "XXXXXXXX";    // SSH user password    static String HOST = "192.168.1.62";  // Redis server host    static int PORT = 6379;    // Redis server port    public TestTunnel() {      try {        // Open the SSH session        session = jsch.getSession( USER, HOST, 22 );        session.setPassword( PASSWD );        java.util.Properties config = new java.util.Properties();        config.put("StrictHostKeyChecking", "no");        config.put("Compression", "yes");        config.put("ConnectionAttempts","3");        session.setConfig(config);        session.connect();        // Setup port forwarding from localhost to the Redis server        // Local port is ephemeral (given by the OS)        // Jedis connects to localhost using the local port        port = session.setPortForwardingL( 0, HOST, PORT );        jedis = new Jedis( "127.0.0.1", port );      } catch ( JSchException e ) {        // Proper error handling omitted        System.out.println(e);      }    }    public void disconnect() {      jedis.disconnect();      try {        session.delPortForwardingL( port );        session.disconnect();       } catch ( JSchException e ) {        // Proper error handling omitted        System.out.println(e);      }     }    public void mytest( int n ) {     for ( int k = 0; k < n; k++) {      jedis.set("k" + k, "value"+k);     }     System.out.println("Read: "+jedis.get("k0") );    }    public static void main(String[] args) {      TestTunnel obj = new TestTunnel();      obj.mytest(10);      obj.disconnect();    } }

它可以正常工作,但请注意,由于隧道的原因,会产生开销。当网络速度较慢(例如Internet)时,开销非常低。在快速的LAN(1
GbE)上,它更加引人注目:使用隧道时,延迟最多可以乘以3。Redis服务器可以承受的最大吞吐量也受到影响。在服务器端,sshd守护程序占用一些CPU(比Redis本身更多)。

也就是说,对于2层应用程序,原始性能并不重要。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393209.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号