阿里云数据库redis仅支持内网访问redis服务器,如果实现外网访问,则需要借助与阿里云主机进行转发请求。所以这里需要两个大步骤才能完成上述外网访问云redis.
1.实现ESC-云主机转发
2.模拟ssh请求到esc,esc转发请求,进而操作redis
下面具体说明每一步如何操作。
1.实现ESC-云主机转发
这个实现是在阿里云官方文档的基础上。我多说几个注意点。实际操作还是结合官方文档:阿里云redis—公网连接
这里我说明**意事项:
1.1 redis设置IP白名单
要干掉127.0.0.1这个ip.加上内网那些云主机可以ip,还有公网允许访问的ip。
IP白名单设置为0.0.0.0/0代表允许所有地址访问,设置为127.0.0.1代表禁止所有地址访问
特别注意点:设置完ip白名单最好重启下redis
1.2 云主机设置安全组
2.模拟ssh请求到esc,esc转发请求,进而操作redis
项目结构如下图
2.1 pom依赖引入
<!-- 引入 redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.2 启动类中开启redis
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
@EnableCaching
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class RedisApplication {
public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
2.3 管理session工程
package com.redis.factory;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Properties;
/**
* @author zhanglifeng
* @date 2019-05-15
*/
@Component
public class SessionFactory {
/**定义ThreadLocal对象*/
private static final ThreadLocal<Session> THREADLOCAL = new ThreadLocal<Session>();
/**云主机名*/
@Value("${constant.mt.escUserName}")
private String ESC_USERNAME;
/**云主机端口号*/
@Value("${constant.mt.escPort}")
private int ESC_PORT;
/**云主机外网地址*/
@Value("${constant.mt.escHost}")
private String ESC_HOST;
/**云主机登陆密码*/
@Value("${constant.mt.escPassword}")
private String ESC_PASSWORD;
/**云redis地址*/
@Value("${constant.mt.redisHost}")
private String REDIS_HOST;
/**云redis密码*/
@Value("${constant.mt.redisPassword}")
private String REDIS_PASSWORD;
/**云redis端口号*/
@Value("${constant.mt.redisPort}")
private int REDIS_PORT;
/**定义JSch对象*/
private JSch jsch;
/**定义Properties对象*/
private Properties config;
public Session getSession()throws JSchException {
//从ThreadLocal对象中获得Session对象
Session session = THREADLOCAL.get();
//判断获得的Session对象是否为空或者未打开
if(null == session || !session.isConnected()){
if(null == jsch){
jsch=new JSch();
}
session = jsch.getSession(ESC_USERNAME, ESC_HOST, ESC_PORT);
if(null == config){
config = new Properties();
config.put("StrictHostKeyChecking", "no");
}
session.setConfig(config);
//连接到阿里云主机ESC上密码
session.setPassword(ESC_PASSWORD);
session.connect();
//转跳ESC->REDIS,加上redis的连接配置
session.setPortForwardingL(REDIS_PORT, REDIS_HOST, REDIS_PORT);
//在ThreadLocal对象中保存该Session对象
THREADLOCAL.set(session);
}
return session;
}
public void closeSession(){
//从ThreadLocal对象中获得Session对象
Session session = THREADLOCAL.get();
//将当前线程Session对象从ThreadLocal对象中移除
THREADLOCAL.set(null);
if (session != null) {
session.disconnect();
}
}
}
2.4 写测试类测试redis
其中2.3依赖的注入配置信息在yml文件中。如下
然后测试类如下
package com.redis;
import com.jcraft.jsch.Session;
import com.redis.factory.SessionFactory;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.Jedis;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class RedisApplicationTests {
@Autowired
private SessionFactory sessionFactory;
public void SSHConnection () throws Throwable{
Session session = sessionFactory.getSession();
// 通过jedis操作redis。这里必须是127.0.0.1。
Jedis jedis = new Jedis("127.0.0.1", 6379);
//redis设置的有密码,要通过校验
jedis.auth("3*******ZUiW");
//测试存值
jedis.set("name", "zhanglifeng");
//测试取值
String output = jedis.get("name");
System.out.println(output);
// 关闭session
sessionFactory.closeSession();
}
@Test
public void aliYunRedis(){
try {
SSHConnection();
log.info("往redis中存入一个姓名成功");
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
}
3.执行完后可以通过redis客户端看到操作的结果
如何配置这个redis-cli连接到云redis?
以上就是所有的内容。谢谢~
参考资料:
HowTo:通过跳板机连接redis
阿里云相关文档