Просмотр исходного кода

feat(webforwarding): 添加反向代理功能

- 在 CdnService 中新增 EditProxy 方法,用于修改反向代理配置
- 在 WebForwardingService 中集成 ProxyService,支持反向代理相关操作
- 更新 WebForwardingData 结构,增加 Proxy 字段用于控制反向代理功能
- 在创建或更新网站转发时,根据 Proxy 字段开启或关闭反向代理功能
fusu 4 недель назад
Родитель
Сommit
a8bcc2246d

+ 21 - 0
api/v1/proxy.go

@@ -0,0 +1,21 @@
+package v1
+
+type Proxy struct {
+	ReverseProxyId int64
+	RequestHostType int32
+	RequestHost string
+	RequestHostExcludingPort bool
+	RequestURI string
+	StripPrefix string
+	AutoFlush bool
+	AddHeaders []string
+	ProxyProtocolJSON []byte
+	FollowRedirects bool
+	Retry50X bool
+	Retry40X bool
+}
+
+type ProxyProtocolJSON struct {
+	IsOn    bool `json:"isOn"`
+	Version int  `json:"version"`
+}

+ 1 - 0
api/v1/webForwarding.go

@@ -12,6 +12,7 @@ type WebForwardingDataRequest struct {
 	HttpsCert          string `form:"httpsCert" json:"httpsCert"`
 	HttpsKey           string `form:"httpsKey" json:"httpsKey"`
 	SslCertId          int64    `form:"sslCertId" json:"sslCertId"`
+	Proxy 				bool `form:"proxy" json:"proxy" default:"false"`
 }
 
 type DeleteWebForwardingRequest struct {

+ 2 - 0
cmd/server/wire/wire.go

@@ -47,6 +47,7 @@ var repositorySet = wire.NewSet(
 	repository.NewGateWayGroupIpRepository,
 	repository.NewCdnRepository,
 	repository.NewAllowAndDenyIpRepository,
+	repository.NewProxyRepository,
 
 )
 
@@ -80,6 +81,7 @@ var serviceSet = wire.NewSet(
 	service.NewRequestService,
 	service.NewCdnService,
 	service.NewAllowAndDenyIpService,
+	service.NewProxyService,
 )
 
 var handlerSet = wire.NewSet(

+ 5 - 3
cmd/server/wire/wire_gen.go

@@ -71,7 +71,9 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 	cdnService := service.NewCdnService(serviceService, viperViper, requestService, cdnRepository)
 	wafFormatterService := service.NewWafFormatterService(serviceService, globalLimitRepository, hostRepository, requiredService, parserService, tcpforwardingRepository, udpForWardingRepository, webForwardingRepository, rabbitMQ, hostService, gatewayGroupRepository, gateWayGroupIpRepository, cdnService)
 	aoDunService := service.NewAoDunService(serviceService, viperViper)
-	webForwardingService := service.NewWebForwardingService(serviceService, requiredService, webForwardingRepository, crawlerService, parserService, wafFormatterService, aoDunService, rabbitMQ, gateWayGroupIpRepository, gatewayGroupRepository, globalLimitRepository, cdnService)
+	proxyRepository := repository.NewProxyRepository(repositoryRepository)
+	proxyService := service.NewProxyService(serviceService, proxyRepository, cdnService)
+	webForwardingService := service.NewWebForwardingService(serviceService, requiredService, webForwardingRepository, crawlerService, parserService, wafFormatterService, aoDunService, rabbitMQ, gateWayGroupIpRepository, gatewayGroupRepository, globalLimitRepository, cdnService, proxyService)
 	webForwardingHandler := handler.NewWebForwardingHandler(handlerHandler, webForwardingService)
 	webLimitRepository := repository.NewWebLimitRepository(repositoryRepository)
 	webLimitService := service.NewWebLimitService(serviceService, webLimitRepository, requiredService, parserService, crawlerService, hostService)
@@ -107,9 +109,9 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 
 // wire.go:
 
-var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, repository.NewAdminRepository, repository.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, repository.NewWebForwardingRepository, repository.NewTcpforwardingRepository, repository.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewWebLimitRepository, repository.NewTcpLimitRepository, repository.NewUdpLimitRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, repository.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, repository.NewCdnRepository, repository.NewAllowAndDenyIpRepository)
+var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, repository.NewAdminRepository, repository.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, repository.NewWebForwardingRepository, repository.NewTcpforwardingRepository, repository.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewWebLimitRepository, repository.NewTcpLimitRepository, repository.NewUdpLimitRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, repository.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, repository.NewCdnRepository, repository.NewAllowAndDenyIpRepository, repository.NewProxyRepository)
 
