实现springboot项目外网操作阿里云数据库redis

阿里云数据库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
实现springboot项目外网操作阿里云数据库redis_第1张图片
1.2 云主机设置安全组
实现springboot项目外网操作阿里云数据库redis_第2张图片
2.模拟ssh请求到esc,esc转发请求,进而操作redis
项目结构如下图
实现springboot项目外网操作阿里云数据库redis_第3张图片
2.1 pom依赖引入


        
            org.springframework.boot
            spring-boot-starter-redis
            1.3.8.RELEASE
        
        
            redis.clients
            jedis
        
        
            com.jcraft
            jsch
            0.1.53
        
        
            org.apache.commons
            commons-pool2
        

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 THREADLOCAL  = new ThreadLocal();
    /**云主机名*/
    @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文件中。如下
实现springboot项目外网操作阿里云数据库redis_第4张图片
然后测试类如下

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客户端看到操作的结果
实现springboot项目外网操作阿里云数据库redis_第5张图片
如何配置这个redis-cli连接到云redis?
实现springboot项目外网操作阿里云数据库redis_第6张图片
以上就是所有的内容。谢谢~
参考资料:
HowTo:通过跳板机连接redis
阿里云相关文档

你可能感兴趣的:(redis缓存相关,springboot,阿里云数据库redis,SSH连接)