Echo 框架:实现服务端限流中间件
2023-03-14 22:54:31 时间
介绍
通过一个完整例子,在基于 Echo 框架的微服务中实现【限流】中间件。
我们将会使用 rk-boot 来启动 Echo 框架的微服务。
请访问如下地址获取完整教程:https://rkdocs.netlify.app/cn
安装
go get github.com/rookie-ninja/rk-boot
go get github.com/rookie-ninja/rk-echo
快速开始
1.创建 boot.yaml
为了验证,我们启动了如下几个选项:
- commonService:commonService 里包含了一系列通用 API。详情
我们针对 /rk/v1/healthy 进行限流处理,设置成 0,其他 API 设置成 100。
---
echo:
- name: greeter # Required
port: 8080 # Required
enabled: true # Required
commonService:
enabled: true # Optional, default: false
interceptors:
rateLimit:
enabled: true
reqPerSec: 100
paths:
- path: "/rk/v1/healthy"
reqPerSec: 0
2.创建 main.go
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"github.com/rookie-ninja/rk-boot"
_ "github.com/rookie-ninja/rk-echo/boot"
)
// Application entrance.
func main() {
// Create a new boot instance.
boot := rkboot.NewBoot()
// Bootstrap
boot.Bootstrap(context.Background())
// Wait for shutdown sig
boot.WaitForShutdownSig(context.Background())
}
3.文件夹结构
$ tree
.
├── boot.yaml
├── go.mod
├── go.sum
└── main.go
0 directories, 4 files
4.启动 main.go
$ go run main.go
5.验证
- 发送请求到 /rk/v1/healthy,会被限流。
$ curl -X GET localhost:8080/rk/v1/healthy
{
"error":{
"code":429,
"status":"Too Many Requests",
"message":"",
"details":[
"slow down your request"
]
}
}
- 发送请求到 /rk/v1/info,正常
$ curl -X GET localhost:8080/rk/v1/info
{
"appName":"rk-demo",
"version":"master-2c9c6fd",
"description":"Internal RK entry which describes application with fields of appName, version and etc.",
"keywords":[],
"homeUrl":"",
"iconUrl":"",
"docsUrl":[],
"maintainers":[],
"uid":"501",
"gid":"20",
"username":"Dongxun Yin",
"startTime":"2021-11-14T00:32:09+08:00",
"upTimeSec":123,
"upTimeStr":"2 minutes",
"region":"",
"az":"",
"realm":"",
"domain":""
}
YAML 选项
名字 | 描述 | 类型 | 默认值 |
---|---|---|---|
echo.interceptors.rateLimit.enabled | 启动限流中间件 | boolean | false |
echo.interceptors.rateLimit.algorithm | 限流算法, 支持 tokenBucket 和 leakyBucket | string | tokenBucket |
echo.interceptors.rateLimit.reqPerSec | 全局限流值 | int | 0 |
echo.interceptors.rateLimit.paths.path | HTTP 路径 | string | "" |
echo.interceptors.rateLimit.paths.reqPerSec | 基于 HTTP 路径的限流值 | int | 0 |
相关文章
- 函数体内局部变量定义的问题
- 7个 jQuery上手项目,Github超千人star
- 双11极速包裹为何越来越多 秒发货是怎么办到的
- Docker不再是唯一的选择
- 关于主从延迟,一篇文章给你讲明白了!
- 【鸿蒙开发板试用报告】从点灯开始理解鸿蒙OS的项目结构与启动流程
- 软件开发人员应该了解的2021年技术趋势
- 从前端性能优化引申出来的5道经典面试题
- 你现在可以玩下这 5 个 CSS 新功能
- Node.JavaScript文件系统中目录的操作
- 有了这12款Idea插件后,室友再也不叫我小白了
- 神州邦邦“华东运营中心”落地上海,助力华东数字经济
- 一例 Go 编译器代码优化 bug 定位和修复解析
- 推荐一个开源后台管理系统,Github标星10K+
- Kubernetes 网络的四种场景分析
- 二叉树:一入递归深似海,从此offer是路人
- 蚂蚁金服的“技术中台”:亿级分布式系统架构实践
- 设计模式系列:一文带你领略“访问者模式”的魅力
- 简化开发|Lombok神器带你消除冗余代码
- 为什么现在开发一款软件的时间越来越长?