目录
1.概述
kafka启动时做很多初始化运行环境工作,具体请参考:kafka源码--broker的基础模块serversocket
其中SockeServer类启动时,首先初始化NIO网络环境、启动监听、创建主线程、工作线程池、设置参数等等。
kafka的所有逻辑处理和交互实际是交给KafkaApi类来处理的。
通过请求的类型,把具体的request路由到对应的handler处理。
2.解析request源码
2.1 RequestHeader
val header = RequestHeader.parse(receive.payload)
public class RequestHeader implements AbstractRequestResponse {
public static RequestHeader parse(ByteBuffer buffer) {
short apiKey = -1;
try {
apiKey = buffer.getShort();
short apiVersion = buffer.getShort();
short headerVersion = ApiKeys.forId(apiKey).requestHeaderVersion(apiVersion);
// 设置position=0,mark=-1,为了后面重新读取
buffer.rewind();
return new RequestHeader(new RequestHeaderData(
new ByteBufferAccessor(buffer), headerVersion), headerVersion);
} catch (UnsupportedVersionException e) {
throw new InvalidRequestException("Unknown API key " + apiKey, e);
} catch (Throwable ex) {
throw new InvalidRequestException("Error parsing request header. Our best guess of the apiKey is: " +
apiKey, ex);
}
}
}
public class RequestHeaderData implements ApiMessage {
@Override
public void read(Readable _readable, short _version) {
// 读取2个字节数据设置到requestApiKey
this.requestApiKey = _readable.readShort();
// 读取2个字节数据设置到requestApiVersion
this.requestApiVersion =