±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚinfoq£¬ÎÄÕÂÉîÈë·ÖÎöÁËgrpcÏß³ÌÄ£ÐÍÒÔ¼°Ô´Â룬½áºÏnetty·ÖÎöÁËgrpcµÄÔ´Âë½á¹¹£¬×îºó¸ø³öÁ˼õÉÙ¾ºÕùµÄËøÓÅ»¯·½°¸¡£ |
|
1. RPCÏß³ÌÄ£ÐÍ
1.1. BIOÏß³ÌÄ£ÐÍ
ÔÚJDK 1.4ÍÆ³öJava NIO֮ǰ£¬»ùÓÚJavaµÄËùÓÐSocketͨÐŶ¼²ÉÓÃÁËͬ²½×èÈûģʽ£¨BIO£©£¬ÕâÖÖÒ»ÇëÇóÒ»Ó¦´ðµÄͨÐÅÄ£Ðͼò»¯ÁËÉϲãµÄÓ¦Óÿª·¢£¬µ«ÊÇÔÚÐÔÄܺͿɿ¿ÐÔ·½ÃæÈ´´æÔÚמ޴óµÄÆ¿¾±¡£Òò´Ë£¬Ôںܳ¤Ò»¶Îʱ¼äÀ´óÐ͵ÄÓ¦Ó÷þÎñÆ÷¶¼²ÉÓÃC»òÕßC++ÓïÑÔ¿ª·¢£¬ÒòΪËüÃÇ¿ÉÒÔÖ±½ÓʹÓòÙ×÷ϵͳÌṩµÄÒì²½I/O»òÕßAIOÄÜÁ¦¡£µ±²¢·¢·ÃÎÊÁ¿Ôö´ó¡¢ÏìӦʱ¼äÑÓ³ÙÔö´óÖ®ºó£¬²ÉÓÃJava
BIO¿ª·¢µÄ·þÎñ¶ËÈí¼þÖ»ÓÐͨ¹ýÓ²¼þµÄ²»¶ÏÀ©ÈÝÀ´Âú×ã¸ß²¢·¢ºÍµÍʱÑÓ£¬Ëü¼«´óµØÔö¼ÓÁËÆóÒµµÄ³É±¾£¬²¢ÇÒËæ×ż¯Èº¹æÄ£µÄ²»¶ÏÅòÕÍ£¬ÏµÍ³µÄ¿Éά»¤ÐÔÒ²ÃæÁÙ¾Þ´óµÄÌôÕ½£¬Ö»ÄÜͨ¹ý²É¹ºÐÔÄܸü¸ßµÄÓ²¼þ·þÎñÆ÷À´½â¾öÎÊÌ⣬Õâ»áµ¼Ö¶ñÐÔÑ»·,´«Í³²ÉÓÃBIOµÄJava
Web·þÎñÆ÷ÈçÏÂËùʾ£¨µäÐ͵ÄÈçTomcatµÄBIOģʽ£©£º

ͼ1-1 »ùÓÚBIOÏß³ÌÄ£Ð͵ÄJava Web·þÎñÆ÷
²ÉÓøÃÏß³ÌÄ£Ð͵ķþÎñÆ÷µ÷¶ÈÌØµãÈçÏ£º
1.·þÎñ¶Ë¼àÌýÏß³ÌAcceptor¸ºÔð¿Í»§¶ËÁ¬½ÓµÄ½ÓÈ룬ÿµ±ÓÐеĿͻ§¶Ë½ÓÈ룬¾Í»á´´½¨Ò»¸öеÄI/OÏ̸߳ºÔð´¦ÀíSocket
2.¿Í»§¶ËÇëÇóÏûÏ¢µÄ¶ÁÈ¡ºÍÓ¦´ðµÄ·¢ËÍ£¬¶¼ÓÐI/OÏ̸߳ºÔð
3.³ýÁËI/O¶Áд²Ù×÷£¬Ä¬ÈÏÇé¿öÏÂÒµÎñµÄÂß¼´¦Àí£¬ÀýÈçDB²Ù×÷µÈ£¬Ò²¶¼ÔÚI/OÏ̴߳¦Àí
4.I/O²Ù×÷²ÉÓÃͬ²½×èÈû²Ù×÷£¬¶ÁдûÓÐÍê³É£¬I/OÏ̻߳áͬ²½×èÈû
BIOÏß³ÌÄ£ÐÍÖ÷Òª´æÔÚÈçÏÂÈý¸öÎÊÌ⣺
1.ÐÔÄÜÎÊÌ⣺һÁ¬½ÓÒ»Ïß³ÌÄ£Ð͵¼Ö·þÎñ¶ËµÄ²¢·¢½ÓÈëÊýºÍϵͳÍÌÍÂÁ¿Êܵ½¼«´óÏÞÖÆ
2.¿É¿¿ÐÔÎÊÌ⣺ÓÉÓÚI/O²Ù×÷²ÉÓÃͬ²½×èÈûģʽ£¬µ±ÍøÂçÓµÈû»òÕßͨÐŶԶ˴¦Àí»ºÂý»áµ¼ÖÂI/OÏ̱߳»¹Òס£¬×èÈûʱ¼äÎÞ·¨Ô¤²â
3.¿Éά»¤ÐÔÎÊÌ⣺I/OÏß³ÌÊýÎÞ·¨ÓÐЧ¿ØÖÆ¡¢×ÊÔ´ÎÞ·¨ÓÐЧ¹²Ïí£¨¶àÏ̲߳¢·¢ÎÊÌ⣩£¬ÏµÍ³¿Éά»¤ÐÔ²î
ΪÁ˽â¾öͬ²½×èÈûI/OÃæÁÙµÄÒ»¸öÁ´Â·ÐèÒªÒ»¸öÏ̴߳¦ÀíµÄÎÊÌ⣬ͨ³£»á¶ÔËüµÄÏß³ÌÄ£ÐͽøÐÐÓÅ»¯£¬ºó¶Ëͨ¹ýÒ»¸öÏ̳߳ØÀ´´¦Àí¶à¸ö¿Í»§¶ËµÄÇëÇó½ÓÈ룬Ðγɿͻ§¶Ë¸öÊýM£ºÏ̳߳Ø×î´óÏß³ÌÊýNµÄ±ÈÀý¹ØÏµ£¬ÆäÖÐM¿ÉÒÔÔ¶Ô¶´óÓÚN£¬Í¨¹ýÏ̳߳ؿÉÒÔÁé»îµÄµ÷ÅäÏß³Ì×ÊÔ´£¬ÉèÖÃÏ̵߳Ä×î´óÖµ£¬·ÀÖ¹ÓÉÓÚº£Á¿²¢·¢½ÓÈëµ¼ÖÂÏ̺߳ľ¡£¬ËüµÄ¹¤×÷ÔÀíÈçÏÂËùʾ£º

ͼ1-2 ¸Ä½ø°æBIOÏß³ÌÄ£ÐÍ
ÓÅ»¯Ö®ºóµÄBIOÄ£ÐͲÉÓÃÁËÏ̳߳ØÊµÏÖ£¬Òò´Ë±ÜÃâÁËΪÿ¸öÇëÇó¶¼´´½¨Ò»¸ö¶ÀÁ¢Ïß³ÌÔì³ÉµÄÏß³Ì×ÊÔ´ºÄ¾¡ÎÊÌâ¡£µ«ÊÇÓÉÓÚËüµ×²ãµÄͨÐÅÒÀÈ»²ÉÓÃͬ²½×èÈûÄ£ÐÍ£¬×èÈûµÄʱ¼äÈ¡¾öÓÚ¶Ô·½I/OÏ̵߳Ĵ¦ÀíËٶȺÍÍøÂçI/OµÄ´«ÊäËÙ¶È¡£±¾ÖÊÉÏÀ´½²£¬ÎÞ·¨±£Ö¤Éú²ú»·¾³µÄÍøÂç×´¿öºÍ¶Ô¶ËµÄÓ¦ÓóÌÐòÄÜ×ã¹»¿ì£¬Èç¹ûÓ¦ÓóÌÐòÒÀÀµ¶Ô·½µÄ´¦ÀíËÙ¶È£¬ËüµÄ¿É¿¿ÐԾͷdz£²î£¬ÓÅ»¯Ö®ºóµÄBIOÏß³ÌÄ£ÐÍÈÔÈ»ÎÞ·¨´Ó¸ù±¾ÉϽâ¾öÐÔÄÜÏßÐÔÀ©Õ¹ÎÊÌâ¡£
1.2. Òì²½·Ç×èÈûÏß³ÌÄ£ÐÍ
´ÓJDK1.0µ½JDK1.3£¬JavaµÄI/OÀà¿â¶¼·Ç³£Ôʼ£¬ºÜ¶àUNIXÍøÂç±à³ÌÖеĸÅÄî»òÕß½Ó¿ÚÔÚI/OÀà¿âÖж¼Ã»ÓÐÌåÏÖ£¬ÀýÈçPipe¡¢Channel¡¢BufferºÍSelectorµÈ¡£2002Äê·¢²¼JDK1.4ʱ£¬NIOÒÔJSR-51µÄÉí·ÝÕýÊ½ËæJDK·¢²¼¡£ËüÐÂÔöÁ˸öjava.nio°ü£¬ÌṩÁËºÜ¶à½øÐÐÒì²½I/O¿ª·¢µÄAPIºÍÀà¿â£¬Ö÷ÒªµÄÀàºÍ½Ó¿ÚÈçÏ£º
1.½øÐÐÒì²½I/O²Ù×÷µÄ»º³åÇøByteBufferµÈ
2.½øÐÐÒì²½I/O²Ù×÷µÄ¹ÜµÀPipe
3.½øÐи÷ÖÖI/O²Ù×÷£¨Òì²½»òÕßͬ²½£©µÄChannel£¬°üÀ¨ServerSocketChannelºÍSocketChannel
4.¶àÖÖ×Ö·û¼¯µÄ±àÂëÄÜÁ¦ºÍ½âÂëÄÜÁ¦
5.ʵÏÖ·Ç×èÈûI/O²Ù×÷µÄ¶à·¸´ÓÃÆ÷selector
6.»ùÓÚÁ÷ÐеÄPerlʵÏÖµÄÕýÔò±í´ïʽÀà¿â
7.ÎļþͨµÀFileChannel
еÄNIOÀà¿âµÄÌṩ£¬¼«´óµØ´Ù½øÁË»ùÓÚJavaµÄÒì²½·Ç×èÈû±à³ÌµÄ·¢Õ¹ºÍÓ¦ÓÃ,Ò²µ®ÉúÁ˺ܶàÓÅÐãµÄJava
NIO¿ò¼Ü£¬ÀýÈçApacheµÄMina¡¢ÒÔ¼°µ±Ç°·Ç³£Á÷ÐеÄNetty¡£
Java NIOÀà¿âµÄ¹¤×÷ÔÀíÈçÏÂËùʾ£º

ͼ1-3 Java NIOÀà¿â¹¤×÷ÔÀí
ÔÚJava NIOÀà¿âÖУ¬×îÖØÒªµÄ¾ÍÊǶà·¸´ÓÃÆ÷Selector£¬ËüÊÇJava NIO±à³ÌµÄ»ù´¡£¬ÊìÁ·µØÕÆÎÕSelector¶ÔÓÚÕÆÎÕNIO±à³ÌÖÁ¹ØÖØÒª¡£¶à·¸´ÓÃÆ÷ÌṩѡÔñÒѾ¾ÍÐ÷µÄÈÎÎñµÄÄÜÁ¦¡£¼òµ¥À´½²£¬Selector»á²»¶ÏµØÂÖѯע²áÔÚÆäÉϵÄChannel£¬Èç¹ûij¸öChannelÉÏÃæÓÐеÄTCPÁ¬½Ó½ÓÈë¡¢¶ÁºÍдʼþ£¬Õâ¸öChannel¾Í´¦ÓÚ¾ÍÐ÷״̬£¬»á±»SelectorÂÖѯ³öÀ´£¬È»ºóͨ¹ýSelectionKey¿ÉÒÔ»ñÈ¡¾ÍÐ÷ChannelµÄ¼¯ºÏ£¬½øÐкóÐøµÄI/O²Ù×÷¡£Í¨³£Ò»¸öI/OÏ̻߳á¾ÛºÏÒ»¸öSelector£¬Ò»¸öSelector¿ÉÒÔͬʱע²áN¸öChannel,ÕâÑùµ¥¸öI/OÏ߳̾ͿÉÒÔͬʱ²¢·¢´¦Àí¶à¸ö¿Í»§¶ËÁ¬½Ó¡£ÁíÍ⣬ÓÉÓÚI/O²Ù×÷ÊÇ·Ç×èÈûµÄ£¬Òò´ËÒ²²»»áÊÜÏÞÓÚÍøÂçËٶȺͶԷ½¶ËµãµÄ´¦ÀíʱÑÓ£¬¿É¿¿ÐÔºÍЧÂʶ¼µÃµ½Á˺ܴóÌáÉý¡£
µäÐ͵ÄNIOÏß³ÌÄ£ÐÍ£¨Reactorģʽ£©ÈçÏÂËùʾ£º

