refactor(server): 优化结构体字段布局并使用 matcher 常量
- Server 和 VHostManager 结构体字段重新排序优化内存布局 - RegexHostMatcher 字段顺序调整 - 使用 matcher.LocationType* 常量替代硬编码字符串 - server_names 数组支持:遍历注册所有主机名 - 提取 createListener 方法支持 Unix socket Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
ca03c121d3
commit
6281196dfd
@ -62,10 +62,9 @@ import (
|
|||||||
// - 创建后需调用 Start 方法启动服务器
|
// - 创建后需调用 Start 方法启动服务器
|
||||||
// - 关闭时建议使用 GracefulStop 实现优雅关闭
|
// - 关闭时建议使用 GracefulStop 实现优雅关闭
|
||||||
type Server struct {
|
type Server struct {
|
||||||
startTime time.Time
|
handler fasthttp.RequestHandler
|
||||||
resolver resolver.Resolver
|
resolver resolver.Resolver
|
||||||
tlsManager *ssl.TLSManager
|
tlsManager *ssl.TLSManager
|
||||||
handler fasthttp.RequestHandler
|
|
||||||
accessLogMiddleware *accesslog.AccessLog
|
accessLogMiddleware *accesslog.AccessLog
|
||||||
luaEngine *lua.LuaEngine
|
luaEngine *lua.LuaEngine
|
||||||
accessControl *security.AccessControl
|
accessControl *security.AccessControl
|
||||||
@ -79,11 +78,12 @@ type Server struct {
|
|||||||
proxies []*proxy.Proxy
|
proxies []*proxy.Proxy
|
||||||
listeners []net.Listener
|
listeners []net.Listener
|
||||||
healthCheckers []*proxy.HealthChecker
|
healthCheckers []*proxy.HealthChecker
|
||||||
|
locationEngine *matcher.LocationEngine
|
||||||
|
startTime time.Time
|
||||||
connections atomic.Int64
|
connections atomic.Int64
|
||||||
requests atomic.Int64
|
requests atomic.Int64
|
||||||
bytesSent atomic.Int64
|
bytesSent atomic.Int64
|
||||||
bytesReceived atomic.Int64
|
bytesReceived atomic.Int64
|
||||||
locationEngine *matcher.LocationEngine
|
|
||||||
running bool
|
running bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -686,8 +686,16 @@ func (s *Server) startVHostMode() error {
|
|||||||
handler = s.pool.WrapHandler(handler)
|
handler = s.pool.WrapHandler(handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := vhostMgr.AddHost(s.config.Servers[i].Name, handler); err != nil {
|
// 注册 server_names 数组中的所有主机名
|
||||||
return err
|
names := s.config.Servers[i].ServerNames
|
||||||
|
if len(names) == 0 {
|
||||||
|
// 如果未配置 server_names,使用 Name 字段
|
||||||
|
names = []string{s.config.Servers[i].Name}
|
||||||
|
}
|
||||||
|
for _, name := range names {
|
||||||
|
if err := vhostMgr.AddHost(name, handler); err != nil {
|
||||||
|
return fmt.Errorf("add host %s: %w", name, err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -770,7 +778,7 @@ func (s *Server) startVHostMode() error {
|
|||||||
s.running = true
|
s.running = true
|
||||||
|
|
||||||
// 创建监听器并保存,用于热升级
|
// 创建监听器并保存,用于热升级
|
||||||
ln, err := net.Listen("tcp", serverCfg.Listen)
|
ln, err := s.createListener(serverCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to listen: %w", err)
|
return fmt.Errorf("failed to listen: %w", err)
|
||||||
}
|
}
|
||||||
@ -824,7 +832,7 @@ func (s *Server) startMultiServerMode() error {
|
|||||||
serverCfg := &s.config.Servers[idx]
|
serverCfg := &s.config.Servers[idx]
|
||||||
|
|
||||||
// 创建监听器
|
// 创建监听器
|
||||||
ln, err := net.Listen("tcp", serverCfg.Listen)
|
ln, err := s.createListener(serverCfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errCh <- fmt.Errorf("监听地址 %s 失败: %w", serverCfg.Listen, err)
|
errCh <- fmt.Errorf("监听地址 %s 失败: %w", serverCfg.Listen, err)
|
||||||
return
|
return
|
||||||
@ -984,22 +992,22 @@ func (s *Server) registerProxyRoutesWithLocationEngine(serverCfg *config.ServerC
|
|||||||
// 根据 LocationType 注册路由
|
// 根据 LocationType 注册路由
|
||||||
locType := proxyCfg.LocationType
|
locType := proxyCfg.LocationType
|
||||||
if locType == "" {
|
if locType == "" {
|
||||||
locType = "prefix"
|
locType = matcher.LocationTypePrefix
|
||||||
}
|
}
|
||||||
|
|
||||||
switch locType {
|
switch locType {
|
||||||
case "exact":
|
case matcher.LocationTypeExact:
|
||||||
_ = s.locationEngine.AddExact(proxyCfg.Path, p.ServeHTTP)
|
_ = s.locationEngine.AddExact(proxyCfg.Path, p.ServeHTTP)
|
||||||
case "prefix_priority":
|
case matcher.LocationTypePrefixPriority:
|
||||||
_ = s.locationEngine.AddPrefixPriority(proxyCfg.Path, p.ServeHTTP)
|
_ = s.locationEngine.AddPrefixPriority(proxyCfg.Path, p.ServeHTTP)
|
||||||
case "regex", "regex_caseless":
|
case matcher.LocationTypeRegex, matcher.LocationTypeRegexCaseless:
|
||||||
caseInsensitive := locType == "regex_caseless"
|
caseInsensitive := locType == matcher.LocationTypeRegexCaseless
|
||||||
_ = s.locationEngine.AddRegex(proxyCfg.Path, p.ServeHTTP, caseInsensitive)
|
_ = s.locationEngine.AddRegex(proxyCfg.Path, p.ServeHTTP, caseInsensitive)
|
||||||
case "named":
|
case matcher.LocationTypeNamed:
|
||||||
if proxyCfg.LocationName != "" {
|
if proxyCfg.LocationName != "" {
|
||||||
_ = s.locationEngine.AddNamed(proxyCfg.LocationName, p.ServeHTTP)
|
_ = s.locationEngine.AddNamed(proxyCfg.LocationName, p.ServeHTTP)
|
||||||
}
|
}
|
||||||
case "prefix":
|
case matcher.LocationTypePrefix:
|
||||||
_ = s.locationEngine.AddPrefix(proxyCfg.Path, p.ServeHTTP)
|
_ = s.locationEngine.AddPrefix(proxyCfg.Path, p.ServeHTTP)
|
||||||
default:
|
default:
|
||||||
_ = s.locationEngine.AddPrefix(proxyCfg.Path, p.ServeHTTP)
|
_ = s.locationEngine.AddPrefix(proxyCfg.Path, p.ServeHTTP)
|
||||||
@ -1033,15 +1041,15 @@ func (s *Server) registerStaticHandlersWithLocationEngine(cfg *config.ServerConf
|
|||||||
// 根据 LocationType 注册路由
|
// 根据 LocationType 注册路由
|
||||||
locType := static.LocationType
|
locType := static.LocationType
|
||||||
if locType == "" {
|
if locType == "" {
|
||||||
locType = "prefix"
|
locType = matcher.LocationTypePrefix
|
||||||
}
|
}
|
||||||
|
|
||||||
switch locType {
|
switch locType {
|
||||||
case "exact":
|
case matcher.LocationTypeExact:
|
||||||
_ = s.locationEngine.AddExact(path, staticHandler.Handle)
|
_ = s.locationEngine.AddExact(path, staticHandler.Handle)
|
||||||
case "prefix_priority":
|
case matcher.LocationTypePrefixPriority:
|
||||||
_ = s.locationEngine.AddPrefixPriority(path, staticHandler.Handle)
|
_ = s.locationEngine.AddPrefixPriority(path, staticHandler.Handle)
|
||||||
case "prefix":
|
case matcher.LocationTypePrefix:
|
||||||
_ = s.locationEngine.AddPrefix(path, staticHandler.Handle)
|
_ = s.locationEngine.AddPrefix(path, staticHandler.Handle)
|
||||||
default:
|
default:
|
||||||
_ = s.locationEngine.AddPrefix(path, staticHandler.Handle)
|
_ = s.locationEngine.AddPrefix(path, staticHandler.Handle)
|
||||||
|
|||||||
@ -31,26 +31,17 @@ import (
|
|||||||
// 支持默认主机作为未匹配请求的 fallback。
|
// 支持默认主机作为未匹配请求的 fallback。
|
||||||
// 支持精确匹配、前缀通配(*.example.com)、后缀通配(example.*)和正则匹配。
|
// 支持精确匹配、前缀通配(*.example.com)、后缀通配(example.*)和正则匹配。
|
||||||
type VHostManager struct {
|
type VHostManager struct {
|
||||||
// 精确匹配
|
hosts map[string]*VirtualHost
|
||||||
hosts map[string]*VirtualHost
|
|
||||||
|
|
||||||
// 前缀通配 - suffix map(O(1) 查找)
|
|
||||||
wildcardSuffixMap map[string]*VirtualHost // suffix -> vhost
|
wildcardSuffixMap map[string]*VirtualHost // suffix -> vhost
|
||||||
|
wildcardTLDMap map[string]*VirtualHost // TLD -> vhost
|
||||||
// 后缀通配 - TLD map
|
regexHosts []*RegexHostMatcher
|
||||||
wildcardTLDMap map[string]*VirtualHost // TLD -> vhost
|
defaultHost *VirtualHost
|
||||||
|
|
||||||
// 正则匹配
|
|
||||||
regexHosts []*RegexHostMatcher
|
|
||||||
|
|
||||||
// defaultHost 默认主机,处理未匹配的 Host 头请求
|
|
||||||
defaultHost *VirtualHost
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RegexHostMatcher 正则主机匹配器。
|
// RegexHostMatcher 正则主机匹配器。
|
||||||
type RegexHostMatcher struct {
|
type RegexHostMatcher struct {
|
||||||
pattern *regexp.Regexp
|
|
||||||
vhost *VirtualHost
|
vhost *VirtualHost
|
||||||
|
pattern *regexp.Regexp
|
||||||
}
|
}
|
||||||
|
|
||||||
// VirtualHost 虚拟主机。
|
// VirtualHost 虚拟主机。
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user