gin短暂停机反向代理


package main

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"net/http/httputil"
	"net/url"
	"time"
)

// NewProxy takes target host and creates a reverse proxy
// NewProxy 拿到 targetHost 后,创建一个反向代理
func NewProxy(targetHost string) (*httputil.ReverseProxy, error) {
	remoteAddr, err := url.Parse(targetHost)
	if err != nil {
		return nil, err
	}

	return httputil.NewSingleHostReverseProxy(remoteAddr), nil
}

func work(addr string) *http.Server  {
	srv := &http.Server{
		Addr:              ":3002",
		Handler: router(),
	}

	go func() {
		err := srv.ListenAndServe()
		if err != nil {
			fmt.Println("停止")
			return
		}
	}()

	return srv
}

func test(c *gin.Context)  {
	fmt.Println("正则路由")

	proxy, err := NewProxy(addr)
	if err != nil {
		panic(err)
	}
	proxy.ServeHTTP(c.Writer, c.Request)
	fmt.Println("这里可以判断为流量")
}

func router() *gin.Engine {
	r := gin.Default()

	r.GET("/*all", test)
	return r
}

var addr string

func main() {
	addr = "http://127.0.0.1:3001"
	server := work(addr)

	time.Sleep(time.Second * 30)
	addr = "http://127.0.0.1:30002"
	fmt.Println("停止之前的服务器")
	server.Shutdown(context.Background())
	work(addr)

	for {
		time.Sleep(time.Second)
	}
}