首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Zuul的性能优化-缓存

Zuul的性能优化-缓存

原创
作者头像
堕落飞鸟
发布于 2023-04-09 05:28:36
发布于 2023-04-09 05:28:36
52500
代码可运行
举报
文章被收录于专栏:飞鸟的专栏飞鸟的专栏
运行总次数:0
代码可运行

缓存

微服务架构中,有些请求的响应结果是不变的,例如一些静态文件或公共数据。这些请求的响应结果可以被缓存起来,减少重复计算和请求,提高性能。Zuul提供了多种缓存机制,例如本地缓存、分布式缓存等,可以根据实际需求选择适合的缓存机制。

以下是使用本地缓存进行响应结果缓存的示例:

首先需要在pom.xml中引入Guava依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>

然后在Zuul配置类中注入CacheManager:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class ZuulConfig {

    @Bean
    public CacheManager cacheManager() {
        return new ConcurrentMapCacheManager("responseCache");
    }

    @Bean
    public ZuulFilter customFilter() {
        return new CustomFilter(cacheManager());
    }
}

在以上代码中,我们创建了一个名为ZuulConfig的配置类,通过@Bean注解创建了cacheManager和customFilter两个Bean。

其中,cacheManager方法返回ConcurrentMapCacheManager实例,并指定缓存名称为"responseCache";customFilter方法返回自定义的过滤器CustomFilter实例,需要传入cacheManager参数。

在CustomFilter的run方法中,先检查缓存中是否已经存在响应结果,如果存在,则直接返回缓存中的结果;否则,继续执行请求并将响应结果缓存起来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomFilter extends ZuulFilter {

    private CacheManager cacheManager;

    public CustomFilter(CacheManager cacheManager) {
        this.cacheManager = cacheManager;
    }

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String key = request.getRequestURI();
        Cache cache = cacheManager.getCache("responseCache");
        ValueWrapper wrapper = cache.get(key);
        if (wrapper != null) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(HttpStatus.OK.value());
            ctx.setResponseBody(wrapper.get().toString());
            ctx.getResponse().setContentType("application/json;charset=UTF-8");
            return null;
        }
        return doRequest(ctx, key, cache);
    }

    private Object doRequest(RequestContext ctx, String key, Cache cache) {
        try {
            ServiceInstance instance = loadBalancerClient.choose("service-name");
            String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/api";
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
            cache.put(key, response.getBody());
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(HttpStatus.OK.value());
            ctx.setResponseBody(response.getBody());
            ctx.getResponse().setContentType("application/json;charset=UTF-8");
            return null;
        } catch (Exception e) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
            ctx.setResponseBody("请求失败:" + e.getMessage());
            ctx.getResponse().setContentType("application/json;charset=UTF-8");
            return null;
        }
    }
}

在以上代码中,我们通过CacheManager获取名为"responseCache"的缓存实例,并根据请求URL作为key从缓存中获取响应结果。如果缓存中已经存在响应结果,则直接将响应结果设置到Zuul的响应中返回。

如果缓存中不存在响应结果,则继续执行请求,并将响应结果缓存起来。在doRequest方法中,我们选择服务实例、发送请求并将响应结果存入缓存。然后再将响应结果设置到Zuul的响应中返回。

