前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来2 —— Ehcache的各种项目集成与使用初体验

JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来2 —— Ehcache的各种项目集成与使用初体验

原创
作者头像
是Vzn呀
发布于 2023-01-05 00:49:50
发布于 2023-01-05 00:49:50
1.6K0
举报
文章被收录于专栏:架构悟道架构悟道

大家好,又见面了。


本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。


在上一篇文章《JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来 —— 感受来自Ehcache的强大实力》中,介绍了Ehcache所具有的核心优秀特性,如数据持久化、多级缓存、集群能力等等。所谓纸上得来终觉浅、绝知此事要躬行,接下来我们就一起动手实践下,在项目中集成Ehcache并体验Ehcache的各种常见用法。

Ehcache的依赖集成与配置

依赖引入

集成使用Ehcache的第一步,就是要引入对应的依赖包。对于Maven项目而言,可以在pom.xml中添加对应依赖:

代码语言:html
AI代码解释
复制
<dependency>
  <groupId>org.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>3.10.0</version>
</dependency>      

依赖添加完成后,还需要对缓存进行配置后方可使用。

缓存的配置与创建

使用代码配置与创建Ehcache

Ehcache支持在代码中手动创建缓存对象,并指定对应缓存参数信息。在使用之前,需要先了解几个关键代码类:

类名

具体说明

CacheManagerBuilder

CacheManager对象的构造器对象,可以方便的指定相关参数然后创建出符合条件的CacheManager对象。

ResourcePoolsBuilder

用于指定缓存的存储形式(ResourcePools)的配置构造器对象,可以指定缓存是堆内缓存、堆外缓存、磁盘缓存或者多者的组合,以及各个类型缓存的容量信息、是否持久化等信息。

CacheConfiguration

用于承载所有指定的关于缓存的配置属性值。

CacheConfigurationBuilder

用于生成最终缓存总体配置信息的构造器,可以指定缓存存储形式(ResourcePools)、过期策略(ExpiryPolicy)、键值类型等等各种属性值。

通过组合使用上述Builder构造器,我们便可以在代码中完成对缓存Cache属性的设置。比如下面这样:

代码语言:java
AI代码解释
复制
public static void main(String[] args) {
    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
            .with(CacheManagerBuilder.persistence("d:\\myCache\\"))
            .build(true);
    // 指定缓存的存储形式,采用多级缓存,并开启缓存持久化操作
    ResourcePools resourcePools = ResourcePoolsBuilder.newResourcePoolsBuilder()
            .heap(1, MemoryUnit.MB)
            .disk(10, MemoryUnit.GB, true)
            .build();
    // 封装缓存配置对象,指定了键值类型、指定了使用TTL与TTI联合的过期淘汰策略
    CacheConfiguration<Integer, String> cacheConfiguration =
            CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, resourcePools)
                    .withExpiry(ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(10)))
                    .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(5)))
                    .build();
    // 使用给定的配置参数,创建指定名称的缓存对象
    Cache<Integer, String> myCache = cacheManager.createCache("myCache", cacheConfiguration);
}

上面的示例中,我们创建了一个基于heap + disk二级缓存对象,并开启了缓存的持久化,以及指定了持久化结果文件的存储路径。

基于XML配置Ehcache

因为Ehcache在创建缓存的时候可以指定的参数较多,如果通过上面的代码方式指定配置,略显繁琐且不够清晰直观,并且当需要创建多个不同的缓存对象的时候比较麻烦。好在Ehcache还提供了一种通过XML来进行参数配置的途径,并且支持在一个xml中配置多个不同的缓存对象信息。

在项目的resource目录下添加个Ehcache的配置文件,比如取名ehcache.xml,项目层级结构示意如下:

然后我们在ehcache.xml中添加配置内容。内容示例如下:

代码语言:html
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
        xmlns='http://www.ehcache.org/v3'
        xsi:schemaLocation="http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.1.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.1.xsd">

    <persistence directory="D:\myCache"/>

    <cache alias="myCache">
        <key-type>java.lang.Integer</key-type>
        <value-type>java.lang.String</value-type>
        <expiry>
            <tti unit="minutes">5</tti>
        </expiry>
        <resources>
            <heap unit="MB">10</heap>
            <offheap unit="MB">50</offheap>
            <disk persistent="true" unit="MB">500</disk>
        </resources>
    </cache>
</config>

上面演示的Ehcache3.x版本中的配置实现方式(配置文件与Ehcache2.x存在较大差异,不要混用,运行会报错),在xml中指定了myCache的key与value对应的类型,指定了基于TTI的5分钟过期淘汰策略,并规定了采用heap + offheap + disk的三级缓存机制,此外还开启了缓存持久化能力,并指定了持久化文件的存储路径。

通过xml配置的方式,可以很直观的看出这个缓存对象的所有关键属性约束,也是相比于代码中直接配置的方式更有优势的一个地方。在xml配置文件中,也可以同时配置多个缓存对象信息。此外,为了简化配置,Ehcache还支持通过<cache-template>来将一些公用的配置信息抽取出来成为模板,然后各个Cache独立配置的时候只需要增量配置各自差异化的部分即可,当然也可以基于给定的模板进行个性化的修改覆写配置。

比如下面这个配置文件,配置了两个Cache对象信息,复用了同一个配置模板,然后各自针对模板中不符合自己的配置进行了重新改写。

代码语言:html
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
        xmlns='http://www.ehcache.org/v3'
        xsi:schemaLocation="
        http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.1.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.1.xsd">

    <persistence directory="D:\myCache"/>

    <cache-template name="myTemplate">
        <key-type>java.lang.String</key-type>
        <value-type>java.lang.String</value-type>
        <expiry>
            <ttl unit="minutes">30</ttl>
        </expiry>
        <resources>
            <heap unit="MB">10</heap>
            <disk unit="GB" persistent="true">2</disk>
        </resources>
    </cache-template>

    <cache alias="myCache" uses-template="myTemplate">
        <key-type>java.lang.Integer</key-type>
    </cache>
    <cache alias="myCache2" uses-template="myTemplate">
        <expiry>
            <ttl unit="minutes">60</ttl>
        </expiry>
    </cache>
</config>

配置完成之后,我们还需要在代码中指定使用此配置文件进行CacheManager创建与配置,并且完成CacheManager的init初始化操作。

代码语言:java
AI代码解释
复制
public Cache<Integer, String> createCacheWithXml() {
    // 获取配置文件
    URL xmlConfigUrl = this.getClass().getClassLoader().getResource("./ehcache.xml");
    // 解析对应的配置文件并创建CacheManager对象
    XmlConfiguration xmlConfiguration = new XmlConfiguration(xmlConfigUrl);
    CacheManager cacheManager = CacheManagerBuilder.newCacheManager(xmlConfiguration);
    // 执行初始化操作
    cacheManager.init();
    // 直接从CacheManager中根据名称获取对应的缓存对象
    return cacheManager.getCache("myCache", Integer.class, String.class);
}

这样,Ehcache的集成与配置就算完成了,接下来直接获取Cache对象并对其进行操作即可。

代码语言:java
AI代码解释
复制
public static void main(String[] args) {
    EhcacheService ehcacheService = new EhcacheService();
    Cache<Integer, String> cache = ehcacheService.createCacheWithXml();
    cache.put(1, "value1");
    System.out.println(cache.get(1));
}

当然,Ehcache3.x版本中使用xml方式配置的时候,有几个坑需要提防,避免踩坑。

  1. 对于过期时间的设定只允许选择ttl或者tti中的一者,不允许两者同时存在——而通过代码配置的时候则没有这个问题。如果在xml中同时指定ttl与tti则运行的时候会抛异常。
  1. <cache>节点下面配置的时候,<expire>节点需要放在<configuration>节点的前面,否则会报错Schema校验失败

业务中使用

缓存设置并创建完成后,业务代码中便可以通过Ehcache提供的接口,进行缓存数据的相关操作。业务使用是通过对Cache对象的操作来进行的,Cache提供的API接口与JDK中的Map接口极其相似,所以在使用上毫无门槛,可以直接上手。

实际编码中,根据业务的实际诉求,通过Cache提供的API接口来完成缓存数据的增删改查操作。

代码语言:java
AI代码解释
复制
public static void main(String[] args) {
    EhcacheService ehcacheService = new EhcacheService();
    Cache<Integer, String> cache = ehcacheService.getCache();
    // 存入单条记录到缓存中
    cache.put(1, "value1");
    Map<Integer, String> values = new HashMap<>();
    values.put(2, "value2");
    values.put(3, "value3");
    // 批量向缓存中写入数据
    cache.putAll(values);
    // 当缓存不存在的时候才写入缓存
    cache.putIfAbsent(2, "value2");
    // 查询单条记录
    System.out.println(cache.get(2));
    // 批量查询操作
    System.out.println(cache.getAll(Stream.of(1,2,3).collect(Collectors.toSet())));
    // 移除单条记录
    cache.remove(1);
    System.out.println(cache.get(1));
    // 清空缓存记录
    cache.clear();
    System.out.println(cache.get(1));
}

从上述代码可以看出,EhCache具体使用起来与普通Map操作无异。虽然使用简单,但是这样也存在个问题就是业务代码所有使用缓存的地方,都需要强依赖Ehcache的具体接口,导致业务代码与Ehcache的依赖耦合度太高,后续如果想要更换缓存组件时,难度会非常大。

在前面的文章《聊一聊JAVA中的缓存规范 —— 虽迟但到的JCache API与天生不俗的Spring Cache》中有介绍过JAVA业界的缓存标准规范,主要有JSR107标准与Spring Cache标准,如果可以通过标准的接口方式进行访问,这样就可以解决与EhCache深度耦合的问题了。令人欣慰的是,Ehcache同时提供了对JSR107与Spring Cache规范的支持

下面一起看下如何通过JSR107规范接口以及Spring Cache的标准来使用Ehcache。

通过JCache API来使用Ehcache

依赖集成与配置

如果要使用JCache标准方式来使用,需要额外引入JCache对应依赖包:

代码语言:html
AI代码解释
复制
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.1.1</version>
</dependency>

按照JCache的规范,必须通过CacheManager才能获取到Cache对象(这一点与Ehcache相同),而CacheManager则又需要通过CacheProvider来获取。

遵循这一原则,我们可以按照JCache的方式来得到Cache对象:

代码语言:java
AI代码解释
复制
import javax.cache.Cache;
import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.configuration.MutableConfiguration;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
import javax.cache.spi.CachingProvider;

public class JsrCacheService {
    public Cache<Integer, String> getCache() {
        CachingProvider cachingProvider = Caching.getCachingProvide();
        CacheManager cacheManager = cachingProvider.getCacheManager();
        MutableConfiguration<Integer, String> configuration =
                new MutableConfiguration<Integer, String>()
                        .setTypes(Integer.class, String.class)
                        .setStoreByValue(false)
                        .setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE));
        Cache<Integer, String> myCache = cacheManager.createCach    ("myCache", configuration);
        System.out.println(myCache.getClass().getCanonicalName());
        return myCache;
    }
}

import的内容可以看出上述代码没有调用到任何Ehcache的类,调用上述代码执行并打印出构建出来的Cache对象具体类型如下,可以看出的的确确创建出来的是Ehcache提供的Eh107Cache类:

代码语言:txt
AI代码解释
复制
org.ehcache.jsr107.Eh107Cache

