Pārlūkot izejas kodu

feat:增加热重启

wangchuanjin 1 nedēļu atpakaļ
vecāks
revīzija
2f805aa4dd
5 mainītis faili ar 70 papildinājumiem un 34 dzēšanām
  1. 2 1
      config.yaml
  2. 2 2
      config/config.go
  3. 4 1
      go.mod
  4. 12 2
      go.sum
  5. 50 28
      main.go

+ 2 - 1
config.yaml

@@ -7,7 +7,7 @@ oss_accounts:
     access_key_secret: "Bk98FsbPYXcJe72n1bG3Ssf73acuNh"
 buckets:
   - bucket_id: "detail"
-    account_id": "main"
+    account_id": "main" 
     bucket_name: "jytest2022"
 node:
   node_name: "node1"
@@ -56,6 +56,7 @@ logger:
   maxBackups: 3
   maxAge: 3
   compress: true
+  console: true
 uploadPoolSize: 200
 downloadPoolSize: 200
 getDetailFromEsPoolSize: 100

+ 2 - 2
config/config.go

@@ -2,11 +2,11 @@ package config
 
 import (
 	"app.yhyue.com/moapp/jybase/es"
-	"app.yhyue.com/moapp/jybase/go-xweb/log"
 	. "app.yhyue.com/moapp/jybase/mongodb"
 	"github.com/go-redis/redis/v8"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gctx"
+	"log"
 )
 
 // OSSAccount 表示OSS帐号信息
@@ -37,7 +37,7 @@ var Rdb *redis.Client
 var Mgo *MongodbSim
 
 // LoadConfig 从指定的配置文件中加载配置