通过以上方式,我们可以实现对响应结果的缓存,减少重复请求,提高性能。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
https://docs.mongodb.com/manual/tutorial/insert-documents/
郑子铭
2021/01/02
7770
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记
robt 3t 下载地址: https://download.studio3t.com/robomongo/windows/robo3t-1.4.2-windows-x86_64-8650949.exe
郑子铭
2021/01/02
5760
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记
MongoDB索引
创建索引的api,3.0之后使用createIndex,ensureIndex已经废弃 * 对于单字段索引,排序的顺序是升序还是降序无关紧要
字母哥博客
2020/09/23
1.7K0
MongoDB系列6:MongoDB索引的介绍
1、前言 和关系型数据库一样,MongoDB的索引可以提高查询执行效率。索引就好比书中的目录,可以快速定位书中某一页。适当的索引查询,优化器可以快速地返回结果集。 2、MongoDB支持的索引类型 在MongoDB主要支持以下几种索引类型: ·单列索引 ·复合索引 ·多键索引 ·全文索引 ·地理空间索引 ·哈希索引 2.1 单列索引 在MongoDB中,每个集合都会默认创建一个唯一索引列”_id”,”_id”列是最基本的单列索引。 创建单列索引可以使用以下语法: db.collection.cre
大数据和云计算技术
2018/03/30
3.3K0
MongoDB系列6:MongoDB索引的介绍
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API实现)--学习笔记
https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/LighterApi
郑子铭
2021/01/06
3600
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API实现)--学习笔记
005.MongoDB索引及聚合
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
木二
2019/07/01
2.6K0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API重构)--学习笔记
将业务从controller 抽取到 Lighter.Application 层,并为业务建立抽象接口 Lighter.Application.Contract层
郑子铭
2021/01/07
5430
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API重构)--学习笔记
MONGO笔记
collection集合存储,存储未bson数据或者文档 2.集合创建相关操作 创建集合
用户2954508
2025/07/31
970
从青铜到黄金,对着mysql学,一文搞定mongoDB
项目中使用的技术五花八门,接触了很多新技术,之前也没用过mongo,今天恶补一下基础的知识,开始吧。
香菜聊游戏
2021/09/08
8620
从青铜到黄金,对着mysql学,一文搞定mongoDB
MongoDB 单键(列)索引
MongoDB支持基于集合文档上任意列创建索引。缺省情况下,所有的文档的_id列上都存在一个索引。基于业务的需要,可以基于一些重要的查询和操作来创建一些额外的索引。这些索引可以是单列,也可是多列(复合索引),多键索引,地理空间索引,文本索引以及哈希索引等。 本文主要描述在基于文档上的单列来创建索引。 一、创建语法 语法:db.collection.createIndex(keys, options) keys: 一个包含字段和值键值对的文档,指定该键即在该键上
Leshami
2018/08/13
1.1K0
MongoDB 单键(列)索引
mongodb创建索引和删除索引和背景索引background
MongoDB的背景索引允许在后台创建和重建索引,而不会对数据库的正常操作产生影响。背景索引的创建过程是非阻塞的,可以在业务运行时创建或重建索引,而不会中断其他操作。这使得我们可以在生产环境中安全地创建和维护索引,而不必担心对数据库性能造成负面影响。
oktokeep
2024/10/09
7150
索引系列:2dsphere索引
MongoDB Manual (Version 4.2)> Indexes > 2dsphere Indexes
MongoDB中文社区
2020/05/11
3.2K0
索引系列:2dsphere索引
MongoDB权威指南学习笔记(2)--设计应用
索引的值是按照一定顺序排列的,因此,使用索引键对文档进行排序非常快。然而,只有在首先使用索引键进行排序时,索引才有用。
earthchen
2020/09/24
8.8K0
[953]mongo创建索引及索引相关方法
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
周小董
2021/03/11
3.9K0
[953]mongo创建索引及索引相关方法
MongoDB 部分索引(Partial Indexes)
a、部分索引就是带有过滤条件的索引,即索引只存在与某些文档之上 b、满足过滤条件的文档在查询时,其执行计划将使用该列上的索引,否则不会被使用 c、稀疏索引与部分索引的差异是一个是基于某些文档存在的列,一个是列上的某些匹配条件的值 d、可以基于某个列上创建索引,而在另外的列来使用过滤条件
Leshami
2018/08/08
1.9K0
[置顶] 数据库MongoDB查询语句--持续更新
链接:https://pan.baidu.com/s/1RjU1BXq2rXFG07Zaw5BHrQ 提取码:o1w5
JQ实验室
2022/01/11
4K0
MongoDB入门(三)
指定删除Array中的某一个元素,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
传说之下的花儿
2023/11/25
3400
MongoDB入门(三)
MongoDB入门实战教程(9)
前面我们学习了如何套用常见的设计模式打造合适的模型设计,本篇我们来看看在MongoDB中如何使用索引来提高查询效率。
Edison Zhou
2021/07/01
1.8K0
MongoDB分组查询
MongoDB分组查询 设置显示要查询的列 显示 device_id,device_name,online_status,video_diag_time db.getCollection('vqd_result_his').find({},{device_id:1,device_name:1,online_status:1,video_diag_time:1}) 不显示 device_id,其他都显示 db.getCollection('vqd_result_his').find({},{device_i
编程随想曲
2022/04/21
2.4K0
索引实操练习
向 mydoc 集合中,插入多条数据,mydoc 之前是没有存在过的,我们直接使用 db.mydoc.insertMany() ,mongodb 会默认给我们新建这个集合
阿兵云原生
2023/02/16
3290
推荐阅读
相关推荐
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档