过年没事,写写代码,最好能为开源项目贡献点东西,就选了kitex,字节的,打算之后跳槽到字节。
既然贡献代码,最好能选一个模块来专门仔细看,看了kitex的目录结构后就选了负载均衡模块。
顺便研究下一致性哈希的源码是怎么实现的。
代码里面,loadbalance模块好像最适合,代码不多不少,适合修修补补。
.
├── acl
│ ├── acl.go
│ └── acl_test.go
├── circuitbreak
│ ├── cbsuite.go
│ ├── cbsuite_test.go
│ ├── circuitbreak.go
│ ├── circuitbreak_test.go
│ ├── default.go
│ ├── default_test.go
│ └── doc.go
├── connpool
│ ├── config.go
│ └── config_test.go
├── consts
│ └── ctx.go
├── diagnosis
│ ├── interface.go
│ └── interface_test.go
├── discovery
│ ├── constants.go
│ ├── discovery.go
│ └── discovery_test.go
├── endpoint
│ ├── endpoint.go
│ └── endpoint_test.go
├── event
│ ├── bus.go
│ ├── bus_test.go
│ ├── event.go
│ ├── queue.go
│ └── queue_test.go
├── exception
│ ├── deprecated.go
│ └── deprecated_test.go
├── generic
│ ├── binary_test
│ │ ├── generic_init.go
│ │ └── generic_test.go
│ ├── binarythrift_codec.go
│ ├── descriptor
│ │ ├── annotation.go
│ │ ├── descriptor.go
│ │ ├── field_mapping.go
│ │ ├── field_mapping_test.go
│ │ ├── http.go
│ │ ├── http_mapping.go
│ │ ├── route.go
│ │ ├── router.go
│ │ ├── tree.go
│ │ ├── tree_test.go
│ │ ├── type.go
│ │ ├── util.go
│ │ ├── value_mapping.go
│ │ └── value_mapping_test.go
│ ├── descriptor_provider.go
│ ├── generic.go
│ ├── generic_service.go
│ ├── httpthrift_codec.go
│ ├── httpthrift_codec_test.go
│ ├── json_test
│ │ ├── conf
│ │ │ └── kitex.yml
│ │ ├── generic_init.go
│ │ ├── generic_test.go
│ │ └── idl
│ │ ├── base.thrift
│ │ ├── example_check_read_required.thrift
│ │ ├── example_check_write_required.thrift
│ │ ├── example.thrift
│ │ ├── mock.thrift
│ │ └── self_ref.thrift
│ ├── jsonthrift_codec.go
│ ├── map_test
│ │ ├── conf
│ │ │ └── kitex.yml
│ │ ├── generic_init.go
│ │ ├── generic_test.go
│ │ └── idl
│ │ ├── base.thrift
│ │ ├── example_check_read_required.thrift
│ │ ├── example_check_write_required.thrift
│ │ ├── example.thrift
│ │ ├── mock.thrift
│ │ └── self_ref.thrift
│ ├── mapthrift_codec.go
│ ├── thrift
│ │ ├── base.go
│ │ ├── http.go
│ │ ├── json.go
│ │ ├── parse.go
│ │ ├── parse_test.go
│ │ ├── read.go
│ │ ├── read_test.go
│ │ ├── struct.go
│ │ ├── thrift.go
│ │ ├── util.go
│ │ ├── util_test.go
│ │ ├── write.go
│ │ └── write_test.go
│ ├── thriftidl_provider.go
│ └── thriftidl_provider_test.go
├── gofunc
│ └── go.go
├── http
│ ├── resolver.go
│ └── resolver_test.go
├── kerrors
│ ├── kerrors.go
│ └── kerrors_test.go
├── klog
│ ├── default.go
│ └── log.go
├── limit
│ ├── limit.go
│ └── limit_test.go
├── limiter
│ ├── concurrency_limiter.go
│ ├── concurrency_limiter_test.go
│ ├── dummy.go
│ ├── limiter.go
│ ├── limiter_test.go
│ ├── qps_limiter.go
│ └── qps_limiter_test.go
├── loadbalance
│ ├── consist.go
│ ├── consist_test.go
│ ├── dummy_picker.go
│ ├── lbcache
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── hookable.go
│ │ ├── hookable_test.go
│ │ └── shared_ticker.go
│ ├── loadbalancer.go
│ ├── weighted_random.go
│ └── weighted_random_test.go
├── protocol
│ └── bthrift
│ ├── binary.go
│ └── interface.go
├── proxy
│ └── proxy.go
├── registry
│ └── registry.go
├── remote
│ ├── bound
│ │ ├── limiter_inbound.go
│ │ └── transmeta_bound.go
│ ├── bytebuf.go
│ ├── codec
│ │ ├── bytebuf_util.go
│ │ ├── default_codec.go
│ │ ├── default_codec_test.go
│ │ ├── header_codec.go
│ │ ├── header_codec_test.go
│ │ ├── perrors
│ │ │ ├── protocol_error.go
│ │ │ └── protocol_error_test.go
│ │ ├── protobuf
│ │ │ ├── error.pb.go
│ │ │ ├── error.proto
│ │ │ ├── grpc.go
│ │ │ ├── pberror.go
│ │ │ ├── protobuf.go
│ │ │ ├── protobuf_test.go
│ │ │ ├── test.pb.go
│ │ │ └── test.proto
│ │ ├── thrift
│ │ │ ├── binary_protocol.go
│ │ │ ├── binary_protocol_test.go
│ │ │ ├── thrift.go
│ │ │ └── thrift_test.go
│ │ └── util.go
│ ├── codec.go
│ ├── compression.go
│ ├── connpool
│ │ ├── dummy.go
│ │ ├── long_pool.go
│ │ ├── long_pool_test.go
│ │ ├── reporter.go
│ │ ├── short_pool.go
│ │ ├── short_pool_test.go
│ │ └── utils.go
│ ├── connpool.go
│ ├── default_bytebuf.go
│ ├── default_bytebuf_test.go
│ ├── dialer.go
│ ├── doc.go
│ ├── message.go
│ ├── option.go
│ ├── payload_codec.go
│ ├── remotecli
│ │ ├── client.go
│ │ ├── conn_wrapper.go
│ │ ├── conn_wrapper_test.go
│ │ └── stream.go
│ ├── remotesvr
│ │ ├── server.go
│ │ └── server_test.go
│ ├── role.go
│ ├── trans
│ │ ├── common.go
│ │ ├── default_client_handler.go
│ │ ├── default_client_handler_test.go
│ │ ├── default_server_handler.go
│ │ ├── default_server_handler_test.go
│ │ ├── detection
│ │ │ ├── noop.go
│ │ │ └── server_handler.go
│ │ ├── invoke
│ │ │ ├── conn_extension.go
│ │ │ ├── conn_extension_test.go
│ │ │ ├── invoke.go
│ │ │ ├── invoke_handler.go
│ │ │ ├── invoke_handler_test.go
│ │ │ ├── message.go
│ │ │ └── message_test.go
│ │ ├── mocks_test.go
│ │ ├── netpoll
│ │ │ ├── bytebuf.go
│ │ │ ├── client_handler.go
│ │ │ ├── client_handler_test.go
│ │ │ ├── conn_extension.go
│ │ │ ├── dialer.go
│ │ │ ├── http_client.go
│ │ │ ├── http_client_handler.go
│ │ │ ├── http_client_handler_test.go
│ │ │ ├── mocks_test.go
│ │ │ ├── server_handler.go
│ │ │ ├── server_handler_test.go
│ │ │ ├── trans_server.go
│ │ │ └── trans_server_test.go
│ │ ├── netpollmux
│ │ │ ├── client_handler.go
│ │ │ ├── client_handler_test.go
│ │ │ ├── mocks_test.go
│ │ │ ├── mux_conn.go
│ │ │ ├── mux_pool.go
│ │ │ ├── mux_pool_test.go
│ │ │ ├── mux_transport.go
│ │ │ ├── mux_transport_test.go
│ │ │ ├── server_handler.go
│ │ │ ├── shared_map.go
│ │ │ ├── shared_map_test.go
│ │ │ ├── shared_queue.go
│ │ │ └── shared_queue_test.go
│ │ └── nphttp2
│ │ ├── buffer.go
│ │ ├── client_conn.go
│ │ ├── client_handler.go
│ │ ├── codes
│ │ │ └── codes.go
│ │ ├── codes.go
│ │ ├── conn_pool.go
│ │ ├── doc.go
│ │ ├── grpc
│ │ │ ├── bdp_estimator.go
│ │ │ ├── controlbuf.go
│ │ │ ├── defaults.go
│ │ │ ├── flowcontrol.go
│ │ │ ├── http2_client.go
│ │ │ ├── http2_server.go
│ │ │ ├── http_util.go
│ │ │ ├── keepalive.go
│ │ │ ├── log.go
│ │ │ └── transport.go
│ │ ├── metadata
│ │ │ └── metadata.go
│ │ ├── server_conn.go
│ │ ├── server_handler.go
│ │ ├── status
│ │ │ └── status.go
│ │ └── stream.go
│ ├── trans_errors.go
│ ├── trans_errors_test.go
│ ├── trans_handler.go
│ ├── transmeta
│ │ ├── http_metakey.go
│ │ └── metakey.go
│ ├── trans_meta.go
│ ├── trans_pipeline.go
│ └── trans_server.go
├── retry
│ ├── backup.go
│ ├── backup_retryer.go
│ ├── failure.go
│ ├── failure_retryer.go
│ ├── failure_test.go
│ ├── policy.go
│ ├── policy_test.go
│ ├── retryer.go
│ ├── retryer_test.go
│ └── util.go
├── rpcinfo
│ ├── basicinfo.go
│ ├── convert.go
│ ├── convert_test.go
│ ├── ctx.go
│ ├── ctx_test.go
│ ├── endpointInfo.go
│ ├── endpointInfo_test.go
│ ├── interface.go
│ ├── invocation.go
│ ├── invocation_test.go
│ ├── mocks_test.go
│ ├── mutable.go
│ ├── remoteinfo
│ │ ├── remoteInfo.go
│ │ └── remoteInfo_test.go
│ ├── rpcconfig.go
│ ├── rpcconfig_test.go
│ ├── rpcinfo.go
│ ├── rpcstats.go
│ └── rpcstats_test.go
├── rpctimeout
│ └── rpctimeout.go
├── serviceinfo
│ ├── serviceinfo.go
│ └── serviceinfo_test.go
├── stats
│ ├── event.go
│ ├── event_test.go
│ ├── status.go
│ └── tracer.go
├── streaming
│ └── streaming.go
├── transmeta
│ ├── http2.go
│ ├── http2_test.go
│ ├── metainfo.go
│ ├── metainfo_test.go
│ ├── ttheader.go
│ └── ttheader_test.go
└── utils
├── byte2str.go
├── byte2str_test.go
├── config.go
├── config_test.go
├── counter.go
├── counter_test.go
├── err_chain.go
├── err_chain_test.go
├── func.go
├── func_test.go
├── int_len.go
├── int_len_test.go
├── json.go
├── json_test.go
├── max_counter.go
├── max_counter_test.go
├── netaddr.go
├── netaddr_test.go
├── ring.go
├── ring_single.go
├── ring_test.go
├── rpcstats.go
├── slice.go
├── slice_test.go
├── strbuf.go
├── strbuf_test.go
├── thrift.go
├── thrift_test.go
├── yaml.go
└── yaml_test.go