这是为什么呢?其实原理很简单,之前介绍JCache API的文章中也有解释过。JCache中的CacheProvider其实是一个SPI接口,Ehcache实现并向JVM中注册了这一接口,所以JVM可以直接加载使用了Ehcache提供的实际能力。翻看下Ehcache的源码,我们也可以找到其SPI注册对应的配置信息:

这里还有一个需要注意的点,因为SPI接口有可能被多个组件实现,而且可能会有多个组件同时往JVM中注册了javax.cache.spi.CachingProvider这一SPI接口的实现类,这种情况下,上述代码执行的时候会报错,因为没有指定具体使用哪一个SPI,所以JVM出现了选择困难症,只能抛异常了:

所以为了避免这种情况的发生,我们可以在获取CacheProvider的时候,指定加载使用Ehcache提供的具体实现类org.ehcache.jsr107.EhcacheCachingProvider即可。

代码语言:java
AI代码解释
复制
CachingProvider cachingProvider = Caching.getCachingProvider("org.ehcache.jsr107.EhcacheCachingProvider");

上面代码中,使用了JCache的MutableConfiguration类来实现缓存配置的设定。作为通用规范,JCache仅定义了所有缓存实现者需要实现的功能的最小集,而Ehcache除了JCache提供的最低限度缓存功能外,还有很多其余缓存不具备的增强特性。如果需要使用这些特性,则需要使用Ehcache自己的缓存配置类来实现。

举个例子,MutableConfiguration只能设定基于内存缓存的一些行为参数,而如果需要配置Ehcache提供的heap+offheap+disk三级缓存能力,或者是要开启Ehcache的持久化能力,则MutableConfiguration就有点爱莫能助,只能Ehcache亲自出马了。

比如下面这样:

代码语言:java
AI代码解释
复制
public Cache<Integer, String> getCache() {
    CacheConfiguration<Integer, String> cacheConfiguration =
            CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class,
                    ResourcePoolsBuilder.heap(10).offheap(20, MemoryUnit.MB)).build();
    EhcacheCachingProvider cachingProvider = (EhcacheCachingProvider) Caching.getCachingProvider();
    CacheManager cacheManager = cachingProvider.getCacheManager();
    return cacheManager.createCache("myCache",
            Eh107Configuration.fromEhcacheCacheConfiguration(cacheConfiguration));
}

当然,也可以在JCache中继续使用Ehcache的xml配置方式。如下示意:

代码语言:java
AI代码解释
复制
public Cache<Integer, String> getCache3() throwsURISyntaxException {
    CachingProvider cachingProvider = Caching.getCachingProvider();
    CacheManager manager = cachingProvider.getCacheManager(
            getClass().getClassLoader().getResource("./ehcache.xml").toURI(),
            getClass().getClassLoader());
    return manager.getCache("myCache", Integer.class, String.class);
}

相比于使用纯粹的JCache API方式,上述两种使用Ehcache自己配置的方式可以享受到Ehcache提供的一些高级特性。但代价就是业务代码与Ehcache的解耦不是那么彻底,好在这些依赖仅在创建缓存的地方,对整体代码的耦合度影响不是很高,属于可接受的范围。

业务中使用

完成了通过JCache API获取Cache对象,然后业务层代码中,便可以基于Cache对象提供的一系列方法,对缓存的具体内容进行操作了。

代码语言:java
AI代码解释
复制
public static void main(String[] args) throws Exception {
    JsrCacheService service = new JsrCacheService();
    Cache<Integer, String> cache = service.getCache();
    cache.put(1,"value1");
    cache.put(2,"value2");
    System.out.println(cache.get(1));
    cache.remove(1);
    System.out.println(cache.containsKey(1));
}

在Spring中集成Ehcache

作为JAVA领域霸主级别的存在,Spring凭借其优良的设计与出色的表现俘获了大批开发人员青睐,大部分项目都使用Spring作为基础框架来简化编码逻辑。Ehcache可以整合到Spring中,并搭配Spring Cache的标准化注解,让代码可以以一种更加优雅的方式来实现缓存的操作。

