bladex路由菜单缓存源码
时间: 2023-07-05 19:05:51 浏览: 349
BladeX是基于Spring Cloud的一款微服务开发框架,它提供了一些方便的功能来加速微服务的开发。其中之一就是路由菜单缓存功能。
路由菜单缓存是指在启动时缓存服务的路由信息和菜单信息,然后在运行时使用缓存,避免了每次请求都需要从注册中心获取服务列表和菜单列表的开销,提高了系统的性能。
在BladeX中,路由菜单缓存的实现主要是通过CacheManager来实现的。CacheManager是Spring框架提供的缓存管理器,它可以管理多种缓存,包括内存缓存、Redis缓存等。
在BladeX中,我们可以通过在配置文件中配置cacheManager来实现路由菜单缓存。具体实现步骤如下:
1. 在pom.xml文件中添加依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
```
2. 配置CacheManager
在application.yml文件中添加以下内容:
```yaml
spring:
cache:
type: caffeine #指定使用的缓存类型,这里使用的是Caffeine
```
3. 实现CacheManager
在BladeX中,路由菜单缓存的具体实现是通过RouterCache和MenuCache两个类来实现的。它们分别继承了Spring框架提供的Cache接口,并重写了其中的一些方法。
RouterCache的实现代码如下:
```java
@Component
public class RouterCache implements Cache<String, Object> {
private final ConcurrentMap<String, Object> cache = new ConcurrentHashMap<>();
@Override
public String getName() {
return "routerCache";
}
@Override
public Object getNativeCache() {
return cache;
}
@Override
public ValueWrapper get(Object key) {
Object value = cache.get(key);
return value != null ? new SimpleValueWrapper(value) : null;
}
@Override
public <T> T get(Object key, Class<T> type) {
Object value = cache.get(key);
if (value != null && type != null && !type.isInstance(value)) {
throw new IllegalStateException(
"Cached value is not of required type [" + type.getName() + "]: " + value);
}
return (T) value;
}
@Override
public void put(String key, Object value) {
cache.put(key, value);
}
@Override
public ValueWrapper putIfAbsent(String key, Object value) {
Object existingValue = cache.putIfAbsent(key, value);
return existingValue != null ? new SimpleValueWrapper(existingValue) : null;
}
@Override
public void evict(Object key) {
cache.remove(key);
}
@Override
public void clear() {
cache.clear();
}
}
```
MenuCache的实现代码类似,这里不再赘述。
4. 配置缓存注解
在BladeX中,我们可以通过使用@Cacheable注解来启用缓存功能。我们可以在Controller层的方法上添加@Cacheable注解,来缓存服务的路由信息和菜单信息。
```java
@Cacheable(value = "routerCache", key = "#serviceName")
@GetMapping("/{serviceName}")
public List<BladeService> getServiceList(@PathVariable String serviceName) {
return discoveryClient.getInstances(serviceName).stream()
.map(BladeService::new)
.collect(Collectors.toList());
}
```
以上就是BladeX实现路由菜单缓存的源代码。
阅读全文