Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

87 rindas
2.5KB

  1. package services
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-kit/kit/endpoint"
  6. "github.com/go-kit/kit/metrics"
  7. "github.com/juju/ratelimit"
  8. "golang.org/x/time/rate"
  9. "job_risk_third/internal/proto"
  10. "time"
  11. )
  12. var ErrLimitExceed = fmt.Errorf("Rate limit exceed!")
  13. // NewTokenBucketLimitterWithJuju 使用juju/ratelimit创建限流中间件
  14. func NewTokenBucketLimitterWithJuju(bkt *ratelimit.Bucket) endpoint.Middleware {
  15. return func(next endpoint.Endpoint) endpoint.Endpoint {
  16. return func(ctx context.Context, request interface{}) (response interface{}, err error) {
  17. if bkt.TakeAvailable(1) == 0 {
  18. return nil, ErrLimitExceed
  19. }
  20. return next(ctx, request)
  21. }
  22. }
  23. }
  24. // NewTokenBucketLimitterWithBuildIn 使用x/time/rate创建限流中间件
  25. func NewTokenBucketLimitterWithBuildIn(bkt *rate.Limiter) endpoint.Middleware {
  26. return func(next endpoint.Endpoint) endpoint.Endpoint {
  27. return func(ctx context.Context, request interface{}) (response interface{}, err error) {
  28. if !bkt.Allow() {
  29. return nil, ErrLimitExceed
  30. }
  31. return next(ctx, request)
  32. }
  33. }
  34. }
  35. // metricMiddleware 定义监控中间件,嵌入Service
  36. // 新增监控指标项:requestCount和requestLatency
  37. type metricMiddleware struct {
  38. JobRiskThirdServices
  39. requestCount metrics.Counter
  40. requestLatency metrics.Histogram
  41. }
  42. // Metrics 封装监控方法
  43. func Metrics(requestCount metrics.Counter, requestLatency metrics.Histogram) ServiceMiddleware {
  44. return func(next JobRiskThirdServices) JobRiskThirdServices {
  45. return metricMiddleware{
  46. next,
  47. requestCount,
  48. requestLatency}
  49. }
  50. }
  51. func (mw metricMiddleware) PushFeatureDeal(req proto.PushFeatureDealRequest) error {
  52. defer func(beign time.Time) {
  53. lvs := []string{"method", "PushFeatureDeal"}
  54. mw.requestCount.With(lvs...).Add(1)
  55. mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds())
  56. }(time.Now())
  57. b := mw.JobRiskThirdServices.PushFeatureDeal(req)
  58. return b
  59. }
  60. func (mw metricMiddleware) PushUserInfo(req proto.PushUserInfoRequest) error {
  61. defer func(beign time.Time) {
  62. lvs := []string{"method", "PushUserInfo"}
  63. mw.requestCount.With(lvs...).Add(1)
  64. mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds())
  65. }(time.Now())
  66. return mw.JobRiskThirdServices.PushUserInfo(req)
  67. }
  68. func (mw metricMiddleware) PushFeatureInfo(req proto.PushFeatureInfoRequest) error {
  69. defer func(beign time.Time) {
  70. lvs := []string{"method", "PushFeatureInfo"}
  71. mw.requestCount.With(lvs...).Add(1)
  72. mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds())
  73. }(time.Now())
  74. return mw.JobRiskThirdServices.PushFeatureInfo(req)
  75. }