GRPC: 实现服务端限流-阿里云开发者社区

开发者社区> 尹东勋> 正文

GRPC: 实现服务端限流

简介: 本文将介绍如何在 gRPC 微服务中实现【限流】拦截器/中间件。
+关注继续查看

介绍

本文将介绍如何在 gRPC 微服务中实现【限流】拦截器/中间件。

我们将会使用 rk-boot 来启动 gRPC 服务。

请访问如下地址获取完整教程:

安装

go get github.com/rookie-ninja/rk-boot

快速开始

1.创建 boot.yaml

为了验证,我们启动了 commonService,commonService 里包含了一系列常用 API,例如 /rk/v1/healthy

我们针对 /rk.api.v1.RkCommonService/Healthy 进行限流处理,设置成 0,其他 API 设置成 100

---
grpc:
  - name: greeter                   # Name of grpc entry
    port: 8080                      # Port of grpc entry
    enabled: true                   # Enable grpc entry
    commonService:
      enabled: true                 # Enable common service for testing
    interceptors:
      rateLimit:
        enabled: true
        reqPerSec: 100
#        algorithm: "leakyBucket"
        paths:
          - path: "/rk.api.v1.RkCommonService/Healthy"
            reqPerSec: 0

2.创建 main.go

package main

import (
    "context"
    "github.com/rookie-ninja/rk-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,会被限流
{
    "code":8,
    "message":"Slow down your request.",
    "details":[
        {
            "@type":"type.googleapis.com/rk.api.v1.ErrorDetail",
            "code":8,
            "status":"ResourceExhausted",
            "message":"[from-grpc] Slow down your request."
        }
    ]
}
  • 发送请求到 /rk/v1/info正常
{
    "appName":"demo",
    "az":"",
    "description":"Internal RK entry which describes application with fields of appName, version and etc.",
    "docsUrl":[

    ],
    "domain":"",
    "gid":"20",
    "homeUrl":"",
    "iconUrl":"",
    "keywords":[

    ],
    "maintainers":[

    ],
    "realm":"",
    "region":"",
    "startTime":"2021-10-25T01:15:48+08:00",
    "uid":"501",
    "upTimeSec":76,
    "upTimeStr":"1 minute",
    "username":"Dongxun Yin",
    "version":"master-557da30"
}

YAML 选项

名字描述类型默认值
grpc.interceptors.rateLimit.enabled启动限流兰姐去booleanfalse
grpc.interceptors.rateLimit.algorithm限流算法, 支持 tokenBucket 和 leakyBucketstringtokenBucket
grpc.interceptors.rateLimit.reqPerSec全局限流值int0
grpc.interceptors.rateLimit.paths.pathgRPC 方法路径string""
grpc.interceptors.rateLimit.paths.reqPerSec基于 gRPC 方法路径的限流值int0

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
.Net网络编程——使用TcpClient与TcpListener建立客户端与服务端连接
              一,.NET中如何实现建立连接                         在网络中,我们可以通过IP地址唯一定位一台主机,而在主机中,我们要确定收到的数据包发给谁,可以通过端口号,端口号的作用简单说就是不至于使你要发给QQ好友的消息数据包被错误发到了你的OC程序上。
971 0
阿里云ECS服务器部署Dart服务端程序
1.Dart服务端绑定域名为ECS的内部IP:172.31.213.9(自己的服务器内网IP)io.serve(handler, '172.31.213.9', 80).then((server) { print('Serving at http://${server.address.host}:${server.port}'); }); 2.安全组策略开启80/TCP端口。
2065 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4504 0
服务端编程示例|学习笔记
快速学习服务端编程示例
28 0
Linux rsync传输(服务端和客户端)
客户端: yum install -y rsync vi /etc/rsyncd.secrets username:password rsync -av yourfire --password-file=/etc/rsyncd.
637 0
C# Winform WCF 调试服务端的程序(三种方法)
推荐方法三 方法一: 服务端设置: 1、打开需要调试的解决方案,在WCF服务端项目上右键,将其设置为启动项目 2、在该解决方案下点击 或者直接按F5启动WCF服务端项目。 3、寻找端口号: i、方式一 启动调试后,浏览器中会出现下面的界面 需要留意的是地址栏中的端口号。 ii、方式二: 在启动WCF服务项目后,在桌面的右下角会出现,如下面所示的图标: 在这里也可以看到端口号,由于我是
2877 0
+关注
尹东勋
点目科技创始人
63
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载