【完结13章】高性能多级网关与多级缓存架构落地实战
给大家分享一套网关课程——高性能多级网关与多级缓存架构落地实战,已完结13章,附源码+电子书。
多级网关与多级缓存架构是一种常用的系统架构设计模式,用于提高系统性能和可扩展性。下面详细介绍一下这两种架构。
多级网关架构(Multi-tier Gateway Architecture):
多级网关架构是指将系统划分为多个层次或级别的网关,每个网关层次负责执行特定的功能。每个网关层次都有其特定的职责,可以是协议转换、数据加工、请求分发等。不同的网关层次可以部署在不同的服务器上,通过网络连接起来。
多级网关架构的主要优点包括:
1. 模块化和可扩展性:通过将系统划分为多个网关层次,可以方便地扩展和替换某个特定层次的功能模块,而无需影响整个系统。
2. 高可用性:通过将不同层次的网关部署在不同的服务器上,可以提高系统的可用性和容错性。当某个网关层次发生故障时,其他层次可以继续工作。
3. 安全性:通过在每个网关层次上实施相应的安全策略,可以提高系统的安全性和防护能力。不同层次的网关可以执行不同的安全检查和过滤操作。
多级缓存架构(Multi-level Cache Architecture):
多级缓存架构是指在系统中引入多个层次的缓存,用于提高系统的性能和响应速度。每个层次的缓存可以根据数据的使用频率和访问模式进行优化配置,以达到最佳的性能表现。
多级缓存架构的主要优点包括:
1. 提高读取性能:通过在多个层次上缓存数据,可以大大提高读取数据的速度。近距离的缓存层次(如内存缓存)可以快速响应请求,而远距离的缓存层次(如磁盘缓存)可以提供更大的存储容量。
2. 减轻后端负载:通过减少对后端数据源的直接访问,多级缓存可以降低后端系统的负载压力,提高系统的整体性能和可扩展性。
3. 改善用户体验:多级缓存可以降低网络延迟和响应时间,提高用户访问网站或应用的体验。用户可以更快地获取到所需的数据。
在每个分组下分别生成一个业务API,两个API均设置为APP鉴权模式,假设两个API相关属性为:
API1: Method: GET Path: /business1 后端地址为:
http://backend1.alicloudapi.com:8080/business1
API2 Method: GET Path: /business2 后端地址为:
http://backend2.alicloudapi.com:8080/business2
创建路由插件,将路由插件绑定到分发API上。
---
parameters:
target: "Query:target"
routes:
- name: backend1
condition: "$target = 'resource1'"
backend:
type: "HTTP"
address: "17ff4c9189004a1d87b557606b767334-cn-huhehaote-intranet.alicloudapi.com"
path: "/business1"
- name: backend2
condition: "$target = 'resource2'"
backend:
type: "HTTP"
address: "c6e984b2dd784c0fb843f7c2a8878b15-cn-huhehaote-intranet.alicloudapi.com"
path: "/business2"
这个路由组件的意思是,绑定了这个插件的API,收到请求的时候,判断请求中query参数target,如果target的值为resource1,就给17ff4c9189004a1d87b557606b767334-cn-huhehaote-intranet.alicloudapi.com发送一个path为/business1的HTTP请求,target值为resource2时情况类似。
线下会议详情弹窗对应的是offline_meeting-info.vue页面,我们先来看看模型层都定义了什么东西?
data: function() {
return {
visible: false,
title: null,
date: null,
place: null,
start: null,
end: null,
members: [],
present: [],
unpresent: [],
status: null
};
},
会议概要信息是弹窗页面init()函数发出Ajax请求获取的,所以我们可以动手把这个init()给实现一下。
init: function(id, status) {
let that = this;
that.visible = true;
that.$nextTick(() => {
let data = {
id: id,
status: status
};
that.$http('meeting/searchMeetingInfo', 'POST', data, true, function(resp) {
that.title = resp.title;
that.date = resp.date;
that.place = resp.place;
that.start = resp.start;
that.end = resp.end;
if (resp.status == 1) {
that.status = '待审批';
} else if (resp.status == 3) {
that.status = '未开始';
} else if (resp.status == 4) {
that.status = '进行中';
} else if (resp.status == 5) {
that.status = '已结束';
}
if (resp.hasOwnProperty('members')) {
that.members = JSON.parse(resp.members);
}
if (resp.hasOwnProperty('present')) {
that.present = JSON.parse(resp.present);
}
if (resp.hasOwnProperty('unpresent')) {
that.unpresent = JSON.parse(resp.unpresent);
}
});
});
}
我们首先看一下模型层定义的变量,除了有查询条件之外,还有与分页相关的变量。总体上来看,跟用户管理页面的模型层差不多。
data: function() {
return {
dataForm: {
date: null,
mold: '全部会议'
},
dataList: [],
pageIndex: 1,
pageSize: 10,
totalCount: 0,
dataListLoading: false,
addVisible: false,
dataRule: {}
};
},
接下来我们看看前端页面的表单控件是怎么定义的。当用户点击查询按钮的时候,触发点击事件对应的回调函数是searchHandle(),这个函数是我们一会儿要声明的。
<el-form :inline="true" :model="dataForm" :rules="dataRule" ref="dataForm" class="form">
<el-form-item prop="date">
<el-date-picker
v-model="dataForm.date"
type="date"
placeholder="选择日期"
class="input"
size="medium"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button size="medium" type="primary" @click="searchHandle()">查询</el-button>
<el-button size="medium" type="danger" @click="addHandle()">会议申请</el-button>
</el-form-item>
<el-form-item class="mold">
<el-radio-group v-model="dataForm.mold" size="medium" @change="changeHandle">
<el-radio-button label="全部会议"></el-radio-button>
<el-radio-button label="我的会议"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
![QQ截图20231215144445.png](https://static.golangjob.cn/231215/0ce905f78423605f9b02ec337be7ae23.png)
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)