反向圈圈

const http = require('http');
let svr = http.createServer((req, resp)=>{
    resp.writeHead(200, {"Content-Type":"text/plain"});
    resp.end("bienvinido\n");
});
svr.listen(9092); //或者9091

反向圈圈

package main

import (
    "math/rand"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func NewMulti(targets []*url.URL) *httputil.ReverseProxy {
    director := func(req *http.Request) {
        target := targets[rand.Intn(len(targets))]
        req.URL.Scheme = target.Scheme
        req.URL.Host = target.Host
        req.URL.Path = target.Path
    }
    return &httputil.ReverseProxy{Director: director}
}

func main() {
    proxy := NewMulti([]*url.URL{
        {
            Scheme: "http",
            Host:   "localhost:9092",
        },
        {
            Scheme: "http",
            Host:   "localhost:9091",
        },
    })
    http.ListenAndServe(":9090", proxy)
}

有了反向圈圈之後, 可以將一個正向圈圈寫得更簡單:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "time"
)

func main() {
    rProxy := httputil.ReverseProxy{
        Director: func(req *http.Request) {
            log.Printf("request for %v", req.URL)
        },
    }
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(rw http.ResponseWriter, req *http.Request) {
        rProxy.ServeHTTP(rw, req)
    })
    svr := http.Server{
        Addr:         ":8080",
        Handler:      mux,
        ReadTimeout:  10 * time.Second,
        WriteTimeout: 10 * time.Second,
    }
    res := svr.ListenAndServe()
    fmt.Printf("\n%v\n", res)
}

Director的作用就是重寫填寫Scheme/Host/Path. 如果什麼都不改, 那就退化爲最簡單的圈圈.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值