-var serviceSet = wire.NewSet(service.NewService, service.NewAoDunService, service.NewUserService, service.NewAdminService, service.NewGameShieldService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, service.NewWebForwardingService, service.NewTcpforwardingService, service.NewUdpForWardingService, service.NewGameShieldUserIpService, service.NewWebLimitService, service.NewTcpLimitService, service.NewUdpLimitService, service.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, service.NewGlobalLimitService, service.NewGatewayGroupService, service.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, service.NewCdnService, service.NewAllowAndDenyIpService)
+var serviceSet = wire.NewSet(service.NewService, service.NewAoDunService, service.NewUserService, service.NewAdminService, service.NewGameShieldService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, service.NewWebForwardingService, service.NewTcpforwardingService, service.NewUdpForWardingService, service.NewGameShieldUserIpService, service.NewWebLimitService, service.NewTcpLimitService, service.NewUdpLimitService, service.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, service.NewGlobalLimitService, service.NewGatewayGroupService, service.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, service.NewCdnService, service.NewAllowAndDenyIpService, service.NewProxyService)
 
 var handlerSet = wire.NewSet(handler.NewHandler, handler.NewUserHandler, handler.NewAdminHandler, handler.NewGameShieldHandler, handler.NewGameShieldPublicIpHandler, handler.NewWebForwardingHandler, handler.NewTcpforwardingHandler, handler.NewUdpForWardingHandler, handler.NewGameShieldUserIpHandler, handler.NewWebLimitHandler, handler.NewTcpLimitHandler, handler.NewUdpLimitHandler, handler.NewGameShieldBackendHandler, handler.NewGameShieldSdkIpHandler, handler.NewHostHandler, handler.NewGlobalLimitHandler, handler.NewGatewayGroupHandler, handler.NewGateWayGroupIpHandler, handler.NewAllowAndDenyIpHandler)
 

+ 1 - 0
internal/model/webforwarding.go

@@ -17,6 +17,7 @@ type WebForwarding struct {
 	HttpsCert             string `gorm:"null"`
 	HttpsKey             string `gorm:"null"`
 	SslCertId 		int `gorm:"null"`
+	Proxy 				bool `gorm:"null"`
 	CreatedAt            time.Time
 	UpdatedAt            time.Time
 }

+ 5 - 4
internal/repository/globallimit.go