ͼ1-4 Java NIOÏß³ÌÄ£ÐÍʾÀý£¨Reactorģʽ£©
1.3. RPCÐÔÄÜÈýÔÔò
Ó°ÏìRPC¿ò¼ÜÐÔÄܵÄÈý¸öºËÐÄÒªËØÈçÏ£º
1.I/OÄ£ÐÍ£ºÓÃʲôÑùµÄͨµÀ½«Êý¾Ý·¢Ë͸ø¶Ô·½£¬BIO¡¢NIO»òÕßAIO£¬IOÄ£ÐÍÔںܴó³Ì¶ÈÉϾö¶¨ÁË¿ò¼ÜµÄÐÔÄÜ
2.ÐÒ飺²ÉÓÃʲôÑùµÄͨÐÅÐÒ飬Rest+ JSON»òÕß»ùÓÚTCPµÄ˽Óжþ½øÖÆÐÒé¡£ÐÒéµÄÑ¡Ôñ²»Í¬£¬ÐÔÄÜÄ£ÐÍÒ²²»Í¬¡£Ïà±ÈÓÚ¹«ÓÐÐÒ飬ÄÚ²¿Ë½Óжþ½øÖÆÐÒéµÄÐÔÄÜͨ³£¿ÉÒÔ±»Éè¼ÆµÄ¸üÓÅ
3.Ị̈߳ºÊý¾Ý±¨ÈçºÎ¶ÁÈ¡£¿¶Áȡ֮ºóµÄ±à½âÂëÔÚÄĸöÏ߳̽øÐУ¬±à½âÂëºóµÄÏûÏ¢ÈçºÎÅÉ·¢£¬Í¨ÐÅÏß³ÌÄ£Ð͵IJ»Í¬£¬¶ÔÐÔÄܵÄÓ°ÏìÒ²·Ç³£´ó

ͼ1-5 RPCÐÔÄÜÈýÒªËØ
ÔÚÒÔÉÏÈý¸öÒªËØÖУ¬Ïß³ÌÄ£ÐͶÔÐÔÄܵÄÓ°Ïì·Ç³£´ó¡£Ëæ×ÅÓ²¼þÐÔÄܵÄÌáÉý£¬CPUµÄºËÊýÔ½À´Ô½Ô½¶à£¬ºÜ¶à·þÎñÆ÷±êÅäÒѾ´ïµ½32»ò64ºË¡£Í¨¹ý¶àÏ̲߳¢·¢±à³Ì£¬¿ÉÒÔ³ä·ÖÀûÓöàºËCPUµÄ´¦ÀíÄÜÁ¦£¬ÌáÉýϵͳµÄ´¦ÀíЧÂʺͲ¢·¢ÐÔÄÜ¡£µ«ÊÇÈç¹ûÏ̴߳´½¨»òÕß¹ÜÀí²»µ±£¬Æµ·±·¢ÉúÏß³ÌÉÏÏÂÎÄÇл»»òÕßËø¾ºÕù£¬·´¶ø»áÓ°ÏìϵͳµÄÐÔÄÜ¡£
Ïß³ÌÄ£Ð͵ÄÓÅÁÓÖ±½ÓÓ°ÏìÁËRPC¿ò¼ÜµÄÐÔÄܺͲ¢·¢ÄÜÁ¦£¬ËüÒ²ÊÇ´ó¼ÒÑ¡ÐÍʱ±È½Ï¹ØÐĵļ¼Êõϸ½ÚÖ®Ò»¡£ÏÂÃæÎÒÃÇÒ»ÆðÀ´·ÖÎöºÍѧϰÏÂgRPCµÄÏß³ÌÄ£ÐÍ¡£
2. gRPCÏß³ÌÄ£ÐÍ·ÖÎö
gRPCµÄÏß³ÌÄ£ÐÍÖ÷Òª°üÀ¨·þÎñ¶ËÏß³ÌÄ£ÐͺͿͻ§¶ËÏß³ÌÄ£ÐÍ£¬ÆäÖзþÎñ¶ËÏß³ÌÄ£ÐÍÖ÷Òª°üÀ¨£º
1.·þÎñ¶Ë¼àÌýºÍ¿Í»§¶Ë½ÓÈëỊ̈߳¨HTTP /2 Acceptor£©
2.ÍøÂçI/O¶ÁдÏß³Ì
3.·þÎñ½Ó¿Úµ÷ÓÃÏß³Ì
4.¿Í»§¶ËÏß³ÌÄ£ÐÍÖ÷Òª°üÀ¨£º
5.¿Í»§¶ËÁ¬½ÓỊ̈߳¨HTTP/2 Connector£©
6.ÍøÂçI/O¶ÁдÏß³Ì
7.½Ó¿Úµ÷ÓÃÏß³Ì
8.ÏìÓ¦»Øµ÷֪ͨÏß³Ì
2.1. ·þÎñ¶ËÏß³ÌÄ£ÐÍ
gRPC·þÎñ¶ËÏß³ÌÄ£ÐÍÕûÌåÉÏ¿ÉÒÔ·ÖΪÁ½´óÀࣺ
1.ÍøÂçͨÐÅÏà¹ØµÄÏß³ÌÄ£ÐÍ£¬»ùÓÚNetty4.1µÄÏß³ÌÄ£ÐÍʵÏÖ
2.·þÎñ½Ó¿Úµ÷ÓÃÏß³ÌÄ£ÐÍ£¬»ùÓÚJDKÏ̳߳ØÊµÏÖ
2.1.1. ·þÎñ¶ËÏß³ÌÄ£Ð͸ÅÊö
gRPC·þÎñ¶ËÏß³ÌÄ£Ðͺͽ»»¥Í¼ÈçÏÂËùʾ£º

ͼ2-1 gRPC·þÎñ¶ËÏß³ÌÄ£ÐÍ
ÆäÖУ¬HTTP/2·þÎñ¶Ë´´½¨¡¢HTTP/2ÇëÇóÏûÏ¢µÄ½ÓÈëºÍÏìÓ¦·¢ËͶ¼ÓÉNetty¸ºÔð£¬gRPCÏûÏ¢µÄÐòÁл¯ºÍ·´ÐòÁл¯¡¢ÒÔ¼°Ó¦Ó÷þÎñ½Ó¿ÚµÄµ÷ÓÃÓÉgRPCµÄSerializingExecutorÏ̳߳ظºÔð¡£
2.1.2. I/OͨÐÅÏß³ÌÄ£ÐÍ
gRPCµÄ×ö·¨ÊÇ·þÎñ¶Ë¼àÌýÏ̺߳ÍI/OÏ̷߳ÖÀëµÄReactor¶àÏß³ÌÄ£ÐÍ£¬ËüµÄ´úÂëÈçÏÂËùʾ£º

ËüµÄ¹¤×÷ÔÀíÈçÏ£º

