Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
gRPCÏß³ÌÄ£ÐÍ·ÖÎö
 
  16180  次浏览      27
 2017-11-24
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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

   
16180 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù