美文网首页
反响代理实现原理

反响代理实现原理

作者: huiwq1990 | 来源:发表于2020-01-19 20:34 被阅读0次

前言

之前接触的代理是sofa-mosn这种,它client端连接到mosn后,mosn将数据包转发到后端。其中
1)mosn到后端服务器有个连接池,连接是可以复用的
2)mosn会对数据包进行解包
3)支持请求数据(不是连接请求)的负载均衡

tcp负载均衡

最近接触到TCP层的负载均衡,Proxy只能实现连接的负载均衡,即后端有两个机器,第一个连接会将所有数据发送到S1,第二个连接会转发到S2。相当于client连接proxy后,proxy会创建一个到server的connection。

为什么不能复用连接?
1)proxy不知道client发送的数据内容,也不知道client什么时候发送完。如果proxy到server的连接不是独享的,会导致包错乱。

实现

下面以https://github.com/yyyar/gobetween
为例解释一下。

server.go

        # client到proxy的连接
    clientConn := ctx.Conn
    
    # 负载均衡选取后端节点,拿到的是服务器的信息,不是连接
    backend, err := this.scheduler.TakeBackend(ctx)
    
      # 创建proxy到server的连接
    if this.cfg.BackendsTls != nil {
        backendConn, err = tls.DialWithDialer(&net.Dialer{
            Timeout: utils.ParseDurationOrDefault(*this.cfg.BackendConnectionTimeout, 0),
        }, "tcp", backend.Address(), this.backendsTlsConfg)

    } else {
        backendConn, err = net.DialTimeout("tcp", backend.Address(), utils.ParseDurationOrDefault(*this.cfg.BackendConnectionTimeout, 0))
    }
        # server返回给proxy的数据 转发给 client
    cs := proxy(clientConn, backendConn, utils.ParseDurationOrDefault(*this.cfg.BackendIdleTimeout, 0))
         # proxy收到client发送过来的数据 转发给server
    bs := proxy(backendConn, clientConn, utils.ParseDurationOrDefault(*this.cfg.ClientIdleTimeout, 0))

具体的proxy过程见proxy.go


func Copy(to io.Writer, from io.Reader, ch chan<- core.ReadWriteCount) error {
    for {
                # 读数据
        readN, readErr := from.Read(buf)

        if readN > 0 {
                        #写数据
            writeN, writeErr := to.Write(buf[0:readN])

            if writeN > 0 {
                ch <- core.ReadWriteCount{CountRead: uint(readN), CountWrite: uint(writeN)}
            }
        }
    }
}

参考

https://github.com/darkhelmet/balance
https://kasvith.me/posts/lets-create-a-simple-lb-go/

相关文章

  • 反响代理实现原理

    前言 之前接触的代理是sofa-mosn这种,它client端连接到mosn后,mosn将数据包转发到后端。其中1...

  • AOP——cglib动态代理源码解析

    上一篇分析了使用JDK动态代理的低层实现原理,这次再来看看cglib实现动态代理的原理。 关于JDK动态代理的实现...

  • Spring AOP 实现原理

    Spring AOP 实现原理 静态代理 众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就...

  • BLE Mesh代理协议

    什么是代理协议?代理协议的作用?代理协议的原理?代理协议的实现过程?为什么会有代理协议? 1、原理:为什么要使用代...

  • 动态代理-jdk代理实现原理

    动态代理-jdk代理实现原理 JDK中提供了一个Proxy类用于实现动态代理,JDK的动态代理是基于接口实现的,被...

  • 动态代理(二)

    动态代理的原理 我们可以看到动态代理是根据反射实现的,那么我们可以自己实现动态代理吗? 1、每个动态代理的类都实现...

  • Spring_AOP_02——实现原理

    本文主要讲实现AOP的 代理模式原理,以及静态代理,动态代理的区别和具体实现。 对SpringAOP的概念和使用,...

  • jQuery实现事件代理

    jQuery实现事件代理 1.事件代理的原理和意义 实现原理是利用了浏览器的事件冒泡和事件源(target)。在j...

  • Spring AOP(一)

    Spring AOP实现原理 动态代理: 利用核心类Proxy和接口InvocationHandler(基于代理模...

  • Java动态代理

    参考来源: Java动态代理视频 JDK动态代理实现原理 JDK Dynamic Proxies Building...

网友评论

      本文标题:反响代理实现原理

      本文链接:https://www.haomeiwen.com/subject/emcdzctx.html