依赖集成与配置

以SpringBoot项目为例进行说明,首先需要引入对应的依赖包。对于maven项目,在pom.xml中添加如下配置:

代码语言:html
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
</dependency>

依赖引入之后,我们需要在配置文件中指定使用Ehcache作为集成的缓存能力提供者,并且可以指定ehcache.xml独立的配置文件(ehcache.xml配置文件需要放置在resource目录下):

代码语言:text
AI代码解释
复制
spring.cache.type=ehcache
spring.cache.ehcache.config=./ehcache.xml

然后我们需要在项目启动类上添加上@EnableCaching来声明开启缓存能力:

代码语言:java
AI代码解释
复制
@SpringBootApplication
@EnableCaching
public class CrawlerApplication {
    // ...
}

到这里,对于Ehcache2.x版本而言,就已经完成集成预配置操作,可以直接在代码中进行操作与使用了。但是对于Ehcache3.x版本而言,由于Spring并未提供对应的CacheManager对其进行支持,如果这个时候我们直接启动程序,会在启动的时候就被无情的泼上一盆冷水:

为了实现Ehcache3.xSpring的集成,解决上述的问题,需要做一些额外的适配逻辑。根据报错信息,首先可以想到的就是手动实现cacheManager的创建与初始化。而由于Spring Cache提供了对JSR107规范的支持,且Ehcache3.x也全面符合JSR107规范,所以我们可以将三者结合起来,以JSR107规范作为桥梁,实现SpringBoot与Ehcache3.x的集成。

这个方案也即目前比较常用的"SpringBoot + JCache + Ehcache"组合模式。首先需要在前面已有实现的基础上,额外增加对JCache的依赖:

代码语言:html
AI代码解释
复制
<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.1.1</version>
</dependency>

其次,需要修改下application.properties配置文件,将Spring Cache声明使用的缓存类型改为JCache

代码语言:text
AI代码解释
复制
spring.cache.type=jcache
spring.cache.jcache.config=./ehcache.xml

上面的配置看着略显魔幻,也是很多不清楚原有的小伙伴们会比较疑惑的地方(我曾经刚在项目中看到这种写法的时候,就一度怀疑是别人代码配置写错了)。但是经过上述的原因阐述,应该就明白其中的寓意了。

接下来,需要在项目中手动指定使用ehcache.xml配置文件来构建cacheManager对象。

代码语言:java
AI代码解释
复制
@Configuration
public class EhcacheConfig {
    @Bean
    public JCacheManagerFactoryBean cacheManagerFactoryBean() throws Exception {
        JCacheManagerFactoryBean factoryBean = new JCacheManagerFactoryBean();
        factoryBean.setCacheManagerUri(getClass().getClassLoader().getResource("ehcache.xml").toURI());
        return factoryBean;
    }
    @Bean
    public CacheManager cacheManager(javax.cache.CacheManager cacheManager) {
        JCacheCacheManager cacheCacheManager = new JCacheCacheManager();
        cacheCacheManager.setCacheManager(cacheManager);
        return cacheCacheManager;
    }
}

这样,就完成了通过JCache桥接来实现Spring中使用Ehcache3.x版本的目的了。

支持Spring Cache注解操作

完成了Spring与Ehcache的整合之后,便可以使用Spring Cache提供的标准注解来实现对Ehcache缓存的操作。

首先需了解Spring Cache几个常用的注解及其含义:

注解

含义说明

@EnableCaching

开启使用缓存能力

@Cacheable

添加相关内容到缓存中

@CachePut

更新相关缓存记录

@CacheEvict

删除指定的缓存记录,如果需要清空指定容器的全部缓存记录,可以指定allEntities=true来实现

通过注解的方式,可以轻松的实现将某个方法调用的入参与响应映射自动缓存起来,基于AOP机制,实现了对业务逻辑无侵入式的静默缓存处理。

