实战前需了解:https://blog.csdn.net/wanzijy/article/details/125041622
Hystrix熔断器整合 - 搭建项目:https://blog.csdn.net/wanzijy/article/details/125496651
Hystrix熔断器整合 - 请求缓存:https://blog.csdn.net/wanzijy/article/details/125512072
Hystrix熔断器整合 - 请求合并:https://blog.csdn.net/wanzijy/article/details/125579664
Hystrix熔断器整合 - 服务隔离之线程池隔离:https://blog.csdn.net/wanzijy/article/details/125630353
Hystrix熔断器整合 - 服务隔离之信号量隔离:https://blog.csdn.net/wanzijy/article/details/125826690
Hystrix熔断器整合 - 服务熔断和服务降级:https://blog.csdn.net/wanzijy/article/details/125826853
Hystrix熔断器整合 - Feign实现服务容错:https://blog.csdn.net/wanzijy/article/details/125985304
Hystrix熔断器整合 - 可视化界面三部曲:https://blog.csdn.net/wanzijy/article/details/126005452
1. 在 order-service-rest 导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2. 修改 order-service-rest 模块的 application
spring:
application:
name: order-service-rest
# redis 缓存
redis:
timeout: 10000 # 连接超时时间
host: localhost # 服务器地址
port: 6379 # 服务器端口
database: 0 # 选择一个数据库,默认是 0 库
lettuce:
pool:
max-active: 1024 # 最大连接数,默认8
max-wait: 10000 # 最大连接阻塞等待时间,单位毫秒,默认 -1
max-idle: 200 # 最大空闲连接,默认8
min-idle: 5 # 最小空闲连接,默认0
3. 将 redis 对象注入并重写序列化方式
@Configuration
public class RedisConfig {
/**
* 重写 RedisTemplate 序列化
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer()); // 为 string 类型 key 设置序列化器
template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 为 string 类型 value 设置序列化器
template.setHashKeySerializer(new StringRedisSerializer()); // 为 hash 类型 key 设置序列化器
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); // 为 hash 类型 value 设置序列化器
template.setConnectionFactory(redisConnectionFactory);
return template;
}
/**
* 重写 Cache 序列化
* @param redisTemplate
* @return
*/
@Bean
public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(30)) // 设置缓存过期时间为30分钟
// 设置 key 和 value 的序列化
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
}
}
4. 修改 order-service-rest 中ProductServiceImpl 的对应方法
@Cacheable(cacheNames = "orderService:product:list") // 以目录的方式创建缓存数据
以目录的形式创建缓存数据的意思如下图:
在可视化界面中,其实就是按层级的形式去存储数据。当不同类型的数据较多时,可以将其存在不同的父目录下加以区分
5. 在 order-service-rest 的启动类上开启缓存注解
@EnableCaching // 开启缓存注解
6. 测试
在 JMeter 中添加 “ http://localhost:9090/order/1/product/list ” 接口的高并发测试
JMeter 的使用教程可以看我的另一篇关于 JMeter 的文章
https://blog.csdn.net/wanzijy/article/details/125080317
开始进行高并发模拟后,测试 “ http://localhost:9090/order/1/product ” 接口是否受影响
解释:
- 因为在 “ http://localhost:9090/order/1/product/list ” 接口中,做了数据的缓存和高并发的模拟
- 如果在浏览器多次访问 “ http://localhost:9090/order/1/product ” 接口时,在浏览器的控制台观察到每一次访问的时间并没有太大的变化,则意味着在高并发的环境下也没有影响到该接口的访问
- 再去 JMeter 观察 “ http://localhost:9090/order/1/product/list ” 接口的访问时间,如果发现也不会有太大的变化,而且时间也不会太长,则意味着在高并发的访问下,该接口的数据是从缓存 Redis 中直接获取的,也就意味着请求缓存成功