@@ -22,7 +22,7 @@ type GlobalLimitRepository interface {
 	GetGlobalLimitFirst(ctx context.Context,uid int64) (*model.GlobalLimit, error)
 	GetUserInfo(ctx context.Context, uid int64) (v1.UserInfo, error)
 	GetHostName(ctx context.Context,hostId int64) (string, error)
-	GetNodeId(ctx context.Context, id int) (int64, error)
+	GetNodeId(ctx context.Context, cndWebId int) (int64, error)
 }
 
 func NewGlobalLimitRepository(
@@ -149,10 +149,11 @@ func (r *globalLimitRepository) GetHostName(ctx context.Context,hostId int64) (s
 	return projectName, nil
 }
 
-func (r *globalLimitRepository) GetNodeId(ctx context.Context, id int) (int64, error) {
+func (r *globalLimitRepository) GetNodeId(ctx context.Context, cndWebId int) (int64, error) {
 	var nodeId int64
-	if err := r.DBWithName(ctx,"cdn").WithContext(ctx).Table("cloud_servers").Where("id = ?", id).Select("clusterId").Scan(&nodeId).Error; err != nil {
+	if err := r.DBWithName(ctx,"cdn").WithContext(ctx).Table("cloud_servers").Where("id = ?", cndWebId).Select("clusterId").Scan(&nodeId).Error; err != nil {
 		return 0, err
 	}
 	return nodeId, nil
-}
+}
+

+ 33 - 0
internal/service/cdn.go

@@ -40,6 +40,8 @@ type CdnService interface {
 	DelSSLCert(ctx context.Context, sslCertId int64) error
 	EditSSLCert(ctx context.Context, req v1.SSlCert) error
 	EditSSLPolicy(ctx context.Context, req v1.SSLPolicy) error
+	// 修改反向代理
+	EditProxy(ctx context.Context, req v1.Proxy) error
 }
 
 func NewCdnService(
@@ -763,3 +765,34 @@ func (s *cdnService) EditSSLPolicy(ctx context.Context, req v1.SSLPolicy) error
 	return nil
 
 }
+
+// 修改反向代理
+func (s *cdnService) EditProxy(ctx context.Context, req v1.Proxy) error {
+	formData := map[string]interface{}{
+		"reverseProxyId"   : req.ReverseProxyId,
+		"requestHostType"  : req.RequestHostType,
+		"requestHost"      : req.RequestHost,
+		"requestHostExcludingPort" : req.RequestHostExcludingPort,
+		"requestURI"       : req.RequestURI,
+		"stripPrefix"      : req.StripPrefix,
+		"autoFlush"        : req.AutoFlush,
+		"addHeaders"       : req.AddHeaders,
+		"proxyProtocolJSON": req.ProxyProtocolJSON,
+		"followRedirects"  : req.FollowRedirects,
+		"retry50X"         : req.Retry50X,
+		"retry40X"         : req.Retry40X,
+	}
+	apiUrl := s.Url + "ReverseProxyService/updateReverseProxy"
+	resBody, err := s.sendDataWithTokenRetry(ctx, formData, apiUrl)
+	if err != nil {
+		return err
+	}
+	var res v1.GeneralResponse[any]
+	if err := json.Unmarshal(resBody, &res); err != nil {
+		return fmt.Errorf("反序列化响应 JSON 失败 (内容: %s): %w", string(resBody), err)
+	}
+	if res.Code != 200 {
+		return fmt.Errorf("API 错误: code %d, msg '%s'", res.Code, res.Message)
+	}
+	return nil
+}

+ 29 - 0
internal/service/webforwarding.go

@@ -35,6 +35,7 @@ func NewWebForwardingService(
 	gatewayGroupRep repository.GatewayGroupRepository,
 	globalLimitRep repository.GlobalLimitRepository,
 	cdn CdnService,
+	proxy ProxyService,
 ) WebForwardingService {
 	return &webForwardingService{
 		Service:                 service,
@@ -49,6 +50,7 @@ func NewWebForwardingService(
 		gatewayGroupRep:         gatewayGroupRep,
 		cdn:                     cdn,
 		globalLimitRep:          globalLimitRep,
+		proxy:                   proxy,
 	}
 }
 
@@ -72,6 +74,7 @@ type webForwardingService struct {
 	gatewayGroupRep         repository.GatewayGroupRepository
 	cdn                     CdnService
 	globalLimitRep          repository.GlobalLimitRepository
+	proxy                   ProxyService
 }
 
 func (s *webForwardingService) require(ctx context.Context, req v1.GlobalRequire) (v1.GlobalRequire, error) {
@@ -157,6 +160,7 @@ func (s *webForwardingService) buildWebForwardingModel(req *v1.WebForwardingData
 		HttpsCert: req.HttpsCert,
 		HttpsKey:  req.HttpsKey,
 		SslCertId: int(require.SslPolicyId),
+		Proxy:     req.Proxy,
 	}
 }
 
@@ -356,6 +360,8 @@ func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.Web
 	for _, k := range req.WebForwardingData.BackendList {
 		backendList[k.Addr] = k.CustomHost
 	}
+
+
 	// 添加源站
 	cdnOriginIds := make(map[string]int64)
 	for _, v := range req.WebForwardingData.BackendList {
@@ -399,6 +405,18 @@ func (s *webForwardingService) AddWebForwarding(ctx context.Context, req *v1.Web
 		}
 	}
 
+
+	// 开启proxy
+	if req.WebForwardingData.Proxy {
+		err = s.proxy.EditProxy(ctx,webId, v1.ProxyProtocolJSON{
+			IsOn: true,
+			Version: 1,
+		})
+		if err != nil {
+			return err
+		}
+	}
+
 	webModel := s.buildWebForwardingModel(&req.WebForwardingData, int(webId), require)
 
 	id, err := s.webForwardingRepository.AddWebForwarding(ctx, webModel)
@@ -525,6 +543,17 @@ func (s *webForwardingService) EditWebForwarding(ctx context.Context, req *v1.We
 		}
 	}
 
+	//修改Proxy
+	if oldData.Proxy != req.WebForwardingData.Proxy {
+		err = s.proxy.EditProxy(ctx, int64(oldData.CdnWebId), v1.ProxyProtocolJSON{
+			IsOn:    req.WebForwardingData.Proxy,
+			Version: 1,
+		})
+		if err != nil {
+			return err
+		}
+	}
+
 	// 将域名添加到白名单
 	webData, err := s.webForwardingRepository.GetWebForwarding(ctx, int64(req.WebForwardingData.Id))
 	if err != nil {