代码语言:java
AI代码解释
复制
@Service
@Slf4j
public class TestService {
    @Cacheable(cacheNames = "myCache", key = "#id")
    public String queryById(int id) {
        log.info("queryById方法被执行");
        return "value" + id;
    }
    @CachePut(cacheNames = "myCache", key = "#id")
    public String updateIdValue(int id, String newValue) {
        log.info("updateIdValue方法被执行");
        return newValue;
    }
    @CacheEvict(cacheNames = "myCache", key = "#id")
    public void deleteById(int id) {
        log.info("deleteById方法被执行");
    }
}

通过注解的方式指定了各个方法需要配套执行的缓存操作,具体业务代码里面则聚焦于自身逻辑,无需操心缓存的具体实现。可以通过下面的代码测试下集成后的效果:

代码语言:java
AI代码解释
复制
@GetMapping("/test")
public String test() {
    String value = testService.queryById(123);
    System.out.println("第一次查询,结果:" + value);
    value = testService.queryById(123);
    System.out.println("第二次查询,结果:" +value);
    testService.updateIdValue(123, "newValue123");
    value = testService.queryById(123);
    System.out.println("更新后重新查询,结果:" + value);
    testService.deleteById(123);
    value = testService.queryById(123);
    System.out.println("删除后重新查询,结果:" + value);
    return "OK";
}

执行结果如下:

代码语言:txt
AI代码解释
复制
queryById方法被执行
第一次查询,结果:value123
第二次查询,结果:value123
updateIdValue方法被执行
更新后重新查询,结果:newValue123
deleteById方法被执行
queryById方法被执行
删除后重新查询,结果:newValue123

从测试结果可以看出,查询之后方法的入参与返回值被做了缓存,再次去查询的时候并没有真正的执行具体的查询操作方法,而调用删除方法之后再次查询,又会触发了真正的查询方法的执行。

小结回顾

好啦,关于Ehcache的各种配置、以及通过JSR107或者Spring Cache规范集成到项目中使用的相关内容,就介绍到这里了。不知道小伙伴们是否对Ehcache的使用有了进一步的了解呢?而关于Ehcache,你是否有自己的一些想法与见解呢?欢迎评论区一起交流下,期待和各位小伙伴们一起切磋、共同成长。

📣 补充说明1

本文属于《深入理解缓存原理与实战设计》系列专栏的内容之一。该专栏围绕缓存这个宏大命题进行展开阐述,全方位、系统性地深度剖析各种缓存实现策略与原理、以及缓存的各种用法、各种问题应对策略,并一起探讨下缓存设计的哲学。如果有兴趣,也欢迎关注此专栏。

📣 补充说明2