-func init() {
+func InitDb() {
 	log.Println("开始初始化。。。")
 	ctx := gctx.New()
 	es.NewEs(g.Config().MustGet(ctx, "elasticSearch.version").String(), g.Config().MustGet(ctx, "elasticSearch.address").String(), g.Config().MustGet(ctx, "elasticSearch.size").Int(), g.Config().MustGet(ctx, "elasticSearch.userName").String(), g.Config().MustGet(ctx, "elasticSearch.password").String())

+ 4 - 1
go.mod

@@ -5,7 +5,7 @@ go 1.23.0
 toolchain go1.23.4
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20250403014436-53740a2395aa
+	app.yhyue.com/moapp/jybase v0.0.0-20250813073741-ab6608c757c9
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20250304072104-4817d2821c84
 	github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
 	github.com/go-redis/redis/v8 v8.11.5
@@ -20,6 +20,7 @@ require (
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 // indirect
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.17 // indirect
 	github.com/BurntSushi/toml v1.2.0 // indirect
+	github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/cenkalti/backoff/v4 v4.2.0 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
@@ -35,6 +36,7 @@ require (
 	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-ole/go-ole v1.2.4 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
 	github.com/go-openapi/jsonreference v0.20.1 // indirect
 	github.com/go-openapi/swag v0.22.3 // indirect
@@ -54,6 +56,7 @@ require (
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
+	github.com/jpillora/s3 v1.1.4 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.15.15 // indirect
 	github.com/magiconair/properties v1.8.6 // indirect

+ 12 - 2
go.sum

@@ -1,7 +1,7 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
-app.yhyue.com/moapp/jybase v0.0.0-20250403014436-53740a2395aa h1:F45Yi0O0W7ezagpb4EWc57CGNoQ60HN3Ut7npO/sto4=
-app.yhyue.com/moapp/jybase v0.0.0-20250403014436-53740a2395aa/go.mod h1:OEtMbsn7wY/7MLgV7yDUpVDKExUoj3B8h+4w4ZckJQQ=
+app.yhyue.com/moapp/jybase v0.0.0-20250813073741-ab6608c757c9 h1:XA8AJiVikaoGVMFJ/4gvAtmZ35+MobSSwJ5qHRNL0Mg=
+app.yhyue.com/moapp/jybase v0.0.0-20250813073741-ab6608c757c9/go.mod h1:soa+vc23+uvhfJnybo9pTmtSuqnvWegO2wRraA1cTlc=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20250304072104-4817d2821c84 h1:Kg9Z5qq7QHBYfSlk/WJX+s4tzX/SfY6Dbprx/6/tBng=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20250304072104-4817d2821c84/go.mod h1:Q+r+DRzSIHAsYBA7i39O2UrZB6ZhRtfCjVpN7n1p+Fg=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.1.0 h1:60fFbyRAnn5vrnsPk99pVB2aJVin6nDIkNnmekdpFso=
@@ -46,6 +46,8 @@ github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0
 github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
+github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
 github.com/alicebob/miniredis/v2 v2.30.2 h1:lc1UAUT9ZA7h4srlfBmBt2aorm5Yftk9nBjxz7EyY9I=
@@ -118,6 +120,8 @@ github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
 github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
+github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
 github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
 github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
@@ -232,6 +236,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/s3 v1.1.4 h1:YCCKDWzb/Ye9EBNd83ATRF/8wPEy0xd43Rezb6u6fzc=
+github.com/jpillora/s3 v1.1.4/go.mod h1:yedE603V+crlFi1Kl/5vZJaBu9pUzE9wvKegU/lF2zs=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
@@ -314,8 +320,12 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
+github.com/smartystreets/assertions v1.1.1 h1:T/YLemO5Yp7KPzS+lVtu+WsHn8yoSwTfItdAd1r3cck=
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.1.3/go.mod h1:EH5qMBab2UclzXUcpR8b93eHsIlp9u+pDQIRp5DZNzQ=
+github.com/smartystreets/gunit v1.4.2 h1:tyWYZffdPhQPfK5VsMQXfauwnJkqg7Tv5DLuQVYxq3Q=
 github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=

+ 50 - 28
main.go

@@ -2,12 +2,15 @@ package main
 
 import (
 	. "app.yhyue.com/moapp/jybase/mongodb"
+	osr "app.yhyue.com/moapp/jybase/overseer"
 	"flag"
+	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gctx"
 	"github.com/gogf/gf/v2/os/gfsnotify"
 	"google.golang.org/grpc"
 	"gopkg.in/natefinch/lumberjack.v2"
+	"io"
 	"jygit.jydev.jianyu360.cn/BaseService/ossClient/constant"
 	"jygit.jydev.jianyu360.cn/BaseService/ossClient/pb"
 	"jygit.jydev.jianyu360.cn/BaseService/ossService/config"
@@ -17,16 +20,33 @@ import (
 	"net"
 	"net/http"
 	"net/rpc"
+	"os"
 	"strings"
 	"sync"
 	"time"
 )
 
+const Version = "V1.3"
+
 func main() {
+	ctx := gctx.New()
+	osr.Run(osr.Config{
+		Addresses: []string{g.Config().MustGet(ctx, "port").String(), g.Config().MustGet(ctx, "grpcPort").String()}, // 多个监听地址
+		Program:   program,
+	})
+}
+func program(state osr.State) {
+	pid := os.Getpid()
+	log.Println("ppid", os.Getppid(), "子进程", pid, "启动,监听端口", strings.Join(state.Addresses, " "))
 	ctx := gctx.New()
 	var logger *lumberjack.Logger
 	g.Config().MustGet(ctx, "logger").Struct(&logger)
-	log.SetOutput(logger)
+	writers := []io.Writer{logger}
+	if g.Config().MustGet(ctx, "logger.console").Bool() {
+		writers = append(writers, os.Stdout)
+	}
+	log.SetOutput(io.MultiWriter(writers...))
+	config.InitDb()
 	// 初始化OSS帐号与bucket信息
 	ossService.LoadOSSAccounts()
 	// 注册一个回调函数,当配置发生变更时会被调用
@@ -56,7 +76,6 @@ func main() {
 	go func() {
 		ticker := time.NewTicker(5 * time.Second)
 		var onlineNodesPrevWarn, downloadQueuePrevWarn, uploadQueuePrevWarn, getDetailQueuePrevWarn int64
-		ctx := gctx.New()
 		for range ticker.C {
 			util.SendHeartbeat(ctx)
 			util.CheckOnlineNodes(ctx, &onlineNodesPrevWarn)
@@ -65,37 +84,40 @@ func main() {
 			util.CheckGetDetailQueue(ctx, &getDetailQueuePrevWarn)
 		}
 	}()
-	go func() {
-		//创建一个grpc 服务器
-		s := grpc.NewServer()
-		//注册事件
-		pb.RegisterServiceServer(s, &ossService.Grpc{})
-		grpcPort := g.Config().MustGet(gctx.New(), "grpcPort").String()
-		//处理链接
-		listen, err := net.Listen("tcp", grpcPort)
-		if err != nil {
-			log.Println(err)
-		} else {
-			log.Println("grpc server is listening", grpcPort)
-		}
-		s.Serve(listen)
-	}()
+	// state.Listeners 与配置的 Addresses 顺序一致
+	servers := make([]osr.Server, len(state.Listeners))
 	// 启动RPC服务:注册OSSService,实现接口调用
 	rpcService := new(ossService.OSSService)
 	rpc.Register(rpcService)
 	rpc.HandleHTTP()
-
-	http.HandleFunc(constant.UploadUrl, ossService.UploadHandler)
-	http.HandleFunc(constant.DownloadUrl, ossService.DownloadHandler)
-	http.HandleFunc(constant.DeleteUrl, ossService.DeleteHandler)
-	http.HandleFunc("/ossservice/nodes", ossService.NodesHandler)
-	http.HandleFunc(constant.GetBidDetailUrl, ossService.BidDetailHandler)
-	port := g.Config().MustGet(ctx, "port").String()
-	log.Println("HTTP server started on " + port)
-	if err := http.ListenAndServe(port, nil); err != nil {
-		//if err := endless.ListenAndServe(port, nil, func() {}); err != nil {
-		log.Fatalln("HTTP server error", err)
+	mux := http.DefaultServeMux
+	mux.HandleFunc(constant.UploadUrl, ossService.UploadHandler)
+	mux.HandleFunc(constant.DownloadUrl, ossService.DownloadHandler)
+	mux.HandleFunc(constant.DeleteUrl, ossService.DeleteHandler)
+	mux.HandleFunc("/ossservice/nodes", ossService.NodesHandler)
+	mux.HandleFunc(constant.GetBidDetailUrl, ossService.BidDetailHandler)
+	mux.HandleFunc("/ossservice/version", func(w http.ResponseWriter, r *http.Request) {
+		fmt.Fprint(w, "版本号:", Version)
+	})
+	servers[0] = &http.Server{Handler: mux}
+	//创建一个grpc 服务器
+	grpcServer := grpc.NewServer()
+	defer grpcServer.GracefulStop()
+	//注册事件
+	pb.RegisterServiceServer(grpcServer, &ossService.Grpc{})
+	servers[1] = grpcServer
+	// 启动所有服务(每个监听对应一个服务器)
+	for i, listener := range state.Listeners {
+		go func(srv osr.Server, l net.Listener) {
+			log.Println("子进程", pid, "启动端口", l.Addr().String())
+			if err := srv.Serve(l); err != nil {
+				log.Println("端口", l.Addr().String(), "服务启动失败", err)
+			}
+		}(servers[i], listener)
 	}
+	// 监听关闭信号,优雅关闭所有服务器
+	<-state.GracefulShutdown
+	log.Println("子进程", pid, "停止运行。。。")
 }
 
 // /////////////////