SpringBoot使用Google guava缓存

  • 开发环境
    • springboot
    • guava
    • docker-client
  • 应用场景
    • 用来存储DockerClient的client连接,项目通过操作docker-client提供对docker的可视化界面操作,操作范围没有固定,可以是当前k8s集群上的任意节点,或者是任意主机的docker,所以只能根据接口传递的主机ip和docker.service配置的port端口操作不同节点上的docker,因为无法固定操作节点,当操作不同节点的时候需要重新对docker发起连接请求,比较耗时,所以打算将连接成功后的节点DockerClient对象存储到缓存中,这样用到的时候从缓存中,这样避免频繁发起连接请求。
  • 选择Google guava的原因
    • guava是一个内存缓存模块,用于将数据缓存到JVM内存中,在项目开发中可以将一些公共或者常用的数据缓存起来方便快速访问,可以自动回收元素。
    • 愿意消耗一些内存来提升速度
    • DockerClient会被查询n次
    • 存放的数据总量不会超出内存容量

开始使用

  1. maven导包
    <dependency>
       <groupId>javax.cache</groupId>
        <artifactId>cache-api</artifactId>
        <version>1.1.0</version>
    </dependency>
    
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>18.0</version>
    </dependency>
    
  2. 代码示例
    import com.spotify.docker.client.DefaultDockerClient;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.net.URI;
    
    public class DockerClientUtil {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(DockerClientUtil.class);
    
        private static String DEFAULT_PORT = "2375";
    
        private static long CONNECT_TIMEOUT_MILLIS = 10000L;
    
        public static DefaultDockerClient getDockerClient(String hostPath, String port) throws Exception{
            if (StringUtils.isBlank(port)){
                port = DEFAULT_PORT;
            }
            DefaultDockerClient dockerClient;
            try {
                dockerClient = DefaultDockerClient.builder()
                        .connectTimeoutMillis(CONNECT_TIMEOUT_MILLIS)
                        .uri(URI.create("http://" + hostPath + ":" + port)).build();
            }catch (Exception e){
                LOGGER.error("DockerClient连接超时", e.getMessage());
                throw new Exception(e.getMessage());
            }
            return dockerClient;
        }
    }
    
    
    注:dockerclient相关jar包请参考:https://blog.csdn.net/weixin_42518062/article/details/103668710
    import com.csdn.demo.utils.DockerClientUtil;
    import com.google.common.cache.*;
    import com.spotify.docker.client.DefaultDockerClient;
    import org.slf4j.LoggerFactory;
    import org.slf4j.Logger;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class GuavaConfig {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(GuavaConfig.class);
    
        public LoadingCache getDockerClient(){
            LoadingCache<Object, Object> loadingCache = CacheBuilder.newBuilder()
                    //设置并发级别,指可以同时进行缓存的线程数
                    .concurrencyLevel(5)
                    //设置缓存最大容量,超过之后就会按照LUR算反来移除缓存项
                    .maximumSize(5)
                    //设置缓存容器的初始化容量
                    .initialCapacity(2)
                    //设置缓存的移除通知
                    .removalListener(new RemovalListener<Object, Object>() {
                        @Override
                        public void onRemoval(RemovalNotification<Object, Object> removalNotification) {
                            LOGGER.info("缓存移除通知:" + removalNotification.getKey() + "被移除, 移除原因:" + removalNotification.getCause());
                        }
                    })
                    //在缓存不存在时通过cacheLoader实现自动加载缓存
                    .build(new CacheLoader<Object, Object>() {
                        @Override
                        public DefaultDockerClient load(Object key) throws Exception {
                            String[] split = ((String) key).split(":");
                            DefaultDockerClient dockerClient = DockerClientUtil.getDockerClient(split[0], split[1]);
                            return dockerClient;
                        }
                    });
    
            if (LOGGER.isInfoEnabled()){
                LOGGER.info("-----------------guava本地缓存初始化成功------------------");
            }
            return loadingCache;
        }
    }
    
    注:项目关闭重启后缓存清空
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