我是悟道,聊技术、又不仅仅聊技术~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Loki vs ELK:谁是日志收集的终极选择?
几个月前,我们的生产系统突然崩溃,所有服务不可用。我们有数十个微服务和数据库,日志堆积如山,想要快速找到问题源头却成了大难题。我们一开始使用的是经典的 ELK Stack,它强大但复杂,搜索效率也不太尽如人意。后来,我们尝试了 Loki,这个新生代的日志系统,给了我们一些意外的惊喜。
井九
2024/10/12
6010
五款超好用的日志管理工具,赶紧收藏!
日志管理是现代IT环境中不可或缺的一部分,它有助于监视和维护应用程序、系统和网络的正常运行,帮助诊断问题,追踪事件以及确保安全性。
ICT系统集成阿祥
2024/12/03
2.5K0
五款超好用的日志管理工具,赶紧收藏!
Opentelemetry 调研实践一(可观测性到底在说什么)
可观测性(Observability)并不是一个新词,而在几十年前被广泛地用于控制理论,用它来描述和理解⾃我调节系统。随着容器技术、微服务、⽆服务器迅速流行,使得系统间的访问越来越复杂,在云上、本地或两者上可能会运⾏数千个进程, 使用传统的监控技术和⼯具很难跟踪这些分布式架构中的通信路径和相互依赖关系。系统内部的可见性就变得非常重要。
米开朗基杨
2021/10/27
1.5K0
Opentelemetry 调研实践一(可观测性到底在说什么)
从零开始搭建ELK+GPE监控预警系统
前言 本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果。 业务规模 8个平台 100+台服务器 10+个集群分组 微服务600+ 用户N+ 面临问题 随着分布式微服务容器技术的发展,传统监控系统面临许多问题: 容器如何监控 微服务如何监控 集群性能如何进行分析计算 如何管理agent端大量配置脚本 这些都是传统监控所要面临的棘手问题,那么如何解决当前遇到的问题,GPE横空出世,后面会重点分析。 系统监控 目标群体:系统日志、服务器、容器、系
小柒2012
2018/04/13
2.2K0
从零开始搭建ELK+GPE监控预警系统
从零开始搭建ELK+GPE监控预警系统
本文可能不会详细记录每一步实现的过程,但一定程度上可以引领小伙伴走向更开阔的视野,串联每个环节,呈现予你不一样的效果。
小柒2012
2019/12/09
1.4K0
从零开始搭建ELK+GPE监控预警系统
客户案例|某车企建设统一监控平台实践
导语:文章主要介绍腾讯云 Prometheus 在监控出行行业的突出优势与解决方案,为客户运维团队降低了很多成本。
腾讯云可观测平台
2025/02/11
2840
客户案例|某车企建设统一监控平台实践
Prometheus和Grafana监控Kubernetes以及未来
了解使用 Prometheus 和 Grafana 监控 Kubernetes 的优势和挑战,以及他们的潜在继任者。
云云众生s
2024/03/28
2000
Prometheus和Grafana监控Kubernetes以及未来
你居然还去服务器上捞日志,搭个日志收集系统难道不香么!
经典的ELK架构或现被称为Elastic Stack。Elastic Stack架构为Elasticsearch + Logstash + Kibana + Beats的组合:
JavaEdge
2023/11/01
6590
你居然还去服务器上捞日志,搭个日志收集系统难道不香么!
构建混合技术栈的统一监控与日志平台
在多技术栈开发环境中,不同系统可能使用不同的监控和日志工具,导致数据分散、分析困难。本文以 Prometheus 和 ELK Stack 为例,展示如何构建一个统一的监控与日志平台,实现混合技术栈下的系统可观测性。文章包含一个可运行的示例 Demo,并通过图解说明系统架构,帮助开发者快速上手。
网罗开发
2024/12/30
2200
构建混合技术栈的统一监控与日志平台
可观测平台-2: 开源解决方案
构建一个复杂应用系统的监控和告警系统,涉及到从前端、各类后端语言的 API、网关、消息队列(MQ)、缓存(Cache)以及数据库(DB)等多个组件。自动绘制应用系统的组件拓扑图并关联对应组件的状态是一个复杂的过程,通常需要以下几个步骤:
行者深蓝
2023/11/26
1.2K0
七年4个阶段:滴滴可观测架构演进与实践
TakinTalks稳定性社区专家团成员,滴滴出行可观测架构负责人。深耕可观测领域多年,专注于架构设计与优化。带领团队完成了滴滴第二代到第四代的架构迭代。多个可观测开源项目的Contributor。目前聚焦在滴滴可观测的稳定性建设和滴滴场景下的可观测性的实现与落地工作。
TakinTalks稳定性社区
2023/12/04
7720
七年4个阶段:滴滴可观测架构演进与实践
AI大模型独角兽 MiniMax 基于 Apache Doris 升级日志系统,PB 数据秒级查询响应
MiniMax 是领先的通用人工智能科技公司,自主研发了不同模态的通用大模型,其中包括拥有万亿参数的 MoE 文本大模型、语音大模型以及图像大模型。MiniMax 以“与用户共创智能”为愿景,通过对大模型持续迭代,MiniMax 在国内率先完成核心 MoE 算法技术路线的突破。2024 年 4 月,公司推出国内首个上线商用的 MoE 架构、包含万亿参数的大语言模型——“MiniMax-abab 6.5”,模型性能接近国际领先水平。
SelectDB技术团队
2024/08/23
2010
随便聊聊
这三个方向虽然各有千秋,各有侧重,但是又不完全独立。在Peter Bourgon 的文章《Metrics, Tracing, and Logging》系统地阐述了这三者的定义、特征,以及它们之间的关系与差异,受到了业界的广泛认可。
没有故事的陈师傅
2023/05/01
3740
随便聊聊
图解 | 监控系统 Prometheus 的原理
ELK Stack 日志收集和检索平台想必大家应该比较熟悉,Elasticsearch + Filebeat + Logstash + Kibana。
悟空聊架构
2022/12/12
1.2K0
图解 | 监控系统 Prometheus 的原理
在 EKS 中实现基于 Promtail + Loki + Grafana 容器日志解决方案
如果今天谈论到要部署一套日志系统,相信用户首先会想到的就是经典的ELK架构,或者现在被称为Elastic Stack。Elastic Stack架构为Elasticsearch + Logstash + Kibana + Beats的组合,其中,Beats负责日志的采集, Logstash负责做日志的聚合和处理,Elasticsearch作为日志的存储和搜索系统,Kibana作为可视化前端展示,整体架构如下图所示:
我是阳明
2021/06/25
2.9K0
在 EKS 中实现基于 Promtail + Loki + Grafana 容器日志解决方案
尝鲜初体验:使用 Loggie 和 VictoriaLogs 快速构建新一代的日志系统
如果你熟悉Prometheus,想必你肯定也知道VictoriaMetrics,这款越来越流行的监控项目,可作为Prometheus的增强或者平替。VictoriaMetrics一个重要的亮点就是解决Prometheus在大规模Metrics指标数据量级下的存储问题。
我是阳明
2023/08/21
2.7K0
尝鲜初体验:使用 Loggie 和 VictoriaLogs 快速构建新一代的日志系统
可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse
可观测性(Observability)是指通过系统的外部输出数据,推断其内部状态的能力。可观测性平台通过采集、存储、可视化分析三大可观测性数据:日志(Logging)、链路追踪(Tracing)和指标(Metrics),帮助团队全面洞察分布式系统的运行状态,支撑资源优化、预警机制、故障分析等,提升系统可靠性与用户体验。
SelectDB技术团队
2025/05/13
1100
可观测性方案怎么选?SelectDB vs Elasticsearch vs ClickHouse
啥?Grafana 还能为日志添加告警?
做过运维的同学都知道,服务的可观测性是一个非常重要的渠道,能够让我们掌控线上服务运行时的状态。一个好的监控系统,其价值在于一旦出现故障能够让我们运维的同学能够快速收到服务异常的通知以及定位问题。也就是我们常说的告警的两大衡量指标,即实时性和有效性。
米开朗基杨
2020/09/21
2.4K0
啥?Grafana 还能为日志添加告警?
SRE-面试问答模拟-开放问答话题
SRE(Site Reliability Engineering)和可观测性是运维工作中的关键理念,这些问题涵盖了不同层次的运维实践和理念。以下是对部分问题的简要回答:
行者深蓝
2024/09/07
2420
基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
在后移动互联网时代,良好的用户体验是增长的基础,而稳定的使用体验则是用户体验的基础。大型的互联网公司,尤其是面向 C 端客户的公司,对业务系统稳定性的要求越来越高,因此对线上问题发现和处理的速度要求通常是分钟级的。比如滴滴等出行公司,打车服务停摆 10 分钟都会导致导致乘客、司机大规模投诉,不仅造成经济损失,而且严重平台商誉和用户口碑。
三余鱻生
2021/11/19
2K1
基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
推荐阅读
相关推荐
Loki vs ELK:谁是日志收集的终极选择?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档