ͼ2-2 gRPC·þÎñ¶Ë´´½¨
Á÷³ÌÈçÏ£º
²½Öè1£ºÒµÎñÏ̷߳¢Æð´´½¨·þÎñ¶Ë²Ù×÷£¬ÔÚ´´½¨·þÎñ¶ËµÄʱºòʵÀý»¯ÁË2¸öEventLoopGroup£¬1¸öEventLoopGroupʵ¼Ê¾ÍÊÇÒ»¸öEventLoopÏß³Ì×飬¸ºÔð¹ÜÀíEventLoopµÄÉêÇëºÍÊÍ·Å¡£
EventLoopGroup¹ÜÀíµÄÏß³ÌÊý¿ÉÒÔͨ¹ý¹¹Ô캯ÊýÉèÖã¬Èç¹ûûÓÐÉèÖã¬Ä¬ÈÏÈ¡-Dio.netty.eventLoopThreads£¬Èç¹û¸Ãϵͳ²ÎÊýҲûÓÐÖ¸¶¨£¬ÔòΪ¿ÉÓõÄCPUÄÚºË*2¡£bossGroupÏß³Ì×éʵ¼Ê¾ÍÊÇAcceptorÏ̳߳أ¬¸ºÔð´¦Àí¿Í»§¶ËµÄTCPÁ¬½ÓÇëÇó£¬Èç¹ûϵͳֻÓÐÒ»¸ö·þÎñ¶Ë¶Ë¿ÚÐèÒª¼àÌý£¬Ôò½¨ÒébossGroupÏß³Ì×éÏß³ÌÊýÉèÖÃΪ1¡£workerGroupÊÇÕæÕý¸ºÔðI/O¶Áд²Ù×÷µÄÏß³Ì×飬ͨ¹ýServerBootstrapµÄgroup·½·¨½øÐÐÉèÖã¬ÓÃÓÚºóÐøµÄChannel°ó¶¨¡£
²½Öè2£º·þÎñ¶ËSelectorÂÖѯ£¬¼àÌý¿Í»§¶ËÁ¬½Ó£¬´úÂëʾÀýÈçÏ£º

²½Öè3£ºÈç¹û¼àÌýµ½¿Í»§¶ËÁ¬½Ó£¬Ôò´´½¨¿Í»§¶ËSocketChannelÁ¬½Ó£¬´ÓworkerGroupÖÐËæ»úÑ¡ÔñÒ»¸öNioEventLoopỊ̈߳¬½«SocketChannel×¢²áµ½¸ÃÏ̳߳ÖÓеÄSelector£¬´úÂëʾÀýÈçÏ£º

²½Öè4£ºÍ¨¹ýµ÷ÓÃEventLoopGroupµÄnext()»ñȡһ¸öEventLoop£¨NioEventLoop£©£¬ÓÃÓÚ´¦ÀíÍøÂçI/Oʼþ¡£
NettyÏß³ÌÄ£Ð͵ĺËÐÄÊÇNioEventLoop£¬ËüµÄÖ°ÔðÈçÏ£º
1.×÷Ϊ·þÎñ¶ËAcceptorỊ̈߳¬¸ºÔð´¦Àí¿Í»§¶ËµÄÇëÇó½ÓÈë
2.×÷ΪI/OỊ̈߳¬¼àÌýÍøÂç¶Á²Ù×÷룬¸ºÔð´ÓSocketChannelÖжÁÈ¡±¨ÎÄ
3.×÷ΪI/OỊ̈߳¬¸ºÔðÏòSocketChannelдÈ뱨ÎÄ·¢Ë͸ø¶Ô·½£¬Èç¹û·¢Éúд°ë°ü£¬»á×Ô¶¯×¢²á¼àÌýдʼþ£¬ÓÃÓÚºóÐø¼ÌÐø·¢ËͰë°üÊý¾Ý£¬Ö±µ½Êý¾ÝÈ«²¿·¢ËÍÍê³É
4.×÷Ϊ¶¨Ê±ÈÎÎñỊ̈߳¬¿ÉÒÔÖ´Ðж¨Ê±ÈÎÎñ£¬ÀýÈçÁ´Â·¿ÕÏмì²âºÍ·¢ËÍÐÄÌøÏûÏ¢µÈ
5.×÷ΪÏß³ÌÖ´ÐÐÆ÷¿ÉÒÔÖ´ÐÐÆÕͨµÄÈÎÎñỊ̈߳¨Runnable£©
NioEventLoop´¦ÀíÍøÂçI/O²Ù×÷µÄÏà¹Ø´úÂëÈçÏ£º

³ýÁË´¦ÀíI/O²Ù×÷£¬NioEventLoopÒ²¿ÉÒÔÖ´ÐÐRunnableºÍ¶¨Ê±ÈÎÎñ¡£NioEventLoop¼Ì³ÐSingleThreadEventExecutor£¬Õâ¾ÍÒâζ×ÅËüʵ¼ÊÉÏÊÇÒ»¸öÏ̸߳öÊýΪ1µÄÏ̳߳أ¬Àà¼Ì³Ð¹ØÏµÈçÏÂËùʾ£º

SingleThreadEventExecutor¾ÛºÏÁËJDKµÄjava.util.concurrent.ExecutorºÍÏûÏ¢¶ÓÁÐQueue£¬×Ô¶¨ÒåÌṩÏ̳߳ع¦ÄÜ£¬Ïà¹Ø´úÂëÈçÏ£º

Ö±½Óµ÷ÓÃNioEventLoopµÄexecute(Runnable task)·½·¨¼´¿ÉÖ´ÐÐ×Ô¶¨ÒåµÄTask£¬´úÂëʾÀýÈçÏ£º

³ýÁËSingleThreadEventExecutor£¬NioEventLoopͬʱʵÏÖÁËScheduledExecutorService½Ó¿Ú£¬ÕâÒâζ×ÅËüÒ²¿ÉÒÔÖ´Ðж¨Ê±ÈÎÎñ£¬Ïà¹Ø½Ó¿Ú¶¨ÒåÈçÏ£º

ΪÁË·ÀÖ¹´óÁ¿RunnableºÍ¶¨Ê±ÈÎÎñÖ´ÐÐÓ°ÏìÍøÂçI/OµÄ´¦ÀíЧÂÊ£¬NettyÌṩÁËÒ»¸öÅäÖÃÏioRatio£¬ÓÃÓÚÉèÖÃI/O²Ù×÷ºÍÆäËüÈÎÎñÖ´ÐеÄʱ¼ä±ÈÀý£¬Ä¬ÈÏΪ50%£¬Ïà¹Ø´úÂëʾÀýÈçÏ£º

