Jaeger源码分析——服务注册与服务发现
原文:Jaeger源码分析——服务注册与服务发现 声明
TChannel服务注册和服务发现
第三方注册——手动注册go run cmd/agent/main.go --collector.host-port=192.168.0.10:14267,192.168.0.11:14267
注册表
github.com/uber/tchannel-go/peer.go #59 type PeerList struct { sync.RWMutex parent *RootPeerList //以hostPort为下标组成注册表 peersByHostPort map[string]*peerScore //负载均衡实现 peerHeap *peerHeap scoreCalculator ScoreCalculator lastSelected uint64 }
github.com/jaegertracing/jaeger/pkg/discovery/peerlistmgr/peer_list_mgr.go #150 func (m *PeerListManager) ensureConnections() { peers := m.peers.Copy() minPeers := m.getMinPeers(peers) numConnected,notConnected := m.findConnected(peers) //只要有3个有效服务,就不会进行健康检查 if numConnected >= minPeers { return } ...... for i := range notConnected { // swap current peer with random from the remaining positions r := i + m.rnd.Intn(len(notConnected)-i) notConnected[i],notConnected[r] = notConnected[r],notConnected[i] // try to connect to current peer (swapped) peer := notConnected[i] m.logger.Info("Trying to connect to peer",zap.String("host:port",peer.HostPort())) //用于控制超时 ctx,cancel := context.WithTimeout(context.Background(),m.connCheckTimeout) conn,err := peer.GetConnection(ctx) cancel() if err != nil { m.logger.Error("Unable to connect",peer.HostPort()),zap.Duration("connCheckTimeout",m.connCheckTimeout),zap.Error(err)) continue } ...... } }
github.com/uber/tchannel-go/connection.go #228 func (ch *Channel) newOutboundConnection(timeout time.Duration,hostPort string,events connectionEvents) (*Connection,error) { conn,err := net.DialTimeout("tcp",hostPort,timeout) if err != nil { if ne,ok := err.(net.Error); ok && ne.Timeout() { ch.log.WithFields(LogField{"hostPort",hostPort},LogField{"timeout",timeout}).Infof("Outbound net.Dial timed out") err = ErrTimeout } return nil,err } return ch.newConnection(conn,connectionWaitingToSendInitReq,events),nil } 客户端服务发现
github.com/uber/tchannel-go/peer.go #149 func (l *PeerList) choosePeer(prevSelected map[string]struct{},avoidHost bool) *Peer { var psPopList []*peerScore var ps *peerScore ...... size := l.peerHeap.Len() for i := 0; i < size; i++ { //把peer从Heap头部弹出来 popped := l.peerHeap.popPeer() if canChoosePeer(popped.HostPort()) { ps = popped break } psPopList = append(psPopList,popped) } //不符合的放入Heap尾部 for _,p := range psPopList { heap.Push(l.peerHeap,p) } if ps == nil { return nil } //符合条件的打分,再放入Heap尾部 l.peerHeap.pushPeer(ps) ps.chosenCount.Inc() return ps.Peer }
github.com/uber/tchannel-go/retry.go #212 func (ch *Channel) RunWithRetry(runCtx context.Context,f RetriableFunc) error { var err error opts := getRetryOptions(runCtx) rs := ch.getRequestState(opts) defer requestStatePool.Put(rs) //默认重试5次 for i := 0; i < opts.MaxAttempts; i++ { rs.Attempt++ if opts.TimeoutPerAttempt == 0 { err = f(runCtx,rs) } else { attemptCtx,cancel := context.WithTimeout(runCtx,opts.TimeoutPerAttempt) err = f(attemptCtx,rs) cancel() } if err == nil { return nil } if !opts.RetryOn.CanRetry(err) { if ch.log.Enabled(LogLevelInfo) { ch.log.WithFields(ErrField(err)).Info("Failed after non-retriable error.") } return err } ...... } // Too many retries,return the last error return err }
Consul+docker 服务注册和服务发现
准备工作
docker run -itd --network=backend -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server -bootstrap -ui-dir /ui
docker run -itd --network=backend --name=jaeger-agent -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778/tcp --dns-search="service.consul" --dns=172.18.0.2 jaegertracing/jaeger-agent /go/bin/agent-linux --collector.host-port=jaeger-collector:14267
#node1 docker run -itd --network=backend --name=jaeger-collector-node1 -p :14267 --dns-search="service.consul" --dns=172.18.0.2 jaegertracing/jaeger-collector /go/bin/collector-linux --span-storage.type=cassandra --cassandra.keyspace=jaeger_v1_dc --cassandra.servers=cassandra:9042 #node2 docker run -itd --network=backend --name=jaeger-collector-node2 -p :14267 --dns-search="service.consul" --dns=172.18.0.2 jaegertracing/jaeger-collector /go/bin/collector-linux --span-storage.type=cassandra --cassandra.keyspace=jaeger_v1_dc --cassandra.servers=cassandra:9042 服务注册——自动注册docker run -itd --net=backend --name=registrator --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://172.18.0.2:8500
注册表
服务端服务发现
总结
服务注册
健康检查
服务发现
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |