美文网首页
【Spring Cloud】Redis缓存接入监控、运维平台Ca

【Spring Cloud】Redis缓存接入监控、运维平台Ca

作者: 冷冷zz | 来源:发表于2018-01-01 11:39 被阅读1742次

    CacheCloud
    CacheCloud提供一个Redis云管理平台:实现多种类型(Redis Standalone、Redis Sentinel、Redis Cluster)自动部署、解决Redis实例碎片化现象、提供完善统计、监控、运维功能、减少运维成本和误操作,提高机器的利用率,提供灵活的伸缩性,提供方便的接入客户端。
    项目主页: https://github.com/sohutv/cachecloud

    image image

    改造RedisConnectionFactory

    /**
     * 根据缓存策略的不同,RedisConnectionFactory不同
     * 示例是单机模式。
     *
     * @return
     */
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
       while (true) {
            try {
                LOCK.tryLock(100, TimeUnit.MILLISECONDS);
                /**
                 * 心跳返回的请求为空;
                 */
                String response = HttpUtils.doGet("http://localhost:5005/cache/client/redis/standalone/10000.json?clientVersion=1.0-SNAPSHOT");
                if (response == null || response.isEmpty()) {
                    continue;
                }
                JSONObject jsonObject = null;
                try {
                    jsonObject = JSONObject.parseObject(response);
                } catch (Exception e) {
                }
                if (jsonObject == null) {
                    continue;
                }
                /**
                 * 从心跳中提取HostAndPort,构造JedisPool实例;
                 */
                String instance = jsonObject.getString("standalone");
                String[] instanceArr = instance.split(":");
                if (instanceArr.length != 2) {
                    continue;
                }
    
                //收集上报数据
                ClientDataCollectReportExecutor.getInstance("http://localhost:5005/cachecloud/client/reportData.json");
    
                String password = jsonObject.getString("password");
                String host = instanceArr[0];
                String port = instanceArr[1];
    
                JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
                jedisConnectionFactory.setPassword(password);
                jedisConnectionFactory.setHostName(host);
                jedisConnectionFactory.setPort(Integer.parseInt(port));
                return jedisConnectionFactory;
            } catch (InterruptedException e) {
                logger.error("error in build().", e);
            }
    
        }
    }
    

    改造 jedis-2.9.0

    Connection.java

    /**
     * 命令捕获,异常保存
     * @param cmd
     * @param args
     */
    public void sendCommand(final ProtocolCommand cmd, final byte[]... args) {
        try {
            //统计开始
            UsefulDataModel costModel = UsefulDataModel.getCostModel(threadLocal);
            costModel.setCommand(cmd.toString().toLowerCase());
            costModel.setStartTime(System.currentTimeMillis());
            connect();
            Protocol.sendCommand(outputStream, cmd, args);
        } catch (JedisConnectionException ex) {
            UsefulDataCollector.collectException(ex, getHostPort(), System.currentTimeMillis());
            broken = true;
            throw ex;
        }
    }
    

    JedisClusterCommand.java

    private T runWithRetries(byte[] key, int attempts, boolean tryRandomNode, boolean asking) {
        if (attempts <= 0) {
            JedisClusterMaxRedirectionsException exception = new JedisClusterMaxRedirectionsException("Too many Cluster redirections? key=" + SafeEncoder.encode(key));
            //收集
            UsefulDataCollector.collectException(exception, "", System.currentTimeMillis(), ClientExceptionType.REDIS_CLUSTER);
            throw exception;
        }
    }
    

    更新spring-boot-starter-data-redis依赖

     <!--Redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusions>
            <exclusion>
                <artifactId>jedis</artifactId>
                <groupId>redis.clients</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.sohu.tv</groupId>
        <artifactId>cachecloud-open-client-redis</artifactId>
        <version>1.0-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <artifactId>jedis</artifactId>
                <groupId>redis.clients</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--上步改造后编译的jar-->
    <dependency>
        <groupId>com.github.pig</groupId>
        <artifactId>pig-cache-cloud-jedis</artifactId>
        <version>2.9.1</version>
    </dependency>
    

    部署服务war

    这一步直接参考 cachecloud 的文档即可

    总结

    1. 源码,参考pig: https://gitee.com/log4j/pig
    2. 关于pig, 这是一套微服务应用的实践基于Spring Cloud、Spring Security Oauth2.0开发企业级认证与授权,提供常见服务监控、链路追踪、日志分析、缓存管理、任务调度等实现
    3. 改造写于2017-2018的跨年夜,文章整理与2018.1.1,真惨,不过我喜欢 😊
    4. 2017 失去很多,2018本命年 💪 汪汪汪!

    相关文章

      网友评论

          本文标题:【Spring Cloud】Redis缓存接入监控、运维平台Ca

          本文链接:https://www.haomeiwen.com/subject/srqtnxtx.html