refactor(routes): unify route existence checks and remove 'All' route pool

This commit is contained in:
yusing
2025-09-04 06:34:19 +08:00
parent 0edad7377a
commit 9ab00e3902
5 changed files with 45 additions and 51 deletions

View File

@@ -97,10 +97,6 @@ func (s *FileServer) Start(parent task.Parent) gperr.Error {
return nil
}
if err := checkExists(s); err != nil {
return err
}
routes.HTTP.Add(s)
s.task.OnFinished("remove_route_from_http", func() {
routes.HTTP.Del(s)

View File

@@ -136,10 +136,6 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) gperr.Error {
return nil
}
if err := checkExists(r); err != nil {
return err
}
if r.UseLoadBalance() {
r.addToLoadBalancer(parent)
} else {
@@ -171,7 +167,7 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
linked = l.(*ReveseProxyRoute)
lb = linked.loadBalancer
lb.UpdateConfigIfNeeded(cfg)
if linked.Homepage == nil {
if linked.Homepage.Name == "" {
linked.Homepage = r.Homepage
}
} else {
@@ -187,10 +183,8 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) {
handler: lb,
}
routes.HTTP.AddKey(cfg.Link, linked)
routes.All.AddKey(cfg.Link, linked)
r.task.OnFinished("remove_loadbalancer_route", func() {
routes.HTTP.DelKey(cfg.Link)
routes.All.DelKey(cfg.Link)
})
lbLock.Unlock()
}

View File

@@ -24,7 +24,6 @@ import (
"github.com/yusing/go-proxy/internal/common"
config "github.com/yusing/go-proxy/internal/config/types"
"github.com/yusing/go-proxy/internal/logging/accesslog"
"github.com/yusing/go-proxy/internal/route/routes"
"github.com/yusing/go-proxy/internal/route/rules"
route "github.com/yusing/go-proxy/internal/route/types"
"github.com/yusing/go-proxy/internal/utils"
@@ -46,7 +45,7 @@ type (
HealthCheck *types.HealthCheckConfig `json:"healthcheck"`
LoadBalance *types.LoadBalancerConfig `json:"load_balance,omitempty" extensions:"x-nullable"`
Middlewares map[string]types.LabelMap `json:"middlewares,omitempty" extensions:"x-nullable"`
Homepage *homepage.ItemConfig `json:"homepage"`
Homepage homepage.ItemConfig `json:"homepage"`
AccessLog *accesslog.RequestLoggerConfig `json:"access_log,omitempty" extensions:"x-nullable"`
Agent string `json:"agent,omitempty"`
@@ -287,25 +286,27 @@ func (r *Route) start(parent task.Parent) gperr.Error {
}
defer close(r.started)
if err := r.impl.Start(parent); err != nil {
return err
// skip checking for excluded routes
if !r.ShouldExclude() {
if err := checkExists(r); err != nil {
return err
}
}
if conflict, added := routes.All.AddIfNotExists(r.impl); !added {
err := gperr.Errorf("route %s already exists: from %s and %s", r.Alias, r.ProviderName(), conflict.ProviderName())
r.task.FinishAndWait(err)
if cont := r.ContainerInfo(); cont != nil {
docker.SetDockerHostByContainerID(cont.ContainerID, cont.DockerHost)
}
if err := r.impl.Start(parent); err != nil {
return err
} else {
// reference here because r.impl will be nil after Finish() is called.
impl := r.impl
r.task.OnCancel("remove_routes_from_all", func() {
routes.All.Del(impl)
})
}
return nil
}
func (r *Route) Finish(reason any) {
if cont := r.ContainerInfo(); cont != nil {
docker.DeleteDockerHostByContainerID(cont.ContainerID)
}
r.FinishAndWait(reason)
}
@@ -410,16 +411,16 @@ func (r *Route) LoadBalanceConfig() *types.LoadBalancerConfig {
return r.LoadBalance
}
func (r *Route) HomepageConfig() *homepage.ItemConfig {
return r.Homepage.GetOverride(r.Alias)
}
func (r *Route) HomepageItem() *homepage.Item {
return &homepage.Item{
func (r *Route) HomepageItem() homepage.Item {
return homepage.Item{
Alias: r.Alias,
Provider: r.Provider,
ItemConfig: r.HomepageConfig(),
}
ItemConfig: r.Homepage,
}.GetOverride()
}
func (r *Route) DisplayName() string {
return r.Homepage.Name
}
func (r *Route) ContainerInfo() *types.Container {
@@ -629,10 +630,8 @@ func (r *Route) FinalizeHomepageConfig() {
isDocker := r.Container != nil
if r.Homepage == nil {
r.Homepage = &homepage.ItemConfig{Show: true}
}
r.Homepage = r.Homepage.GetOverride(r.Alias)
// apply override config
r.Homepage = r.HomepageItem().ItemConfig
if r.ShouldExclude() && isDocker {
r.Homepage.Show = false

View File

@@ -8,16 +8,15 @@ import (
var (
HTTP = pool.New[types.HTTPRoute]("http_routes")
Stream = pool.New[types.StreamRoute]("stream_routes")
// All is a pool of all routes, including HTTP, Stream routes and also excluded routes.
All = pool.New[types.Route]("all_routes")
)
func init() {
All.DisableLog()
}
func Iter(yield func(r types.Route) bool) {
for _, r := range All.Iter {
for _, r := range HTTP.Iter {
if !yield(r) {
break
}
}
for _, r := range Stream.Iter {
if !yield(r) {
break
}
@@ -25,7 +24,12 @@ func Iter(yield func(r types.Route) bool) {
}
func IterKV(yield func(alias string, r types.Route) bool) {
for k, r := range All.Iter {
for k, r := range HTTP.Iter {
if !yield(k, r) {
break
}
}
for k, r := range Stream.Iter {
if !yield(k, r) {
break
}
@@ -33,13 +37,12 @@ func IterKV(yield func(alias string, r types.Route) bool) {
}
func NumRoutes() int {
return All.Size()
return HTTP.Size() + Stream.Size()
}
func Clear() {
HTTP.Clear()
Stream.Clear()
All.Clear()
}
func GetHTTPRouteOrExact(alias, host string) (types.HTTPRoute, bool) {
@@ -52,5 +55,11 @@ func GetHTTPRouteOrExact(alias, host string) (types.HTTPRoute, bool) {
}
func Get(alias string) (types.Route, bool) {
return All.Get(alias)
if r, ok := HTTP.Get(alias); ok {
return r, true
}
if r, ok := Stream.Get(alias); ok {
return r, true
}
return nil, false
}

View File

@@ -73,10 +73,6 @@ func (r *StreamRoute) Start(parent task.Parent) gperr.Error {
return nil
}
if err := checkExists(r); err != nil {
return err
}
r.ListenAndServe(r.task.Context(), nil, nil)
r.l = r.l.With().Stringer("rurl", r.ProxyURL).Stringer("laddr", r.LocalAddr()).Logger()
r.l.Info().Msg("stream started")