feat(platform): 实现HTTP服务器启动和管道适配器- 添加HTTP服务器启动功能,支持HTTP和HTTPS配置- 实现pipeline适配器,将请求处理管道与HTTP服务器集成

-修复CreatePipeline函数中的循环条件错误
- 移除main.go中冗余的日志和配置处理代码
- 新增placeholder包用于启动平台服务- 添加完整的HTTP服务器配置选项,包括端口、主机名和TLS设置
- 实现并发安全的服务器启动机制
This commit is contained in:
2025-11-03 21:48:08 +08:00
parent 24416eeb62
commit b2692d76f2
5 changed files with 182 additions and 72 deletions

View File

@@ -0,0 +1,74 @@
package http
import (
"fmt"
"net/http"
"platform/config"
"platform/logging"
"platform/pipeline"
"sync"
)
type pipelineAdaptor struct {
pipeline.RequestPipeline
}
func (p pipelineAdaptor) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
err := p.ProcessRequest(request, writer)
if err != nil {
http.Error(writer, err.Error(), http.StatusInternalServerError)
return
}
}
func Serve(pl pipeline.RequestPipeline, cfg config.Configuration, logger logging.Logger) *sync.WaitGroup {
wg := sync.WaitGroup{}
adaptor := pipelineAdaptor{RequestPipeline: pl}
serveHttp(cfg, logger, &wg, &adaptor)
serveHttps(cfg, logger, &wg, &adaptor)
return &wg
}
func serveHttp(cfg config.Configuration, logger logging.Logger, wg *sync.WaitGroup, adaptor *pipelineAdaptor) {
enableHttp := cfg.GetBoolDefault("http:enableHTTP", true)
if !enableHttp {
return
}
httpPort := cfg.GetIntDefault("http:port", 5000)
httpName := cfg.GetStringDefault("http:name", "localhost")
logger.Debugf("Starting HTTP server on port %v:%d", httpName, httpPort)
wg.Add(1)
go func() {
url := fmt.Sprintf("%v:%v", httpName, httpPort)
err := http.ListenAndServe(url, adaptor)
if err != nil {
panic(err)
}
}()
}
func serveHttps(cfg config.Configuration, logger logging.Logger, wg *sync.WaitGroup, adaptor *pipelineAdaptor) {
enableHttps := cfg.GetBoolDefault("http:enableHTTPS", false)
if !enableHttps {
return
}
httpsPort := cfg.GetIntDefault("http:httpsPort", 5500)
httpsName := cfg.GetStringDefault("http:httpsName", "localhost")
certFile, cfOk := cfg.GetString("http:httpsCert")
keyFile, kfOk := cfg.GetString("http:httpsKey")
if cfOk && kfOk {
logger.Debugf("Starting HTTPS server on port %v:%d", httpsName, httpsPort)
wg.Add(1)
go func() {
url := fmt.Sprintf("%v:%v", httpsName, httpsPort)
err := http.ListenAndServeTLS(url, certFile, keyFile, adaptor)
if err != nil {
panic(err)
}
}()
} else {
panic("HTTPS certificate or key file setting not found")
}
}

View File

@@ -1 +1,76 @@
package main
import (
"platform/config"
"platform/logging"
"platform/services"
"testing"
)
func writeMessage(logger logging.Logger, cfg config.Configuration) {
section, ok := cfg.GetSection("main")
if !ok {
logger.Panicf("Config section not found %v", "main")
return
}
message, ok := section.GetString("message")
if !ok {
logger.Panicf("Config value not found %v", "message")
return
}
logger.Info(message)
messages, ok := cfg.GetSectionSlice("messages")
if !ok {
logger.Panicf("Config section not found %v", "messages")
return
}
for _, item := range messages {
itemMessage, itemOk := item.GetString("message")
if !itemOk {
logger.Panicf("Config value not found %v", "messages.message")
return
}
logger.Info(itemMessage)
}
}
func TestServices1(t *testing.T) {
// 注册服务
services.RegisterDefaultService()
// 获取配置服务
var cfg config.Configuration
err := services.GetService(&cfg)
if err != nil {
panic(err)
}
// 获取日志服务
var logger logging.Logger
err = services.GetService(&logger)
if err != nil {
panic(err)
}
// 写入日志
writeMessage(logger, cfg)
}
func TestServices2(t *testing.T) {
// 注册服务
services.RegisterDefaultService()
_, err := services.Call(writeMessage)
if err != nil {
panic(err)
}
val := struct {
message string
logging.Logger
}{
message: "Hello from the struct",
}
err = services.Populate(&val)
if err != nil {
panic(err)
}
val.Logger.Debug(val.message)
}

View File

@@ -1,79 +1,11 @@
package main
import (
"platform/config"
"platform/logging"
"platform/placeholder"
"platform/services"
)
func writeMessage(logger logging.Logger, cfg config.Configuration) {
section, ok := cfg.GetSection("main")
if !ok {
logger.Panicf("Config section not found %v", "main")
return
}
message, ok := section.GetString("message")
if !ok {
logger.Panicf("Config value not found %v", "message")
return
}
logger.Info(message)
messages, ok := cfg.GetSectionSlice("messages")
if !ok {
logger.Panicf("Config section not found %v", "messages")
return
}
for _, item := range messages {
itemMessage, itemOk := item.GetString("message")
if !itemOk {
logger.Panicf("Config value not found %v", "messages.message")
return
}
logger.Info(itemMessage)
}
}
func main1() {
// 注册服务
services.RegisterDefaultService()
// 获取配置服务
var cfg config.Configuration
err := services.GetService(&cfg)
if err != nil {
panic(err)
}
// 获取日志服务
var logger logging.Logger
err = services.GetService(&logger)
if err != nil {
panic(err)
}
// 写入日志
writeMessage(logger, cfg)
}
func main2() {
// 注册服务
services.RegisterDefaultService()
_, err := services.Call(writeMessage)
if err != nil {
panic(err)
}
val := struct {
message string
logging.Logger
}{
message: "Hello from the struct",
}
err = services.Populate(&val)
if err != nil {
panic(err)
}
val.Logger.Debug(val.message)
}
func main() {
main2()
services.RegisterDefaultService()
placeholder.Start()
}

View File

@@ -11,7 +11,7 @@ var emptyPipeline RequestPipeline = func(*ComponentContext) {
// CreatePipeline 创建管道
func CreatePipeline(components ...MiddlewareComponent) RequestPipeline {
f := emptyPipeline
for i := len(components) - 1; i <= 0; i-- {
for i := len(components) - 1; i >= 0; i-- {
currentComponent := components[i]
nextFunc := f
f = func(context *ComponentContext) {

View File

@@ -0,0 +1,29 @@
package placeholder
import (
"platform/http"
"platform/pipeline"
"platform/pipeline/basic"
"platform/services"
"sync"
)
func createPipeline() pipeline.RequestPipeline {
return pipeline.CreatePipeline(
&basic.ServicesComponent{},
&basic.LoggingComponent{},
&basic.ErrorComponent{},
&basic.StaticFileComponent{},
&SimpleMessageComponent{},
)
}
func Start() {
results, err := services.Call(http.Serve, createPipeline())
if err == nil {
wg := results[0].(*sync.WaitGroup)
wg.Wait()
} else {
panic(err)
}
}