NioEventLoopͬʱ֧³ÖI/O²Ù×÷ºÍRunnableÖ´ÐеÄÔÒòÈçÏ£º±ÜÃâËø¾ºÕù£¬ÀýÈçÐÄÌø¼ì²â£¬ÍùÍùÐèÒªÖÜÆÚÐÔµÄÖ´ÐУ¬Èç¹ûNioEventLoop²»Ö§³Ö¶¨Ê±ÈÎÎñÖ´ÐУ¬ÔòÓû§ÐèÒª×Ô¼º´´½¨Ò»¸öÀàËÆScheduledExecutorServiceµÄ¶¨Ê±ÈÎÎñÏ̳߳ػòÕß¶¨Ê±ÈÎÎñỊ̈߳¬ÖÜÆÚÐԵķ¢ËÍÐÄÌø£¬·¢ËÍÐÄÌøÐèÒªÍøÂç²Ù×÷£¬¾ÍÒª¸úI/OÏß³ÌËù³ÖÓеÄ×ÊÔ´½øÐн»»¥£¬ÀýÈçHandler¡¢ByteBuf¡¢NioSocketChannelµÈ£¬ÕâÑù¾Í»á²úÉúËø¾ºÕù£¬ÐèÒª¿¼ÂDz¢·¢°²È«ÎÊÌâ¡£ÔÀíÈçÏ£º

ͼ2-3 NioEventLoopËø¾ºÕùʾÀý
2.1.3. ·þÎñµ÷¶ÈÏß³ÌÄ£ÐÍ
gRPC·þÎñµ÷¶ÈÏß³ÌÖ÷ÒªÖ°ÔðÈçÏ£º
1.ÇëÇóÏûÏ¢µÄ·´ÐòÁл¯£¬Ö÷Òª°üÀ¨£ºHTTP/2 HeaderµÄ·´ÐòÁл¯£¬ÒÔ¼°½«PB(Body)·´ÐòÁл¯ÎªÇëÇó¶ÔÏó
2.·þÎñ½Ó¿ÚµÄµ÷Óã¬method.invoke(·Ç·´Éä»úÖÆ)
3.½«ÏìÓ¦ÏûÏ¢·â×°³ÉWriteQueue.QueuedCommand£¬Ð´Èëµ½Netty
ChannelÖУ¬Í¬Ê±£¬¶ÔÏìÓ¦HeaderºÍBody¶ÔÏó×öÐòÁл¯
4.·þÎñ¶Ëµ÷¶ÈµÄºËÐÄÊÇSerializingExecutor£¬ËüͬʱʵÏÖÁËJDKµÄExecutorºÍRunnable½Ó¿Ú£¬¼ÈÊÇÒ»¸öÏ̳߳أ¬Í¬Ê±Ò²ÊÇÒ»¸öTask¡£
SerializingExecutor¾ÛºÏÁËJDKµÄExecutor£¬ÓÉExecutor¸ºÔðRunnableµÄÖ´ÐУ¬´úÂëʾÀýÈçÏ£º

ÆäÖУ¬ExecutorĬÈÏʹÓõÄÊÇJDKµÄCachedThreadPool£¬ÔÚ¹¹½¨ServerImplµÄʱºò½øÐгõʼ»¯£¬´úÂëÈçÏ£º

µ±·þÎñ¶Ë½ÓÊÕµ½¿Í»§¶ËHTTP/2ÇëÇóÏûϢʱ£¬ÓÉNettyµÄNioEventLoopÏß³ÌÇл»µ½gRPCµÄSerializingExecutor£¬½øÐÐÏûÏ¢µÄ·´ÐòÁл¯¡¢ÒÔ¼°·þÎñ½Ó¿ÚµÄµ÷Ó㬴úÂëʾÀýÈçÏ£º

Ïà¹ØµÄµ÷ÓöÑÕ»£¬Ê¾ÀýÈçÏ£º

ÏìÓ¦ÏûÏ¢µÄ·¢ËÍ£¬ÓÉSerializingExecutor·¢Æð£¬½«ÏìÓ¦ÏûϢͷºÍÏûÏ¢ÌåÐòÁл¯£¬È»ºó·Ö±ð·â×°³ÉSendResponseHeadersCommandºÍSendGrpcFrameCommand£¬µ÷ÓÃNetty
NioSocketChannleµÄwrite·½·¨£¬·¢Ë͵½NettyµÄChannelPipelineÖУ¬ÓÉgRPCµÄNettyServerHandlerÀ¹½ØÖ®ºó£¬ÕæÕýдÈëµ½SocketChannelÖУ¬´úÂëÈçÏÂËùʾ£º

ÏìÓ¦ÏûÏ¢ÌåµÄ·¢ËͶÑÕ»ÈçÏÂËùʾ£º

Netty I/OÏ̺߳ͷþÎñµ÷¶ÈÏ̵߳ÄÔËÐзֹ¤½çÃæÒÔ¼°Çл»µãÈçÏÂËùʾ£º

ͼ2-4 ÍøÂçI/OÏ̺߳ͷþÎñµ÷¶ÈÏ߳̽»»¥Í¼
ÊÂʵÉÏ£¬ÔÚʵ¼Ê·þÎñ½Ó¿Úµ÷Óùý³ÌÖУ¬NIOÏ̺߳ͷþÎñµ÷ÓÃÏß³ÌÇл»´ÎÊýÔ¶Ô¶³¬¹ý4´Î£¬Æµ·±µÄÏß³ÌÇл»¶ÔgRPCµÄÐÔÄÜ´øÀ´ÁËÒ»¶¨µÄËðºÄ¡£
2.2. ¿Í»§¶ËÏß³ÌÄ£ÐÍ
gRPC¿Í»§¶ËµÄÏß³ÌÖ÷Òª·ÖΪÈýÀࣺ
1.ÒµÎñµ÷ÓÃÏß³Ì
2.¿Í»§¶ËÁ¬½ÓºÍI/O¶ÁдÏß³Ì
3.ÇëÇóÏûÏ¢ÒµÎñ´¦ÀíºÍÏìÓ¦»Øµ÷Ïß³Ì
2.2.1. ¿Í»§¶ËÏß³ÌÄ£Ð͸ÅÊö
gRPC¿Í»§¶ËÏß³ÌÄ£Ð͹¤×÷ÔÀíÈçÏÂͼËùʾ£¨Í¬²½×èÈûµ÷ÓÃΪÀý£©£º

ͼ2-5 ¿Í»§¶Ëµ÷ÓÃÏß³ÌÄ£ÐÍ
¿Í»§¶Ëµ÷ÓÃÖ÷񻃾¼°µÄḬ̈߳üÀ¨£º
1.Ó¦ÓÃỊ̈߳¬¸ºÔðµ÷ÓÃgRPC·þÎñ¶Ë²¢»ñÈ¡ÏìÓ¦£¬ÆäÖÐÇëÇóÏûÏ¢µÄÐòÁл¯ÓɸÃÏ̸߳ºÔð
2..¿Í»§¶Ë¸ºÔؾùºâÒÔ¼°Netty Client´´½¨£¬ÓÉgrpc-default-executorÏ̳߳ظºÔð
3.HTTP/2¿Í»§¶ËÁ´Â·´´½¨¡¢ÍøÂçI/OÊý¾ÝµÄ¶Áд£¬ÓÉNetty
NioEventLoopÏ̸߳ºÔð
4.ÏìÓ¦ÏûÏ¢µÄ·´ÐòÁл¯ÓÉSerializingExecutor¸ºÔð£¬Óë·þÎñ¶Ë²»Í¬µÄÊÇ£¬¿Í»§¶ËʹÓõÄÊÇThreadlessExecutor£¬²¢·ÇJDKÏ̳߳Ø
5.SerializingExecutorͨ¹ýµ÷ÓÃresponseFutureµÄset(value)£¬»½ÐÑ×èÈûµÄÓ¦ÓÃỊ̈߳¬Íê³ÉÒ»´ÎRPCµ÷ÓÃ
2.2.2. I/OͨÐÅÏß³ÌÄ£ÐÍ
Ïà±ÈÓÚ·þÎñ¶Ë£¬¿Í»§¶ËµÄÏß³ÌÄ£Ðͼòµ¥Ò»Ð©£¬ËüµÄ¹¤×÷ÔÀíÈçÏ£º

ͼ2-5 Netty¿Í»§¶ËÏß³ÌÄ£ÐÍ
µÚ1²½£¬ÓÉgrpc-default-executor·¢Æð¿Í»§¶ËÁ¬½Ó£¬Ê¾Àý´úÂëÈçÏ£º

Ïà±ÈÓÚ·þÎñ¶Ë£¬¿Í»§¶ËÖ»ÐèÒª´´½¨Ò»¸öNioEventLoop£¬ÒòΪËü²»ÐèÒª¶ÀÁ¢µÄÏß³ÌÈ¥¼àÌý¿Í»§¶ËÁ¬½Ó£¬Ò²Ã»±ØÒªÍ¨¹ýÒ»¸öµ¥¶ÀµÄ¿Í»§¶ËÏß³ÌÈ¥Á¬½Ó·þÎñ¶Ë¡£NettyÊÇÒ첽ʼþÇý¶¯µÄNIO¿ò¼Ü£¬ËüµÄÁ¬½ÓºÍËùÓÐI/O²Ù×÷¶¼ÊÇ·Ç×èÈûµÄ£¬Òò´Ë²»ÐèÒª´´½¨µ¥¶ÀµÄÁ¬½ÓÏ̡߳£ÁíÍ⣬¿Í»§¶ËʹÓõÄworkÏß³Ì×é²¢·Çͨ³£ÒâÒåµÄEventLoopGroup£¬¶øÊÇÒ»¸öEventLoop£º¼´HTTP/2¿Í»§¶ËʹÓõÄworkÏ̲߳¢·ÇÒ»×éỊ̈߳¨Ä¬ÈÏÏß³ÌÊýΪCPUÄÚºË
* 2£©£¬¶øÊÇÒ»¸öEventLoopÏ̡߳£Õâ¸öÆäʵҲºÜÈÝÒ×Àí½â£¬Ò»¸öNioEventLoopÏ߳̿ÉÒÔͬʱ´¦Àí¶à¸öHTTP/2¿Í»§¶ËÁ¬½Ó£¬ËüÊǶà·¸´Óõ쬶ÔÓÚµ¥¸öHTTP/2¿Í»§¶Ë£¬Èç¹ûĬÈ϶ÀÕ¼Ò»¸öworkÏß³Ì×飬½«Ôì³É¼«´óµÄ×ÊÔ´ÀË·Ñ£¬Í¬Ê±Ò²¿ÉÄܻᵼÖ¾ä±úÒç³ö£¨²¢·¢Æô¶¯´óÁ¿HTTP/2¿Í»§¶Ë£©¡£
µÚ2²½£¬·¢ÆðÁ¬½Ó²Ù×÷£¬ÅжÏÁ¬½Ó½á¹û£¬ÅжÏÁ¬½Ó½á¹û£¬Èç¹ûûÓÐÁ¬½Ó³É¹¦£¬Ôò¼àÌýÁ¬½ÓÍøÂç²Ù×÷λSelectionKey.OP_CONNECT¡£Èç¹ûÁ¬½Ó³É¹¦£¬Ôòµ÷ÓÃpipeline().fireChannelActive()½«¼àÌýλÐÞ¸ÄΪREAD¡£´úÂëÈçÏ£º

µÚ3²½£¬ÓÉNioEventLoopµÄ¶à·¸´ÓÃÆ÷ÂÖѯÁ¬½Ó²Ù×÷½á¹û£¬ÅжÏÁ¬½Ó½á¹û£¬Èç¹û»òÁ¬½Ó³É¹¦£¬ÖØÐÂÉèÖüàÌýλΪREAD£º

µÚ4²½£¬ÓÉNioEventLoopÏ̸߳ºÔðI/O¶Áд£¬Í¬·þÎñ¶Ë¡£
2.2.3. ¿Í»§¶Ëµ÷ÓÃÏß³ÌÄ£ÐÍ
¿Í»§¶Ëµ÷ÓÃÏ߳̽»»¥Á÷³ÌÈçÏÂËùʾ£º

ͼ2-6 ¿Í»§¶ËÏ߳̽»»¥ÔÀíͼ
ÇëÇóÏûÏ¢µÄ·¢ËÍÓÉÓû§Ï̷߳¢Æð£¬Ïà¹Ø´úÂëʾÀýÈçÏ£º

HTTP/2 HeaderµÄ´´½¨¡¢ÒÔ¼°ÇëÇó²ÎÊý·´ÐòÁл¯ÎªProtobuf£¬¾ùÓÉÓû§Ï̸߳ºÔðÍê³É£¬Ïà¹Ø´úÂëʾÀýÈçÏ£º

Óû§Ï߳̽«ÇëÇóÏûÏ¢·â×°³ÉCreateStreamCommandºÍSendGrpcFrameCommand£¬·¢Ë͵½NettyµÄChannelPipelineÖУ¬È»ºó·µ»Ø£¬Íê³ÉÏß³ÌÇл»¡£ºóÐø²Ù×÷ÓÉNetty
NIOÏ̸߳ºÔð£¬Ïà¹Ø´úÂëʾÀýÈçÏ£º

¿Í»§¶ËÏìÓ¦ÏûÏ¢µÄ½ÓÊÕ£¬ÓÉgRPCµÄNettyClientHandler¸ºÔð£¬Ïà¹Ø´úÂëÈçÏÂËùʾ£º

