15.集成限流功能到我们的服务中(花操作必看)

限流代码

package Services

import (
    "context"
    "errors"
    "fmt"
    "github.com/go-kit/kit/endpoint"
    "golang.org/x/time/rate"
    "gomicro/utils"
    "strconv"
)

type UserRequest struct { //封装User请求结构体
    Uid    int `json:"uid"`
    Method string
}

type UserResponse struct {
    Result string `json:"result"`
}

//加入限流功能中间件
func RateLimit(limit *rate.Limiter) endpoint.Middleware { //Middleware type Middleware func(Endpoint) Endpoint
    return func(next endpoint.Endpoint) endpoint.Endpoint { //Endpoint type Endpoint func(ctx context.Context, request interface{}) (response interface{}, err error)
        return func(ctx context.Context, request interface{}) (response interface{}, err error) {
            if !limit.Allow(){
                return nil,errors.New("too many request")
            }
            return next(ctx,request)
        }
    }
}

func GenUserEnPoint(userService IUserService) endpoint.Endpoint {
    return func(ctx context.Context, request interface{}) (response interface{}, err error) {
        r := request.(UserRequest) //通过类型断言获取请求结构体
        result := "nothings"
        if r.Method == "GET" {
            result = userService.GetName(r.Uid) + strconv.Itoa(utils.ServicePort)
            fmt.Println(result)
        } else if r.Method == "DELETE" {
            err := userService.DelUser(r.Uid)
            if err != nil {
                result = err.Error()
            } else {
                result = fmt.Sprintf("userid为%d的用户已删除", r.Uid)
            }
        }
        return UserResponse{Result: result}, nil
    }
}

限流调用代码

package main

import (
    "flag"
    "fmt"
    httptransport "github.com/go-kit/kit/transport/http"
    mymux "github.com/gorilla/mux"
    "golang.org/x/time/rate"
    "gomicro/Services"
    "gomicro/utils"
    "log"
    "net/http"
    "os"
    "os/signal"
    "strconv"
    "syscall"
)

func main() {
    name := flag.String("name", "", "服务名称")
    port := flag.Int("port", 0, "服务端口")
    flag.Parse()
    if *name == "" {
        log.Fatal("请指定服务名")
    }
    if *port == 0 {
        log.Fatal("请指定端口")
    }
    utils.SetServiceNameAndPort(*name, *port) //设置服务名和端口

    user := Services.UserService{}
    limit := rate.NewLimiter(1, 5)
    endp := Services.RateLimit(limit)(Services.GenUserEnPoint(user))//调用限流代码生成的中间件

    serverHandler := httptransport.NewServer(endp, Services.DecodeUserRequest, Services.EncodeUserResponse) //使用go kit创建server传入我们之前定义的两个解析函数

    r := mymux.NewRouter()
    //r.Handle(`/user/{uid:\d+}`, serverHandler) //这种写法支持多种请求方式
    r.Methods("GET", "DELETE").Path(`/user/{uid:\d+}`).Handler(serverHandler) //这种写法仅支持Get,限定只能Get请求
    r.Methods("GET").Path("/health").HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
        writer.Header().Set("Content-type", "application/json")
        writer.Write([]byte(`{"status":"ok"}`))
    })
    errChan := make(chan error)
    go func() {
        utils.RegService()                                                 //调用注册服务程序
        err := http.ListenAndServe(":"+strconv.Itoa(utils.ServicePort), r) //启动http服务
        if err != nil {
            log.Println(err)
            errChan <- err
        }
    }()
    go func() {
        sigChan := make(chan os.Signal)
        signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
        errChan <- fmt.Errorf("%s", <-sigChan)
    }()
    getErr := <-errChan
    utils.UnRegService()
    log.Println(getErr)
}

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/hualou/p/12081743.html

时间: 2024-09-30 22:12:24

15.集成限流功能到我们的服务中(花操作必看)的相关文章

快速体验 Sentinel 集群限流功能,只需简单几步

? Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器. Sentinel 从 1.4.0 版本开始提供集群流控特性,但使用 Sentinel 集群限流需要对一系列的动态数据源进行相关配置,并且需要对开源控制台进行一些改造,有一定的使用成本.为了大家更好地理解集群流控并快速地使用,我们提供了云上版本的 Sentinel 集群限流控制台示例.只需要简单的几步即

更好用的集群限流功能,Sentinel 发布 v1.4.2

摘要: 感谢 Sentinel 社区的贡献者们 ? Sentinel 发布 v1.4.2 正式发布,该版本主要变更如下: 特性/功能改进 新增 Zuul 1.x 适配模块(sentinel-zuul-adapter),结合集群限流特性可以更好地在 API Gateway 发挥流控的作用 热点参数限流添加线程数模式支持 在 BlockException 中携带更多的信息(如触发的规则) 完善 Tracer,支持针对某个 Entry 或 Context 记录异常数目 优化 ClusterStateM

前端js分页功能的实现,非常实用,新手必看

分享一个前端拿到数据后,自己生成分页的案例,案例如图显示,点击搜索后查询数据,显示数据列表,前端根据数据显示正确的分页 附上代码:代码附上,简单粗暴,自己用过的,兼容性好,没有封装,可以很好的分页原理,希望可以帮助到大家 html排版如下: <!--搜索列表--><div class="search"> <div class="container"> <div class="searchList">

DRF框架中其他功能:认证、权限、限流

定义视图时,只要视图继承了APIView或其子类,就可以使用DRF框架的认证.权限和限流功能. 当客户端访问API接口时,DRF框架在调用对应的API接口之前,会依次进行认证.权限和限流的操作. 认证Authentication 权限Permissions 限流Throttling 原文地址:https://www.cnblogs.com/oklizz/p/11290731.html

聊聊高并发系统之限流特技

在开发高并发系统时,有很多手段用来保护系统:缓存.降级和限流.缓存的目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹:而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰过去或者问题解决后再打开的场景:而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀.抢购).写服务(如评论.下单).频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流. 限流的目的是通过对并发访问进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达

【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们将介绍如何实现自定义客户端的限流功能,来进一步完善网关的基础功能. .netcore项目实战交流群(637326624),有兴趣的朋友可以在群里交流讨论. 一.功能描述 限流就是为了保证网关在高并发或瞬时并发时,在服务能承受范围内,牺牲部分请求为代价,保证系统的整体可用性而做的安全策略,避免单个服务

NGINX上的限流

本文是对 https://www.nginx.com/blog/rate-limiting-nginx/ 的主要内容(去掉了关于NGINX Plus相关内容)的翻译 限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一.该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数.请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求. 限流也可以用于安全目的上,比如减慢暴力密码破解攻击.通过限制进来的请求速率,并且(结

限流(访问频率)组件的使用

目录 限流(访问频率)组件的使用 限流(访问频率)组件的使用 框架中限流功能的实现依赖于封装好的限流类,设置方式上分为全局设置和局部设置.继承类设置和自定义类设置.如果要实现限流功能则必须设置DEAFULRT_THROTTLE_CLASSES和DEAFULRT_THROTTLE_RATES 自定义限流类 限流类的基本思路: 限流需要知道访问者的本地IP地址,通过地址才能进行记录访问次数: 限流需要了解访问者访问的时间,通过记录时间和次数来限制规定时间内访问者可以访问的频次: 拿到IP地址后,创建

springboot + aop + Lua分布式限流原理解析

一.什么是限流?为什么要限流?不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了 限流 !因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤.列车的超载,存在一定的安全隐患.同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃.为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间. 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动