开源的反向代理项目推荐

ttps://bitbucket.org/tebeka/seamless是一个开源的反向代理项目,可将用户访问通过代理分流给多个后端服务器。可通过http接口动态增加删除后端服务。
项目主要文件有两个:seamless.go和backends.go,简单,易于阅读学习。
其中最主要的一个函数forward用于转发请求:

1
2
3
4
5
6
7
8
9
10
func forward (local net. Conn , remoteAddr string ) {
    remote , err := net. Dial ( "tcp" , remoteAddr )
    if err != nil {
        log. Printf ( "remote dial failed: %v\n" , err )
        local. Close ( )
        return
    }
    go io. Copy (local , remote )
    go io. Copy (remote , local )
}

io.Copy一句是精隨。
local和remote均是一个网络连接,类型为net.Conn,关于Conn接口的定,在Go官方源码中有:

1
2
3
4
5
6
7
8
9
10
type Conn interface {
        Read (b [ ]byte ) (n int , err error )
        Write (b [ ]byte ) (n int , err error )
        Close ( ) error
        LocalAddr ( ) Addr
        RemoteAddr ( ) Addr
        SetDeadline (t time. Time ) error
        SetReadDeadline (t time. Time ) error
        SetWriteDeadline (t time. Time ) error
    }

io.Copy(dst Writer, src Reader),则实现从src复制到dst。
io.Copy的实现代码有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
buf := make ( [ ]byte , 32 * 1024 )
    for {
        nr , er := src. Read (buf )
        if nr > 0 {
            nw , ew := dst. Write (buf [ 0 :nr ] )
            if nw > 0 {
                written += int64 (nw )
            }
            if ew != nil {
                err = ew
                break
            }
            if nr != nw {
                err = ErrShortWrite
                break
            }
        }
        if er == EOF {
            break
        }
        if er != nil {
            err = er
            break
        }
    }
    return written , err

可以看到调用了Read和Write方法,而这个方法刚好net.Conn中定义了。这就实现了将一个连接的数据复制到另一个连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值