mirror of
				https://github.com/zhufuyi/sponge.git
				synced 2025-10-28 19:22:04 +08:00 
			
		
		
		
	change code for shield pkg
This commit is contained in:
		| @@ -5,10 +5,9 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/zhufuyi/sponge/pkg/container/group" | 	"github.com/zhufuyi/sponge/pkg/container/group" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/gin/response" | 	"github.com/zhufuyi/sponge/pkg/gin/response" | ||||||
|  | 	"github.com/zhufuyi/sponge/pkg/shield/circuitbreaker" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker" |  | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker/sre" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ErrNotAllowed error not allowed. | // ErrNotAllowed error not allowed. | ||||||
| @@ -24,7 +23,7 @@ type circuitBreakerOptions struct { | |||||||
| func defaultCircuitBreakerOptions() *circuitBreakerOptions { | func defaultCircuitBreakerOptions() *circuitBreakerOptions { | ||||||
| 	return &circuitBreakerOptions{ | 	return &circuitBreakerOptions{ | ||||||
| 		group: group.NewGroup(func() interface{} { | 		group: group.NewGroup(func() interface{} { | ||||||
| 			return sre.NewBreaker() | 			return circuitbreaker.NewBreaker() | ||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ import ( | |||||||
| 	"github.com/zhufuyi/sponge/pkg/container/group" | 	"github.com/zhufuyi/sponge/pkg/container/group" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/gin/response" | 	"github.com/zhufuyi/sponge/pkg/gin/response" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/gohttp" | 	"github.com/zhufuyi/sponge/pkg/gohttp" | ||||||
|  | 	"github.com/zhufuyi/sponge/pkg/shield/circuitbreaker" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/utils" | 	"github.com/zhufuyi/sponge/pkg/utils" | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker/sre" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func runCircuitBreakerHTTPServer() string { | func runCircuitBreakerHTTPServer() string { | ||||||
| @@ -24,7 +24,7 @@ func runCircuitBreakerHTTPServer() string { | |||||||
| 	gin.SetMode(gin.ReleaseMode) | 	gin.SetMode(gin.ReleaseMode) | ||||||
| 	r := gin.New() | 	r := gin.New() | ||||||
| 	r.Use(CircuitBreaker(WithGroup(group.NewGroup(func() interface{} { | 	r.Use(CircuitBreaker(WithGroup(group.NewGroup(func() interface{} { | ||||||
| 		return sre.NewBreaker() | 		return circuitbreaker.NewBreaker() | ||||||
| 	})))) | 	})))) | ||||||
|  |  | ||||||
| 	r.GET("/hello", func(c *gin.Context) { | 	r.GET("/hello", func(c *gin.Context) { | ||||||
|   | |||||||
| @@ -4,11 +4,9 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/zhufuyi/sponge/pkg/gin/response" |  | ||||||
|  |  | ||||||
| 	"github.com/gin-gonic/gin" | 	"github.com/gin-gonic/gin" | ||||||
| 	rl "github.com/go-kratos/aegis/ratelimit" | 	"github.com/zhufuyi/sponge/pkg/gin/response" | ||||||
| 	"github.com/go-kratos/aegis/ratelimit/bbr" | 	rl "github.com/zhufuyi/sponge/pkg/shield/ratelimit" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ErrLimitExceed is returned when the rate limiter is | // ErrLimitExceed is returned when the rate limiter is | ||||||
| @@ -71,11 +69,11 @@ func WithCPUQuota(quota float64) RateLimitOption { | |||||||
| func RateLimit(opts ...RateLimitOption) gin.HandlerFunc { | func RateLimit(opts ...RateLimitOption) gin.HandlerFunc { | ||||||
| 	o := defaultRatelimitOptions() | 	o := defaultRatelimitOptions() | ||||||
| 	o.apply(opts...) | 	o.apply(opts...) | ||||||
| 	limiter := bbr.NewLimiter( | 	limiter := rl.NewLimiter( | ||||||
| 		bbr.WithWindow(o.window), | 		rl.WithWindow(o.window), | ||||||
| 		bbr.WithBucket(o.bucket), | 		rl.WithBucket(o.bucket), | ||||||
| 		bbr.WithCPUThreshold(o.cpuThreshold), | 		rl.WithCPUThreshold(o.cpuThreshold), | ||||||
| 		bbr.WithCPUQuota(o.cpuQuota), | 		rl.WithCPUQuota(o.cpuQuota), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	return func(c *gin.Context) { | 	return func(c *gin.Context) { | ||||||
|   | |||||||
| @@ -5,9 +5,8 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/zhufuyi/sponge/pkg/container/group" | 	"github.com/zhufuyi/sponge/pkg/container/group" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/errcode" | 	"github.com/zhufuyi/sponge/pkg/errcode" | ||||||
|  | 	"github.com/zhufuyi/sponge/pkg/shield/circuitbreaker" | ||||||
|  |  | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker" |  | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker/sre" |  | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| 	"google.golang.org/grpc/codes" | 	"google.golang.org/grpc/codes" | ||||||
| 	"google.golang.org/grpc/status" | 	"google.golang.org/grpc/status" | ||||||
| @@ -26,7 +25,7 @@ type circuitBreakerOptions struct { | |||||||
| func defaultCircuitBreakerOptions() *circuitBreakerOptions { | func defaultCircuitBreakerOptions() *circuitBreakerOptions { | ||||||
| 	return &circuitBreakerOptions{ | 	return &circuitBreakerOptions{ | ||||||
| 		group: group.NewGroup(func() interface{} { | 		group: group.NewGroup(func() interface{} { | ||||||
| 			return sre.NewBreaker() | 			return circuitbreaker.NewBreaker() | ||||||
| 		}), | 		}), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/zhufuyi/sponge/pkg/container/group" | 	"github.com/zhufuyi/sponge/pkg/container/group" | ||||||
| 	"github.com/zhufuyi/sponge/pkg/errcode" | 	"github.com/zhufuyi/sponge/pkg/errcode" | ||||||
|  | 	"github.com/zhufuyi/sponge/pkg/shield/circuitbreaker" | ||||||
|  |  | ||||||
| 	"github.com/go-kratos/aegis/circuitbreaker/sre" |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| ) | ) | ||||||
| @@ -15,7 +15,7 @@ import ( | |||||||
| func TestUnaryClientCircuitBreaker(t *testing.T) { | func TestUnaryClientCircuitBreaker(t *testing.T) { | ||||||
| 	interceptor := UnaryClientCircuitBreaker(WithGroup( | 	interceptor := UnaryClientCircuitBreaker(WithGroup( | ||||||
| 		group.NewGroup(func() interface{} { | 		group.NewGroup(func() interface{} { | ||||||
| 			return sre.NewBreaker() | 			return circuitbreaker.NewBreaker() | ||||||
| 		}), | 		}), | ||||||
| 	)) | 	)) | ||||||
| 	assert.NotNil(t, interceptor) | 	assert.NotNil(t, interceptor) | ||||||
|   | |||||||
| @@ -5,9 +5,8 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/zhufuyi/sponge/pkg/errcode" | 	"github.com/zhufuyi/sponge/pkg/errcode" | ||||||
|  | 	rl "github.com/zhufuyi/sponge/pkg/shield/ratelimit" | ||||||
|  |  | ||||||
| 	rl "github.com/go-kratos/aegis/ratelimit" |  | ||||||
| 	"github.com/go-kratos/aegis/ratelimit/bbr" |  | ||||||
| 	"google.golang.org/grpc" | 	"google.golang.org/grpc" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -73,11 +72,11 @@ func WithCPUQuota(quota float64) RatelimitOption { | |||||||
| func UnaryServerRateLimit(opts ...RatelimitOption) grpc.UnaryServerInterceptor { | func UnaryServerRateLimit(opts ...RatelimitOption) grpc.UnaryServerInterceptor { | ||||||
| 	o := defaultRatelimitOptions() | 	o := defaultRatelimitOptions() | ||||||
| 	o.apply(opts...) | 	o.apply(opts...) | ||||||
| 	limiter := bbr.NewLimiter( | 	limiter := rl.NewLimiter( | ||||||
| 		bbr.WithWindow(o.window), | 		rl.WithWindow(o.window), | ||||||
| 		bbr.WithBucket(o.bucket), | 		rl.WithBucket(o.bucket), | ||||||
| 		bbr.WithCPUThreshold(o.cpuThreshold), | 		rl.WithCPUThreshold(o.cpuThreshold), | ||||||
| 		bbr.WithCPUQuota(o.cpuQuota), | 		rl.WithCPUQuota(o.cpuQuota), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { | 	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { | ||||||
| @@ -96,11 +95,11 @@ func UnaryServerRateLimit(opts ...RatelimitOption) grpc.UnaryServerInterceptor { | |||||||
| func StreamServerRateLimit(opts ...RatelimitOption) grpc.StreamServerInterceptor { | func StreamServerRateLimit(opts ...RatelimitOption) grpc.StreamServerInterceptor { | ||||||
| 	o := defaultRatelimitOptions() | 	o := defaultRatelimitOptions() | ||||||
| 	o.apply(opts...) | 	o.apply(opts...) | ||||||
| 	limiter := bbr.NewLimiter( | 	limiter := rl.NewLimiter( | ||||||
| 		bbr.WithWindow(o.window), | 		rl.WithWindow(o.window), | ||||||
| 		bbr.WithBucket(o.bucket), | 		rl.WithBucket(o.bucket), | ||||||
| 		bbr.WithCPUThreshold(o.cpuThreshold), | 		rl.WithCPUThreshold(o.cpuThreshold), | ||||||
| 		bbr.WithCPUQuota(o.cpuQuota), | 		rl.WithCPUQuota(o.cpuQuota), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { | 	return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { | ||||||
|   | |||||||
| @@ -103,6 +103,15 @@ func srvRegisterMetrics() { | |||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Register 注册http路由和grpc方法 | ||||||
|  | func Register(mux *http.ServeMux, grpcServer *grpc.Server) { | ||||||
|  | 	// 注册http路由 | ||||||
|  | 	mux.Handle("/metrics", promhttp.HandlerFor(srvReg, promhttp.HandlerOpts{})) | ||||||
|  |  | ||||||
|  | 	// 注册所有gRPC方法到metrics | ||||||
|  | 	grpcServerMetrics.InitializeMetrics(grpcServer) | ||||||
|  | } | ||||||
|  |  | ||||||
| // GoHTTPService 初始化服务端的prometheus的exporter服务,使用 http://ip:port/metrics 获取数据 | // GoHTTPService 初始化服务端的prometheus的exporter服务,使用 http://ip:port/metrics 获取数据 | ||||||
| func GoHTTPService(addr string, grpcServer *grpc.Server) *http.Server { | func GoHTTPService(addr string, grpcServer *grpc.Server) *http.Server { | ||||||
| 	httpServer := &http.Server{ | 	httpServer := &http.Server{ | ||||||
|   | |||||||
| @@ -18,11 +18,14 @@ const ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	r         = rand.New(rand.NewSource(time.Now().UnixNano())) |  | ||||||
| 	refSlices = []byte("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") | 	refSlices = []byte("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") | ||||||
| 	kinds     = [][]byte{refSlices[0:10], refSlices[10:36], refSlices[0:36], refSlices[36:62], refSlices[36:], refSlices[10:62], refSlices[0:62]} | 	kinds     = [][]byte{refSlices[0:10], refSlices[10:36], refSlices[0:36], refSlices[36:62], refSlices[36:], refSlices[10:62], refSlices[0:62]} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func init() { | ||||||
|  | 	rand.Seed(time.Now().UnixNano()) | ||||||
|  | } | ||||||
|  |  | ||||||
| // String 生成多种类型的任意长度的随机字符串,如果参数size为空,默认长度为6 | // String 生成多种类型的任意长度的随机字符串,如果参数size为空,默认长度为6 | ||||||
| // example:String(R_ALL), String(R_ALL, 16), String(R_NUM|R_LOWER, 16) | // example:String(R_ALL), String(R_ALL, 16), String(R_NUM|R_LOWER, 16) | ||||||
| func String(kind int, size ...int) string { | func String(kind int, size ...int) string { | ||||||
| @@ -46,7 +49,7 @@ func Bytes(kind int, bytesLen ...int) []byte { | |||||||
|  |  | ||||||
| 	result := make([]byte, length) | 	result := make([]byte, length) | ||||||
| 	for i := 0; i < length; i++ { | 	for i := 0; i < length; i++ { | ||||||
| 		result[i] = kinds[kind-1][r.Intn(len(kinds[kind-1]))] | 		result[i] = kinds[kind-1][rand.Intn(len(kinds[kind-1]))] | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return result | 	return result | ||||||
| @@ -56,14 +59,14 @@ func Bytes(kind int, bytesLen ...int) []byte { | |||||||
| func Int(rangeSize ...int) int { | func Int(rangeSize ...int) int { | ||||||
| 	switch len(rangeSize) { | 	switch len(rangeSize) { | ||||||
| 	case 0: | 	case 0: | ||||||
| 		return r.Intn(101) // 默认0~100 | 		return rand.Intn(101) // 默认0~100 | ||||||
| 	case 1: | 	case 1: | ||||||
| 		return r.Intn(rangeSize[0] + 1) | 		return rand.Intn(rangeSize[0] + 1) | ||||||
| 	default: | 	default: | ||||||
| 		if rangeSize[0] > rangeSize[1] { | 		if rangeSize[0] > rangeSize[1] { | ||||||
| 			rangeSize[0], rangeSize[1] = rangeSize[1], rangeSize[0] | 			rangeSize[0], rangeSize[1] = rangeSize[1], rangeSize[0] | ||||||
| 		} | 		} | ||||||
| 		return r.Intn(rangeSize[1]-rangeSize[0]+1) + rangeSize[0] | 		return rand.Intn(rangeSize[1]-rangeSize[0]+1) + rangeSize[0] | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -76,18 +79,18 @@ func Float64(dpLength int, rangeSize ...int) float64 { | |||||||
| 		for i := 0; i < dpLength; i++ { | 		for i := 0; i < dpLength; i++ { | ||||||
| 			dpmax *= 10 | 			dpmax *= 10 | ||||||
| 		} | 		} | ||||||
| 		dp = float64(r.Intn(dpmax)) / float64(dpmax) | 		dp = float64(rand.Intn(dpmax)) / float64(dpmax) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch len(rangeSize) { | 	switch len(rangeSize) { | ||||||
| 	case 0: | 	case 0: | ||||||
| 		return float64(r.Intn(101)) + dp // 默认0~100 | 		return float64(rand.Intn(101)) + dp // 默认0~100 | ||||||
| 	case 1: | 	case 1: | ||||||
| 		return float64(r.Intn(rangeSize[0]+1)) + dp | 		return float64(rand.Intn(rangeSize[0]+1)) + dp | ||||||
| 	default: | 	default: | ||||||
| 		if rangeSize[0] > rangeSize[1] { | 		if rangeSize[0] > rangeSize[1] { | ||||||
| 			rangeSize[0], rangeSize[1] = rangeSize[1], rangeSize[0] | 			rangeSize[0], rangeSize[1] = rangeSize[1], rangeSize[0] | ||||||
| 		} | 		} | ||||||
| 		return float64(r.Intn(rangeSize[1]-rangeSize[0]+1)+rangeSize[0]) + dp | 		return float64(rand.Intn(rangeSize[1]-rangeSize[0]+1)+rangeSize[0]) + dp | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| ## sql2code | ## sql2code | ||||||
|  |  | ||||||
| 根据sql生成不同用途代码,支持生成json、gorm model、dao、handler代码,sql可以从参数、文件、db三种方式获取,优先从高到低。 | 根据sql生成不同用途代码,支持生成json、gorm model、update参数、request 参数代码,sql可以从参数、文件、db三种方式获取,优先从高到低。 | ||||||
|  |  | ||||||
| <br> | <br> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 zhuyasen
					zhuyasen