ETCD源码剖析
  • 前言
  • 修订记录
  • 分布式系统介绍
    • 分布式系统模型
    • CAP理论
    • 分布式系统通信
    • 分布式系统八大问题
    • 分布式存储
      • 一致性问题
      • 共识算法
      • Raft协议
      • 事务ACID
      • 分布式事务
      • 并发控制
    • 小结
  • 架构解析
    • 表现层
      • 命令行
    • 网络层
      • Proxy代理
      • SDK
    • 应用层
      • Raft协议
      • 复制状态机
      • 多版本并发控制
      • K-V存储
      • 发布订阅
      • 分布式事务
    • 数据层
      • 内存数据
        • 索引
      • 磁盘数据
        • 日志
        • 快照
        • 数据文件
    • 小结
  • 集群部署
    • 单节点部署
      • 源码编译安装
      • yum 安装
      • Docker部署
      • K8s部署
    • 多节点部署
      • 源码编译安装
      • yum 安装
      • Docker部署
      • K8s部署
    • 小结
  • 源码阅读
    • 从简单的例子开始
      • 实现一个简单的分布式kv数据库
    • 核心代码
      • raft源码解析
      • wal源码解析
      • mvcc源码解析
        • b-tree索引
      • kv-store源码解析
      • proxy源码解析
      • clientV3源码解析
      • etcdv3事务STM
      • etcd watch源码解析
    • 小结
  • 使用案例
    • 分布式锁
    • 分布式队列
    • 配置中心
    • 分布式k-v
    • 消息订阅
    • 小结
  • 运维指南
    • 集群监控
    • 数据备份
    • 其他
    • 小结
  • 总结
  • 附录
Powered by GitBook
On this page

Was this helpful?

  1. 架构解析
  2. 网络层

Proxy代理

etcd根据协议的不同, 提供了三种不同形式的代理。分别为:

  • tcpproxy

  • grpcproxy

  • httpproxy

下面我们看一个使用tcpproxy的demo

package main

import (
    "fmt"
    "net"
    "net/http"
    "net/http/httptest"
    "net/url"
    "go.etcd.io/etcd/proxy/tcpproxy"
)

func main() {
    l, err := net.Listen("tcp", "127.0.0.1:0")
    if err != nil {
        fmt.Println(err)
    }

    defer l.Close()

    want := "hello proxy"

    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, want)
    }))

    defer ts.Close()

    u, err := url.Parse(ts.URL)

    fmt.Println(u)
    if err != nil {
        fmt.Println(err)
    }
    var port  uint16
    fmt.Sscanf(u.Port(), "%d", &port)


    p := tcpproxy.TCPProxy{
        Listener: l,
        Endpoints: []*net.SRV{{
            Target: u.Hostname(), Port: port,    
        }},
    }
    p.Run()
}

如此,客户端可以运行 curl http://127.0.0.1:port 查看。

Previous网络层NextSDK

Last updated 6 years ago

Was this helpful?