½ÓÊÕµ½HTTP/2ÏìÓ¦Ö®ºó£¬Netty½«ÏûϢͶµÝµ½SerializingExecutor£¬ÓÉSerializingExecutorµÄThreadlessExecutor¸ºÔðÏìÓ¦µÄ·´ÐòÁл¯£¬ÒÔ¼°responseFutureµÄÉèÖµ£¬Ïà¹Ø´úÂëʾÀýÈçÏ£º

3. Ïß³ÌÄ£ÐÍ×ܽá
3.1. Óŵã
3.1.1. NettyÏß³ÌÄ£ÐÍ
Netty4Ö®ºó£¬¶ÔÏß³ÌÄ£ÐͽøÐÐÁËÓÅ»¯£¬Í¨¹ý´®Ðл¯µÄÉè¼Æ±ÜÃâÏ߳̾ºÕù£ºµ±ÏµÍ³ÔÚÔËÐйý³ÌÖУ¬Èç¹ûƵ·±µÄ½øÐÐÏß³ÌÉÏÏÂÎÄÇл»£¬»á´øÀ´¶îÍâµÄÐÔÄÜËðºÄ¡£¶àÏ̲߳¢·¢Ö´ÐÐij¸öÒµÎñÁ÷³Ì£¬ÒµÎñ¿ª·¢Õß»¹ÐèҪʱ¿Ì¶ÔḬ̈߳²È«±£³Ö¾¯Ì裬ÄÄЩÊý¾Ý¿ÉÄܻᱻ²¢·¢Ð޸ģ¬ÈçºÎ±£»¤£¿Õâ²»½ö½µµÍÁË¿ª·¢Ð§ÂÊ£¬Ò²»á´øÀ´¶îÍâµÄÐÔÄÜËðºÄ¡£ÎªÁ˽â¾öÉÏÊöÎÊÌ⣬Netty²ÉÓÃÁË´®Ðл¯Éè¼ÆÀíÄ´ÓÏûÏ¢µÄ¶ÁÈ¡¡¢±àÂëÒÔ¼°ºóÐøHandlerµÄÖ´ÐУ¬Ê¼ÖÕ¶¼ÓÉI/OÏß³ÌNioEventLoop¸ºÔð£¬Õâ¾ÍÒâÍâ×ÅÕû¸öÁ÷³Ì²»»á½øÐÐÏß³ÌÉÏÏÂÎĵÄÇл»£¬Êý¾ÝÒ²²»»áÃæÁÙ±»²¢·¢Ð޸ĵķçÏÕ£¬¶ÔÓÚÓû§¶øÑÔ£¬ÉõÖÁ²»ÐèÒªÁ˽âNettyµÄÏß³Ìϸ½Ú£¬ÕâȷʵÊǸö·Ç³£ºÃµÄÉè¼ÆÀíÄËüµÄ¹¤×÷ÔÀíͼÈçÏ£º

ͼ3-1 NioEventLoop´®ÐÐÖ´ÐÐChannelHandler
Ò»¸öNioEventLoop¾ÛºÏÁËÒ»¸ö¶à·¸´ÓÃÆ÷Selector£¬Òò´Ë¿ÉÒÔ´¦Àí³É°ÙÉÏǧµÄ¿Í»§¶ËÁ¬½Ó£¬NettyµÄ´¦Àí²ßÂÔÊÇÿµ±ÓÐÒ»¸öеĿͻ§¶Ë½ÓÈ룬Ôò´ÓNioEventLoopÏß³Ì×éÖÐ˳Ðò»ñȡһ¸ö¿ÉÓõÄNioEventLoop£¬µ±µ½´ïÊý×éÉÏÏÞÖ®ºó£¬ÖØÐ·µ»Øµ½0£¬Í¨¹ýÕâÖÖ·½Ê½£¬¿ÉÒÔ»ù±¾±£Ö¤¸÷¸öNioEventLoopµÄ¸ºÔؾùºâ¡£Ò»¸ö¿Í»§¶ËÁ¬½ÓÖ»×¢²áµ½Ò»¸öNioEventLoopÉÏ£¬ÕâÑù¾Í±ÜÃâÁ˶à¸öI/OÏß³ÌÈ¥²¢·¢²Ù×÷Ëü¡£
Nettyͨ¹ý´®Ðл¯Éè¼ÆÀíÄî½µµÍÁËÓû§µÄ¿ª·¢ÄѶȣ¬ÌáÉýÁË´¦ÀíÐÔÄÜ¡£ÀûÓÃÏß³Ì×éʵÏÖÁ˶à¸ö´®Ðл¯Ïß³Ìˮƽ²¢ÐÐÖ´ÐУ¬Ïß³ÌÖ®¼ä²¢Ã»Óн»¼¯£¬ÕâÑù¼È¿ÉÒÔ³ä·ÖÀûÓöàºËÌáÉý²¢Ðд¦ÀíÄÜÁ¦£¬Í¬Ê±±ÜÃâÁËÏß³ÌÉÏÏÂÎĵÄÇл»ºÍ²¢·¢±£»¤´øÀ´µÄ¶îÍâÐÔÄÜËðºÄ¡£
Netty 3µÄI/Oʼþ´¦ÀíÁ÷³ÌÈçÏ£º

ͼ3-2 Netty3Ïß³ÌÄ£ÐÍ
Netty 4µÄI/OÏûÏ¢´¦ÀíÁ÷³ÌÈçÏÂËùʾ£º

ͼ3-3 Netty4Ïß³ÌÄ£ÐÍ
Netty 4ÐÞ¸ÄÁËNetty 3µÄÏß³ÌÄ£ÐÍ£ºÔÚNetty 3µÄʱºò£¬upstreamÊÇÔÚI/OÏß³ÌÀïÖ´Ðе쬶ødownstreamÊÇÔÚÒµÎñÏß³ÌÀïÖ´ÐС£µ±Netty´ÓÍøÂç¶Áȡһ¸öÊý¾Ý±¨Í¶µÝ¸øÒµÎñhandlerµÄʱºò£¬handlerÊÇÔÚI/OÏß³ÌÀïÖ´ÐУ»¶øµ±ÎÒÃÇÔÚÒµÎñÏß³ÌÖе÷ÓÃwriteºÍwriteAndFlushÏòÍøÂç·¢ËÍÏûÏ¢µÄʱºò,handlerÊÇÔÚÒµÎñÏß³ÌÀïÖ´ÐУ¬Ö±µ½×îºóÒ»¸öHeader
handler½«ÏûϢдÈëµ½·¢ËͶÓÁÐÖУ¬ÒµÎñÏ̲߳ŷµ»Ø¡£
Netty4ÐÞ¸ÄÁËÕâһģÐÍ£¬ÔÚNetty 4Àïinbound(¶ÔÓ¦Netty 3µÄupstream)ºÍoutbound(¶ÔÓ¦Netty
3µÄdownstream)¶¼ÊÇÔÚNioEventLoop(I/OÏß³Ì)ÖÐÖ´ÐС£µ±ÎÒÃÇÔÚÒµÎñÏß³ÌÀïͨ¹ýChannelHandlerContext.write·¢ËÍÏûÏ¢µÄʱºò£¬Netty
4ÔÚ½«ÏûÏ¢·¢ËÍʼþµ÷¶Èµ½ChannelPipelineµÄʱºò£¬Ê×ÏȽ«´ý·¢Ë͵ÄÏûÏ¢·â×°³ÉÒ»¸öTask£¬È»ºó·Åµ½NioEventLoopµÄÈÎÎñ¶ÓÁÐÖУ¬ÓÉNioEventLoopÏß³ÌÒì²½Ö´ÐС£ºóÐøËùÓÐhandlerµÄµ÷¶ÈºÍÖ´ÐУ¬°üÀ¨ÏûÏ¢µÄ·¢ËÍ¡¢I/OʼþµÄ֪ͨ£¬¶¼ÓÉNioEventLoopÏ̸߳ºÔð´¦Àí¡£
3.1.2. gRPCÏß³ÌÄ£ÐÍ
ÏûÏ¢µÄÐòÁл¯ºÍ·´ÐòÁл¯¾ùÓÉgRPCÏ̸߳ºÔ𣬶øÃ»ÓÐÔÚNettyµÄHandlerÖÐ×öCodeC£¬ÔÒòÈçÏ£ºNetty4ÓÅ»¯ÁËÏß³ÌÄ£ÐÍ£¬ËùÓÐÒµÎñHandler¶¼ÓÉNettyµÄI/OÏ̸߳ºÔð£¬Í¨¹ý´®Ðл¯µÄ·½Ê½Ïû³ýËø¾ºÕù£¬ÔÀíÈçÏÂËùʾ£º

ͼ3-4 Netty4´®ÐÐÖ´ÐÐHandler
Èç¹û´óÁ¿µÄHandler¶¼ÔÚNetty I/OÏß³ÌÖÐÖ´ÐУ¬Ò»µ©Ä³Ð©HandlerÖ´ÐбȽϺÄʱ£¬Ôò¿ÉÄܻᷴÏòÓ°ÏìI/O²Ù×÷µÄÖ´ÐУ¬ÏñÐòÁл¯ºÍ·´ÐòÁл¯²Ù×÷£¬¶¼ÊÇCPUÃܼ¯ÐͲÙ×÷£¬¸üÊʺÏÔÚÒµÎñÓ¦ÓÃÏ̳߳ØÖÐÖ´ÐУ¬ÌáÉý²¢·¢´¦ÀíÄÜÁ¦¡£Òò´Ë£¬gRPC²¢Ã»ÓÐÔÚI/OÏß³ÌÖÐ×öÏûÏ¢µÄÐòÁл¯ºÍ·´ÐòÁл¯¡£
3.2. ¸Ä½øµã˼¿¼
3.2.1. ʱ¼ä¿É¿ØµÄ½Ó¿Úµ÷ÓÃÖ±½ÓÔÚI/OÏß³ÌÉÏ´¦Àí
gRPC²ÉÓõÄÊÇÍøÂçI/OÏ̺߳ÍÒµÎñµ÷ÓÃÏ̷߳ÖÀëµÄ²ßÂÔ£¬´ó²¿·Ö³¡¾°Ï¸òßÂÔÊÇ×îÓŵġ£µ«ÊÇ£¬¶ÔÓÚÄÇЩ½Ó¿ÚÂß¼·Ç³£¼òµ¥£¬Ö´ÐÐʱ¼äºÜ¶Ì£¬²»ÐèÒªÓëÍâ²¿ÍøÔª½»»¥¡¢·ÃÎÊÊý¾Ý¿âºÍ´ÅÅÌ£¬Ò²²»ÐèÒªµÈ´ýÆäËü×ÊÔ´µÄ£¬Ôò½¨Òé½Ó¿Úµ÷ÓÃÖ±½ÓÔÚNetty
/OÏß³ÌÖÐÖ´ÐУ¬²»ÐèÒªÔÙͶµÝµ½ºó¶ËµÄ·þÎñÏ̳߳ء£±ÜÃâÏß³ÌÉÏÏÂÎÄÇл»£¬Í¬Ê±Ò²Ïû³ýÁËÏ̲߳¢·¢ÎÊÌâ¡£
ÀýÈçÌṩÅäÖÃÏî»òÕß½Ó¿Ú£¬ÏµÍ³Ä¬ÈϽ«ÏûϢͶµÝµ½ºó¶Ë·þÎñµ÷¶ÈỊ̈߳¬µ«ÊÇÒ²Ö§³Ö¶Ì·²ßÂÔ£¬Ö±½ÓÔÚNettyµÄNioEventLoopÖÐÖ´ÐÐÏûÏ¢µÄÐòÁл¯ºÍ·´ÐòÁл¯¡¢ÒÔ¼°·þÎñ½Ó¿Úµ÷Óá£
3.2.2. ¼õÉÙËø¾ºÕù
µ±Ç°gRPCµÄÏß³ÌÇл»²ßÂÔÈçÏ£º

ͼ3-4 gRPCÏß³ÌËø¾ºÕù
ÓÅ»¯Ö®ºóµÄgRPCÏß³ÌÇл»²ßÂÔ£º

ͼ3-5 gRPCÏß³ÌËø¾ºÕùÓÅ»¯
ͨ¹ýḬ̈߳󶨼¼Êõ£¨ÀýÈç²ÉÓÃÒ»ÖÂÐÔhash×öÓ³É䣩,½«NettyµÄI/OÏß³ÌÓëºó¶ËµÄ·þÎñµ÷¶ÈÏß³Ì×ö°ó¶¨£¬1¸öI/OḬ̈߳ó¶¨Ò»¸ö»òÕß¶à¸ö·þÎñµ÷ÓÃỊ̈߳¬½µµÍËø¾ºÕù£¬ÌáÉýÐÔÄÜ¡£
3.2.3. ¹Ø¼üµã×ܽá
RPCµ÷ÓÃÉæ¼°µÄÖ÷Òª¶ÓÁÐÈçÏ£º
1.NettyµÄÏûÏ¢·¢ËͶÓÁУ¨¿Í»§¶ËºÍ·þÎñ¶Ë¶¼Éæ¼°£©
2.gRPC SerializingExecutorµÄÏûÏ¢¶ÓÁУ¨JDKµÄBlockingQueue£©
3.gRPCÏûÏ¢·¢ËÍÈÎÎñ¶ÓÁÐWriteQueue |