[{"data":1,"prerenderedAt":8710},["ShallowReactive",2],{"\u002Fposts\u002F39924a5":3,"surround-\u002Fposts\u002F39924a5":8705},{"id":4,"title":5,"body":6,"categories":8679,"date":8681,"description":8682,"draft":8683,"extension":8684,"image":8685,"meta":8686,"navigation":205,"path":8688,"permalink":8688,"published":8689,"readingTime":8690,"recommend":8695,"references":8689,"seo":8696,"sitemap":8697,"stem":8698,"tags":8699,"type":8702,"updated":8703,"__hash__":8704},"content\u002Fposts\u002F2026\u002F重复造轮子之简易RPC框架.md","重复造轮子之简易RPC框架",{"type":7,"value":8,"toc":8647},"minimark",[9,14,19,27,32,35,38,41,44,47,51,54,57,60,63,66,69,73,78,278,282,686,690,1058,1062,1457,1460,1464,1468,1471,1716,1897,1901,1905,1908,2158,2162,2166,2169,2519,2523,2527,2538,2560,2565,2568,2677,2681,2684,3185,3189,3192,3426,3434,3455,3459,3462,3928,3932,3942,4098,4102,4105,4108,4111,4410,4413,4962,4966,4969,5278,5575,5579,5582,6882,6888,7268,7272,7275,7284,7287,8000,8003,8197,8208,8568,8571,8574,8580,8584,8590,8593,8596,8599,8602,8605,8626,8629,8643],[10,11,13],"h2",{"id":12},"rpc框架","RPC框架",[15,16,18],"h3",{"id":17},"什么是-rpc-框架","什么是 RPC 框架",[20,21,22,26],"p",{},[23,24,25],"strong",{},"RPC（Remote Procedure Call，远程过程调用）"," 框架是一种用于实现远程过程调用的软件工具或库。通过RPC框架，开发者可以在分布式系统中，像调用本地函数一样调用远程服务器上的服务。RPC框架负责封装底层的网络通信细节，使得开发者能够以更简单、更高效的方式实现服务之间的调用。",[28,29],"pic",{"caption":30,"src":31},"RPC框架架构图","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777702582565_image.webp",[20,33,34],{},"传统 Java 多模块单体项目需要将各个模块的 jar 包引入，从而实现在 A 模块中调用 B 模块的代码。在 Maven 中通常是父子工程模块，以及兄弟模块直接互相作为依赖导入。",[20,36,37],{},"如果是分布式微服务项目的话，多个服务独立部署在多个服务器中，这些独立的服务之间需要互相通信，调用如果没有 RPC 框架，就是通过 HTTP API 接口请求交互，达到互相通信的目的。",[20,39,40],{},"这样通过接口调用有个最直观的弊端就是需要服务提供方写好接口，调用方写好接口调用代码，然后才能通信，就像前端调用后端接口获取数据一样，开发者需要自己写接口，写调用的代码，不够高效，而且服务之间的通信延迟不够低，网络开销比较大。因此就出现了 RPC 框架，有了 RPC 框架之后，就可以像本地调用普通方法一样，不需要关心底层网络通信，接口调用等细节，本地怎么调用本地方法，就怎么调用其他微服务方法。",[10,42,43],{"id":43},"代码实现",[20,45,46],{},"接下来通过代码来实现一个非常简易的 RPC 框架，先在 IDEA 中创建一个空的模块 dhbxs-rpc，这个模块里分为 4 个子模块，分别是 common（公共模块）、consumer（服务消费者模块）、provider（服务提供者模块）、easy-rpc（rpc 模块）。",[28,48],{"caption":49,"src":50},"项目总览图","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777702806845_image.webp",[15,52,53],{"id":53},"代码结构",[20,55,56],{},"common 模块主要是负责定义实体类和公共接口，也就是我们服务提供者提供哪些服务，先在 common 中定义出来，主要是接口，没有实现类，因为具体的实现是提供者的事。这个的 common 模块也就相当于是 RPC 框架中的注册中心。",[20,58,59],{},"provider 模块主要是提供服务，也就是实现 common 模块中定义的接口，以及后面我们通过 provider 模块启动 rpc 模块。",[20,61,62],{},"consumer 模块就是使用 provider 模块提供的服务，但是 consumer 模块中并不会直接在 Maven 的 pom.xml 中配置依赖于 provider，而是通过 rpc 框架自动调用 provider。",[20,64,65],{},"easy-rpc 模块主要就是实现 rpc 框架的基本功能，我们这里除了注册中心以外，基本功能都会实现。",[15,67,68],{"id":68},"各模块依赖",[28,70],{"caption":71,"src":72},"Maven模块依赖关系图","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777702907529_image.webp",[74,75,77],"h4",{"id":76},"common-模块","common 模块",[79,80,86],"pre",{"className":81,"code":82,"filename":83,"language":84,"meta":85,"style":85},"language-xml shiki shiki-themes catppuccin-latte one-dark-pro","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n    \u003CartifactId>common\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\n\u003C\u002Fproject>\n","pom.xml","xml","",[87,88,89,124,148,159,178,200,207,226,245,264,269],"code",{"__ignoreMap":85},[90,91,94,98,101,105,109,113,116,118,121],"span",{"class":92,"line":93},"line",1,[90,95,97],{"class":96},"sxizN","\u003C?",[90,99,84],{"class":100},"sGF2L",[90,102,104],{"class":103},"sK5Ct"," version",[90,106,108],{"class":107},"sa2x1","=",[90,110,112],{"class":111},"sw_MA","\"1.0\"",[90,114,115],{"class":103}," encoding",[90,117,108],{"class":107},[90,119,120],{"class":111},"\"UTF-8\"",[90,122,123],{"class":96},"?>\n",[90,125,127,130,133,136,140,143,145],{"class":92,"line":126},2,[90,128,129],{"class":96},"\u003C",[90,131,132],{"class":100},"project",[90,134,135],{"class":103}," xmlns",[90,137,139],{"class":138},"sGpC2",":",[90,141,142],{"class":103},"xsi",[90,144,108],{"class":107},[90,146,147],{"class":111},"\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n",[90,149,151,154,156],{"class":92,"line":150},3,[90,152,153],{"class":103},"         xmlns",[90,155,108],{"class":107},[90,157,158],{"class":111},"\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n",[90,160,162,165,167,170,172,175],{"class":92,"line":161},4,[90,163,164],{"class":103},"         xsi",[90,166,139],{"class":138},[90,168,169],{"class":103},"schemaLocation",[90,171,108],{"class":107},[90,173,174],{"class":111},"\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\"",[90,176,177],{"class":96},">\n",[90,179,181,184,187,190,193,196,198],{"class":92,"line":180},5,[90,182,183],{"class":96},"    \u003C",[90,185,186],{"class":100},"modelVersion",[90,188,189],{"class":96},">",[90,191,192],{"class":107},"4.0.0",[90,194,195],{"class":96},"\u003C\u002F",[90,197,186],{"class":100},[90,199,177],{"class":96},[90,201,203],{"class":92,"line":202},6,[90,204,206],{"emptyLinePlaceholder":205},true,"\n",[90,208,210,212,215,217,220,222,224],{"class":92,"line":209},7,[90,211,183],{"class":96},[90,213,214],{"class":100},"groupId",[90,216,189],{"class":96},[90,218,219],{"class":107},"top.dhbxs.rpc",[90,221,195],{"class":96},[90,223,214],{"class":100},[90,225,177],{"class":96},[90,227,229,231,234,236,239,241,243],{"class":92,"line":228},8,[90,230,183],{"class":96},[90,232,233],{"class":100},"artifactId",[90,235,189],{"class":96},[90,237,238],{"class":107},"common",[90,240,195],{"class":96},[90,242,233],{"class":100},[90,244,177],{"class":96},[90,246,248,250,253,255,258,260,262],{"class":92,"line":247},9,[90,249,183],{"class":96},[90,251,252],{"class":100},"version",[90,254,189],{"class":96},[90,256,257],{"class":107},"1.0-SNAPSHOT",[90,259,195],{"class":96},[90,261,252],{"class":100},[90,263,177],{"class":96},[90,265,267],{"class":92,"line":266},10,[90,268,206],{"emptyLinePlaceholder":205},[90,270,272,274,276],{"class":92,"line":271},11,[90,273,195],{"class":96},[90,275,132],{"class":100},[90,277,177],{"class":96},[74,279,281],{"id":280},"provider-模块","provider 模块",[79,283,285],{"className":81,"code":284,"filename":83,"language":84,"meta":85,"style":85},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n    \u003CartifactId>provider\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\n    \u003Cdependencies>\n      \u003Cdependency>\n            \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n            \u003CartifactId>common\u003C\u002FartifactId>\n            \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n            \u003CartifactId>easy-rpc\u003C\u002FartifactId>\n            \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n            \u003CartifactId>lombok\u003C\u002FartifactId>\n            \u003Cversion>1.18.44\u003C\u002Fversion>\n            \u003Cscope>provided\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\n\u003C\u002Fproject>\n",[87,286,287,307,323,331,345,361,365,381,398,414,418,427,438,456,473,490,500,510,527,545,562,571,580,598,616,634,653,662,672,677],{"__ignoreMap":85},[90,288,289,291,293,295,297,299,301,303,305],{"class":92,"line":93},[90,290,97],{"class":96},[90,292,84],{"class":100},[90,294,104],{"class":103},[90,296,108],{"class":107},[90,298,112],{"class":111},[90,300,115],{"class":103},[90,302,108],{"class":107},[90,304,120],{"class":111},[90,306,123],{"class":96},[90,308,309,311,313,315,317,319,321],{"class":92,"line":126},[90,310,129],{"class":96},[90,312,132],{"class":100},[90,314,135],{"class":103},[90,316,139],{"class":138},[90,318,142],{"class":103},[90,320,108],{"class":107},[90,322,147],{"class":111},[90,324,325,327,329],{"class":92,"line":150},[90,326,153],{"class":103},[90,328,108],{"class":107},[90,330,158],{"class":111},[90,332,333,335,337,339,341,343],{"class":92,"line":161},[90,334,164],{"class":103},[90,336,139],{"class":138},[90,338,169],{"class":103},[90,340,108],{"class":107},[90,342,174],{"class":111},[90,344,177],{"class":96},[90,346,347,349,351,353,355,357,359],{"class":92,"line":180},[90,348,183],{"class":96},[90,350,186],{"class":100},[90,352,189],{"class":96},[90,354,192],{"class":107},[90,356,195],{"class":96},[90,358,186],{"class":100},[90,360,177],{"class":96},[90,362,363],{"class":92,"line":202},[90,364,206],{"emptyLinePlaceholder":205},[90,366,367,369,371,373,375,377,379],{"class":92,"line":209},[90,368,183],{"class":96},[90,370,214],{"class":100},[90,372,189],{"class":96},[90,374,219],{"class":107},[90,376,195],{"class":96},[90,378,214],{"class":100},[90,380,177],{"class":96},[90,382,383,385,387,389,392,394,396],{"class":92,"line":228},[90,384,183],{"class":96},[90,386,233],{"class":100},[90,388,189],{"class":96},[90,390,391],{"class":107},"provider",[90,393,195],{"class":96},[90,395,233],{"class":100},[90,397,177],{"class":96},[90,399,400,402,404,406,408,410,412],{"class":92,"line":247},[90,401,183],{"class":96},[90,403,252],{"class":100},[90,405,189],{"class":96},[90,407,257],{"class":107},[90,409,195],{"class":96},[90,411,252],{"class":100},[90,413,177],{"class":96},[90,415,416],{"class":92,"line":266},[90,417,206],{"emptyLinePlaceholder":205},[90,419,420,422,425],{"class":92,"line":271},[90,421,183],{"class":96},[90,423,424],{"class":100},"dependencies",[90,426,177],{"class":96},[90,428,430,433,436],{"class":92,"line":429},12,[90,431,432],{"class":96},"      \u003C",[90,434,435],{"class":100},"dependency",[90,437,177],{"class":96},[90,439,441,444,446,448,450,452,454],{"class":92,"line":440},13,[90,442,443],{"class":96},"            \u003C",[90,445,214],{"class":100},[90,447,189],{"class":96},[90,449,219],{"class":107},[90,451,195],{"class":96},[90,453,214],{"class":100},[90,455,177],{"class":96},[90,457,459,461,463,465,467,469,471],{"class":92,"line":458},14,[90,460,443],{"class":96},[90,462,233],{"class":100},[90,464,189],{"class":96},[90,466,238],{"class":107},[90,468,195],{"class":96},[90,470,233],{"class":100},[90,472,177],{"class":96},[90,474,476,478,480,482,484,486,488],{"class":92,"line":475},15,[90,477,443],{"class":96},[90,479,252],{"class":100},[90,481,189],{"class":96},[90,483,257],{"class":107},[90,485,195],{"class":96},[90,487,252],{"class":100},[90,489,177],{"class":96},[90,491,493,496,498],{"class":92,"line":492},16,[90,494,495],{"class":96},"        \u003C\u002F",[90,497,435],{"class":100},[90,499,177],{"class":96},[90,501,503,506,508],{"class":92,"line":502},17,[90,504,505],{"class":96},"        \u003C",[90,507,435],{"class":100},[90,509,177],{"class":96},[90,511,513,515,517,519,521,523,525],{"class":92,"line":512},18,[90,514,443],{"class":96},[90,516,214],{"class":100},[90,518,189],{"class":96},[90,520,219],{"class":107},[90,522,195],{"class":96},[90,524,214],{"class":100},[90,526,177],{"class":96},[90,528,530,532,534,536,539,541,543],{"class":92,"line":529},19,[90,531,443],{"class":96},[90,533,233],{"class":100},[90,535,189],{"class":96},[90,537,538],{"class":107},"easy-rpc",[90,540,195],{"class":96},[90,542,233],{"class":100},[90,544,177],{"class":96},[90,546,548,550,552,554,556,558,560],{"class":92,"line":547},20,[90,549,443],{"class":96},[90,551,252],{"class":100},[90,553,189],{"class":96},[90,555,257],{"class":107},[90,557,195],{"class":96},[90,559,252],{"class":100},[90,561,177],{"class":96},[90,563,565,567,569],{"class":92,"line":564},21,[90,566,495],{"class":96},[90,568,435],{"class":100},[90,570,177],{"class":96},[90,572,574,576,578],{"class":92,"line":573},22,[90,575,505],{"class":96},[90,577,435],{"class":100},[90,579,177],{"class":96},[90,581,583,585,587,589,592,594,596],{"class":92,"line":582},23,[90,584,443],{"class":96},[90,586,214],{"class":100},[90,588,189],{"class":96},[90,590,591],{"class":107},"org.projectlombok",[90,593,195],{"class":96},[90,595,214],{"class":100},[90,597,177],{"class":96},[90,599,601,603,605,607,610,612,614],{"class":92,"line":600},24,[90,602,443],{"class":96},[90,604,233],{"class":100},[90,606,189],{"class":96},[90,608,609],{"class":107},"lombok",[90,611,195],{"class":96},[90,613,233],{"class":100},[90,615,177],{"class":96},[90,617,619,621,623,625,628,630,632],{"class":92,"line":618},25,[90,620,443],{"class":96},[90,622,252],{"class":100},[90,624,189],{"class":96},[90,626,627],{"class":107},"1.18.44",[90,629,195],{"class":96},[90,631,252],{"class":100},[90,633,177],{"class":96},[90,635,637,639,642,644,647,649,651],{"class":92,"line":636},26,[90,638,443],{"class":96},[90,640,641],{"class":100},"scope",[90,643,189],{"class":96},[90,645,646],{"class":107},"provided",[90,648,195],{"class":96},[90,650,641],{"class":100},[90,652,177],{"class":96},[90,654,656,658,660],{"class":92,"line":655},27,[90,657,495],{"class":96},[90,659,435],{"class":100},[90,661,177],{"class":96},[90,663,665,668,670],{"class":92,"line":664},28,[90,666,667],{"class":96},"    \u003C\u002F",[90,669,424],{"class":100},[90,671,177],{"class":96},[90,673,675],{"class":92,"line":674},29,[90,676,206],{"emptyLinePlaceholder":205},[90,678,680,682,684],{"class":92,"line":679},30,[90,681,195],{"class":96},[90,683,132],{"class":100},[90,685,177],{"class":96},[74,687,689],{"id":688},"consumer-模块","consumer 模块",[79,691,693],{"className":81,"code":692,"filename":83,"language":84,"meta":85,"style":85},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n    \u003CartifactId>consumer\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n            \u003CartifactId>easy-rpc\u003C\u002FartifactId>\n            \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n            \u003CartifactId>common\u003C\u002FartifactId>\n            \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n            \u003CartifactId>lombok\u003C\u002FartifactId>\n            \u003Cversion>1.18.44\u003C\u002Fversion>\n            \u003Cscope>provided\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\u003C\u002Fproject>\n",[87,694,695,715,731,739,753,769,773,789,806,822,826,834,842,858,874,890,898,906,922,938,954,962,970,986,1002,1018,1034,1042,1050],{"__ignoreMap":85},[90,696,697,699,701,703,705,707,709,711,713],{"class":92,"line":93},[90,698,97],{"class":96},[90,700,84],{"class":100},[90,702,104],{"class":103},[90,704,108],{"class":107},[90,706,112],{"class":111},[90,708,115],{"class":103},[90,710,108],{"class":107},[90,712,120],{"class":111},[90,714,123],{"class":96},[90,716,717,719,721,723,725,727,729],{"class":92,"line":126},[90,718,129],{"class":96},[90,720,132],{"class":100},[90,722,135],{"class":103},[90,724,139],{"class":138},[90,726,142],{"class":103},[90,728,108],{"class":107},[90,730,147],{"class":111},[90,732,733,735,737],{"class":92,"line":150},[90,734,153],{"class":103},[90,736,108],{"class":107},[90,738,158],{"class":111},[90,740,741,743,745,747,749,751],{"class":92,"line":161},[90,742,164],{"class":103},[90,744,139],{"class":138},[90,746,169],{"class":103},[90,748,108],{"class":107},[90,750,174],{"class":111},[90,752,177],{"class":96},[90,754,755,757,759,761,763,765,767],{"class":92,"line":180},[90,756,183],{"class":96},[90,758,186],{"class":100},[90,760,189],{"class":96},[90,762,192],{"class":107},[90,764,195],{"class":96},[90,766,186],{"class":100},[90,768,177],{"class":96},[90,770,771],{"class":92,"line":202},[90,772,206],{"emptyLinePlaceholder":205},[90,774,775,777,779,781,783,785,787],{"class":92,"line":209},[90,776,183],{"class":96},[90,778,214],{"class":100},[90,780,189],{"class":96},[90,782,219],{"class":107},[90,784,195],{"class":96},[90,786,214],{"class":100},[90,788,177],{"class":96},[90,790,791,793,795,797,800,802,804],{"class":92,"line":228},[90,792,183],{"class":96},[90,794,233],{"class":100},[90,796,189],{"class":96},[90,798,799],{"class":107},"consumer",[90,801,195],{"class":96},[90,803,233],{"class":100},[90,805,177],{"class":96},[90,807,808,810,812,814,816,818,820],{"class":92,"line":247},[90,809,183],{"class":96},[90,811,252],{"class":100},[90,813,189],{"class":96},[90,815,257],{"class":107},[90,817,195],{"class":96},[90,819,252],{"class":100},[90,821,177],{"class":96},[90,823,824],{"class":92,"line":266},[90,825,206],{"emptyLinePlaceholder":205},[90,827,828,830,832],{"class":92,"line":271},[90,829,183],{"class":96},[90,831,424],{"class":100},[90,833,177],{"class":96},[90,835,836,838,840],{"class":92,"line":429},[90,837,505],{"class":96},[90,839,435],{"class":100},[90,841,177],{"class":96},[90,843,844,846,848,850,852,854,856],{"class":92,"line":440},[90,845,443],{"class":96},[90,847,214],{"class":100},[90,849,189],{"class":96},[90,851,219],{"class":107},[90,853,195],{"class":96},[90,855,214],{"class":100},[90,857,177],{"class":96},[90,859,860,862,864,866,868,870,872],{"class":92,"line":458},[90,861,443],{"class":96},[90,863,233],{"class":100},[90,865,189],{"class":96},[90,867,538],{"class":107},[90,869,195],{"class":96},[90,871,233],{"class":100},[90,873,177],{"class":96},[90,875,876,878,880,882,884,886,888],{"class":92,"line":475},[90,877,443],{"class":96},[90,879,252],{"class":100},[90,881,189],{"class":96},[90,883,257],{"class":107},[90,885,195],{"class":96},[90,887,252],{"class":100},[90,889,177],{"class":96},[90,891,892,894,896],{"class":92,"line":492},[90,893,495],{"class":96},[90,895,435],{"class":100},[90,897,177],{"class":96},[90,899,900,902,904],{"class":92,"line":502},[90,901,505],{"class":96},[90,903,435],{"class":100},[90,905,177],{"class":96},[90,907,908,910,912,914,916,918,920],{"class":92,"line":512},[90,909,443],{"class":96},[90,911,214],{"class":100},[90,913,189],{"class":96},[90,915,219],{"class":107},[90,917,195],{"class":96},[90,919,214],{"class":100},[90,921,177],{"class":96},[90,923,924,926,928,930,932,934,936],{"class":92,"line":529},[90,925,443],{"class":96},[90,927,233],{"class":100},[90,929,189],{"class":96},[90,931,238],{"class":107},[90,933,195],{"class":96},[90,935,233],{"class":100},[90,937,177],{"class":96},[90,939,940,942,944,946,948,950,952],{"class":92,"line":547},[90,941,443],{"class":96},[90,943,252],{"class":100},[90,945,189],{"class":96},[90,947,257],{"class":107},[90,949,195],{"class":96},[90,951,252],{"class":100},[90,953,177],{"class":96},[90,955,956,958,960],{"class":92,"line":564},[90,957,495],{"class":96},[90,959,435],{"class":100},[90,961,177],{"class":96},[90,963,964,966,968],{"class":92,"line":573},[90,965,505],{"class":96},[90,967,435],{"class":100},[90,969,177],{"class":96},[90,971,972,974,976,978,980,982,984],{"class":92,"line":582},[90,973,443],{"class":96},[90,975,214],{"class":100},[90,977,189],{"class":96},[90,979,591],{"class":107},[90,981,195],{"class":96},[90,983,214],{"class":100},[90,985,177],{"class":96},[90,987,988,990,992,994,996,998,1000],{"class":92,"line":600},[90,989,443],{"class":96},[90,991,233],{"class":100},[90,993,189],{"class":96},[90,995,609],{"class":107},[90,997,195],{"class":96},[90,999,233],{"class":100},[90,1001,177],{"class":96},[90,1003,1004,1006,1008,1010,1012,1014,1016],{"class":92,"line":618},[90,1005,443],{"class":96},[90,1007,252],{"class":100},[90,1009,189],{"class":96},[90,1011,627],{"class":107},[90,1013,195],{"class":96},[90,1015,252],{"class":100},[90,1017,177],{"class":96},[90,1019,1020,1022,1024,1026,1028,1030,1032],{"class":92,"line":636},[90,1021,443],{"class":96},[90,1023,641],{"class":100},[90,1025,189],{"class":96},[90,1027,646],{"class":107},[90,1029,195],{"class":96},[90,1031,641],{"class":100},[90,1033,177],{"class":96},[90,1035,1036,1038,1040],{"class":92,"line":655},[90,1037,495],{"class":96},[90,1039,435],{"class":100},[90,1041,177],{"class":96},[90,1043,1044,1046,1048],{"class":92,"line":664},[90,1045,667],{"class":96},[90,1047,424],{"class":100},[90,1049,177],{"class":96},[90,1051,1052,1054,1056],{"class":92,"line":674},[90,1053,195],{"class":96},[90,1055,132],{"class":100},[90,1057,177],{"class":96},[74,1059,1061],{"id":1060},"easy-rpc-模块","easy-rpc 模块",[79,1063,1065],{"className":81,"code":1064,"filename":83,"language":84,"meta":85,"style":85},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003Cproject xmlns:xsi=\"http:\u002F\u002Fwww.w3.org\u002F2001\u002FXMLSchema-instance\"\n         xmlns=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0\"\n         xsi:schemaLocation=\"http:\u002F\u002Fmaven.apache.org\u002FPOM\u002F4.0.0 http:\u002F\u002Fmaven.apache.org\u002Fxsd\u002Fmaven-4.0.0.xsd\">\n    \u003CmodelVersion>4.0.0\u003C\u002FmodelVersion>\n\n    \u003CgroupId>top.dhbxs.rpc\u003C\u002FgroupId>\n    \u003CartifactId>easy-rpc\u003C\u002FartifactId>\n    \u003Cversion>1.0-SNAPSHOT\u003C\u002Fversion>\n\n    \u003Cdependencies>\n        \u003Cdependency>\n            \u003CgroupId>io.vertx\u003C\u002FgroupId>\n            \u003CartifactId>vertx-core\u003C\u002FartifactId>\n            \u003Cversion>4.5.1\u003C\u002Fversion>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>cn.hutool\u003C\u002FgroupId>\n            \u003CartifactId>hutool-http\u003C\u002FartifactId>\n            \u003Cversion>5.8.44\u003C\u002Fversion>\n            \u003Cscope>compile\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n        \u003Cdependency>\n            \u003CgroupId>org.projectlombok\u003C\u002FgroupId>\n            \u003CartifactId>lombok\u003C\u002FartifactId>\n            \u003Cversion>1.18.44\u003C\u002Fversion>\n            \u003Cscope>provided\u003C\u002Fscope>\n        \u003C\u002Fdependency>\n    \u003C\u002Fdependencies>\n\n\u003C\u002Fproject>\n",[87,1066,1067,1087,1103,1111,1125,1141,1145,1161,1177,1193,1197,1205,1213,1230,1247,1264,1272,1280,1297,1314,1331,1348,1356,1364,1380,1396,1412,1428,1436,1444,1448],{"__ignoreMap":85},[90,1068,1069,1071,1073,1075,1077,1079,1081,1083,1085],{"class":92,"line":93},[90,1070,97],{"class":96},[90,1072,84],{"class":100},[90,1074,104],{"class":103},[90,1076,108],{"class":107},[90,1078,112],{"class":111},[90,1080,115],{"class":103},[90,1082,108],{"class":107},[90,1084,120],{"class":111},[90,1086,123],{"class":96},[90,1088,1089,1091,1093,1095,1097,1099,1101],{"class":92,"line":126},[90,1090,129],{"class":96},[90,1092,132],{"class":100},[90,1094,135],{"class":103},[90,1096,139],{"class":138},[90,1098,142],{"class":103},[90,1100,108],{"class":107},[90,1102,147],{"class":111},[90,1104,1105,1107,1109],{"class":92,"line":150},[90,1106,153],{"class":103},[90,1108,108],{"class":107},[90,1110,158],{"class":111},[90,1112,1113,1115,1117,1119,1121,1123],{"class":92,"line":161},[90,1114,164],{"class":103},[90,1116,139],{"class":138},[90,1118,169],{"class":103},[90,1120,108],{"class":107},[90,1122,174],{"class":111},[90,1124,177],{"class":96},[90,1126,1127,1129,1131,1133,1135,1137,1139],{"class":92,"line":180},[90,1128,183],{"class":96},[90,1130,186],{"class":100},[90,1132,189],{"class":96},[90,1134,192],{"class":107},[90,1136,195],{"class":96},[90,1138,186],{"class":100},[90,1140,177],{"class":96},[90,1142,1143],{"class":92,"line":202},[90,1144,206],{"emptyLinePlaceholder":205},[90,1146,1147,1149,1151,1153,1155,1157,1159],{"class":92,"line":209},[90,1148,183],{"class":96},[90,1150,214],{"class":100},[90,1152,189],{"class":96},[90,1154,219],{"class":107},[90,1156,195],{"class":96},[90,1158,214],{"class":100},[90,1160,177],{"class":96},[90,1162,1163,1165,1167,1169,1171,1173,1175],{"class":92,"line":228},[90,1164,183],{"class":96},[90,1166,233],{"class":100},[90,1168,189],{"class":96},[90,1170,538],{"class":107},[90,1172,195],{"class":96},[90,1174,233],{"class":100},[90,1176,177],{"class":96},[90,1178,1179,1181,1183,1185,1187,1189,1191],{"class":92,"line":247},[90,1180,183],{"class":96},[90,1182,252],{"class":100},[90,1184,189],{"class":96},[90,1186,257],{"class":107},[90,1188,195],{"class":96},[90,1190,252],{"class":100},[90,1192,177],{"class":96},[90,1194,1195],{"class":92,"line":266},[90,1196,206],{"emptyLinePlaceholder":205},[90,1198,1199,1201,1203],{"class":92,"line":271},[90,1200,183],{"class":96},[90,1202,424],{"class":100},[90,1204,177],{"class":96},[90,1206,1207,1209,1211],{"class":92,"line":429},[90,1208,505],{"class":96},[90,1210,435],{"class":100},[90,1212,177],{"class":96},[90,1214,1215,1217,1219,1221,1224,1226,1228],{"class":92,"line":440},[90,1216,443],{"class":96},[90,1218,214],{"class":100},[90,1220,189],{"class":96},[90,1222,1223],{"class":107},"io.vertx",[90,1225,195],{"class":96},[90,1227,214],{"class":100},[90,1229,177],{"class":96},[90,1231,1232,1234,1236,1238,1241,1243,1245],{"class":92,"line":458},[90,1233,443],{"class":96},[90,1235,233],{"class":100},[90,1237,189],{"class":96},[90,1239,1240],{"class":107},"vertx-core",[90,1242,195],{"class":96},[90,1244,233],{"class":100},[90,1246,177],{"class":96},[90,1248,1249,1251,1253,1255,1258,1260,1262],{"class":92,"line":475},[90,1250,443],{"class":96},[90,1252,252],{"class":100},[90,1254,189],{"class":96},[90,1256,1257],{"class":107},"4.5.1",[90,1259,195],{"class":96},[90,1261,252],{"class":100},[90,1263,177],{"class":96},[90,1265,1266,1268,1270],{"class":92,"line":492},[90,1267,495],{"class":96},[90,1269,435],{"class":100},[90,1271,177],{"class":96},[90,1273,1274,1276,1278],{"class":92,"line":502},[90,1275,505],{"class":96},[90,1277,435],{"class":100},[90,1279,177],{"class":96},[90,1281,1282,1284,1286,1288,1291,1293,1295],{"class":92,"line":512},[90,1283,443],{"class":96},[90,1285,214],{"class":100},[90,1287,189],{"class":96},[90,1289,1290],{"class":107},"cn.hutool",[90,1292,195],{"class":96},[90,1294,214],{"class":100},[90,1296,177],{"class":96},[90,1298,1299,1301,1303,1305,1308,1310,1312],{"class":92,"line":529},[90,1300,443],{"class":96},[90,1302,233],{"class":100},[90,1304,189],{"class":96},[90,1306,1307],{"class":107},"hutool-http",[90,1309,195],{"class":96},[90,1311,233],{"class":100},[90,1313,177],{"class":96},[90,1315,1316,1318,1320,1322,1325,1327,1329],{"class":92,"line":547},[90,1317,443],{"class":96},[90,1319,252],{"class":100},[90,1321,189],{"class":96},[90,1323,1324],{"class":107},"5.8.44",[90,1326,195],{"class":96},[90,1328,252],{"class":100},[90,1330,177],{"class":96},[90,1332,1333,1335,1337,1339,1342,1344,1346],{"class":92,"line":564},[90,1334,443],{"class":96},[90,1336,641],{"class":100},[90,1338,189],{"class":96},[90,1340,1341],{"class":107},"compile",[90,1343,195],{"class":96},[90,1345,641],{"class":100},[90,1347,177],{"class":96},[90,1349,1350,1352,1354],{"class":92,"line":573},[90,1351,495],{"class":96},[90,1353,435],{"class":100},[90,1355,177],{"class":96},[90,1357,1358,1360,1362],{"class":92,"line":582},[90,1359,505],{"class":96},[90,1361,435],{"class":100},[90,1363,177],{"class":96},[90,1365,1366,1368,1370,1372,1374,1376,1378],{"class":92,"line":600},[90,1367,443],{"class":96},[90,1369,214],{"class":100},[90,1371,189],{"class":96},[90,1373,591],{"class":107},[90,1375,195],{"class":96},[90,1377,214],{"class":100},[90,1379,177],{"class":96},[90,1381,1382,1384,1386,1388,1390,1392,1394],{"class":92,"line":618},[90,1383,443],{"class":96},[90,1385,233],{"class":100},[90,1387,189],{"class":96},[90,1389,609],{"class":107},[90,1391,195],{"class":96},[90,1393,233],{"class":100},[90,1395,177],{"class":96},[90,1397,1398,1400,1402,1404,1406,1408,1410],{"class":92,"line":636},[90,1399,443],{"class":96},[90,1401,252],{"class":100},[90,1403,189],{"class":96},[90,1405,627],{"class":107},[90,1407,195],{"class":96},[90,1409,252],{"class":100},[90,1411,177],{"class":96},[90,1413,1414,1416,1418,1420,1422,1424,1426],{"class":92,"line":655},[90,1415,443],{"class":96},[90,1417,641],{"class":100},[90,1419,189],{"class":96},[90,1421,646],{"class":107},[90,1423,195],{"class":96},[90,1425,641],{"class":100},[90,1427,177],{"class":96},[90,1429,1430,1432,1434],{"class":92,"line":664},[90,1431,495],{"class":96},[90,1433,435],{"class":100},[90,1435,177],{"class":96},[90,1437,1438,1440,1442],{"class":92,"line":674},[90,1439,667],{"class":96},[90,1441,424],{"class":100},[90,1443,177],{"class":96},[90,1445,1446],{"class":92,"line":679},[90,1447,206],{"emptyLinePlaceholder":205},[90,1449,1451,1453,1455],{"class":92,"line":1450},31,[90,1452,195],{"class":96},[90,1454,132],{"class":100},[90,1456,177],{"class":96},[15,1458,1459],{"id":1459},"分模块开发",[74,1461,1463],{"id":1462},"common-模块开发","common 模块开发",[28,1465],{"caption":1466,"src":1467},"common公共模块","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777702975942_image.webp",[20,1469,1470],{},"公共模块主要定义一个 model 包，里面定义一个 User 类，模拟从 RPC 框架拿到的数据对象，这个对象就是消费者要消费的对象。然后是一个 UserService 接口，在这个接口中，就简单定义一个获取 User 对象的方法，提供者需要实现这个接口中的方法。",[79,1472,1477],{"className":1473,"code":1474,"filename":1475,"language":1476,"meta":85,"style":85},"language-java shiki shiki-themes catppuccin-latte one-dark-pro","package top.dhbxs.rpc.common.model;\n\nimport java.io.Serializable;\n\n\u002F**\n * 用户\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class User implements Serializable {\n\n    private String name;\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n","User.java","java",[87,1478,1479,1513,1517,1539,1543,1549,1554,1559,1571,1581,1586,1607,1611,1626,1630,1646,1655,1660,1664,1688,1707,1711],{"__ignoreMap":85},[90,1480,1481,1485,1488,1492,1495,1497,1500,1502,1504,1506,1509],{"class":92,"line":93},[90,1482,1484],{"class":1483},"sSWcl","package",[90,1486,1487],{"class":1483}," top",[90,1489,1491],{"class":1490},"sHUla",".",[90,1493,1494],{"class":1483},"dhbxs",[90,1496,1491],{"class":1490},[90,1498,1499],{"class":1483},"rpc",[90,1501,1491],{"class":1490},[90,1503,238],{"class":1483},[90,1505,1491],{"class":1490},[90,1507,1508],{"class":1483},"model",[90,1510,1512],{"class":1511},"sgT6j",";\n",[90,1514,1515],{"class":92,"line":126},[90,1516,206],{"emptyLinePlaceholder":205},[90,1518,1519,1522,1526,1529,1532,1534,1537],{"class":92,"line":150},[90,1520,1521],{"class":1483},"import",[90,1523,1525],{"class":1524},"szf8G"," java",[90,1527,1491],{"class":1528},"sGc2n",[90,1530,1531],{"class":1524},"io",[90,1533,1491],{"class":1528},[90,1535,1536],{"class":1524},"Serializable",[90,1538,1512],{"class":1511},[90,1540,1541],{"class":92,"line":161},[90,1542,206],{"emptyLinePlaceholder":205},[90,1544,1545],{"class":92,"line":180},[90,1546,1548],{"class":1547},"skYY2","\u002F**\n",[90,1550,1551],{"class":92,"line":202},[90,1552,1553],{"class":1547}," * 用户\n",[90,1555,1556],{"class":92,"line":209},[90,1557,1558],{"class":1547}," *\n",[90,1560,1561,1564,1568],{"class":92,"line":228},[90,1562,1563],{"class":1547}," * ",[90,1565,1567],{"class":1566},"szsGz","@author",[90,1569,1570],{"class":1547}," dhbxs\n",[90,1572,1573,1575,1578],{"class":92,"line":247},[90,1574,1563],{"class":1547},[90,1576,1577],{"class":1566},"@since",[90,1579,1580],{"class":1547}," 2026\u002F4\u002F21\n",[90,1582,1583],{"class":92,"line":266},[90,1584,1585],{"class":1547}," *\u002F\n",[90,1587,1588,1591,1594,1598,1601,1604],{"class":92,"line":271},[90,1589,1590],{"class":1483},"public",[90,1592,1593],{"class":1483}," class",[90,1595,1597],{"class":1596},"sIkkJ"," User",[90,1599,1600],{"class":1483}," implements",[90,1602,1603],{"class":1596}," Serializable",[90,1605,1606],{"class":1511}," {\n",[90,1608,1609],{"class":92,"line":429},[90,1610,206],{"emptyLinePlaceholder":205},[90,1612,1613,1616,1620,1624],{"class":92,"line":440},[90,1614,1615],{"class":1483},"    private",[90,1617,1619],{"class":1618},"sPahJ"," String",[90,1621,1623],{"class":1622},"sIGPt"," name",[90,1625,1512],{"class":1511},[90,1627,1628],{"class":92,"line":458},[90,1629,206],{"emptyLinePlaceholder":205},[90,1631,1632,1635,1637,1641,1644],{"class":92,"line":475},[90,1633,1634],{"class":1483},"    public",[90,1636,1619],{"class":1618},[90,1638,1640],{"class":1639},"seVD2"," getName",[90,1642,1643],{"class":1511},"()",[90,1645,1606],{"class":1511},[90,1647,1648,1651,1653],{"class":92,"line":492},[90,1649,1650],{"class":1483},"        return",[90,1652,1623],{"class":107},[90,1654,1512],{"class":1511},[90,1656,1657],{"class":92,"line":502},[90,1658,1659],{"class":1511},"    }\n",[90,1661,1662],{"class":92,"line":512},[90,1663,206],{"emptyLinePlaceholder":205},[90,1665,1666,1668,1671,1674,1677,1680,1683,1686],{"class":92,"line":529},[90,1667,1634],{"class":1483},[90,1669,1670],{"class":1483}," void",[90,1672,1673],{"class":1639}," setName",[90,1675,1676],{"class":1511},"(",[90,1678,1679],{"class":1618},"String",[90,1681,1623],{"class":1682},"sddMY",[90,1684,1685],{"class":1511},")",[90,1687,1606],{"class":1511},[90,1689,1690,1694,1696,1699,1703,1705],{"class":92,"line":547},[90,1691,1693],{"class":1692},"sQee8","        this",[90,1695,1491],{"class":1511},[90,1697,1698],{"class":1524},"name",[90,1700,1702],{"class":1701},"sqgB4"," =",[90,1704,1623],{"class":107},[90,1706,1512],{"class":1511},[90,1708,1709],{"class":92,"line":564},[90,1710,1659],{"class":1511},[90,1712,1713],{"class":92,"line":573},[90,1714,1715],{"class":1511},"}\n",[79,1717,1720],{"className":1473,"code":1718,"filename":1719,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.common.service;\n\nimport top.dhbxs.rpc.common.model.User;\n\n\u002F**\n * 用户相关服务\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic interface UserService {\n\n    \u002F**\n     * 获取用户\n     *\n     * @param user 用户\n     * @return 用户\n     *\u002F\n    User getUser(User user);\n}\n\n","UserService.java",[87,1721,1722,1747,1751,1780,1784,1788,1793,1797,1805,1813,1817,1829,1833,1838,1843,1848,1862,1871,1876,1893],{"__ignoreMap":85},[90,1723,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1745],{"class":92,"line":93},[90,1725,1484],{"class":1483},[90,1727,1487],{"class":1483},[90,1729,1491],{"class":1490},[90,1731,1494],{"class":1483},[90,1733,1491],{"class":1490},[90,1735,1499],{"class":1483},[90,1737,1491],{"class":1490},[90,1739,238],{"class":1483},[90,1741,1491],{"class":1490},[90,1743,1744],{"class":1483},"service",[90,1746,1512],{"class":1511},[90,1748,1749],{"class":92,"line":126},[90,1750,206],{"emptyLinePlaceholder":205},[90,1752,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1778],{"class":92,"line":150},[90,1754,1521],{"class":1483},[90,1756,1487],{"class":1524},[90,1758,1491],{"class":1528},[90,1760,1494],{"class":1524},[90,1762,1491],{"class":1528},[90,1764,1499],{"class":1524},[90,1766,1491],{"class":1528},[90,1768,238],{"class":1524},[90,1770,1491],{"class":1528},[90,1772,1508],{"class":1524},[90,1774,1491],{"class":1528},[90,1776,1777],{"class":1524},"User",[90,1779,1512],{"class":1511},[90,1781,1782],{"class":92,"line":161},[90,1783,206],{"emptyLinePlaceholder":205},[90,1785,1786],{"class":92,"line":180},[90,1787,1548],{"class":1547},[90,1789,1790],{"class":92,"line":202},[90,1791,1792],{"class":1547}," * 用户相关服务\n",[90,1794,1795],{"class":92,"line":209},[90,1796,1558],{"class":1547},[90,1798,1799,1801,1803],{"class":92,"line":228},[90,1800,1563],{"class":1547},[90,1802,1567],{"class":1566},[90,1804,1570],{"class":1547},[90,1806,1807,1809,1811],{"class":92,"line":247},[90,1808,1563],{"class":1547},[90,1810,1577],{"class":1566},[90,1812,1580],{"class":1547},[90,1814,1815],{"class":92,"line":266},[90,1816,1585],{"class":1547},[90,1818,1819,1821,1824,1827],{"class":92,"line":271},[90,1820,1590],{"class":1483},[90,1822,1823],{"class":1483}," interface",[90,1825,1826],{"class":1596}," UserService",[90,1828,1606],{"class":1511},[90,1830,1831],{"class":92,"line":429},[90,1832,206],{"emptyLinePlaceholder":205},[90,1834,1835],{"class":92,"line":440},[90,1836,1837],{"class":1547},"    \u002F**\n",[90,1839,1840],{"class":92,"line":458},[90,1841,1842],{"class":1547},"     * 获取用户\n",[90,1844,1845],{"class":92,"line":475},[90,1846,1847],{"class":1547},"     *\n",[90,1849,1850,1853,1856,1859],{"class":92,"line":492},[90,1851,1852],{"class":1547},"     * ",[90,1854,1855],{"class":1566},"@param",[90,1857,1858],{"class":1682}," user",[90,1860,1861],{"class":1547}," 用户\n",[90,1863,1864,1866,1869],{"class":92,"line":502},[90,1865,1852],{"class":1547},[90,1867,1868],{"class":1566},"@return",[90,1870,1861],{"class":1547},[90,1872,1873],{"class":92,"line":512},[90,1874,1875],{"class":1547},"     *\u002F\n",[90,1877,1878,1881,1884,1886,1888,1890],{"class":92,"line":529},[90,1879,1880],{"class":1618},"    User",[90,1882,1883],{"class":1639}," getUser",[90,1885,1676],{"class":1511},[90,1887,1777],{"class":1618},[90,1889,1858],{"class":1682},[90,1891,1892],{"class":1511},");\n",[90,1894,1895],{"class":92,"line":547},[90,1896,1715],{"class":1511},[74,1898,1900],{"id":1899},"provider-模块开发","provider 模块开发",[28,1902],{"caption":1903,"src":1904},"provider提供者模块","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777703061045_image.webp",[20,1906,1907],{},"提供者模块就需要实现公共模块定义的 UserService 接口，目前先忽略 EasyProviderExample 这个类。",[79,1909,1912],{"className":1473,"code":1910,"filename":1911,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.provider;\n\nimport top.dhbxs.rpc.common.model.User;\nimport top.dhbxs.rpc.common.service.UserService;\n\n\u002F**\n * 用户服务实现类\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class UserServiceImpl implements UserService {\n    \u002F**\n     * 获取用户\n     *\n     * @param user 用户\n     * @return 用户\n     *\u002F\n    @Override\n    public User getUser(User user) {\n        System.out.println(\"用户名：\" + user.getName());\n        return user;\n    }\n}\n\n","UserServiceImpl.java",[87,1913,1914,1934,1938,1966,1995,1999,2003,2008,2012,2020,2028,2032,2047,2051,2055,2059,2069,2077,2081,2091,2109,2142,2150,2154],{"__ignoreMap":85},[90,1915,1916,1918,1920,1922,1924,1926,1928,1930,1932],{"class":92,"line":93},[90,1917,1484],{"class":1483},[90,1919,1487],{"class":1483},[90,1921,1491],{"class":1490},[90,1923,1494],{"class":1483},[90,1925,1491],{"class":1490},[90,1927,1499],{"class":1483},[90,1929,1491],{"class":1490},[90,1931,391],{"class":1483},[90,1933,1512],{"class":1511},[90,1935,1936],{"class":92,"line":126},[90,1937,206],{"emptyLinePlaceholder":205},[90,1939,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964],{"class":92,"line":150},[90,1941,1521],{"class":1483},[90,1943,1487],{"class":1524},[90,1945,1491],{"class":1528},[90,1947,1494],{"class":1524},[90,1949,1491],{"class":1528},[90,1951,1499],{"class":1524},[90,1953,1491],{"class":1528},[90,1955,238],{"class":1524},[90,1957,1491],{"class":1528},[90,1959,1508],{"class":1524},[90,1961,1491],{"class":1528},[90,1963,1777],{"class":1524},[90,1965,1512],{"class":1511},[90,1967,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1993],{"class":92,"line":161},[90,1969,1521],{"class":1483},[90,1971,1487],{"class":1524},[90,1973,1491],{"class":1528},[90,1975,1494],{"class":1524},[90,1977,1491],{"class":1528},[90,1979,1499],{"class":1524},[90,1981,1491],{"class":1528},[90,1983,238],{"class":1524},[90,1985,1491],{"class":1528},[90,1987,1744],{"class":1524},[90,1989,1491],{"class":1528},[90,1991,1992],{"class":1524},"UserService",[90,1994,1512],{"class":1511},[90,1996,1997],{"class":92,"line":180},[90,1998,206],{"emptyLinePlaceholder":205},[90,2000,2001],{"class":92,"line":202},[90,2002,1548],{"class":1547},[90,2004,2005],{"class":92,"line":209},[90,2006,2007],{"class":1547}," * 用户服务实现类\n",[90,2009,2010],{"class":92,"line":228},[90,2011,1558],{"class":1547},[90,2013,2014,2016,2018],{"class":92,"line":247},[90,2015,1563],{"class":1547},[90,2017,1567],{"class":1566},[90,2019,1570],{"class":1547},[90,2021,2022,2024,2026],{"class":92,"line":266},[90,2023,1563],{"class":1547},[90,2025,1577],{"class":1566},[90,2027,1580],{"class":1547},[90,2029,2030],{"class":92,"line":271},[90,2031,1585],{"class":1547},[90,2033,2034,2036,2038,2041,2043,2045],{"class":92,"line":429},[90,2035,1590],{"class":1483},[90,2037,1593],{"class":1483},[90,2039,2040],{"class":1596}," UserServiceImpl",[90,2042,1600],{"class":1483},[90,2044,1826],{"class":1596},[90,2046,1606],{"class":1511},[90,2048,2049],{"class":92,"line":440},[90,2050,1837],{"class":1547},[90,2052,2053],{"class":92,"line":458},[90,2054,1842],{"class":1547},[90,2056,2057],{"class":92,"line":475},[90,2058,1847],{"class":1547},[90,2060,2061,2063,2065,2067],{"class":92,"line":492},[90,2062,1852],{"class":1547},[90,2064,1855],{"class":1566},[90,2066,1858],{"class":1682},[90,2068,1861],{"class":1547},[90,2070,2071,2073,2075],{"class":92,"line":502},[90,2072,1852],{"class":1547},[90,2074,1868],{"class":1566},[90,2076,1861],{"class":1547},[90,2078,2079],{"class":92,"line":512},[90,2080,1875],{"class":1547},[90,2082,2083,2087],{"class":92,"line":529},[90,2084,2086],{"class":2085},"slb6Y","    @",[90,2088,2090],{"class":2089},"saiVi","Override\n",[90,2092,2093,2095,2097,2099,2101,2103,2105,2107],{"class":92,"line":547},[90,2094,1634],{"class":1483},[90,2096,1597],{"class":1618},[90,2098,1883],{"class":1639},[90,2100,1676],{"class":1511},[90,2102,1777],{"class":1618},[90,2104,1858],{"class":1682},[90,2106,1685],{"class":1511},[90,2108,1606],{"class":1511},[90,2110,2111,2114,2116,2119,2121,2124,2126,2129,2132,2134,2136,2139],{"class":92,"line":564},[90,2112,2113],{"class":1524},"        System",[90,2115,1491],{"class":1511},[90,2117,2118],{"class":1524},"out",[90,2120,1491],{"class":1511},[90,2122,2123],{"class":1639},"println",[90,2125,1676],{"class":1511},[90,2127,2128],{"class":111},"\"用户名：\"",[90,2130,2131],{"class":1701}," +",[90,2133,1858],{"class":1524},[90,2135,1491],{"class":1511},[90,2137,2138],{"class":1639},"getName",[90,2140,2141],{"class":1511},"());\n",[90,2143,2144,2146,2148],{"class":92,"line":573},[90,2145,1650],{"class":1483},[90,2147,1858],{"class":107},[90,2149,1512],{"class":1511},[90,2151,2152],{"class":92,"line":582},[90,2153,1659],{"class":1511},[90,2155,2156],{"class":92,"line":600},[90,2157,1715],{"class":1511},[74,2159,2161],{"id":2160},"consumer-模块开发","consumer 模块开发",[28,2163],{"caption":2164,"src":2165},"consumer模块","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777703087692_image.webp",[20,2167,2168],{},"消费者模块就是要使用我们公共模块中定义的接口，来获取用户数据。",[79,2170,2173],{"className":1473,"code":2171,"filename":2172,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.consumer;\n\nimport top.dhbxs.rpc.common.model.User;\nimport top.dhbxs.rpc.common.service.UserService;\n\n\u002F**\n * 简单的服务消费者示例\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class EasyConsumerExample {\n\n    public static void main(String[] args) {\n        UserService userService = null;\n\n        User user = new User();\n        user.setName(\"灯火不休时\");\n\n        \u002F\u002F 如果没有 RPC 框架，这里调用会报 NPE，因为userService为空，不是实体对象，调用不了方法\n        \u002F\u002F UserServiceImpl 为服务提供者 provider 模块下的类，当前项目的 pom 也没有直接引入 provider 模块\n        \u002F\u002F 所以需要 RPC 框架帮我们完成调用\n        User newUser = userService.getUser(user);\n\n        if (newUser != null) {\n            System.out.println(newUser.getName());\n        } else {\n            System.out.println(\"user = null\");\n        }\n    }\n}\n\n","EasyConsumerExample.java",[87,2174,2175,2195,2199,2227,2255,2259,2263,2268,2272,2280,2288,2292,2303,2307,2333,2349,2353,2370,2387,2391,2396,2401,2406,2429,2433,2453,2477,2487,2506,2511,2515],{"__ignoreMap":85},[90,2176,2177,2179,2181,2183,2185,2187,2189,2191,2193],{"class":92,"line":93},[90,2178,1484],{"class":1483},[90,2180,1487],{"class":1483},[90,2182,1491],{"class":1490},[90,2184,1494],{"class":1483},[90,2186,1491],{"class":1490},[90,2188,1499],{"class":1483},[90,2190,1491],{"class":1490},[90,2192,799],{"class":1483},[90,2194,1512],{"class":1511},[90,2196,2197],{"class":92,"line":126},[90,2198,206],{"emptyLinePlaceholder":205},[90,2200,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225],{"class":92,"line":150},[90,2202,1521],{"class":1483},[90,2204,1487],{"class":1524},[90,2206,1491],{"class":1528},[90,2208,1494],{"class":1524},[90,2210,1491],{"class":1528},[90,2212,1499],{"class":1524},[90,2214,1491],{"class":1528},[90,2216,238],{"class":1524},[90,2218,1491],{"class":1528},[90,2220,1508],{"class":1524},[90,2222,1491],{"class":1528},[90,2224,1777],{"class":1524},[90,2226,1512],{"class":1511},[90,2228,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253],{"class":92,"line":161},[90,2230,1521],{"class":1483},[90,2232,1487],{"class":1524},[90,2234,1491],{"class":1528},[90,2236,1494],{"class":1524},[90,2238,1491],{"class":1528},[90,2240,1499],{"class":1524},[90,2242,1491],{"class":1528},[90,2244,238],{"class":1524},[90,2246,1491],{"class":1528},[90,2248,1744],{"class":1524},[90,2250,1491],{"class":1528},[90,2252,1992],{"class":1524},[90,2254,1512],{"class":1511},[90,2256,2257],{"class":92,"line":180},[90,2258,206],{"emptyLinePlaceholder":205},[90,2260,2261],{"class":92,"line":202},[90,2262,1548],{"class":1547},[90,2264,2265],{"class":92,"line":209},[90,2266,2267],{"class":1547}," * 简单的服务消费者示例\n",[90,2269,2270],{"class":92,"line":228},[90,2271,1558],{"class":1547},[90,2273,2274,2276,2278],{"class":92,"line":247},[90,2275,1563],{"class":1547},[90,2277,1567],{"class":1566},[90,2279,1570],{"class":1547},[90,2281,2282,2284,2286],{"class":92,"line":266},[90,2283,1563],{"class":1547},[90,2285,1577],{"class":1566},[90,2287,1580],{"class":1547},[90,2289,2290],{"class":92,"line":271},[90,2291,1585],{"class":1547},[90,2293,2294,2296,2298,2301],{"class":92,"line":429},[90,2295,1590],{"class":1483},[90,2297,1593],{"class":1483},[90,2299,2300],{"class":1596}," EasyConsumerExample",[90,2302,1606],{"class":1511},[90,2304,2305],{"class":92,"line":440},[90,2306,206],{"emptyLinePlaceholder":205},[90,2308,2309,2311,2314,2316,2319,2321,2323,2326,2329,2331],{"class":92,"line":458},[90,2310,1634],{"class":1483},[90,2312,2313],{"class":1483}," static",[90,2315,1670],{"class":1483},[90,2317,2318],{"class":1639}," main",[90,2320,1676],{"class":1511},[90,2322,1679],{"class":1618},[90,2324,2325],{"class":1511},"[]",[90,2327,2328],{"class":1682}," args",[90,2330,1685],{"class":1511},[90,2332,1606],{"class":1511},[90,2334,2335,2338,2341,2343,2347],{"class":92,"line":475},[90,2336,2337],{"class":1618},"        UserService",[90,2339,2340],{"class":1622}," userService",[90,2342,1702],{"class":1701},[90,2344,2346],{"class":2345},"sFiMs"," null",[90,2348,1512],{"class":1511},[90,2350,2351],{"class":92,"line":492},[90,2352,206],{"emptyLinePlaceholder":205},[90,2354,2355,2358,2360,2362,2365,2367],{"class":92,"line":502},[90,2356,2357],{"class":1618},"        User",[90,2359,1858],{"class":1622},[90,2361,1702],{"class":1701},[90,2363,2364],{"class":1483}," new",[90,2366,1597],{"class":1639},[90,2368,2369],{"class":1511},"();\n",[90,2371,2372,2375,2377,2380,2382,2385],{"class":92,"line":512},[90,2373,2374],{"class":1524},"        user",[90,2376,1491],{"class":1511},[90,2378,2379],{"class":1639},"setName",[90,2381,1676],{"class":1511},[90,2383,2384],{"class":111},"\"灯火不休时\"",[90,2386,1892],{"class":1511},[90,2388,2389],{"class":92,"line":529},[90,2390,206],{"emptyLinePlaceholder":205},[90,2392,2393],{"class":92,"line":547},[90,2394,2395],{"class":1547},"        \u002F\u002F 如果没有 RPC 框架，这里调用会报 NPE，因为userService为空，不是实体对象，调用不了方法\n",[90,2397,2398],{"class":92,"line":564},[90,2399,2400],{"class":1547},"        \u002F\u002F UserServiceImpl 为服务提供者 provider 模块下的类，当前项目的 pom 也没有直接引入 provider 模块\n",[90,2402,2403],{"class":92,"line":573},[90,2404,2405],{"class":1547},"        \u002F\u002F 所以需要 RPC 框架帮我们完成调用\n",[90,2407,2408,2410,2413,2415,2417,2419,2422,2424,2427],{"class":92,"line":582},[90,2409,2357],{"class":1618},[90,2411,2412],{"class":1622}," newUser",[90,2414,1702],{"class":1701},[90,2416,2340],{"class":1524},[90,2418,1491],{"class":1511},[90,2420,2421],{"class":1639},"getUser",[90,2423,1676],{"class":1511},[90,2425,2426],{"class":107},"user",[90,2428,1892],{"class":1511},[90,2430,2431],{"class":92,"line":600},[90,2432,206],{"emptyLinePlaceholder":205},[90,2434,2435,2438,2441,2444,2447,2449,2451],{"class":92,"line":618},[90,2436,2437],{"class":1483},"        if",[90,2439,2440],{"class":1511}," (",[90,2442,2443],{"class":107},"newUser ",[90,2445,2446],{"class":1701},"!=",[90,2448,2346],{"class":2345},[90,2450,1685],{"class":1511},[90,2452,1606],{"class":1511},[90,2454,2455,2458,2460,2462,2464,2466,2468,2471,2473,2475],{"class":92,"line":636},[90,2456,2457],{"class":1524},"            System",[90,2459,1491],{"class":1511},[90,2461,2118],{"class":1524},[90,2463,1491],{"class":1511},[90,2465,2123],{"class":1639},[90,2467,1676],{"class":1511},[90,2469,2470],{"class":1524},"newUser",[90,2472,1491],{"class":1511},[90,2474,2138],{"class":1639},[90,2476,2141],{"class":1511},[90,2478,2479,2482,2485],{"class":92,"line":655},[90,2480,2481],{"class":1511},"        }",[90,2483,2484],{"class":1483}," else",[90,2486,1606],{"class":1511},[90,2488,2489,2491,2493,2495,2497,2499,2501,2504],{"class":92,"line":664},[90,2490,2457],{"class":1524},[90,2492,1491],{"class":1511},[90,2494,2118],{"class":1524},[90,2496,1491],{"class":1511},[90,2498,2123],{"class":1639},[90,2500,1676],{"class":1511},[90,2502,2503],{"class":111},"\"user = null\"",[90,2505,1892],{"class":1511},[90,2507,2508],{"class":92,"line":674},[90,2509,2510],{"class":1511},"        }\n",[90,2512,2513],{"class":92,"line":679},[90,2514,1659],{"class":1511},[90,2516,2517],{"class":92,"line":1450},[90,2518,1715],{"class":1511},[74,2520,2522],{"id":2521},"easy-rpc-模块开发","easy-rpc 模块开发",[28,2524],{"caption":2525,"src":2526},"easy-rpc模块","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777703151776_image.webp",[20,2528,2529,2530,2537],{},"easy-rpc 模块是重点，前文中提到过，rpc 框架是需要通过网络通信实现不同服务之间的通信。所以我们需要 rpc 框架能启动一个 HTTP 服，处理网络请求。这里使用 ",[2531,2532,2536],"a",{"href":2533,"rel":2534},"https:\u002F\u002Fvertx.io",[2535],"nofollow","Vert.x"," 这个框架来实现，关于 Vert.x 框架的介绍，参考我和 AI 的对话：",[2539,2540,2541,2544,2547,2550,2553],"chat",{},[20,2542,2543],{},"{:2026-04-26 17:22:00}",[20,2545,2546],{},"{.灯火不休时}",[20,2548,2549],{},"简单介绍Vertx框架",[20,2551,2552],{},"{AI}",[20,2554,2555,2556,2559],{},"Vert.x 是一个事件驱动、非阻塞、轻量级的 Java 全栈应用框架，专为构建高性能、高并发的响应式应用而设计。",[2557,2558],"br",{},"\n如果你正在处理高并发连接、低延迟要求、资源受限环境（如容器\u002FK8s 中），Vert.x 是非常值得考虑的选择。",[2561,2562,2564],"h5",{"id":2563},"_1定义-vertx-http-服务接口","1）定义 Vertx HTTP 服务接口",[20,2566,2567],{},"首先定义一个接口，用来启动 Vertx HTTP 服务，在 top.dhbxs.rpc.server 包下",[79,2569,2572],{"className":1473,"code":2570,"filename":2571,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.server;\n\n\u002F**\n * HTTP 服务器接口\n *\u002F\npublic interface HttpServer {\n\n    \u002F**\n     * 启动服务器\n     *\n     * @param port 端口\n     *\u002F\n    void doStart(int port);\n}\n\n","HttpServer.java",[87,2573,2574,2595,2599,2603,2608,2612,2623,2627,2631,2636,2640,2652,2656,2673],{"__ignoreMap":85},[90,2575,2576,2578,2580,2582,2584,2586,2588,2590,2593],{"class":92,"line":93},[90,2577,1484],{"class":1483},[90,2579,1487],{"class":1483},[90,2581,1491],{"class":1490},[90,2583,1494],{"class":1483},[90,2585,1491],{"class":1490},[90,2587,1499],{"class":1483},[90,2589,1491],{"class":1490},[90,2591,2592],{"class":1483},"server",[90,2594,1512],{"class":1511},[90,2596,2597],{"class":92,"line":126},[90,2598,206],{"emptyLinePlaceholder":205},[90,2600,2601],{"class":92,"line":150},[90,2602,1548],{"class":1547},[90,2604,2605],{"class":92,"line":161},[90,2606,2607],{"class":1547}," * HTTP 服务器接口\n",[90,2609,2610],{"class":92,"line":180},[90,2611,1585],{"class":1547},[90,2613,2614,2616,2618,2621],{"class":92,"line":202},[90,2615,1590],{"class":1483},[90,2617,1823],{"class":1483},[90,2619,2620],{"class":1596}," HttpServer",[90,2622,1606],{"class":1511},[90,2624,2625],{"class":92,"line":209},[90,2626,206],{"emptyLinePlaceholder":205},[90,2628,2629],{"class":92,"line":228},[90,2630,1837],{"class":1547},[90,2632,2633],{"class":92,"line":247},[90,2634,2635],{"class":1547},"     * 启动服务器\n",[90,2637,2638],{"class":92,"line":266},[90,2639,1847],{"class":1547},[90,2641,2642,2644,2646,2649],{"class":92,"line":271},[90,2643,1852],{"class":1547},[90,2645,1855],{"class":1566},[90,2647,2648],{"class":1682}," port",[90,2650,2651],{"class":1547}," 端口\n",[90,2653,2654],{"class":92,"line":429},[90,2655,1875],{"class":1547},[90,2657,2658,2661,2664,2666,2669,2671],{"class":92,"line":440},[90,2659,2660],{"class":1483},"    void",[90,2662,2663],{"class":1639}," doStart",[90,2665,1676],{"class":1511},[90,2667,2668],{"class":1483},"int",[90,2670,2648],{"class":1682},[90,2672,1892],{"class":1511},[90,2674,2675],{"class":92,"line":458},[90,2676,1715],{"class":1511},[2561,2678,2680],{"id":2679},"_2实现接口启动-http-服务","2）实现接口启动 HTTP 服务",[20,2682,2683],{},"实现该接口，启动 HTTP 服务",[79,2685,2688],{"className":1473,"code":2686,"filename":2687,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.server;\n\nimport io.vertx.core.Vertx;\n\n\u002F**\n * 基于 Vertx 实现的 web 服务器\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class VertxHttpServer implements HttpServer {\n\n    \u002F**\n     * 启动服务器\n     *\n     * @param port 端口\n     *\u002F\n    @Override\n    public void doStart(int port) {\n        \u002F\u002F 创建 Vertx 实例\n        Vertx vertx = Vertx.vertx();\n\n        \u002F\u002F 创建 HTTP 服务器\n        io.vertx.core.http.HttpServer server = vertx.createHttpServer();\n\n        server.requestHandler(request -> {\n            \u002F\u002F 记录请求日志\n            System.out.println(\"Received request: Method: \" + request.method() + \" URI: \" + request.uri());\n\n            \u002F\u002F 设置响应内容并返回响应\n            request.response().putHeader(\"content-type\", \"text\u002Fhtml\")\n                    .end(\"\u003Ch1>Hello Vert.x HTTP server!\u003C\u002Fh1>\");\n        });\n\n        server.listen(port, result -> {\n            if (result.succeeded()) {\n                System.out.println(\"Server is now listening on port \" + port);\n            } else {\n                System.out.println(\"Failed to start server: \" + result.cause());\n            }\n        });\n    }\n}\n\n","VertxHttpServer.java",[87,2689,2690,2710,2714,2738,2742,2746,2751,2755,2763,2771,2775,2790,2794,2798,2802,2806,2816,2820,2826,2844,2849,2868,2872,2877,2914,2918,2938,2943,2988,2992,2997,3027,3043,3049,3054,3078,3099,3124,3134,3164,3170,3175,3180],{"__ignoreMap":85},[90,2691,2692,2694,2696,2698,2700,2702,2704,2706,2708],{"class":92,"line":93},[90,2693,1484],{"class":1483},[90,2695,1487],{"class":1483},[90,2697,1491],{"class":1490},[90,2699,1494],{"class":1483},[90,2701,1491],{"class":1490},[90,2703,1499],{"class":1483},[90,2705,1491],{"class":1490},[90,2707,2592],{"class":1483},[90,2709,1512],{"class":1511},[90,2711,2712],{"class":92,"line":126},[90,2713,206],{"emptyLinePlaceholder":205},[90,2715,2716,2718,2721,2723,2726,2728,2731,2733,2736],{"class":92,"line":150},[90,2717,1521],{"class":1483},[90,2719,2720],{"class":1524}," io",[90,2722,1491],{"class":1528},[90,2724,2725],{"class":1524},"vertx",[90,2727,1491],{"class":1528},[90,2729,2730],{"class":1524},"core",[90,2732,1491],{"class":1528},[90,2734,2735],{"class":1524},"Vertx",[90,2737,1512],{"class":1511},[90,2739,2740],{"class":92,"line":161},[90,2741,206],{"emptyLinePlaceholder":205},[90,2743,2744],{"class":92,"line":180},[90,2745,1548],{"class":1547},[90,2747,2748],{"class":92,"line":202},[90,2749,2750],{"class":1547}," * 基于 Vertx 实现的 web 服务器\n",[90,2752,2753],{"class":92,"line":209},[90,2754,1558],{"class":1547},[90,2756,2757,2759,2761],{"class":92,"line":228},[90,2758,1563],{"class":1547},[90,2760,1567],{"class":1566},[90,2762,1570],{"class":1547},[90,2764,2765,2767,2769],{"class":92,"line":247},[90,2766,1563],{"class":1547},[90,2768,1577],{"class":1566},[90,2770,1580],{"class":1547},[90,2772,2773],{"class":92,"line":266},[90,2774,1585],{"class":1547},[90,2776,2777,2779,2781,2784,2786,2788],{"class":92,"line":271},[90,2778,1590],{"class":1483},[90,2780,1593],{"class":1483},[90,2782,2783],{"class":1596}," VertxHttpServer",[90,2785,1600],{"class":1483},[90,2787,2620],{"class":1596},[90,2789,1606],{"class":1511},[90,2791,2792],{"class":92,"line":429},[90,2793,206],{"emptyLinePlaceholder":205},[90,2795,2796],{"class":92,"line":440},[90,2797,1837],{"class":1547},[90,2799,2800],{"class":92,"line":458},[90,2801,2635],{"class":1547},[90,2803,2804],{"class":92,"line":475},[90,2805,1847],{"class":1547},[90,2807,2808,2810,2812,2814],{"class":92,"line":492},[90,2809,1852],{"class":1547},[90,2811,1855],{"class":1566},[90,2813,2648],{"class":1682},[90,2815,2651],{"class":1547},[90,2817,2818],{"class":92,"line":502},[90,2819,1875],{"class":1547},[90,2821,2822,2824],{"class":92,"line":512},[90,2823,2086],{"class":2085},[90,2825,2090],{"class":2089},[90,2827,2828,2830,2832,2834,2836,2838,2840,2842],{"class":92,"line":529},[90,2829,1634],{"class":1483},[90,2831,1670],{"class":1483},[90,2833,2663],{"class":1639},[90,2835,1676],{"class":1511},[90,2837,2668],{"class":1483},[90,2839,2648],{"class":1682},[90,2841,1685],{"class":1511},[90,2843,1606],{"class":1511},[90,2845,2846],{"class":92,"line":547},[90,2847,2848],{"class":1547},"        \u002F\u002F 创建 Vertx 实例\n",[90,2850,2851,2854,2857,2859,2862,2864,2866],{"class":92,"line":564},[90,2852,2853],{"class":1618},"        Vertx",[90,2855,2856],{"class":1622}," vertx",[90,2858,1702],{"class":1701},[90,2860,2861],{"class":1524}," Vertx",[90,2863,1491],{"class":1511},[90,2865,2725],{"class":1639},[90,2867,2369],{"class":1511},[90,2869,2870],{"class":92,"line":573},[90,2871,206],{"emptyLinePlaceholder":205},[90,2873,2874],{"class":92,"line":582},[90,2875,2876],{"class":1547},"        \u002F\u002F 创建 HTTP 服务器\n",[90,2878,2879,2882,2884,2886,2888,2890,2892,2895,2897,2900,2903,2905,2907,2909,2912],{"class":92,"line":600},[90,2880,2881],{"class":1618},"        io",[90,2883,1491],{"class":1511},[90,2885,2725],{"class":1618},[90,2887,1491],{"class":1511},[90,2889,2730],{"class":1618},[90,2891,1491],{"class":1511},[90,2893,2894],{"class":1618},"http",[90,2896,1491],{"class":1511},[90,2898,2899],{"class":1618},"HttpServer",[90,2901,2902],{"class":1622}," server",[90,2904,1702],{"class":1701},[90,2906,2856],{"class":1524},[90,2908,1491],{"class":1511},[90,2910,2911],{"class":1639},"createHttpServer",[90,2913,2369],{"class":1511},[90,2915,2916],{"class":92,"line":618},[90,2917,206],{"emptyLinePlaceholder":205},[90,2919,2920,2923,2925,2928,2930,2933,2936],{"class":92,"line":636},[90,2921,2922],{"class":1524},"        server",[90,2924,1491],{"class":1511},[90,2926,2927],{"class":1639},"requestHandler",[90,2929,1676],{"class":1511},[90,2931,2932],{"class":107},"request ",[90,2934,2935],{"class":1483},"->",[90,2937,1606],{"class":1511},[90,2939,2940],{"class":92,"line":655},[90,2941,2942],{"class":1547},"            \u002F\u002F 记录请求日志\n",[90,2944,2945,2947,2949,2951,2953,2955,2957,2960,2962,2965,2967,2970,2972,2974,2977,2979,2981,2983,2986],{"class":92,"line":664},[90,2946,2457],{"class":1524},[90,2948,1491],{"class":1511},[90,2950,2118],{"class":1524},[90,2952,1491],{"class":1511},[90,2954,2123],{"class":1639},[90,2956,1676],{"class":1511},[90,2958,2959],{"class":111},"\"Received request: Method: \"",[90,2961,2131],{"class":1701},[90,2963,2964],{"class":1524}," request",[90,2966,1491],{"class":1511},[90,2968,2969],{"class":1639},"method",[90,2971,1643],{"class":1511},[90,2973,2131],{"class":1701},[90,2975,2976],{"class":111}," \" URI: \"",[90,2978,2131],{"class":1701},[90,2980,2964],{"class":1524},[90,2982,1491],{"class":1511},[90,2984,2985],{"class":1639},"uri",[90,2987,2141],{"class":1511},[90,2989,2990],{"class":92,"line":674},[90,2991,206],{"emptyLinePlaceholder":205},[90,2993,2994],{"class":92,"line":679},[90,2995,2996],{"class":1547},"            \u002F\u002F 设置响应内容并返回响应\n",[90,2998,2999,3002,3004,3007,3010,3013,3015,3018,3021,3024],{"class":92,"line":1450},[90,3000,3001],{"class":1524},"            request",[90,3003,1491],{"class":1511},[90,3005,3006],{"class":1639},"response",[90,3008,3009],{"class":1511},"().",[90,3011,3012],{"class":1639},"putHeader",[90,3014,1676],{"class":1511},[90,3016,3017],{"class":111},"\"content-type\"",[90,3019,3020],{"class":1511},",",[90,3022,3023],{"class":111}," \"text\u002Fhtml\"",[90,3025,3026],{"class":1511},")\n",[90,3028,3030,3033,3036,3038,3041],{"class":92,"line":3029},32,[90,3031,3032],{"class":1511},"                    .",[90,3034,3035],{"class":1639},"end",[90,3037,1676],{"class":1511},[90,3039,3040],{"class":111},"\"\u003Ch1>Hello Vert.x HTTP server!\u003C\u002Fh1>\"",[90,3042,1892],{"class":1511},[90,3044,3046],{"class":92,"line":3045},33,[90,3047,3048],{"class":1511},"        });\n",[90,3050,3052],{"class":92,"line":3051},34,[90,3053,206],{"emptyLinePlaceholder":205},[90,3055,3057,3059,3061,3064,3066,3069,3071,3074,3076],{"class":92,"line":3056},35,[90,3058,2922],{"class":1524},[90,3060,1491],{"class":1511},[90,3062,3063],{"class":1639},"listen",[90,3065,1676],{"class":1511},[90,3067,3068],{"class":107},"port",[90,3070,3020],{"class":1511},[90,3072,3073],{"class":107}," result ",[90,3075,2935],{"class":1483},[90,3077,1606],{"class":1511},[90,3079,3081,3084,3086,3089,3091,3094,3097],{"class":92,"line":3080},36,[90,3082,3083],{"class":1483},"            if",[90,3085,2440],{"class":1511},[90,3087,3088],{"class":1524},"result",[90,3090,1491],{"class":1511},[90,3092,3093],{"class":1639},"succeeded",[90,3095,3096],{"class":1511},"())",[90,3098,1606],{"class":1511},[90,3100,3102,3105,3107,3109,3111,3113,3115,3118,3120,3122],{"class":92,"line":3101},37,[90,3103,3104],{"class":1524},"                System",[90,3106,1491],{"class":1511},[90,3108,2118],{"class":1524},[90,3110,1491],{"class":1511},[90,3112,2123],{"class":1639},[90,3114,1676],{"class":1511},[90,3116,3117],{"class":111},"\"Server is now listening on port \"",[90,3119,2131],{"class":1701},[90,3121,2648],{"class":107},[90,3123,1892],{"class":1511},[90,3125,3127,3130,3132],{"class":92,"line":3126},38,[90,3128,3129],{"class":1511},"            }",[90,3131,2484],{"class":1483},[90,3133,1606],{"class":1511},[90,3135,3137,3139,3141,3143,3145,3147,3149,3152,3154,3157,3159,3162],{"class":92,"line":3136},39,[90,3138,3104],{"class":1524},[90,3140,1491],{"class":1511},[90,3142,2118],{"class":1524},[90,3144,1491],{"class":1511},[90,3146,2123],{"class":1639},[90,3148,1676],{"class":1511},[90,3150,3151],{"class":111},"\"Failed to start server: \"",[90,3153,2131],{"class":1701},[90,3155,3156],{"class":1524}," result",[90,3158,1491],{"class":1511},[90,3160,3161],{"class":1639},"cause",[90,3163,2141],{"class":1511},[90,3165,3167],{"class":92,"line":3166},40,[90,3168,3169],{"class":1511},"            }\n",[90,3171,3173],{"class":92,"line":3172},41,[90,3174,3048],{"class":1511},[90,3176,3178],{"class":92,"line":3177},42,[90,3179,1659],{"class":1511},[90,3181,3183],{"class":92,"line":3182},43,[90,3184,1715],{"class":1511},[2561,3186,3188],{"id":3187},"_3测试-http-server-请求响应","3）测试 HTTP Server 请求响应",[20,3190,3191],{},"在 provider 模块中的 top.dhbxs.rpc.provider 包下新建一个类，启动刚建好的 HTTP Server 测试能否接收到请求并响应数据",[79,3193,3196],{"className":1473,"code":3194,"filename":3195,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.provider;\n\nimport top.dhbxs.rpc.common.service.UserService;\nimport top.dhbxs.rpc.registry.LocalRegistry;\nimport top.dhbxs.rpc.server.VertxHttpServer;\n\n\u002F**\n * 简单的服务提供者示例\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class EasyProviderExample {\n\n    public static void main(String[] args) {\n\n        \u002F\u002F 启动 web 服务\n        VertxHttpServer vertxHttpServer = new VertxHttpServer();\n        vertxHttpServer.doStart(8080);\n    }\n}\n\n","EasyProviderExample.java",[87,3197,3198,3218,3222,3250,3276,3301,3305,3309,3314,3318,3326,3334,3338,3349,3353,3375,3379,3384,3400,3418,3422],{"__ignoreMap":85},[90,3199,3200,3202,3204,3206,3208,3210,3212,3214,3216],{"class":92,"line":93},[90,3201,1484],{"class":1483},[90,3203,1487],{"class":1483},[90,3205,1491],{"class":1490},[90,3207,1494],{"class":1483},[90,3209,1491],{"class":1490},[90,3211,1499],{"class":1483},[90,3213,1491],{"class":1490},[90,3215,391],{"class":1483},[90,3217,1512],{"class":1511},[90,3219,3220],{"class":92,"line":126},[90,3221,206],{"emptyLinePlaceholder":205},[90,3223,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248],{"class":92,"line":150},[90,3225,1521],{"class":1483},[90,3227,1487],{"class":1524},[90,3229,1491],{"class":1528},[90,3231,1494],{"class":1524},[90,3233,1491],{"class":1528},[90,3235,1499],{"class":1524},[90,3237,1491],{"class":1528},[90,3239,238],{"class":1524},[90,3241,1491],{"class":1528},[90,3243,1744],{"class":1524},[90,3245,1491],{"class":1528},[90,3247,1992],{"class":1524},[90,3249,1512],{"class":1511},[90,3251,3252,3254,3256,3258,3260,3262,3264,3266,3269,3271,3274],{"class":92,"line":161},[90,3253,1521],{"class":1483},[90,3255,1487],{"class":1524},[90,3257,1491],{"class":1528},[90,3259,1494],{"class":1524},[90,3261,1491],{"class":1528},[90,3263,1499],{"class":1524},[90,3265,1491],{"class":1528},[90,3267,3268],{"class":1524},"registry",[90,3270,1491],{"class":1528},[90,3272,3273],{"class":1524},"LocalRegistry",[90,3275,1512],{"class":1511},[90,3277,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296,3299],{"class":92,"line":180},[90,3279,1521],{"class":1483},[90,3281,1487],{"class":1524},[90,3283,1491],{"class":1528},[90,3285,1494],{"class":1524},[90,3287,1491],{"class":1528},[90,3289,1499],{"class":1524},[90,3291,1491],{"class":1528},[90,3293,2592],{"class":1524},[90,3295,1491],{"class":1528},[90,3297,3298],{"class":1524},"VertxHttpServer",[90,3300,1512],{"class":1511},[90,3302,3303],{"class":92,"line":202},[90,3304,206],{"emptyLinePlaceholder":205},[90,3306,3307],{"class":92,"line":209},[90,3308,1548],{"class":1547},[90,3310,3311],{"class":92,"line":228},[90,3312,3313],{"class":1547}," * 简单的服务提供者示例\n",[90,3315,3316],{"class":92,"line":247},[90,3317,1558],{"class":1547},[90,3319,3320,3322,3324],{"class":92,"line":266},[90,3321,1563],{"class":1547},[90,3323,1567],{"class":1566},[90,3325,1570],{"class":1547},[90,3327,3328,3330,3332],{"class":92,"line":271},[90,3329,1563],{"class":1547},[90,3331,1577],{"class":1566},[90,3333,1580],{"class":1547},[90,3335,3336],{"class":92,"line":429},[90,3337,1585],{"class":1547},[90,3339,3340,3342,3344,3347],{"class":92,"line":440},[90,3341,1590],{"class":1483},[90,3343,1593],{"class":1483},[90,3345,3346],{"class":1596}," EasyProviderExample",[90,3348,1606],{"class":1511},[90,3350,3351],{"class":92,"line":458},[90,3352,206],{"emptyLinePlaceholder":205},[90,3354,3355,3357,3359,3361,3363,3365,3367,3369,3371,3373],{"class":92,"line":475},[90,3356,1634],{"class":1483},[90,3358,2313],{"class":1483},[90,3360,1670],{"class":1483},[90,3362,2318],{"class":1639},[90,3364,1676],{"class":1511},[90,3366,1679],{"class":1618},[90,3368,2325],{"class":1511},[90,3370,2328],{"class":1682},[90,3372,1685],{"class":1511},[90,3374,1606],{"class":1511},[90,3376,3377],{"class":92,"line":492},[90,3378,206],{"emptyLinePlaceholder":205},[90,3380,3381],{"class":92,"line":502},[90,3382,3383],{"class":1547},"        \u002F\u002F 启动 web 服务\n",[90,3385,3386,3389,3392,3394,3396,3398],{"class":92,"line":512},[90,3387,3388],{"class":1618},"        VertxHttpServer",[90,3390,3391],{"class":1622}," vertxHttpServer",[90,3393,1702],{"class":1701},[90,3395,2364],{"class":1483},[90,3397,2783],{"class":1639},[90,3399,2369],{"class":1511},[90,3401,3402,3405,3407,3410,3412,3416],{"class":92,"line":529},[90,3403,3404],{"class":1524},"        vertxHttpServer",[90,3406,1491],{"class":1511},[90,3408,3409],{"class":1639},"doStart",[90,3411,1676],{"class":1511},[90,3413,3415],{"class":3414},"sYQis","8080",[90,3417,1892],{"class":1511},[90,3419,3420],{"class":92,"line":547},[90,3421,1659],{"class":1511},[90,3423,3424],{"class":92,"line":564},[90,3425,1715],{"class":1511},[20,3427,3428,3429,3433],{},"然后运行这个 main 方法，启动 Vertx HTTP Server，然后在浏览器访问 ",[2531,3430,3431],{"href":3431,"rel":3432},"http:\u002F\u002Flocalhost:8080",[2535]," 查看是否能看到 Hello Vert.x HTTP server! 然后控制台是否能输出如下内容",[79,3435,3440],{"className":3436,"code":3437,"filename":3438,"language":3439,"meta":85,"style":85},"language-log shiki shiki-themes catppuccin-latte one-dark-pro","Server is now listening on port 8080\nReceived request: Method: GET URI: \u002F\n","console.log","log",[87,3441,3442,3450],{"__ignoreMap":85},[90,3443,3444,3447],{"class":92,"line":93},[90,3445,3446],{"class":107},"Server is now listening on port ",[90,3448,3449],{"class":2345},"8080\n",[90,3451,3452],{"class":92,"line":126},[90,3453,3454],{"class":107},"Received request: Method: GET URI: \u002F\n",[2561,3456,3458],{"id":3457},"_4实现本地注册中心","4）实现本地注册中心",[20,3460,3461],{},"现在 HTTP 服务有了，接下来做一个简易版的注册中心，只在本地注册保存，使用 ConcurrentHashMap 保存注册信息，主要是注册的服务名称(Key)和服务的实现类(Value)。在 provider 模块启动时，需要把它提供的服务保存到这个 Map 中存起来，之后方便 consumer 调用。这个类也很简单，注册服务就是放入 Map，获取服务就是从 Map 中 Get，删除服务就是从 Map 中删除。",[79,3463,3466],{"className":1473,"code":3464,"filename":3465,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.registry;\n\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n\u002F**\n * 本地服务注册器\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class LocalRegistry {\n\n    \u002F**\n     * 存储注册信息 使用线程安全的 ConcurrentHashMap\n     * Key -> 服务名称\n     * Value -> 服务实现类\n     *\u002F\n    private static final Map\u003CString, Class\u003C?>> map = new ConcurrentHashMap\u003C>();\n\n    \u002F**\n     * 注册服务\n     *\n     * @param serviceName 服务名称\n     * @param implClass   服务实现类\n     *\u002F\n    public static void register(String serviceName, Class\u003C?> implClass) {\n        map.put(serviceName, implClass);\n    }\n\n    \u002F**\n     * 获取服务\n     *\n     * @param serviceName 服务名称\n     * @return 服务实现类\n     *\u002F\n    public static Class\u003C?> get(String serviceName) {\n        return map.get(serviceName);\n    }\n\n    \u002F**\n     * 删除服务\n     *\n     * @param serviceName 服务名称\n     *\u002F\n    public static void remove(String serviceName)  {\n        map.remove(serviceName);\n    }\n}\n\n","LocalRegistry.java",[87,3467,3468,3488,3492,3510,3532,3536,3540,3545,3549,3557,3565,3569,3580,3584,3588,3593,3598,3603,3607,3654,3658,3662,3667,3671,3683,3695,3699,3732,3753,3757,3761,3765,3770,3774,3784,3793,3797,3824,3842,3846,3850,3854,3859,3863,3874,3879,3902,3918,3923],{"__ignoreMap":85},[90,3469,3470,3472,3474,3476,3478,3480,3482,3484,3486],{"class":92,"line":93},[90,3471,1484],{"class":1483},[90,3473,1487],{"class":1483},[90,3475,1491],{"class":1490},[90,3477,1494],{"class":1483},[90,3479,1491],{"class":1490},[90,3481,1499],{"class":1483},[90,3483,1491],{"class":1490},[90,3485,3268],{"class":1483},[90,3487,1512],{"class":1511},[90,3489,3490],{"class":92,"line":126},[90,3491,206],{"emptyLinePlaceholder":205},[90,3493,3494,3496,3498,3500,3503,3505,3508],{"class":92,"line":150},[90,3495,1521],{"class":1483},[90,3497,1525],{"class":1524},[90,3499,1491],{"class":1528},[90,3501,3502],{"class":1524},"util",[90,3504,1491],{"class":1528},[90,3506,3507],{"class":1524},"Map",[90,3509,1512],{"class":1511},[90,3511,3512,3514,3516,3518,3520,3522,3525,3527,3530],{"class":92,"line":161},[90,3513,1521],{"class":1483},[90,3515,1525],{"class":1524},[90,3517,1491],{"class":1528},[90,3519,3502],{"class":1524},[90,3521,1491],{"class":1528},[90,3523,3524],{"class":1524},"concurrent",[90,3526,1491],{"class":1528},[90,3528,3529],{"class":1524},"ConcurrentHashMap",[90,3531,1512],{"class":1511},[90,3533,3534],{"class":92,"line":180},[90,3535,206],{"emptyLinePlaceholder":205},[90,3537,3538],{"class":92,"line":202},[90,3539,1548],{"class":1547},[90,3541,3542],{"class":92,"line":209},[90,3543,3544],{"class":1547}," * 本地服务注册器\n",[90,3546,3547],{"class":92,"line":228},[90,3548,1558],{"class":1547},[90,3550,3551,3553,3555],{"class":92,"line":247},[90,3552,1563],{"class":1547},[90,3554,1567],{"class":1566},[90,3556,1570],{"class":1547},[90,3558,3559,3561,3563],{"class":92,"line":266},[90,3560,1563],{"class":1547},[90,3562,1577],{"class":1566},[90,3564,1580],{"class":1547},[90,3566,3567],{"class":92,"line":271},[90,3568,1585],{"class":1547},[90,3570,3571,3573,3575,3578],{"class":92,"line":429},[90,3572,1590],{"class":1483},[90,3574,1593],{"class":1483},[90,3576,3577],{"class":1596}," LocalRegistry",[90,3579,1606],{"class":1511},[90,3581,3582],{"class":92,"line":440},[90,3583,206],{"emptyLinePlaceholder":205},[90,3585,3586],{"class":92,"line":458},[90,3587,1837],{"class":1547},[90,3589,3590],{"class":92,"line":475},[90,3591,3592],{"class":1547},"     * 存储注册信息 使用线程安全的 ConcurrentHashMap\n",[90,3594,3595],{"class":92,"line":492},[90,3596,3597],{"class":1547},"     * Key -> 服务名称\n",[90,3599,3600],{"class":92,"line":502},[90,3601,3602],{"class":1547},"     * Value -> 服务实现类\n",[90,3604,3605],{"class":92,"line":512},[90,3606,1875],{"class":1547},[90,3608,3609,3611,3613,3616,3619,3621,3623,3625,3628,3630,3633,3636,3639,3641,3643,3646,3649,3652],{"class":92,"line":529},[90,3610,1615],{"class":1483},[90,3612,2313],{"class":1483},[90,3614,3615],{"class":1483}," final",[90,3617,3618],{"class":1618}," Map",[90,3620,129],{"class":1511},[90,3622,1679],{"class":1618},[90,3624,3020],{"class":1511},[90,3626,3627],{"class":1618}," Class",[90,3629,129],{"class":1511},[90,3631,3632],{"class":1483},"?",[90,3634,3635],{"class":1511},">>",[90,3637,3638],{"class":1622}," map ",[90,3640,108],{"class":1701},[90,3642,2364],{"class":1483},[90,3644,3645],{"class":1618}," ConcurrentHashMap",[90,3647,3648],{"class":1511},"\u003C>",[90,3650,1643],{"class":3651},"syBBb",[90,3653,1512],{"class":1511},[90,3655,3656],{"class":92,"line":547},[90,3657,206],{"emptyLinePlaceholder":205},[90,3659,3660],{"class":92,"line":564},[90,3661,1837],{"class":1547},[90,3663,3664],{"class":92,"line":573},[90,3665,3666],{"class":1547},"     * 注册服务\n",[90,3668,3669],{"class":92,"line":582},[90,3670,1847],{"class":1547},[90,3672,3673,3675,3677,3680],{"class":92,"line":600},[90,3674,1852],{"class":1547},[90,3676,1855],{"class":1566},[90,3678,3679],{"class":1682}," serviceName",[90,3681,3682],{"class":1547}," 服务名称\n",[90,3684,3685,3687,3689,3692],{"class":92,"line":618},[90,3686,1852],{"class":1547},[90,3688,1855],{"class":1566},[90,3690,3691],{"class":1682}," implClass",[90,3693,3694],{"class":1547},"   服务实现类\n",[90,3696,3697],{"class":92,"line":636},[90,3698,1875],{"class":1547},[90,3700,3701,3703,3705,3707,3710,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730],{"class":92,"line":655},[90,3702,1634],{"class":1483},[90,3704,2313],{"class":1483},[90,3706,1670],{"class":1483},[90,3708,3709],{"class":1639}," register",[90,3711,1676],{"class":1511},[90,3713,1679],{"class":1618},[90,3715,3679],{"class":1682},[90,3717,3020],{"class":1511},[90,3719,3627],{"class":1618},[90,3721,129],{"class":1511},[90,3723,3632],{"class":1483},[90,3725,189],{"class":1511},[90,3727,3691],{"class":1682},[90,3729,1685],{"class":1511},[90,3731,1606],{"class":1511},[90,3733,3734,3737,3739,3742,3744,3747,3749,3751],{"class":92,"line":664},[90,3735,3736],{"class":1524},"        map",[90,3738,1491],{"class":1511},[90,3740,3741],{"class":1639},"put",[90,3743,1676],{"class":1511},[90,3745,3746],{"class":107},"serviceName",[90,3748,3020],{"class":1511},[90,3750,3691],{"class":107},[90,3752,1892],{"class":1511},[90,3754,3755],{"class":92,"line":674},[90,3756,1659],{"class":1511},[90,3758,3759],{"class":92,"line":679},[90,3760,206],{"emptyLinePlaceholder":205},[90,3762,3763],{"class":92,"line":1450},[90,3764,1837],{"class":1547},[90,3766,3767],{"class":92,"line":3029},[90,3768,3769],{"class":1547},"     * 获取服务\n",[90,3771,3772],{"class":92,"line":3045},[90,3773,1847],{"class":1547},[90,3775,3776,3778,3780,3782],{"class":92,"line":3051},[90,3777,1852],{"class":1547},[90,3779,1855],{"class":1566},[90,3781,3679],{"class":1682},[90,3783,3682],{"class":1547},[90,3785,3786,3788,3790],{"class":92,"line":3056},[90,3787,1852],{"class":1547},[90,3789,1868],{"class":1566},[90,3791,3792],{"class":1547}," 服务实现类\n",[90,3794,3795],{"class":92,"line":3080},[90,3796,1875],{"class":1547},[90,3798,3799,3801,3803,3805,3807,3809,3811,3814,3816,3818,3820,3822],{"class":92,"line":3101},[90,3800,1634],{"class":1483},[90,3802,2313],{"class":1483},[90,3804,3627],{"class":1618},[90,3806,129],{"class":1511},[90,3808,3632],{"class":1483},[90,3810,189],{"class":1511},[90,3812,3813],{"class":1639}," get",[90,3815,1676],{"class":1511},[90,3817,1679],{"class":1618},[90,3819,3679],{"class":1682},[90,3821,1685],{"class":1511},[90,3823,1606],{"class":1511},[90,3825,3826,3828,3831,3833,3836,3838,3840],{"class":92,"line":3126},[90,3827,1650],{"class":1483},[90,3829,3830],{"class":1524}," map",[90,3832,1491],{"class":1511},[90,3834,3835],{"class":1639},"get",[90,3837,1676],{"class":1511},[90,3839,3746],{"class":107},[90,3841,1892],{"class":1511},[90,3843,3844],{"class":92,"line":3136},[90,3845,1659],{"class":1511},[90,3847,3848],{"class":92,"line":3166},[90,3849,206],{"emptyLinePlaceholder":205},[90,3851,3852],{"class":92,"line":3172},[90,3853,1837],{"class":1547},[90,3855,3856],{"class":92,"line":3177},[90,3857,3858],{"class":1547},"     * 删除服务\n",[90,3860,3861],{"class":92,"line":3182},[90,3862,1847],{"class":1547},[90,3864,3866,3868,3870,3872],{"class":92,"line":3865},44,[90,3867,1852],{"class":1547},[90,3869,1855],{"class":1566},[90,3871,3679],{"class":1682},[90,3873,3682],{"class":1547},[90,3875,3877],{"class":92,"line":3876},45,[90,3878,1875],{"class":1547},[90,3880,3882,3884,3886,3888,3891,3893,3895,3897,3899],{"class":92,"line":3881},46,[90,3883,1634],{"class":1483},[90,3885,2313],{"class":1483},[90,3887,1670],{"class":1483},[90,3889,3890],{"class":1639}," remove",[90,3892,1676],{"class":1511},[90,3894,1679],{"class":1618},[90,3896,3679],{"class":1682},[90,3898,1685],{"class":1511},[90,3900,3901],{"class":1511},"  {\n",[90,3903,3905,3907,3909,3912,3914,3916],{"class":92,"line":3904},47,[90,3906,3736],{"class":1524},[90,3908,1491],{"class":1511},[90,3910,3911],{"class":1639},"remove",[90,3913,1676],{"class":1511},[90,3915,3746],{"class":107},[90,3917,1892],{"class":1511},[90,3919,3921],{"class":92,"line":3920},48,[90,3922,1659],{"class":1511},[90,3924,3926],{"class":92,"line":3925},49,[90,3927,1715],{"class":1511},[2561,3929,3931],{"id":3930},"_5注册服务到注册中心","5）注册服务到注册中心",[20,3933,3934,3935,3937,3938,3941],{},"接下来在启动提供者服务的时候，需要将服务注册到注册中心。就是把服务名和服务实现类放到 ",[87,3936,3529],{"code":3529},"中。修改 ",[87,3939,3940],{"code":3940},"EasyProviderExample","这个类，加入注册服务的代码。",[79,3943,3945],{"className":1473,"code":3944,"filename":3195,"language":1476,"meta":85,"style":85},"\u002F**\n * 简单的服务提供者示例\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class EasyProviderExample {\n\n    public static void main(String[] args) {\n        \u002F\u002F 注册服务\n        LocalRegistry.register(UserService.class.getName(), UserServiceImpl.class);\n\n        \u002F\u002F 启动 web 服务\n        VertxHttpServer vertxHttpServer = new VertxHttpServer();\n        vertxHttpServer.doStart(8080);\n    }\n}\n",[87,3946,3947,3951,3955,3959,3967,3975,3979,3989,3993,4015,4020,4054,4058,4062,4076,4090,4094],{"__ignoreMap":85},[90,3948,3949],{"class":92,"line":93},[90,3950,1548],{"class":1547},[90,3952,3953],{"class":92,"line":126},[90,3954,3313],{"class":1547},[90,3956,3957],{"class":92,"line":150},[90,3958,1558],{"class":1547},[90,3960,3961,3963,3965],{"class":92,"line":161},[90,3962,1563],{"class":1547},[90,3964,1567],{"class":1566},[90,3966,1570],{"class":1547},[90,3968,3969,3971,3973],{"class":92,"line":180},[90,3970,1563],{"class":1547},[90,3972,1577],{"class":1566},[90,3974,1580],{"class":1547},[90,3976,3977],{"class":92,"line":202},[90,3978,1585],{"class":1547},[90,3980,3981,3983,3985,3987],{"class":92,"line":209},[90,3982,1590],{"class":1483},[90,3984,1593],{"class":1483},[90,3986,3346],{"class":1596},[90,3988,1606],{"class":1511},[90,3990,3991],{"class":92,"line":228},[90,3992,206],{"emptyLinePlaceholder":205},[90,3994,3995,3997,3999,4001,4003,4005,4007,4009,4011,4013],{"class":92,"line":247},[90,3996,1634],{"class":1483},[90,3998,2313],{"class":1483},[90,4000,1670],{"class":1483},[90,4002,2318],{"class":1639},[90,4004,1676],{"class":1511},[90,4006,1679],{"class":1618},[90,4008,2325],{"class":1511},[90,4010,2328],{"class":1682},[90,4012,1685],{"class":1511},[90,4014,1606],{"class":1511},[90,4016,4017],{"class":92,"line":266},[90,4018,4019],{"class":1547},"        \u002F\u002F 注册服务\n",[90,4021,4022,4025,4027,4030,4032,4034,4036,4039,4041,4043,4046,4048,4050,4052],{"class":92,"line":271},[90,4023,4024],{"class":1524},"        LocalRegistry",[90,4026,1491],{"class":1511},[90,4028,4029],{"class":1639},"register",[90,4031,1676],{"class":1511},[90,4033,1992],{"class":1524},[90,4035,1491],{"class":1511},[90,4037,4038],{"class":1524},"class",[90,4040,1491],{"class":1511},[90,4042,2138],{"class":1639},[90,4044,4045],{"class":1511},"(),",[90,4047,2040],{"class":1524},[90,4049,1491],{"class":1511},[90,4051,4038],{"class":1524},[90,4053,1892],{"class":1511},[90,4055,4056],{"class":92,"line":429},[90,4057,206],{"emptyLinePlaceholder":205},[90,4059,4060],{"class":92,"line":440},[90,4061,3383],{"class":1547},[90,4063,4064,4066,4068,4070,4072,4074],{"class":92,"line":458},[90,4065,3388],{"class":1618},[90,4067,3391],{"class":1622},[90,4069,1702],{"class":1701},[90,4071,2364],{"class":1483},[90,4073,2783],{"class":1639},[90,4075,2369],{"class":1511},[90,4077,4078,4080,4082,4084,4086,4088],{"class":92,"line":475},[90,4079,3404],{"class":1524},[90,4081,1491],{"class":1511},[90,4083,3409],{"class":1639},[90,4085,1676],{"class":1511},[90,4087,3415],{"class":3414},[90,4089,1892],{"class":1511},[90,4091,4092],{"class":92,"line":492},[90,4093,1659],{"class":1511},[90,4095,4096],{"class":92,"line":502},[90,4097,1715],{"class":1511},[2561,4099,4101],{"id":4100},"_6实现序列化器","6）实现序列化器",[20,4103,4104],{},"因为 RPC 框架都是通过网络来传输数据，消费者和服务提供者是通过网络来交互，所以需要将传输信息序列化，这样才能在网络中直接传输 Java 对象。",[20,4106,4107],{},"这里我们简单使用 JDK 序列化来实现。",[20,4109,4110],{},"先定义一个序列化和反序列化接口，方便后续如果有更先进的序列化实现可以快速替换。",[79,4112,4115],{"className":1473,"code":4113,"filename":4114,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.serializer;\n\nimport java.io.IOException;\n\n\u002F**\n * 序列化器接口\n *\u002F\npublic interface Serializer {\n\n    \u002F**\n     * 序列化\n     *\n     * @param object 要序列化的对象\n     * @param \u003CT>    序列化对象的类型\n     * @return 序列化字节数组\n     * @throws IOException IO异常\n     *\u002F\n    \u003CT> byte[] serialize(T object) throws IOException;\n\n    \u002F**\n     * 反序列化\n     *\n     * @param bytes 字节数组\n     * @param type  类型\n     * @param \u003CT>   反序列化对象的类型\n     * @return 该类的对象\n     * @throws IOException IO异常\n     *\u002F\n    \u003CT> T deserialize(byte[] bytes, Class\u003CT> type) throws IOException;\n}\n","Serializer.java",[87,4116,4117,4138,4142,4159,4163,4167,4172,4176,4187,4191,4195,4200,4204,4216,4228,4237,4251,4255,4288,4292,4296,4301,4305,4317,4329,4340,4349,4359,4363,4406],{"__ignoreMap":85},[90,4118,4119,4121,4123,4125,4127,4129,4131,4133,4136],{"class":92,"line":93},[90,4120,1484],{"class":1483},[90,4122,1487],{"class":1483},[90,4124,1491],{"class":1490},[90,4126,1494],{"class":1483},[90,4128,1491],{"class":1490},[90,4130,1499],{"class":1483},[90,4132,1491],{"class":1490},[90,4134,4135],{"class":1483},"serializer",[90,4137,1512],{"class":1511},[90,4139,4140],{"class":92,"line":126},[90,4141,206],{"emptyLinePlaceholder":205},[90,4143,4144,4146,4148,4150,4152,4154,4157],{"class":92,"line":150},[90,4145,1521],{"class":1483},[90,4147,1525],{"class":1524},[90,4149,1491],{"class":1528},[90,4151,1531],{"class":1524},[90,4153,1491],{"class":1528},[90,4155,4156],{"class":1524},"IOException",[90,4158,1512],{"class":1511},[90,4160,4161],{"class":92,"line":161},[90,4162,206],{"emptyLinePlaceholder":205},[90,4164,4165],{"class":92,"line":180},[90,4166,1548],{"class":1547},[90,4168,4169],{"class":92,"line":202},[90,4170,4171],{"class":1547}," * 序列化器接口\n",[90,4173,4174],{"class":92,"line":209},[90,4175,1585],{"class":1547},[90,4177,4178,4180,4182,4185],{"class":92,"line":228},[90,4179,1590],{"class":1483},[90,4181,1823],{"class":1483},[90,4183,4184],{"class":1596}," Serializer",[90,4186,1606],{"class":1511},[90,4188,4189],{"class":92,"line":247},[90,4190,206],{"emptyLinePlaceholder":205},[90,4192,4193],{"class":92,"line":266},[90,4194,1837],{"class":1547},[90,4196,4197],{"class":92,"line":271},[90,4198,4199],{"class":1547},"     * 序列化\n",[90,4201,4202],{"class":92,"line":429},[90,4203,1847],{"class":1547},[90,4205,4206,4208,4210,4213],{"class":92,"line":440},[90,4207,1852],{"class":1547},[90,4209,1855],{"class":1566},[90,4211,4212],{"class":1682}," object",[90,4214,4215],{"class":1547}," 要序列化的对象\n",[90,4217,4218,4220,4222,4225],{"class":92,"line":458},[90,4219,1852],{"class":1547},[90,4221,1855],{"class":1566},[90,4223,4224],{"class":1682}," \u003CT>",[90,4226,4227],{"class":1547},"    序列化对象的类型\n",[90,4229,4230,4232,4234],{"class":92,"line":475},[90,4231,1852],{"class":1547},[90,4233,1868],{"class":1566},[90,4235,4236],{"class":1547}," 序列化字节数组\n",[90,4238,4239,4241,4244,4248],{"class":92,"line":492},[90,4240,1852],{"class":1547},[90,4242,4243],{"class":1566},"@throws",[90,4245,4247],{"class":4246},"sT9Pd"," IOException",[90,4249,4250],{"class":1547}," IO异常\n",[90,4252,4253],{"class":92,"line":502},[90,4254,1875],{"class":1547},[90,4256,4257,4259,4262,4264,4267,4270,4273,4275,4277,4279,4281,4284,4286],{"class":92,"line":512},[90,4258,183],{"class":1511},[90,4260,4261],{"class":1618},"T",[90,4263,189],{"class":1511},[90,4265,4266],{"class":1483}," byte",[90,4268,2325],{"class":4269},"sJVDc",[90,4271,4272],{"class":1639}," serialize",[90,4274,1676],{"class":1511},[90,4276,4261],{"class":1618},[90,4278,4212],{"class":1682},[90,4280,1685],{"class":1511},[90,4282,4283],{"class":1483}," throws",[90,4285,4247],{"class":1618},[90,4287,1512],{"class":1511},[90,4289,4290],{"class":92,"line":529},[90,4291,206],{"emptyLinePlaceholder":205},[90,4293,4294],{"class":92,"line":547},[90,4295,1837],{"class":1547},[90,4297,4298],{"class":92,"line":564},[90,4299,4300],{"class":1547},"     * 反序列化\n",[90,4302,4303],{"class":92,"line":573},[90,4304,1847],{"class":1547},[90,4306,4307,4309,4311,4314],{"class":92,"line":582},[90,4308,1852],{"class":1547},[90,4310,1855],{"class":1566},[90,4312,4313],{"class":1682}," bytes",[90,4315,4316],{"class":1547}," 字节数组\n",[90,4318,4319,4321,4323,4326],{"class":92,"line":600},[90,4320,1852],{"class":1547},[90,4322,1855],{"class":1566},[90,4324,4325],{"class":1682}," type",[90,4327,4328],{"class":1547},"  类型\n",[90,4330,4331,4333,4335,4337],{"class":92,"line":618},[90,4332,1852],{"class":1547},[90,4334,1855],{"class":1566},[90,4336,4224],{"class":1682},[90,4338,4339],{"class":1547},"   反序列化对象的类型\n",[90,4341,4342,4344,4346],{"class":92,"line":636},[90,4343,1852],{"class":1547},[90,4345,1868],{"class":1566},[90,4347,4348],{"class":1547}," 该类的对象\n",[90,4350,4351,4353,4355,4357],{"class":92,"line":655},[90,4352,1852],{"class":1547},[90,4354,4243],{"class":1566},[90,4356,4247],{"class":4246},[90,4358,4250],{"class":1547},[90,4360,4361],{"class":92,"line":664},[90,4362,1875],{"class":1547},[90,4364,4365,4367,4369,4371,4374,4377,4379,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400,4402,4404],{"class":92,"line":674},[90,4366,183],{"class":1511},[90,4368,4261],{"class":1618},[90,4370,189],{"class":1511},[90,4372,4373],{"class":1618}," T",[90,4375,4376],{"class":1639}," deserialize",[90,4378,1676],{"class":1511},[90,4380,4381],{"class":1483},"byte",[90,4383,2325],{"class":1511},[90,4385,4313],{"class":1682},[90,4387,3020],{"class":1511},[90,4389,3627],{"class":1618},[90,4391,129],{"class":1511},[90,4393,4261],{"class":1618},[90,4395,189],{"class":1511},[90,4397,4325],{"class":1682},[90,4399,1685],{"class":1511},[90,4401,4283],{"class":1483},[90,4403,4247],{"class":1618},[90,4405,1512],{"class":1511},[90,4407,4408],{"class":92,"line":679},[90,4409,1715],{"class":1511},[20,4411,4412],{},"然后基于 JDK 自带的序列化器实现 JdkSerializer",[79,4414,4417],{"className":1473,"code":4415,"filename":4416,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.serializer;\n\nimport java.io.*;\n\n\u002F**\n * 基于 JDK 实现序列化器\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class JdkSerializer implements Serializer {\n\n    \u002F**\n     * 序列化\n     *\n     * @param object 要序列化的对象\n     * @return 序列化字节数组\n     * @throws IOException IO异常\n     *\u002F\n    @Override\n    public \u003CT> byte[] serialize(T object) throws IOException {\n        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();\n\n        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {\n            objectOutputStream.writeObject(object);\n            objectOutputStream.flush();\n            return byteArrayOutputStream.toByteArray();\n        }\n    }\n\n    \u002F**\n     * 反序列化\n     *\n     * @param bytes 字节数组\n     * @param type  类型\n     * @return 该类的对象\n     * @throws IOException IO异常\n     *\u002F\n    @Override\n    public \u003CT> T deserialize(byte[] bytes, Class\u003CT> type) throws IOException {\n        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);\n        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);\n\n        try {\n            return (T) objectInputStream.readObject();\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new RuntimeException(e);\n        } finally {\n            objectInputStream.close();\n        }\n    }\n}\n\n","JdkSerializer.java",[87,4418,4419,4439,4443,4460,4464,4468,4473,4477,4485,4493,4497,4512,4516,4520,4524,4528,4538,4546,4556,4560,4566,4597,4614,4618,4648,4665,4676,4690,4694,4698,4702,4706,4710,4714,4724,4734,4742,4752,4756,4762,4804,4826,4848,4852,4858,4877,4896,4908,4925,4934,4947,4952,4957],{"__ignoreMap":85},[90,4420,4421,4423,4425,4427,4429,4431,4433,4435,4437],{"class":92,"line":93},[90,4422,1484],{"class":1483},[90,4424,1487],{"class":1483},[90,4426,1491],{"class":1490},[90,4428,1494],{"class":1483},[90,4430,1491],{"class":1490},[90,4432,1499],{"class":1483},[90,4434,1491],{"class":1490},[90,4436,4135],{"class":1483},[90,4438,1512],{"class":1511},[90,4440,4441],{"class":92,"line":126},[90,4442,206],{"emptyLinePlaceholder":205},[90,4444,4445,4447,4449,4451,4453,4455,4458],{"class":92,"line":150},[90,4446,1521],{"class":1483},[90,4448,1525],{"class":1524},[90,4450,1491],{"class":1528},[90,4452,1531],{"class":1524},[90,4454,1491],{"class":1528},[90,4456,4457],{"class":1524},"*",[90,4459,1512],{"class":1511},[90,4461,4462],{"class":92,"line":161},[90,4463,206],{"emptyLinePlaceholder":205},[90,4465,4466],{"class":92,"line":180},[90,4467,1548],{"class":1547},[90,4469,4470],{"class":92,"line":202},[90,4471,4472],{"class":1547}," * 基于 JDK 实现序列化器\n",[90,4474,4475],{"class":92,"line":209},[90,4476,1558],{"class":1547},[90,4478,4479,4481,4483],{"class":92,"line":228},[90,4480,1563],{"class":1547},[90,4482,1567],{"class":1566},[90,4484,1570],{"class":1547},[90,4486,4487,4489,4491],{"class":92,"line":247},[90,4488,1563],{"class":1547},[90,4490,1577],{"class":1566},[90,4492,1580],{"class":1547},[90,4494,4495],{"class":92,"line":266},[90,4496,1585],{"class":1547},[90,4498,4499,4501,4503,4506,4508,4510],{"class":92,"line":271},[90,4500,1590],{"class":1483},[90,4502,1593],{"class":1483},[90,4504,4505],{"class":1596}," JdkSerializer",[90,4507,1600],{"class":1483},[90,4509,4184],{"class":1596},[90,4511,1606],{"class":1511},[90,4513,4514],{"class":92,"line":429},[90,4515,206],{"emptyLinePlaceholder":205},[90,4517,4518],{"class":92,"line":440},[90,4519,1837],{"class":1547},[90,4521,4522],{"class":92,"line":458},[90,4523,4199],{"class":1547},[90,4525,4526],{"class":92,"line":475},[90,4527,1847],{"class":1547},[90,4529,4530,4532,4534,4536],{"class":92,"line":492},[90,4531,1852],{"class":1547},[90,4533,1855],{"class":1566},[90,4535,4212],{"class":1682},[90,4537,4215],{"class":1547},[90,4539,4540,4542,4544],{"class":92,"line":502},[90,4541,1852],{"class":1547},[90,4543,1868],{"class":1566},[90,4545,4236],{"class":1547},[90,4547,4548,4550,4552,4554],{"class":92,"line":512},[90,4549,1852],{"class":1547},[90,4551,4243],{"class":1566},[90,4553,4247],{"class":4246},[90,4555,4250],{"class":1547},[90,4557,4558],{"class":92,"line":529},[90,4559,1875],{"class":1547},[90,4561,4562,4564],{"class":92,"line":547},[90,4563,2086],{"class":2085},[90,4565,2090],{"class":2089},[90,4567,4568,4570,4573,4575,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595],{"class":92,"line":564},[90,4569,1634],{"class":1483},[90,4571,4572],{"class":1511}," \u003C",[90,4574,4261],{"class":1618},[90,4576,189],{"class":1511},[90,4578,4266],{"class":1483},[90,4580,2325],{"class":4269},[90,4582,4272],{"class":1639},[90,4584,1676],{"class":1511},[90,4586,4261],{"class":1618},[90,4588,4212],{"class":1682},[90,4590,1685],{"class":1511},[90,4592,4283],{"class":1483},[90,4594,4247],{"class":1618},[90,4596,1606],{"class":1511},[90,4598,4599,4602,4605,4607,4609,4612],{"class":92,"line":573},[90,4600,4601],{"class":1618},"        ByteArrayOutputStream",[90,4603,4604],{"class":1622}," byteArrayOutputStream",[90,4606,1702],{"class":1701},[90,4608,2364],{"class":1483},[90,4610,4611],{"class":1639}," ByteArrayOutputStream",[90,4613,2369],{"class":1511},[90,4615,4616],{"class":92,"line":582},[90,4617,206],{"emptyLinePlaceholder":205},[90,4619,4620,4623,4625,4628,4631,4633,4635,4638,4640,4643,4646],{"class":92,"line":600},[90,4621,4622],{"class":1483},"        try",[90,4624,2440],{"class":1511},[90,4626,4627],{"class":1618},"ObjectOutputStream",[90,4629,4630],{"class":1622}," objectOutputStream",[90,4632,1702],{"class":1701},[90,4634,2364],{"class":1483},[90,4636,4637],{"class":1639}," ObjectOutputStream",[90,4639,1676],{"class":1511},[90,4641,4642],{"class":107},"byteArrayOutputStream",[90,4644,4645],{"class":1511},"))",[90,4647,1606],{"class":1511},[90,4649,4650,4653,4655,4658,4660,4663],{"class":92,"line":618},[90,4651,4652],{"class":1524},"            objectOutputStream",[90,4654,1491],{"class":1511},[90,4656,4657],{"class":1639},"writeObject",[90,4659,1676],{"class":1511},[90,4661,4662],{"class":107},"object",[90,4664,1892],{"class":1511},[90,4666,4667,4669,4671,4674],{"class":92,"line":636},[90,4668,4652],{"class":1524},[90,4670,1491],{"class":1511},[90,4672,4673],{"class":1639},"flush",[90,4675,2369],{"class":1511},[90,4677,4678,4681,4683,4685,4688],{"class":92,"line":655},[90,4679,4680],{"class":1483},"            return",[90,4682,4604],{"class":1524},[90,4684,1491],{"class":1511},[90,4686,4687],{"class":1639},"toByteArray",[90,4689,2369],{"class":1511},[90,4691,4692],{"class":92,"line":664},[90,4693,2510],{"class":1511},[90,4695,4696],{"class":92,"line":674},[90,4697,1659],{"class":1511},[90,4699,4700],{"class":92,"line":679},[90,4701,206],{"emptyLinePlaceholder":205},[90,4703,4704],{"class":92,"line":1450},[90,4705,1837],{"class":1547},[90,4707,4708],{"class":92,"line":3029},[90,4709,4300],{"class":1547},[90,4711,4712],{"class":92,"line":3045},[90,4713,1847],{"class":1547},[90,4715,4716,4718,4720,4722],{"class":92,"line":3051},[90,4717,1852],{"class":1547},[90,4719,1855],{"class":1566},[90,4721,4313],{"class":1682},[90,4723,4316],{"class":1547},[90,4725,4726,4728,4730,4732],{"class":92,"line":3056},[90,4727,1852],{"class":1547},[90,4729,1855],{"class":1566},[90,4731,4325],{"class":1682},[90,4733,4328],{"class":1547},[90,4735,4736,4738,4740],{"class":92,"line":3080},[90,4737,1852],{"class":1547},[90,4739,1868],{"class":1566},[90,4741,4348],{"class":1547},[90,4743,4744,4746,4748,4750],{"class":92,"line":3101},[90,4745,1852],{"class":1547},[90,4747,4243],{"class":1566},[90,4749,4247],{"class":4246},[90,4751,4250],{"class":1547},[90,4753,4754],{"class":92,"line":3126},[90,4755,1875],{"class":1547},[90,4757,4758,4760],{"class":92,"line":3136},[90,4759,2086],{"class":2085},[90,4761,2090],{"class":2089},[90,4763,4764,4766,4768,4770,4772,4774,4776,4778,4780,4782,4784,4786,4788,4790,4792,4794,4796,4798,4800,4802],{"class":92,"line":3166},[90,4765,1634],{"class":1483},[90,4767,4572],{"class":1511},[90,4769,4261],{"class":1618},[90,4771,189],{"class":1511},[90,4773,4373],{"class":1618},[90,4775,4376],{"class":1639},[90,4777,1676],{"class":1511},[90,4779,4381],{"class":1483},[90,4781,2325],{"class":1511},[90,4783,4313],{"class":1682},[90,4785,3020],{"class":1511},[90,4787,3627],{"class":1618},[90,4789,129],{"class":1511},[90,4791,4261],{"class":1618},[90,4793,189],{"class":1511},[90,4795,4325],{"class":1682},[90,4797,1685],{"class":1511},[90,4799,4283],{"class":1483},[90,4801,4247],{"class":1618},[90,4803,1606],{"class":1511},[90,4805,4806,4809,4812,4814,4816,4819,4821,4824],{"class":92,"line":3172},[90,4807,4808],{"class":1618},"        ByteArrayInputStream",[90,4810,4811],{"class":1622}," byteArrayInputStream",[90,4813,1702],{"class":1701},[90,4815,2364],{"class":1483},[90,4817,4818],{"class":1639}," ByteArrayInputStream",[90,4820,1676],{"class":1511},[90,4822,4823],{"class":107},"bytes",[90,4825,1892],{"class":1511},[90,4827,4828,4831,4834,4836,4838,4841,4843,4846],{"class":92,"line":3177},[90,4829,4830],{"class":1618},"        ObjectInputStream",[90,4832,4833],{"class":1622}," objectInputStream",[90,4835,1702],{"class":1701},[90,4837,2364],{"class":1483},[90,4839,4840],{"class":1639}," ObjectInputStream",[90,4842,1676],{"class":1511},[90,4844,4845],{"class":107},"byteArrayInputStream",[90,4847,1892],{"class":1511},[90,4849,4850],{"class":92,"line":3182},[90,4851,206],{"emptyLinePlaceholder":205},[90,4853,4854,4856],{"class":92,"line":3865},[90,4855,4622],{"class":1483},[90,4857,1606],{"class":1511},[90,4859,4860,4862,4864,4866,4868,4870,4872,4875],{"class":92,"line":3876},[90,4861,4680],{"class":1483},[90,4863,2440],{"class":1511},[90,4865,4261],{"class":107},[90,4867,1685],{"class":1511},[90,4869,4833],{"class":1524},[90,4871,1491],{"class":1511},[90,4873,4874],{"class":1639},"readObject",[90,4876,2369],{"class":1511},[90,4878,4879,4881,4884,4886,4889,4892,4894],{"class":92,"line":3881},[90,4880,2481],{"class":1511},[90,4882,4883],{"class":1483}," catch",[90,4885,2440],{"class":1511},[90,4887,4888],{"class":1618},"Exception",[90,4890,4891],{"class":1682}," e",[90,4893,1685],{"class":1511},[90,4895,1606],{"class":1511},[90,4897,4898,4901,4903,4906],{"class":92,"line":3904},[90,4899,4900],{"class":1524},"            e",[90,4902,1491],{"class":1511},[90,4904,4905],{"class":1639},"printStackTrace",[90,4907,2369],{"class":1511},[90,4909,4910,4913,4915,4918,4920,4923],{"class":92,"line":3920},[90,4911,4912],{"class":1483},"            throw",[90,4914,2364],{"class":1483},[90,4916,4917],{"class":1639}," RuntimeException",[90,4919,1676],{"class":1511},[90,4921,4922],{"class":107},"e",[90,4924,1892],{"class":1511},[90,4926,4927,4929,4932],{"class":92,"line":3925},[90,4928,2481],{"class":1511},[90,4930,4931],{"class":1483}," finally",[90,4933,1606],{"class":1511},[90,4935,4937,4940,4942,4945],{"class":92,"line":4936},50,[90,4938,4939],{"class":1524},"            objectInputStream",[90,4941,1491],{"class":1511},[90,4943,4944],{"class":1639},"close",[90,4946,2369],{"class":1511},[90,4948,4950],{"class":92,"line":4949},51,[90,4951,2510],{"class":1511},[90,4953,4955],{"class":92,"line":4954},52,[90,4956,1659],{"class":1511},[90,4958,4960],{"class":92,"line":4959},53,[90,4961,1715],{"class":1511},[2561,4963,4965],{"id":4964},"_7封装请求体和响应体","7）封装请求体和响应体",[20,4967,4968],{},"这个就不必多说了，直接上代码。这些数据主要是为了方便使用 Java 反射机制来调用对应的方法。",[79,4970,4973],{"className":1473,"code":4971,"filename":4972,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.model;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\n\n\u002F**\n * RPC 调用请求封装\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class RpcRequest implements Serializable {\n\n    \u002F**\n     * 服务名称\n     *\u002F\n    private String serviceName;\n\n    \u002F**\n     * 方法名称\n     *\u002F\n    private String methodName;\n\n    \u002F**\n     * 参数类型列表\n     *\u002F\n    private Class\u003C?>[] parameterTypes;\n\n    \u002F**\n     * 参数列表\n     *\u002F\n    private Object[] args;\n}\n","RpcRequest.java",[87,4974,4975,4995,4999,5013,5026,5039,5052,5056,5072,5076,5080,5085,5089,5097,5105,5109,5117,5124,5131,5138,5153,5157,5161,5166,5170,5180,5184,5188,5193,5197,5208,5212,5216,5221,5225,5244,5248,5252,5257,5261,5274],{"__ignoreMap":85},[90,4976,4977,4979,4981,4983,4985,4987,4989,4991,4993],{"class":92,"line":93},[90,4978,1484],{"class":1483},[90,4980,1487],{"class":1483},[90,4982,1491],{"class":1490},[90,4984,1494],{"class":1483},[90,4986,1491],{"class":1490},[90,4988,1499],{"class":1483},[90,4990,1491],{"class":1490},[90,4992,1508],{"class":1483},[90,4994,1512],{"class":1511},[90,4996,4997],{"class":92,"line":126},[90,4998,206],{"emptyLinePlaceholder":205},[90,5000,5001,5003,5006,5008,5011],{"class":92,"line":150},[90,5002,1521],{"class":1483},[90,5004,5005],{"class":1524}," lombok",[90,5007,1491],{"class":1528},[90,5009,5010],{"class":1524},"AllArgsConstructor",[90,5012,1512],{"class":1511},[90,5014,5015,5017,5019,5021,5024],{"class":92,"line":161},[90,5016,1521],{"class":1483},[90,5018,5005],{"class":1524},[90,5020,1491],{"class":1528},[90,5022,5023],{"class":1524},"Builder",[90,5025,1512],{"class":1511},[90,5027,5028,5030,5032,5034,5037],{"class":92,"line":180},[90,5029,1521],{"class":1483},[90,5031,5005],{"class":1524},[90,5033,1491],{"class":1528},[90,5035,5036],{"class":1524},"Data",[90,5038,1512],{"class":1511},[90,5040,5041,5043,5045,5047,5050],{"class":92,"line":202},[90,5042,1521],{"class":1483},[90,5044,5005],{"class":1524},[90,5046,1491],{"class":1528},[90,5048,5049],{"class":1524},"NoArgsConstructor",[90,5051,1512],{"class":1511},[90,5053,5054],{"class":92,"line":209},[90,5055,206],{"emptyLinePlaceholder":205},[90,5057,5058,5060,5062,5064,5066,5068,5070],{"class":92,"line":228},[90,5059,1521],{"class":1483},[90,5061,1525],{"class":1524},[90,5063,1491],{"class":1528},[90,5065,1531],{"class":1524},[90,5067,1491],{"class":1528},[90,5069,1536],{"class":1524},[90,5071,1512],{"class":1511},[90,5073,5074],{"class":92,"line":247},[90,5075,206],{"emptyLinePlaceholder":205},[90,5077,5078],{"class":92,"line":266},[90,5079,1548],{"class":1547},[90,5081,5082],{"class":92,"line":271},[90,5083,5084],{"class":1547}," * RPC 调用请求封装\n",[90,5086,5087],{"class":92,"line":429},[90,5088,1558],{"class":1547},[90,5090,5091,5093,5095],{"class":92,"line":440},[90,5092,1563],{"class":1547},[90,5094,1567],{"class":1566},[90,5096,1570],{"class":1547},[90,5098,5099,5101,5103],{"class":92,"line":458},[90,5100,1563],{"class":1547},[90,5102,1577],{"class":1566},[90,5104,1580],{"class":1547},[90,5106,5107],{"class":92,"line":475},[90,5108,1585],{"class":1547},[90,5110,5111,5114],{"class":92,"line":492},[90,5112,5113],{"class":2085},"@",[90,5115,5116],{"class":2089},"Data\n",[90,5118,5119,5121],{"class":92,"line":502},[90,5120,5113],{"class":2085},[90,5122,5123],{"class":2089},"Builder\n",[90,5125,5126,5128],{"class":92,"line":512},[90,5127,5113],{"class":2085},[90,5129,5130],{"class":2089},"AllArgsConstructor\n",[90,5132,5133,5135],{"class":92,"line":529},[90,5134,5113],{"class":2085},[90,5136,5137],{"class":2089},"NoArgsConstructor\n",[90,5139,5140,5142,5144,5147,5149,5151],{"class":92,"line":547},[90,5141,1590],{"class":1483},[90,5143,1593],{"class":1483},[90,5145,5146],{"class":1596}," RpcRequest",[90,5148,1600],{"class":1483},[90,5150,1603],{"class":1596},[90,5152,1606],{"class":1511},[90,5154,5155],{"class":92,"line":564},[90,5156,206],{"emptyLinePlaceholder":205},[90,5158,5159],{"class":92,"line":573},[90,5160,1837],{"class":1547},[90,5162,5163],{"class":92,"line":582},[90,5164,5165],{"class":1547},"     * 服务名称\n",[90,5167,5168],{"class":92,"line":600},[90,5169,1875],{"class":1547},[90,5171,5172,5174,5176,5178],{"class":92,"line":618},[90,5173,1615],{"class":1483},[90,5175,1619],{"class":1618},[90,5177,3679],{"class":1622},[90,5179,1512],{"class":1511},[90,5181,5182],{"class":92,"line":636},[90,5183,206],{"emptyLinePlaceholder":205},[90,5185,5186],{"class":92,"line":655},[90,5187,1837],{"class":1547},[90,5189,5190],{"class":92,"line":664},[90,5191,5192],{"class":1547},"     * 方法名称\n",[90,5194,5195],{"class":92,"line":674},[90,5196,1875],{"class":1547},[90,5198,5199,5201,5203,5206],{"class":92,"line":679},[90,5200,1615],{"class":1483},[90,5202,1619],{"class":1618},[90,5204,5205],{"class":1622}," methodName",[90,5207,1512],{"class":1511},[90,5209,5210],{"class":92,"line":1450},[90,5211,206],{"emptyLinePlaceholder":205},[90,5213,5214],{"class":92,"line":3029},[90,5215,1837],{"class":1547},[90,5217,5218],{"class":92,"line":3045},[90,5219,5220],{"class":1547},"     * 参数类型列表\n",[90,5222,5223],{"class":92,"line":3051},[90,5224,1875],{"class":1547},[90,5226,5227,5229,5231,5233,5235,5237,5239,5242],{"class":92,"line":3056},[90,5228,1615],{"class":1483},[90,5230,3627],{"class":1618},[90,5232,129],{"class":1511},[90,5234,3632],{"class":1483},[90,5236,189],{"class":1511},[90,5238,2325],{"class":3651},[90,5240,5241],{"class":1622}," parameterTypes",[90,5243,1512],{"class":1511},[90,5245,5246],{"class":92,"line":3080},[90,5247,206],{"emptyLinePlaceholder":205},[90,5249,5250],{"class":92,"line":3101},[90,5251,1837],{"class":1547},[90,5253,5254],{"class":92,"line":3126},[90,5255,5256],{"class":1547},"     * 参数列表\n",[90,5258,5259],{"class":92,"line":3136},[90,5260,1875],{"class":1547},[90,5262,5263,5265,5268,5270,5272],{"class":92,"line":3166},[90,5264,1615],{"class":1483},[90,5266,5267],{"class":1618}," Object",[90,5269,2325],{"class":3651},[90,5271,2328],{"class":1622},[90,5273,1512],{"class":1511},[90,5275,5276],{"class":92,"line":3172},[90,5277,1715],{"class":1511},[79,5279,5282],{"className":1473,"code":5280,"filename":5281,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.model;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Builder;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\nimport java.io.Serializable;\n\n\u002F**\n * RPC 调用响应封装\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class RpcResponse implements Serializable {\n\n    \u002F**\n     * 响应数据\n     *\u002F\n    private Object data;\n\n    \u002F**\n     * 响应数据类型\n     *\u002F\n    private Class\u003C?> dataType;\n\n    \u002F**\n     * 响应信息\n     *\u002F\n    private String message;\n\n    \u002F**\n     * 异常信息\n     *\u002F\n    private Exception exception;\n}\n\n","RpcResponse.java",[87,5283,5284,5304,5308,5320,5332,5344,5356,5360,5376,5380,5384,5389,5393,5401,5409,5413,5419,5425,5431,5437,5452,5456,5460,5465,5469,5480,5484,5488,5493,5497,5514,5518,5522,5527,5531,5542,5546,5550,5555,5559,5571],{"__ignoreMap":85},[90,5285,5286,5288,5290,5292,5294,5296,5298,5300,5302],{"class":92,"line":93},[90,5287,1484],{"class":1483},[90,5289,1487],{"class":1483},[90,5291,1491],{"class":1490},[90,5293,1494],{"class":1483},[90,5295,1491],{"class":1490},[90,5297,1499],{"class":1483},[90,5299,1491],{"class":1490},[90,5301,1508],{"class":1483},[90,5303,1512],{"class":1511},[90,5305,5306],{"class":92,"line":126},[90,5307,206],{"emptyLinePlaceholder":205},[90,5309,5310,5312,5314,5316,5318],{"class":92,"line":150},[90,5311,1521],{"class":1483},[90,5313,5005],{"class":1524},[90,5315,1491],{"class":1528},[90,5317,5010],{"class":1524},[90,5319,1512],{"class":1511},[90,5321,5322,5324,5326,5328,5330],{"class":92,"line":161},[90,5323,1521],{"class":1483},[90,5325,5005],{"class":1524},[90,5327,1491],{"class":1528},[90,5329,5023],{"class":1524},[90,5331,1512],{"class":1511},[90,5333,5334,5336,5338,5340,5342],{"class":92,"line":180},[90,5335,1521],{"class":1483},[90,5337,5005],{"class":1524},[90,5339,1491],{"class":1528},[90,5341,5036],{"class":1524},[90,5343,1512],{"class":1511},[90,5345,5346,5348,5350,5352,5354],{"class":92,"line":202},[90,5347,1521],{"class":1483},[90,5349,5005],{"class":1524},[90,5351,1491],{"class":1528},[90,5353,5049],{"class":1524},[90,5355,1512],{"class":1511},[90,5357,5358],{"class":92,"line":209},[90,5359,206],{"emptyLinePlaceholder":205},[90,5361,5362,5364,5366,5368,5370,5372,5374],{"class":92,"line":228},[90,5363,1521],{"class":1483},[90,5365,1525],{"class":1524},[90,5367,1491],{"class":1528},[90,5369,1531],{"class":1524},[90,5371,1491],{"class":1528},[90,5373,1536],{"class":1524},[90,5375,1512],{"class":1511},[90,5377,5378],{"class":92,"line":247},[90,5379,206],{"emptyLinePlaceholder":205},[90,5381,5382],{"class":92,"line":266},[90,5383,1548],{"class":1547},[90,5385,5386],{"class":92,"line":271},[90,5387,5388],{"class":1547}," * RPC 调用响应封装\n",[90,5390,5391],{"class":92,"line":429},[90,5392,1558],{"class":1547},[90,5394,5395,5397,5399],{"class":92,"line":440},[90,5396,1563],{"class":1547},[90,5398,1567],{"class":1566},[90,5400,1570],{"class":1547},[90,5402,5403,5405,5407],{"class":92,"line":458},[90,5404,1563],{"class":1547},[90,5406,1577],{"class":1566},[90,5408,1580],{"class":1547},[90,5410,5411],{"class":92,"line":475},[90,5412,1585],{"class":1547},[90,5414,5415,5417],{"class":92,"line":492},[90,5416,5113],{"class":2085},[90,5418,5116],{"class":2089},[90,5420,5421,5423],{"class":92,"line":502},[90,5422,5113],{"class":2085},[90,5424,5123],{"class":2089},[90,5426,5427,5429],{"class":92,"line":512},[90,5428,5113],{"class":2085},[90,5430,5130],{"class":2089},[90,5432,5433,5435],{"class":92,"line":529},[90,5434,5113],{"class":2085},[90,5436,5137],{"class":2089},[90,5438,5439,5441,5443,5446,5448,5450],{"class":92,"line":547},[90,5440,1590],{"class":1483},[90,5442,1593],{"class":1483},[90,5444,5445],{"class":1596}," RpcResponse",[90,5447,1600],{"class":1483},[90,5449,1603],{"class":1596},[90,5451,1606],{"class":1511},[90,5453,5454],{"class":92,"line":564},[90,5455,206],{"emptyLinePlaceholder":205},[90,5457,5458],{"class":92,"line":573},[90,5459,1837],{"class":1547},[90,5461,5462],{"class":92,"line":582},[90,5463,5464],{"class":1547},"     * 响应数据\n",[90,5466,5467],{"class":92,"line":600},[90,5468,1875],{"class":1547},[90,5470,5471,5473,5475,5478],{"class":92,"line":618},[90,5472,1615],{"class":1483},[90,5474,5267],{"class":1618},[90,5476,5477],{"class":1622}," data",[90,5479,1512],{"class":1511},[90,5481,5482],{"class":92,"line":636},[90,5483,206],{"emptyLinePlaceholder":205},[90,5485,5486],{"class":92,"line":655},[90,5487,1837],{"class":1547},[90,5489,5490],{"class":92,"line":664},[90,5491,5492],{"class":1547},"     * 响应数据类型\n",[90,5494,5495],{"class":92,"line":674},[90,5496,1875],{"class":1547},[90,5498,5499,5501,5503,5505,5507,5509,5512],{"class":92,"line":679},[90,5500,1615],{"class":1483},[90,5502,3627],{"class":1618},[90,5504,129],{"class":1511},[90,5506,3632],{"class":1483},[90,5508,189],{"class":1511},[90,5510,5511],{"class":1622}," dataType",[90,5513,1512],{"class":1511},[90,5515,5516],{"class":92,"line":1450},[90,5517,206],{"emptyLinePlaceholder":205},[90,5519,5520],{"class":92,"line":3029},[90,5521,1837],{"class":1547},[90,5523,5524],{"class":92,"line":3045},[90,5525,5526],{"class":1547},"     * 响应信息\n",[90,5528,5529],{"class":92,"line":3051},[90,5530,1875],{"class":1547},[90,5532,5533,5535,5537,5540],{"class":92,"line":3056},[90,5534,1615],{"class":1483},[90,5536,1619],{"class":1618},[90,5538,5539],{"class":1622}," message",[90,5541,1512],{"class":1511},[90,5543,5544],{"class":92,"line":3080},[90,5545,206],{"emptyLinePlaceholder":205},[90,5547,5548],{"class":92,"line":3101},[90,5549,1837],{"class":1547},[90,5551,5552],{"class":92,"line":3126},[90,5553,5554],{"class":1547},"     * 异常信息\n",[90,5556,5557],{"class":92,"line":3136},[90,5558,1875],{"class":1547},[90,5560,5561,5563,5566,5569],{"class":92,"line":3166},[90,5562,1615],{"class":1483},[90,5564,5565],{"class":1618}," Exception",[90,5567,5568],{"class":1622}," exception",[90,5570,1512],{"class":1511},[90,5572,5573],{"class":92,"line":3172},[90,5574,1715],{"class":1511},[2561,5576,5578],{"id":5577},"_8请求处理器","8）请求处理器",[20,5580,5581],{},"请求处理器要做的就是接收消费者模块发起的网络请求，然后进行反序列化处理并调用对应的提供者方法实现功能，再响应序列化后的数据。",[79,5583,5586],{"className":1473,"code":5584,"filename":5585,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.server;\n\nimport io.vertx.core.Handler;\nimport io.vertx.core.buffer.Buffer;\nimport io.vertx.core.http.HttpServerRequest;\nimport io.vertx.core.http.HttpServerResponse;\nimport top.dhbxs.rpc.model.RpcRequest;\nimport top.dhbxs.rpc.model.RpcResponse;\nimport top.dhbxs.rpc.registry.LocalRegistry;\nimport top.dhbxs.rpc.serializer.JdkSerializer;\nimport top.dhbxs.rpc.serializer.Serializer;\n\nimport java.io.IOException;\nimport java.lang.reflect.Method;\n\n\u002F**\n * HTTP 请求处理\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class HttpServerHandler implements Handler\u003CHttpServerRequest> {\n\n    \u002F**\n    * 请求处理器主要功能：\n    * 1. 反序列化请求体，拿到请求参数\n    * 2. 根据参数中的服务名称，从本地注册器中获取对应的服务实现类\n    * 3. 通过反射机制调用\n    * 4. 对调用结果封装和序列化，响应结果\n    *\u002F\n    @Override\n    public void handle(HttpServerRequest request) {\n        \u002F\u002F 指定序列化器\n        final Serializer serializer = new JdkSerializer();\n\n        \u002F\u002F 记录日志\n        System.out.println(\"Received request: \" + request.method() + \" \" + request.uri());\n\n        request.bodyHandler(body -> {\n            \u002F\u002F 取出请求体中的数据\n            byte[] bytes = body.getBytes();\n            RpcRequest rpcRequest = null;\n\n            \u002F\u002F 请求数据反序列化为请求实体\n            try {\n                rpcRequest = serializer.deserialize(bytes, RpcRequest.class);\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n            \u002F\u002F 构造响应结果对象\n            RpcResponse rpcResponse = new RpcResponse();\n            if (rpcRequest == null) {\n                rpcResponse.setMessage(\"RpcRequest is null\");\n                doResponse(request, rpcResponse, serializer);\n                return;\n            }\n\n            try {\n                \u002F\u002F 获取要调用服务的实现类\n                Class\u003C?> implClass = LocalRegistry.get(rpcRequest.getServiceName());\n                \u002F\u002F 反射拿到要调用的方法\n                Method method = implClass.getMethod(rpcRequest.getMethodName(), rpcRequest.getParameterTypes());\n                \u002F\u002F 反射执行方法，拿到执行结果\n                Object result = method.invoke(implClass.newInstance(), rpcRequest.getArgs());\n\n                \u002F\u002F 封装返回结果\n                rpcResponse.setData(result);\n                rpcResponse.setDataType(method.getReturnType());\n                rpcResponse.setMessage(\"OK\");\n            } catch (Exception e) {\n                e.printStackTrace();\n                rpcResponse.setMessage(e.getMessage());\n                rpcResponse.setException(e);\n            }\n\n            \u002F\u002F 响应数据\n            doResponse(request, rpcResponse, serializer);\n        });\n\n\n    }\n\n    \u002F**\n     * 响应\n     *\n     * @param request     请求\n     * @param rpcResponse 响应结果\n     * @param serializer  序列化器\n     *\u002F\n    private void doResponse(HttpServerRequest request, RpcResponse rpcResponse, Serializer serializer) {\n        HttpServerResponse httpServerResponse = request.response().putHeader(\"content-type\", \"application\u002Fjson\");\n\n        try {\n            \u002F\u002F 序列化响应内容\n            byte[] serialized = serializer.serialize(rpcResponse);\n            httpServerResponse.end(Buffer.buffer(serialized));\n        } catch (IOException e) {\n            e.printStackTrace();\n            httpServerResponse.end(Buffer.buffer());\n        }\n    }\n}\n\n","HttpServerHandler.java",[87,5587,5588,5608,5612,5633,5659,5684,5709,5734,5759,5783,5808,5833,5837,5853,5876,5880,5884,5889,5893,5901,5909,5913,5935,5939,5943,5948,5953,5958,5963,5968,5973,5979,5998,6003,6021,6025,6030,6072,6076,6095,6100,6121,6135,6139,6144,6151,6179,6195,6206,6210,6215,6231,6249,6266,6287,6295,6300,6305,6312,6318,6352,6358,6396,6402,6440,6445,6451,6467,6488,6504,6521,6532,6552,6568,6573,6578,6584,6604,6609,6614,6619,6624,6629,6634,6640,6645,6657,6669,6681,6686,6718,6750,6755,6762,6768,6794,6820,6837,6848,6867,6872,6877],{"__ignoreMap":85},[90,5589,5590,5592,5594,5596,5598,5600,5602,5604,5606],{"class":92,"line":93},[90,5591,1484],{"class":1483},[90,5593,1487],{"class":1483},[90,5595,1491],{"class":1490},[90,5597,1494],{"class":1483},[90,5599,1491],{"class":1490},[90,5601,1499],{"class":1483},[90,5603,1491],{"class":1490},[90,5605,2592],{"class":1483},[90,5607,1512],{"class":1511},[90,5609,5610],{"class":92,"line":126},[90,5611,206],{"emptyLinePlaceholder":205},[90,5613,5614,5616,5618,5620,5622,5624,5626,5628,5631],{"class":92,"line":150},[90,5615,1521],{"class":1483},[90,5617,2720],{"class":1524},[90,5619,1491],{"class":1528},[90,5621,2725],{"class":1524},[90,5623,1491],{"class":1528},[90,5625,2730],{"class":1524},[90,5627,1491],{"class":1528},[90,5629,5630],{"class":1524},"Handler",[90,5632,1512],{"class":1511},[90,5634,5635,5637,5639,5641,5643,5645,5647,5649,5652,5654,5657],{"class":92,"line":161},[90,5636,1521],{"class":1483},[90,5638,2720],{"class":1524},[90,5640,1491],{"class":1528},[90,5642,2725],{"class":1524},[90,5644,1491],{"class":1528},[90,5646,2730],{"class":1524},[90,5648,1491],{"class":1528},[90,5650,5651],{"class":1524},"buffer",[90,5653,1491],{"class":1528},[90,5655,5656],{"class":1524},"Buffer",[90,5658,1512],{"class":1511},[90,5660,5661,5663,5665,5667,5669,5671,5673,5675,5677,5679,5682],{"class":92,"line":180},[90,5662,1521],{"class":1483},[90,5664,2720],{"class":1524},[90,5666,1491],{"class":1528},[90,5668,2725],{"class":1524},[90,5670,1491],{"class":1528},[90,5672,2730],{"class":1524},[90,5674,1491],{"class":1528},[90,5676,2894],{"class":1524},[90,5678,1491],{"class":1528},[90,5680,5681],{"class":1524},"HttpServerRequest",[90,5683,1512],{"class":1511},[90,5685,5686,5688,5690,5692,5694,5696,5698,5700,5702,5704,5707],{"class":92,"line":202},[90,5687,1521],{"class":1483},[90,5689,2720],{"class":1524},[90,5691,1491],{"class":1528},[90,5693,2725],{"class":1524},[90,5695,1491],{"class":1528},[90,5697,2730],{"class":1524},[90,5699,1491],{"class":1528},[90,5701,2894],{"class":1524},[90,5703,1491],{"class":1528},[90,5705,5706],{"class":1524},"HttpServerResponse",[90,5708,1512],{"class":1511},[90,5710,5711,5713,5715,5717,5719,5721,5723,5725,5727,5729,5732],{"class":92,"line":209},[90,5712,1521],{"class":1483},[90,5714,1487],{"class":1524},[90,5716,1491],{"class":1528},[90,5718,1494],{"class":1524},[90,5720,1491],{"class":1528},[90,5722,1499],{"class":1524},[90,5724,1491],{"class":1528},[90,5726,1508],{"class":1524},[90,5728,1491],{"class":1528},[90,5730,5731],{"class":1524},"RpcRequest",[90,5733,1512],{"class":1511},[90,5735,5736,5738,5740,5742,5744,5746,5748,5750,5752,5754,5757],{"class":92,"line":228},[90,5737,1521],{"class":1483},[90,5739,1487],{"class":1524},[90,5741,1491],{"class":1528},[90,5743,1494],{"class":1524},[90,5745,1491],{"class":1528},[90,5747,1499],{"class":1524},[90,5749,1491],{"class":1528},[90,5751,1508],{"class":1524},[90,5753,1491],{"class":1528},[90,5755,5756],{"class":1524},"RpcResponse",[90,5758,1512],{"class":1511},[90,5760,5761,5763,5765,5767,5769,5771,5773,5775,5777,5779,5781],{"class":92,"line":247},[90,5762,1521],{"class":1483},[90,5764,1487],{"class":1524},[90,5766,1491],{"class":1528},[90,5768,1494],{"class":1524},[90,5770,1491],{"class":1528},[90,5772,1499],{"class":1524},[90,5774,1491],{"class":1528},[90,5776,3268],{"class":1524},[90,5778,1491],{"class":1528},[90,5780,3273],{"class":1524},[90,5782,1512],{"class":1511},[90,5784,5785,5787,5789,5791,5793,5795,5797,5799,5801,5803,5806],{"class":92,"line":266},[90,5786,1521],{"class":1483},[90,5788,1487],{"class":1524},[90,5790,1491],{"class":1528},[90,5792,1494],{"class":1524},[90,5794,1491],{"class":1528},[90,5796,1499],{"class":1524},[90,5798,1491],{"class":1528},[90,5800,4135],{"class":1524},[90,5802,1491],{"class":1528},[90,5804,5805],{"class":1524},"JdkSerializer",[90,5807,1512],{"class":1511},[90,5809,5810,5812,5814,5816,5818,5820,5822,5824,5826,5828,5831],{"class":92,"line":271},[90,5811,1521],{"class":1483},[90,5813,1487],{"class":1524},[90,5815,1491],{"class":1528},[90,5817,1494],{"class":1524},[90,5819,1491],{"class":1528},[90,5821,1499],{"class":1524},[90,5823,1491],{"class":1528},[90,5825,4135],{"class":1524},[90,5827,1491],{"class":1528},[90,5829,5830],{"class":1524},"Serializer",[90,5832,1512],{"class":1511},[90,5834,5835],{"class":92,"line":429},[90,5836,206],{"emptyLinePlaceholder":205},[90,5838,5839,5841,5843,5845,5847,5849,5851],{"class":92,"line":440},[90,5840,1521],{"class":1483},[90,5842,1525],{"class":1524},[90,5844,1491],{"class":1528},[90,5846,1531],{"class":1524},[90,5848,1491],{"class":1528},[90,5850,4156],{"class":1524},[90,5852,1512],{"class":1511},[90,5854,5855,5857,5859,5861,5864,5866,5869,5871,5874],{"class":92,"line":458},[90,5856,1521],{"class":1483},[90,5858,1525],{"class":1524},[90,5860,1491],{"class":1528},[90,5862,5863],{"class":1524},"lang",[90,5865,1491],{"class":1528},[90,5867,5868],{"class":1524},"reflect",[90,5870,1491],{"class":1528},[90,5872,5873],{"class":1524},"Method",[90,5875,1512],{"class":1511},[90,5877,5878],{"class":92,"line":475},[90,5879,206],{"emptyLinePlaceholder":205},[90,5881,5882],{"class":92,"line":492},[90,5883,1548],{"class":1547},[90,5885,5886],{"class":92,"line":502},[90,5887,5888],{"class":1547}," * HTTP 请求处理\n",[90,5890,5891],{"class":92,"line":512},[90,5892,1558],{"class":1547},[90,5894,5895,5897,5899],{"class":92,"line":529},[90,5896,1563],{"class":1547},[90,5898,1567],{"class":1566},[90,5900,1570],{"class":1547},[90,5902,5903,5905,5907],{"class":92,"line":547},[90,5904,1563],{"class":1547},[90,5906,1577],{"class":1566},[90,5908,1580],{"class":1547},[90,5910,5911],{"class":92,"line":564},[90,5912,1585],{"class":1547},[90,5914,5915,5917,5919,5922,5924,5927,5929,5931,5933],{"class":92,"line":573},[90,5916,1590],{"class":1483},[90,5918,1593],{"class":1483},[90,5920,5921],{"class":1596}," HttpServerHandler",[90,5923,1600],{"class":1483},[90,5925,5926],{"class":1596}," Handler",[90,5928,129],{"class":1511},[90,5930,5681],{"class":1618},[90,5932,189],{"class":1511},[90,5934,1606],{"class":1511},[90,5936,5937],{"class":92,"line":582},[90,5938,206],{"emptyLinePlaceholder":205},[90,5940,5941],{"class":92,"line":600},[90,5942,1837],{"class":1547},[90,5944,5945],{"class":92,"line":618},[90,5946,5947],{"class":1547},"    * 请求处理器主要功能：\n",[90,5949,5950],{"class":92,"line":636},[90,5951,5952],{"class":1547},"    * 1. 反序列化请求体，拿到请求参数\n",[90,5954,5955],{"class":92,"line":655},[90,5956,5957],{"class":1547},"    * 2. 根据参数中的服务名称，从本地注册器中获取对应的服务实现类\n",[90,5959,5960],{"class":92,"line":664},[90,5961,5962],{"class":1547},"    * 3. 通过反射机制调用\n",[90,5964,5965],{"class":92,"line":674},[90,5966,5967],{"class":1547},"    * 4. 对调用结果封装和序列化，响应结果\n",[90,5969,5970],{"class":92,"line":679},[90,5971,5972],{"class":1547},"    *\u002F\n",[90,5974,5975,5977],{"class":92,"line":1450},[90,5976,2086],{"class":2085},[90,5978,2090],{"class":2089},[90,5980,5981,5983,5985,5988,5990,5992,5994,5996],{"class":92,"line":3029},[90,5982,1634],{"class":1483},[90,5984,1670],{"class":1483},[90,5986,5987],{"class":1639}," handle",[90,5989,1676],{"class":1511},[90,5991,5681],{"class":1618},[90,5993,2964],{"class":1682},[90,5995,1685],{"class":1511},[90,5997,1606],{"class":1511},[90,5999,6000],{"class":92,"line":3045},[90,6001,6002],{"class":1547},"        \u002F\u002F 指定序列化器\n",[90,6004,6005,6008,6010,6013,6015,6017,6019],{"class":92,"line":3051},[90,6006,6007],{"class":1483},"        final",[90,6009,4184],{"class":1618},[90,6011,6012],{"class":1622}," serializer",[90,6014,1702],{"class":1701},[90,6016,2364],{"class":1483},[90,6018,4505],{"class":1639},[90,6020,2369],{"class":1511},[90,6022,6023],{"class":92,"line":3056},[90,6024,206],{"emptyLinePlaceholder":205},[90,6026,6027],{"class":92,"line":3080},[90,6028,6029],{"class":1547},"        \u002F\u002F 记录日志\n",[90,6031,6032,6034,6036,6038,6040,6042,6044,6047,6049,6051,6053,6055,6057,6059,6062,6064,6066,6068,6070],{"class":92,"line":3101},[90,6033,2113],{"class":1524},[90,6035,1491],{"class":1511},[90,6037,2118],{"class":1524},[90,6039,1491],{"class":1511},[90,6041,2123],{"class":1639},[90,6043,1676],{"class":1511},[90,6045,6046],{"class":111},"\"Received request: \"",[90,6048,2131],{"class":1701},[90,6050,2964],{"class":1524},[90,6052,1491],{"class":1511},[90,6054,2969],{"class":1639},[90,6056,1643],{"class":1511},[90,6058,2131],{"class":1701},[90,6060,6061],{"class":111}," \" \"",[90,6063,2131],{"class":1701},[90,6065,2964],{"class":1524},[90,6067,1491],{"class":1511},[90,6069,2985],{"class":1639},[90,6071,2141],{"class":1511},[90,6073,6074],{"class":92,"line":3126},[90,6075,206],{"emptyLinePlaceholder":205},[90,6077,6078,6081,6083,6086,6088,6091,6093],{"class":92,"line":3136},[90,6079,6080],{"class":1524},"        request",[90,6082,1491],{"class":1511},[90,6084,6085],{"class":1639},"bodyHandler",[90,6087,1676],{"class":1511},[90,6089,6090],{"class":107},"body ",[90,6092,2935],{"class":1483},[90,6094,1606],{"class":1511},[90,6096,6097],{"class":92,"line":3166},[90,6098,6099],{"class":1547},"            \u002F\u002F 取出请求体中的数据\n",[90,6101,6102,6105,6107,6109,6111,6114,6116,6119],{"class":92,"line":3172},[90,6103,6104],{"class":1483},"            byte",[90,6106,2325],{"class":1511},[90,6108,4313],{"class":1622},[90,6110,1702],{"class":1701},[90,6112,6113],{"class":1524}," body",[90,6115,1491],{"class":1511},[90,6117,6118],{"class":1639},"getBytes",[90,6120,2369],{"class":1511},[90,6122,6123,6126,6129,6131,6133],{"class":92,"line":3177},[90,6124,6125],{"class":1618},"            RpcRequest",[90,6127,6128],{"class":1622}," rpcRequest",[90,6130,1702],{"class":1701},[90,6132,2346],{"class":2345},[90,6134,1512],{"class":1511},[90,6136,6137],{"class":92,"line":3182},[90,6138,206],{"emptyLinePlaceholder":205},[90,6140,6141],{"class":92,"line":3865},[90,6142,6143],{"class":1547},"            \u002F\u002F 请求数据反序列化为请求实体\n",[90,6145,6146,6149],{"class":92,"line":3876},[90,6147,6148],{"class":1483},"            try",[90,6150,1606],{"class":1511},[90,6152,6153,6156,6158,6160,6162,6165,6167,6169,6171,6173,6175,6177],{"class":92,"line":3881},[90,6154,6155],{"class":107},"                rpcRequest ",[90,6157,108],{"class":1701},[90,6159,6012],{"class":1524},[90,6161,1491],{"class":1511},[90,6163,6164],{"class":1639},"deserialize",[90,6166,1676],{"class":1511},[90,6168,4823],{"class":107},[90,6170,3020],{"class":1511},[90,6172,5146],{"class":1524},[90,6174,1491],{"class":1511},[90,6176,4038],{"class":1524},[90,6178,1892],{"class":1511},[90,6180,6181,6183,6185,6187,6189,6191,6193],{"class":92,"line":3904},[90,6182,3129],{"class":1511},[90,6184,4883],{"class":1483},[90,6186,2440],{"class":1511},[90,6188,4888],{"class":1618},[90,6190,4891],{"class":1682},[90,6192,1685],{"class":1511},[90,6194,1606],{"class":1511},[90,6196,6197,6200,6202,6204],{"class":92,"line":3920},[90,6198,6199],{"class":1524},"                e",[90,6201,1491],{"class":1511},[90,6203,4905],{"class":1639},[90,6205,2369],{"class":1511},[90,6207,6208],{"class":92,"line":3925},[90,6209,3169],{"class":1511},[90,6211,6212],{"class":92,"line":4936},[90,6213,6214],{"class":1547},"            \u002F\u002F 构造响应结果对象\n",[90,6216,6217,6220,6223,6225,6227,6229],{"class":92,"line":4949},[90,6218,6219],{"class":1618},"            RpcResponse",[90,6221,6222],{"class":1622}," rpcResponse",[90,6224,1702],{"class":1701},[90,6226,2364],{"class":1483},[90,6228,5445],{"class":1639},[90,6230,2369],{"class":1511},[90,6232,6233,6235,6237,6240,6243,6245,6247],{"class":92,"line":4954},[90,6234,3083],{"class":1483},[90,6236,2440],{"class":1511},[90,6238,6239],{"class":107},"rpcRequest ",[90,6241,6242],{"class":1701},"==",[90,6244,2346],{"class":2345},[90,6246,1685],{"class":1511},[90,6248,1606],{"class":1511},[90,6250,6251,6254,6256,6259,6261,6264],{"class":92,"line":4959},[90,6252,6253],{"class":1524},"                rpcResponse",[90,6255,1491],{"class":1511},[90,6257,6258],{"class":1639},"setMessage",[90,6260,1676],{"class":1511},[90,6262,6263],{"class":111},"\"RpcRequest is null\"",[90,6265,1892],{"class":1511},[90,6267,6269,6272,6274,6277,6279,6281,6283,6285],{"class":92,"line":6268},54,[90,6270,6271],{"class":1639},"                doResponse",[90,6273,1676],{"class":1511},[90,6275,6276],{"class":107},"request",[90,6278,3020],{"class":1511},[90,6280,6222],{"class":107},[90,6282,3020],{"class":1511},[90,6284,6012],{"class":107},[90,6286,1892],{"class":1511},[90,6288,6290,6293],{"class":92,"line":6289},55,[90,6291,6292],{"class":1483},"                return",[90,6294,1512],{"class":1511},[90,6296,6298],{"class":92,"line":6297},56,[90,6299,3169],{"class":1511},[90,6301,6303],{"class":92,"line":6302},57,[90,6304,206],{"emptyLinePlaceholder":205},[90,6306,6308,6310],{"class":92,"line":6307},58,[90,6309,6148],{"class":1483},[90,6311,1606],{"class":1511},[90,6313,6315],{"class":92,"line":6314},59,[90,6316,6317],{"class":1547},"                \u002F\u002F 获取要调用服务的实现类\n",[90,6319,6321,6324,6326,6328,6330,6332,6334,6336,6338,6340,6342,6345,6347,6350],{"class":92,"line":6320},60,[90,6322,6323],{"class":1618},"                Class",[90,6325,129],{"class":1511},[90,6327,3632],{"class":1483},[90,6329,189],{"class":1511},[90,6331,3691],{"class":1622},[90,6333,1702],{"class":1701},[90,6335,3577],{"class":1524},[90,6337,1491],{"class":1511},[90,6339,3835],{"class":1639},[90,6341,1676],{"class":1511},[90,6343,6344],{"class":1524},"rpcRequest",[90,6346,1491],{"class":1511},[90,6348,6349],{"class":1639},"getServiceName",[90,6351,2141],{"class":1511},[90,6353,6355],{"class":92,"line":6354},61,[90,6356,6357],{"class":1547},"                \u002F\u002F 反射拿到要调用的方法\n",[90,6359,6361,6364,6367,6369,6371,6373,6376,6378,6380,6382,6385,6387,6389,6391,6394],{"class":92,"line":6360},62,[90,6362,6363],{"class":1618},"                Method",[90,6365,6366],{"class":1622}," method",[90,6368,1702],{"class":1701},[90,6370,3691],{"class":1524},[90,6372,1491],{"class":1511},[90,6374,6375],{"class":1639},"getMethod",[90,6377,1676],{"class":1511},[90,6379,6344],{"class":1524},[90,6381,1491],{"class":1511},[90,6383,6384],{"class":1639},"getMethodName",[90,6386,4045],{"class":1511},[90,6388,6128],{"class":1524},[90,6390,1491],{"class":1511},[90,6392,6393],{"class":1639},"getParameterTypes",[90,6395,2141],{"class":1511},[90,6397,6399],{"class":92,"line":6398},63,[90,6400,6401],{"class":1547},"                \u002F\u002F 反射执行方法，拿到执行结果\n",[90,6403,6405,6408,6410,6412,6414,6416,6419,6421,6424,6426,6429,6431,6433,6435,6438],{"class":92,"line":6404},64,[90,6406,6407],{"class":1618},"                Object",[90,6409,3156],{"class":1622},[90,6411,1702],{"class":1701},[90,6413,6366],{"class":1524},[90,6415,1491],{"class":1511},[90,6417,6418],{"class":1639},"invoke",[90,6420,1676],{"class":1511},[90,6422,6423],{"class":1524},"implClass",[90,6425,1491],{"class":1511},[90,6427,6428],{"class":1639},"newInstance",[90,6430,4045],{"class":1511},[90,6432,6128],{"class":1524},[90,6434,1491],{"class":1511},[90,6436,6437],{"class":1639},"getArgs",[90,6439,2141],{"class":1511},[90,6441,6443],{"class":92,"line":6442},65,[90,6444,206],{"emptyLinePlaceholder":205},[90,6446,6448],{"class":92,"line":6447},66,[90,6449,6450],{"class":1547},"                \u002F\u002F 封装返回结果\n",[90,6452,6454,6456,6458,6461,6463,6465],{"class":92,"line":6453},67,[90,6455,6253],{"class":1524},[90,6457,1491],{"class":1511},[90,6459,6460],{"class":1639},"setData",[90,6462,1676],{"class":1511},[90,6464,3088],{"class":107},[90,6466,1892],{"class":1511},[90,6468,6470,6472,6474,6477,6479,6481,6483,6486],{"class":92,"line":6469},68,[90,6471,6253],{"class":1524},[90,6473,1491],{"class":1511},[90,6475,6476],{"class":1639},"setDataType",[90,6478,1676],{"class":1511},[90,6480,2969],{"class":1524},[90,6482,1491],{"class":1511},[90,6484,6485],{"class":1639},"getReturnType",[90,6487,2141],{"class":1511},[90,6489,6491,6493,6495,6497,6499,6502],{"class":92,"line":6490},69,[90,6492,6253],{"class":1524},[90,6494,1491],{"class":1511},[90,6496,6258],{"class":1639},[90,6498,1676],{"class":1511},[90,6500,6501],{"class":111},"\"OK\"",[90,6503,1892],{"class":1511},[90,6505,6507,6509,6511,6513,6515,6517,6519],{"class":92,"line":6506},70,[90,6508,3129],{"class":1511},[90,6510,4883],{"class":1483},[90,6512,2440],{"class":1511},[90,6514,4888],{"class":1618},[90,6516,4891],{"class":1682},[90,6518,1685],{"class":1511},[90,6520,1606],{"class":1511},[90,6522,6524,6526,6528,6530],{"class":92,"line":6523},71,[90,6525,6199],{"class":1524},[90,6527,1491],{"class":1511},[90,6529,4905],{"class":1639},[90,6531,2369],{"class":1511},[90,6533,6535,6537,6539,6541,6543,6545,6547,6550],{"class":92,"line":6534},72,[90,6536,6253],{"class":1524},[90,6538,1491],{"class":1511},[90,6540,6258],{"class":1639},[90,6542,1676],{"class":1511},[90,6544,4922],{"class":1524},[90,6546,1491],{"class":1511},[90,6548,6549],{"class":1639},"getMessage",[90,6551,2141],{"class":1511},[90,6553,6555,6557,6559,6562,6564,6566],{"class":92,"line":6554},73,[90,6556,6253],{"class":1524},[90,6558,1491],{"class":1511},[90,6560,6561],{"class":1639},"setException",[90,6563,1676],{"class":1511},[90,6565,4922],{"class":107},[90,6567,1892],{"class":1511},[90,6569,6571],{"class":92,"line":6570},74,[90,6572,3169],{"class":1511},[90,6574,6576],{"class":92,"line":6575},75,[90,6577,206],{"emptyLinePlaceholder":205},[90,6579,6581],{"class":92,"line":6580},76,[90,6582,6583],{"class":1547},"            \u002F\u002F 响应数据\n",[90,6585,6587,6590,6592,6594,6596,6598,6600,6602],{"class":92,"line":6586},77,[90,6588,6589],{"class":1639},"            doResponse",[90,6591,1676],{"class":1511},[90,6593,6276],{"class":107},[90,6595,3020],{"class":1511},[90,6597,6222],{"class":107},[90,6599,3020],{"class":1511},[90,6601,6012],{"class":107},[90,6603,1892],{"class":1511},[90,6605,6607],{"class":92,"line":6606},78,[90,6608,3048],{"class":1511},[90,6610,6612],{"class":92,"line":6611},79,[90,6613,206],{"emptyLinePlaceholder":205},[90,6615,6617],{"class":92,"line":6616},80,[90,6618,206],{"emptyLinePlaceholder":205},[90,6620,6622],{"class":92,"line":6621},81,[90,6623,1659],{"class":1511},[90,6625,6627],{"class":92,"line":6626},82,[90,6628,206],{"emptyLinePlaceholder":205},[90,6630,6632],{"class":92,"line":6631},83,[90,6633,1837],{"class":1547},[90,6635,6637],{"class":92,"line":6636},84,[90,6638,6639],{"class":1547},"     * 响应\n",[90,6641,6643],{"class":92,"line":6642},85,[90,6644,1847],{"class":1547},[90,6646,6648,6650,6652,6654],{"class":92,"line":6647},86,[90,6649,1852],{"class":1547},[90,6651,1855],{"class":1566},[90,6653,2964],{"class":1682},[90,6655,6656],{"class":1547},"     请求\n",[90,6658,6660,6662,6664,6666],{"class":92,"line":6659},87,[90,6661,1852],{"class":1547},[90,6663,1855],{"class":1566},[90,6665,6222],{"class":1682},[90,6667,6668],{"class":1547}," 响应结果\n",[90,6670,6672,6674,6676,6678],{"class":92,"line":6671},88,[90,6673,1852],{"class":1547},[90,6675,1855],{"class":1566},[90,6677,6012],{"class":1682},[90,6679,6680],{"class":1547},"  序列化器\n",[90,6682,6684],{"class":92,"line":6683},89,[90,6685,1875],{"class":1547},[90,6687,6689,6691,6693,6696,6698,6700,6702,6704,6706,6708,6710,6712,6714,6716],{"class":92,"line":6688},90,[90,6690,1615],{"class":1483},[90,6692,1670],{"class":1483},[90,6694,6695],{"class":1639}," doResponse",[90,6697,1676],{"class":1511},[90,6699,5681],{"class":1618},[90,6701,2964],{"class":1682},[90,6703,3020],{"class":1511},[90,6705,5445],{"class":1618},[90,6707,6222],{"class":1682},[90,6709,3020],{"class":1511},[90,6711,4184],{"class":1618},[90,6713,6012],{"class":1682},[90,6715,1685],{"class":1511},[90,6717,1606],{"class":1511},[90,6719,6721,6724,6727,6729,6731,6733,6735,6737,6739,6741,6743,6745,6748],{"class":92,"line":6720},91,[90,6722,6723],{"class":1618},"        HttpServerResponse",[90,6725,6726],{"class":1622}," httpServerResponse",[90,6728,1702],{"class":1701},[90,6730,2964],{"class":1524},[90,6732,1491],{"class":1511},[90,6734,3006],{"class":1639},[90,6736,3009],{"class":1511},[90,6738,3012],{"class":1639},[90,6740,1676],{"class":1511},[90,6742,3017],{"class":111},[90,6744,3020],{"class":1511},[90,6746,6747],{"class":111}," \"application\u002Fjson\"",[90,6749,1892],{"class":1511},[90,6751,6753],{"class":92,"line":6752},92,[90,6754,206],{"emptyLinePlaceholder":205},[90,6756,6758,6760],{"class":92,"line":6757},93,[90,6759,4622],{"class":1483},[90,6761,1606],{"class":1511},[90,6763,6765],{"class":92,"line":6764},94,[90,6766,6767],{"class":1547},"            \u002F\u002F 序列化响应内容\n",[90,6769,6771,6773,6775,6778,6780,6782,6784,6787,6789,6792],{"class":92,"line":6770},95,[90,6772,6104],{"class":1483},[90,6774,2325],{"class":1511},[90,6776,6777],{"class":1622}," serialized",[90,6779,1702],{"class":1701},[90,6781,6012],{"class":1524},[90,6783,1491],{"class":1511},[90,6785,6786],{"class":1639},"serialize",[90,6788,1676],{"class":1511},[90,6790,6791],{"class":107},"rpcResponse",[90,6793,1892],{"class":1511},[90,6795,6797,6800,6802,6804,6806,6808,6810,6812,6814,6817],{"class":92,"line":6796},96,[90,6798,6799],{"class":1524},"            httpServerResponse",[90,6801,1491],{"class":1511},[90,6803,3035],{"class":1639},[90,6805,1676],{"class":1511},[90,6807,5656],{"class":1524},[90,6809,1491],{"class":1511},[90,6811,5651],{"class":1639},[90,6813,1676],{"class":1511},[90,6815,6816],{"class":107},"serialized",[90,6818,6819],{"class":1511},"));\n",[90,6821,6823,6825,6827,6829,6831,6833,6835],{"class":92,"line":6822},97,[90,6824,2481],{"class":1511},[90,6826,4883],{"class":1483},[90,6828,2440],{"class":1511},[90,6830,4156],{"class":1618},[90,6832,4891],{"class":1682},[90,6834,1685],{"class":1511},[90,6836,1606],{"class":1511},[90,6838,6840,6842,6844,6846],{"class":92,"line":6839},98,[90,6841,4900],{"class":1524},[90,6843,1491],{"class":1511},[90,6845,4905],{"class":1639},[90,6847,2369],{"class":1511},[90,6849,6851,6853,6855,6857,6859,6861,6863,6865],{"class":92,"line":6850},99,[90,6852,6799],{"class":1524},[90,6854,1491],{"class":1511},[90,6856,3035],{"class":1639},[90,6858,1676],{"class":1511},[90,6860,5656],{"class":1524},[90,6862,1491],{"class":1511},[90,6864,5651],{"class":1639},[90,6866,2141],{"class":1511},[90,6868,6870],{"class":92,"line":6869},100,[90,6871,2510],{"class":1511},[90,6873,6875],{"class":92,"line":6874},101,[90,6876,1659],{"class":1511},[90,6878,6880],{"class":92,"line":6879},102,[90,6881,1715],{"class":1511},[20,6883,6884,6885,6887],{},"然后需要在之前写的 ",[87,6886,3298],{"code":3298}," 类中绑定并使用这个请求处理器",[79,6889,6891],{"className":1473,"code":6890,"filename":2687,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.server;\n\nimport io.vertx.core.Vertx;\n\n\u002F**\n * 基于 Vertx 实现的 web 服务器\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class VertxHttpServer implements HttpServer {\n\n    \u002F**\n     * 启动服务器\n     *\n     * @param port 端口\n     *\u002F\n    @Override\n    public void doStart(int port) {\n        \u002F\u002F 创建 Vertx 实例\n        Vertx vertx = Vertx.vertx();\n\n        \u002F\u002F 创建 HTTP 服务器\n        io.vertx.core.http.HttpServer server = vertx.createHttpServer();\n\n        \u002F\u002F server.requestHandler(request -> {\n        \u002F\u002F     System.out.println(\"Received request: Method: \" + request.method() + \" URI: \" + request.uri());\n\n        \u002F\u002F     request.response().putHeader(\"content-type\", \"text\u002Fhtml\")\n        \u002F\u002F             .end(\"\u003Ch1>Hello Vert.x HTTP server!\u003C\u002Fh1>\");\n        \u002F\u002F });\n\n       server.requestHandler(new HttpServerHandler());\n\n        server.listen(port, result -> {\n            if (result.succeeded()) {\n                System.out.println(\"Server is now listening on port \" + port);\n            } else {\n                System.out.println(\"Failed to start server: \" + result.cause());\n            }\n        });\n    }\n}\n",[87,6892,6893,6913,6917,6937,6941,6945,6949,6953,6961,6969,6973,6987,6991,6995,6999,7003,7013,7017,7023,7041,7045,7061,7065,7069,7101,7105,7110,7115,7119,7124,7129,7134,7138,7156,7160,7180,7196,7218,7226,7252,7256,7260,7264],{"__ignoreMap":85},[90,6894,6895,6897,6899,6901,6903,6905,6907,6909,6911],{"class":92,"line":93},[90,6896,1484],{"class":1483},[90,6898,1487],{"class":1483},[90,6900,1491],{"class":1490},[90,6902,1494],{"class":1483},[90,6904,1491],{"class":1490},[90,6906,1499],{"class":1483},[90,6908,1491],{"class":1490},[90,6910,2592],{"class":1483},[90,6912,1512],{"class":1511},[90,6914,6915],{"class":92,"line":126},[90,6916,206],{"emptyLinePlaceholder":205},[90,6918,6919,6921,6923,6925,6927,6929,6931,6933,6935],{"class":92,"line":150},[90,6920,1521],{"class":1483},[90,6922,2720],{"class":1524},[90,6924,1491],{"class":1528},[90,6926,2725],{"class":1524},[90,6928,1491],{"class":1528},[90,6930,2730],{"class":1524},[90,6932,1491],{"class":1528},[90,6934,2735],{"class":1524},[90,6936,1512],{"class":1511},[90,6938,6939],{"class":92,"line":161},[90,6940,206],{"emptyLinePlaceholder":205},[90,6942,6943],{"class":92,"line":180},[90,6944,1548],{"class":1547},[90,6946,6947],{"class":92,"line":202},[90,6948,2750],{"class":1547},[90,6950,6951],{"class":92,"line":209},[90,6952,1558],{"class":1547},[90,6954,6955,6957,6959],{"class":92,"line":228},[90,6956,1563],{"class":1547},[90,6958,1567],{"class":1566},[90,6960,1570],{"class":1547},[90,6962,6963,6965,6967],{"class":92,"line":247},[90,6964,1563],{"class":1547},[90,6966,1577],{"class":1566},[90,6968,1580],{"class":1547},[90,6970,6971],{"class":92,"line":266},[90,6972,1585],{"class":1547},[90,6974,6975,6977,6979,6981,6983,6985],{"class":92,"line":271},[90,6976,1590],{"class":1483},[90,6978,1593],{"class":1483},[90,6980,2783],{"class":1596},[90,6982,1600],{"class":1483},[90,6984,2620],{"class":1596},[90,6986,1606],{"class":1511},[90,6988,6989],{"class":92,"line":429},[90,6990,206],{"emptyLinePlaceholder":205},[90,6992,6993],{"class":92,"line":440},[90,6994,1837],{"class":1547},[90,6996,6997],{"class":92,"line":458},[90,6998,2635],{"class":1547},[90,7000,7001],{"class":92,"line":475},[90,7002,1847],{"class":1547},[90,7004,7005,7007,7009,7011],{"class":92,"line":492},[90,7006,1852],{"class":1547},[90,7008,1855],{"class":1566},[90,7010,2648],{"class":1682},[90,7012,2651],{"class":1547},[90,7014,7015],{"class":92,"line":502},[90,7016,1875],{"class":1547},[90,7018,7019,7021],{"class":92,"line":512},[90,7020,2086],{"class":2085},[90,7022,2090],{"class":2089},[90,7024,7025,7027,7029,7031,7033,7035,7037,7039],{"class":92,"line":529},[90,7026,1634],{"class":1483},[90,7028,1670],{"class":1483},[90,7030,2663],{"class":1639},[90,7032,1676],{"class":1511},[90,7034,2668],{"class":1483},[90,7036,2648],{"class":1682},[90,7038,1685],{"class":1511},[90,7040,1606],{"class":1511},[90,7042,7043],{"class":92,"line":547},[90,7044,2848],{"class":1547},[90,7046,7047,7049,7051,7053,7055,7057,7059],{"class":92,"line":564},[90,7048,2853],{"class":1618},[90,7050,2856],{"class":1622},[90,7052,1702],{"class":1701},[90,7054,2861],{"class":1524},[90,7056,1491],{"class":1511},[90,7058,2725],{"class":1639},[90,7060,2369],{"class":1511},[90,7062,7063],{"class":92,"line":573},[90,7064,206],{"emptyLinePlaceholder":205},[90,7066,7067],{"class":92,"line":582},[90,7068,2876],{"class":1547},[90,7070,7071,7073,7075,7077,7079,7081,7083,7085,7087,7089,7091,7093,7095,7097,7099],{"class":92,"line":600},[90,7072,2881],{"class":1618},[90,7074,1491],{"class":1511},[90,7076,2725],{"class":1618},[90,7078,1491],{"class":1511},[90,7080,2730],{"class":1618},[90,7082,1491],{"class":1511},[90,7084,2894],{"class":1618},[90,7086,1491],{"class":1511},[90,7088,2899],{"class":1618},[90,7090,2902],{"class":1622},[90,7092,1702],{"class":1701},[90,7094,2856],{"class":1524},[90,7096,1491],{"class":1511},[90,7098,2911],{"class":1639},[90,7100,2369],{"class":1511},[90,7102,7103],{"class":92,"line":618},[90,7104,206],{"emptyLinePlaceholder":205},[90,7106,7107],{"class":92,"line":636},[90,7108,7109],{"class":1547},"        \u002F\u002F server.requestHandler(request -> {\n",[90,7111,7112],{"class":92,"line":655},[90,7113,7114],{"class":1547},"        \u002F\u002F     System.out.println(\"Received request: Method: \" + request.method() + \" URI: \" + request.uri());\n",[90,7116,7117],{"class":92,"line":664},[90,7118,206],{"emptyLinePlaceholder":205},[90,7120,7121],{"class":92,"line":674},[90,7122,7123],{"class":1547},"        \u002F\u002F     request.response().putHeader(\"content-type\", \"text\u002Fhtml\")\n",[90,7125,7126],{"class":92,"line":679},[90,7127,7128],{"class":1547},"        \u002F\u002F             .end(\"\u003Ch1>Hello Vert.x HTTP server!\u003C\u002Fh1>\");\n",[90,7130,7131],{"class":92,"line":1450},[90,7132,7133],{"class":1547},"        \u002F\u002F });\n",[90,7135,7136],{"class":92,"line":3029},[90,7137,206],{"emptyLinePlaceholder":205},[90,7139,7140,7143,7145,7147,7149,7152,7154],{"class":92,"line":3045},[90,7141,7142],{"class":1524},"       server",[90,7144,1491],{"class":1511},[90,7146,2927],{"class":1639},[90,7148,1676],{"class":1511},[90,7150,7151],{"class":1483},"new",[90,7153,5921],{"class":1639},[90,7155,2141],{"class":1511},[90,7157,7158],{"class":92,"line":3051},[90,7159,206],{"emptyLinePlaceholder":205},[90,7161,7162,7164,7166,7168,7170,7172,7174,7176,7178],{"class":92,"line":3056},[90,7163,2922],{"class":1524},[90,7165,1491],{"class":1511},[90,7167,3063],{"class":1639},[90,7169,1676],{"class":1511},[90,7171,3068],{"class":107},[90,7173,3020],{"class":1511},[90,7175,3073],{"class":107},[90,7177,2935],{"class":1483},[90,7179,1606],{"class":1511},[90,7181,7182,7184,7186,7188,7190,7192,7194],{"class":92,"line":3080},[90,7183,3083],{"class":1483},[90,7185,2440],{"class":1511},[90,7187,3088],{"class":1524},[90,7189,1491],{"class":1511},[90,7191,3093],{"class":1639},[90,7193,3096],{"class":1511},[90,7195,1606],{"class":1511},[90,7197,7198,7200,7202,7204,7206,7208,7210,7212,7214,7216],{"class":92,"line":3101},[90,7199,3104],{"class":1524},[90,7201,1491],{"class":1511},[90,7203,2118],{"class":1524},[90,7205,1491],{"class":1511},[90,7207,2123],{"class":1639},[90,7209,1676],{"class":1511},[90,7211,3117],{"class":111},[90,7213,2131],{"class":1701},[90,7215,2648],{"class":107},[90,7217,1892],{"class":1511},[90,7219,7220,7222,7224],{"class":92,"line":3126},[90,7221,3129],{"class":1511},[90,7223,2484],{"class":1483},[90,7225,1606],{"class":1511},[90,7227,7228,7230,7232,7234,7236,7238,7240,7242,7244,7246,7248,7250],{"class":92,"line":3136},[90,7229,3104],{"class":1524},[90,7231,1491],{"class":1511},[90,7233,2118],{"class":1524},[90,7235,1491],{"class":1511},[90,7237,2123],{"class":1639},[90,7239,1676],{"class":1511},[90,7241,3151],{"class":111},[90,7243,2131],{"class":1701},[90,7245,3156],{"class":1524},[90,7247,1491],{"class":1511},[90,7249,3161],{"class":1639},[90,7251,2141],{"class":1511},[90,7253,7254],{"class":92,"line":3166},[90,7255,3169],{"class":1511},[90,7257,7258],{"class":92,"line":3172},[90,7259,3048],{"class":1511},[90,7261,7262],{"class":92,"line":3177},[90,7263,1659],{"class":1511},[90,7265,7266],{"class":92,"line":3182},[90,7267,1715],{"class":1511},[2561,7269,7271],{"id":7270},"_9动态代理实现跨模块调用","9）动态代理实现跨模块调用",[20,7273,7274],{},"通过动态代理，让消费者模块调用提供者模块\n关于静态代理，动态代理这块的内容，如果不是很了解，可以参考我之前写的关于动态代理的博客",[7276,7277],"link-card",{"className":7278,"icon":7281,"link":7282,"title":7283},[7279,7280],"gradient-card","active","https:\u002F\u002Ffile.dhbxs.top\u002Fylvwvjjs.jpg","https:\u002F\u002Fblog.dhbxs.top\u002Fposts\u002F370adf0","Spring AOP 动态代理机制：从静态代理到 JDK 与 CGLIB 的实现",[20,7285,7286],{},"如果理解动态代理，那么继续。编写动态代理类 ServiceProxy 实现 InvocationHandler 接口的 invoke 方法。",[79,7288,7291],{"className":1473,"code":7289,"filename":7290,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.proxy;\n\nimport cn.hutool.http.HttpRequest;\nimport cn.hutool.http.HttpResponse;\nimport top.dhbxs.rpc.model.RpcRequest;\nimport top.dhbxs.rpc.model.RpcResponse;\nimport top.dhbxs.rpc.serializer.JdkSerializer;\nimport top.dhbxs.rpc.serializer.Serializer;\n\nimport java.io.IOException;\nimport java.lang.reflect.InvocationHandler;\nimport java.lang.reflect.Method;\n\n\u002F**\n * 服务代理 (基于JDK动态代理)\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F22\n *\u002F\npublic class ServiceProxy implements InvocationHandler {\n\n    \u002F**\n     * 调用代理\n     *\n     * @return\n     * @throws Throwable\n     *\u002F\n    @Override\n    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {\n        \u002F\u002F 指定序列化器\n        Serializer serializer = new JdkSerializer();\n\n        \u002F\u002F 构造请求\n        RpcRequest rpcRequest = RpcRequest.builder()\n                .serviceName(method.getDeclaringClass().getName())\n                .methodName(method.getName())\n                .parameterTypes(method.getParameterTypes())\n                .args(args)\n                .build();\n\n        try {\n            \u002F\u002F 序列化请求\n            byte[] bodyBytes = serializer.serialize(rpcRequest);\n\n            \u002F\u002F TODO 这里暂时用硬编码地址，真正的RPC框架都有注册中心和服务发现机制解决\n            try (HttpResponse httpResponse = HttpRequest.post(\"http:\u002F\u002Flocalhost:8080\").body(bodyBytes).execute()) {\n                byte[] result = httpResponse.bodyBytes();\n\n                \u002F\u002F 反序列化\n                RpcResponse rpcResponse = serializer.deserialize(result, RpcResponse.class);\n                return rpcResponse.getData();\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n\n        return null;\n    }\n}\n\n","ServiceProxy.java",[87,7292,7293,7314,7318,7341,7362,7386,7410,7434,7458,7462,7478,7499,7519,7523,7527,7532,7536,7544,7553,7557,7573,7577,7581,7586,7590,7597,7606,7610,7616,7657,7661,7676,7680,7685,7704,7727,7744,7761,7774,7783,7787,7793,7798,7821,7825,7830,7876,7895,7899,7904,7933,7946,7950,7966,7976,7980,7984,7992,7996],{"__ignoreMap":85},[90,7294,7295,7297,7299,7301,7303,7305,7307,7309,7312],{"class":92,"line":93},[90,7296,1484],{"class":1483},[90,7298,1487],{"class":1483},[90,7300,1491],{"class":1490},[90,7302,1494],{"class":1483},[90,7304,1491],{"class":1490},[90,7306,1499],{"class":1483},[90,7308,1491],{"class":1490},[90,7310,7311],{"class":1483},"proxy",[90,7313,1512],{"class":1511},[90,7315,7316],{"class":92,"line":126},[90,7317,206],{"emptyLinePlaceholder":205},[90,7319,7320,7322,7325,7327,7330,7332,7334,7336,7339],{"class":92,"line":150},[90,7321,1521],{"class":1483},[90,7323,7324],{"class":1524}," cn",[90,7326,1491],{"class":1528},[90,7328,7329],{"class":1524},"hutool",[90,7331,1491],{"class":1528},[90,7333,2894],{"class":1524},[90,7335,1491],{"class":1528},[90,7337,7338],{"class":1524},"HttpRequest",[90,7340,1512],{"class":1511},[90,7342,7343,7345,7347,7349,7351,7353,7355,7357,7360],{"class":92,"line":161},[90,7344,1521],{"class":1483},[90,7346,7324],{"class":1524},[90,7348,1491],{"class":1528},[90,7350,7329],{"class":1524},[90,7352,1491],{"class":1528},[90,7354,2894],{"class":1524},[90,7356,1491],{"class":1528},[90,7358,7359],{"class":1524},"HttpResponse",[90,7361,1512],{"class":1511},[90,7363,7364,7366,7368,7370,7372,7374,7376,7378,7380,7382,7384],{"class":92,"line":180},[90,7365,1521],{"class":1483},[90,7367,1487],{"class":1524},[90,7369,1491],{"class":1528},[90,7371,1494],{"class":1524},[90,7373,1491],{"class":1528},[90,7375,1499],{"class":1524},[90,7377,1491],{"class":1528},[90,7379,1508],{"class":1524},[90,7381,1491],{"class":1528},[90,7383,5731],{"class":1524},[90,7385,1512],{"class":1511},[90,7387,7388,7390,7392,7394,7396,7398,7400,7402,7404,7406,7408],{"class":92,"line":202},[90,7389,1521],{"class":1483},[90,7391,1487],{"class":1524},[90,7393,1491],{"class":1528},[90,7395,1494],{"class":1524},[90,7397,1491],{"class":1528},[90,7399,1499],{"class":1524},[90,7401,1491],{"class":1528},[90,7403,1508],{"class":1524},[90,7405,1491],{"class":1528},[90,7407,5756],{"class":1524},[90,7409,1512],{"class":1511},[90,7411,7412,7414,7416,7418,7420,7422,7424,7426,7428,7430,7432],{"class":92,"line":209},[90,7413,1521],{"class":1483},[90,7415,1487],{"class":1524},[90,7417,1491],{"class":1528},[90,7419,1494],{"class":1524},[90,7421,1491],{"class":1528},[90,7423,1499],{"class":1524},[90,7425,1491],{"class":1528},[90,7427,4135],{"class":1524},[90,7429,1491],{"class":1528},[90,7431,5805],{"class":1524},[90,7433,1512],{"class":1511},[90,7435,7436,7438,7440,7442,7444,7446,7448,7450,7452,7454,7456],{"class":92,"line":228},[90,7437,1521],{"class":1483},[90,7439,1487],{"class":1524},[90,7441,1491],{"class":1528},[90,7443,1494],{"class":1524},[90,7445,1491],{"class":1528},[90,7447,1499],{"class":1524},[90,7449,1491],{"class":1528},[90,7451,4135],{"class":1524},[90,7453,1491],{"class":1528},[90,7455,5830],{"class":1524},[90,7457,1512],{"class":1511},[90,7459,7460],{"class":92,"line":247},[90,7461,206],{"emptyLinePlaceholder":205},[90,7463,7464,7466,7468,7470,7472,7474,7476],{"class":92,"line":266},[90,7465,1521],{"class":1483},[90,7467,1525],{"class":1524},[90,7469,1491],{"class":1528},[90,7471,1531],{"class":1524},[90,7473,1491],{"class":1528},[90,7475,4156],{"class":1524},[90,7477,1512],{"class":1511},[90,7479,7480,7482,7484,7486,7488,7490,7492,7494,7497],{"class":92,"line":271},[90,7481,1521],{"class":1483},[90,7483,1525],{"class":1524},[90,7485,1491],{"class":1528},[90,7487,5863],{"class":1524},[90,7489,1491],{"class":1528},[90,7491,5868],{"class":1524},[90,7493,1491],{"class":1528},[90,7495,7496],{"class":1524},"InvocationHandler",[90,7498,1512],{"class":1511},[90,7500,7501,7503,7505,7507,7509,7511,7513,7515,7517],{"class":92,"line":429},[90,7502,1521],{"class":1483},[90,7504,1525],{"class":1524},[90,7506,1491],{"class":1528},[90,7508,5863],{"class":1524},[90,7510,1491],{"class":1528},[90,7512,5868],{"class":1524},[90,7514,1491],{"class":1528},[90,7516,5873],{"class":1524},[90,7518,1512],{"class":1511},[90,7520,7521],{"class":92,"line":440},[90,7522,206],{"emptyLinePlaceholder":205},[90,7524,7525],{"class":92,"line":458},[90,7526,1548],{"class":1547},[90,7528,7529],{"class":92,"line":475},[90,7530,7531],{"class":1547}," * 服务代理 (基于JDK动态代理)\n",[90,7533,7534],{"class":92,"line":492},[90,7535,1558],{"class":1547},[90,7537,7538,7540,7542],{"class":92,"line":502},[90,7539,1563],{"class":1547},[90,7541,1567],{"class":1566},[90,7543,1570],{"class":1547},[90,7545,7546,7548,7550],{"class":92,"line":512},[90,7547,1563],{"class":1547},[90,7549,1577],{"class":1566},[90,7551,7552],{"class":1547}," 2026\u002F4\u002F22\n",[90,7554,7555],{"class":92,"line":529},[90,7556,1585],{"class":1547},[90,7558,7559,7561,7563,7566,7568,7571],{"class":92,"line":547},[90,7560,1590],{"class":1483},[90,7562,1593],{"class":1483},[90,7564,7565],{"class":1596}," ServiceProxy",[90,7567,1600],{"class":1483},[90,7569,7570],{"class":1596}," InvocationHandler",[90,7572,1606],{"class":1511},[90,7574,7575],{"class":92,"line":564},[90,7576,206],{"emptyLinePlaceholder":205},[90,7578,7579],{"class":92,"line":573},[90,7580,1837],{"class":1547},[90,7582,7583],{"class":92,"line":582},[90,7584,7585],{"class":1547},"     * 调用代理\n",[90,7587,7588],{"class":92,"line":600},[90,7589,1847],{"class":1547},[90,7591,7592,7594],{"class":92,"line":618},[90,7593,1852],{"class":1547},[90,7595,7596],{"class":1566},"@return\n",[90,7598,7599,7601,7603],{"class":92,"line":636},[90,7600,1852],{"class":1547},[90,7602,4243],{"class":1566},[90,7604,7605],{"class":4246}," Throwable\n",[90,7607,7608],{"class":92,"line":655},[90,7609,1875],{"class":1547},[90,7611,7612,7614],{"class":92,"line":664},[90,7613,2086],{"class":2085},[90,7615,2090],{"class":2089},[90,7617,7618,7620,7622,7625,7627,7630,7633,7635,7638,7640,7642,7644,7646,7648,7650,7652,7655],{"class":92,"line":674},[90,7619,1634],{"class":1483},[90,7621,5267],{"class":1618},[90,7623,7624],{"class":1639}," invoke",[90,7626,1676],{"class":1511},[90,7628,7629],{"class":1618},"Object",[90,7631,7632],{"class":1682}," proxy",[90,7634,3020],{"class":1511},[90,7636,7637],{"class":1618}," Method",[90,7639,6366],{"class":1682},[90,7641,3020],{"class":1511},[90,7643,5267],{"class":1618},[90,7645,2325],{"class":1511},[90,7647,2328],{"class":1682},[90,7649,1685],{"class":1511},[90,7651,4283],{"class":1483},[90,7653,7654],{"class":1618}," Throwable",[90,7656,1606],{"class":1511},[90,7658,7659],{"class":92,"line":679},[90,7660,6002],{"class":1547},[90,7662,7663,7666,7668,7670,7672,7674],{"class":92,"line":1450},[90,7664,7665],{"class":1618},"        Serializer",[90,7667,6012],{"class":1622},[90,7669,1702],{"class":1701},[90,7671,2364],{"class":1483},[90,7673,4505],{"class":1639},[90,7675,2369],{"class":1511},[90,7677,7678],{"class":92,"line":3029},[90,7679,206],{"emptyLinePlaceholder":205},[90,7681,7682],{"class":92,"line":3045},[90,7683,7684],{"class":1547},"        \u002F\u002F 构造请求\n",[90,7686,7687,7690,7692,7694,7696,7698,7701],{"class":92,"line":3051},[90,7688,7689],{"class":1618},"        RpcRequest",[90,7691,6128],{"class":1622},[90,7693,1702],{"class":1701},[90,7695,5146],{"class":1524},[90,7697,1491],{"class":1511},[90,7699,7700],{"class":1639},"builder",[90,7702,7703],{"class":1511},"()\n",[90,7705,7706,7709,7711,7713,7715,7717,7720,7722,7724],{"class":92,"line":3056},[90,7707,7708],{"class":1511},"                .",[90,7710,3746],{"class":1639},[90,7712,1676],{"class":1511},[90,7714,2969],{"class":1524},[90,7716,1491],{"class":1511},[90,7718,7719],{"class":1639},"getDeclaringClass",[90,7721,3009],{"class":1511},[90,7723,2138],{"class":1639},[90,7725,7726],{"class":1511},"())\n",[90,7728,7729,7731,7734,7736,7738,7740,7742],{"class":92,"line":3080},[90,7730,7708],{"class":1511},[90,7732,7733],{"class":1639},"methodName",[90,7735,1676],{"class":1511},[90,7737,2969],{"class":1524},[90,7739,1491],{"class":1511},[90,7741,2138],{"class":1639},[90,7743,7726],{"class":1511},[90,7745,7746,7748,7751,7753,7755,7757,7759],{"class":92,"line":3101},[90,7747,7708],{"class":1511},[90,7749,7750],{"class":1639},"parameterTypes",[90,7752,1676],{"class":1511},[90,7754,2969],{"class":1524},[90,7756,1491],{"class":1511},[90,7758,6393],{"class":1639},[90,7760,7726],{"class":1511},[90,7762,7763,7765,7768,7770,7772],{"class":92,"line":3126},[90,7764,7708],{"class":1511},[90,7766,7767],{"class":1639},"args",[90,7769,1676],{"class":1511},[90,7771,7767],{"class":107},[90,7773,3026],{"class":1511},[90,7775,7776,7778,7781],{"class":92,"line":3136},[90,7777,7708],{"class":1511},[90,7779,7780],{"class":1639},"build",[90,7782,2369],{"class":1511},[90,7784,7785],{"class":92,"line":3166},[90,7786,206],{"emptyLinePlaceholder":205},[90,7788,7789,7791],{"class":92,"line":3172},[90,7790,4622],{"class":1483},[90,7792,1606],{"class":1511},[90,7794,7795],{"class":92,"line":3177},[90,7796,7797],{"class":1547},"            \u002F\u002F 序列化请求\n",[90,7799,7800,7802,7804,7807,7809,7811,7813,7815,7817,7819],{"class":92,"line":3182},[90,7801,6104],{"class":1483},[90,7803,2325],{"class":1511},[90,7805,7806],{"class":1622}," bodyBytes",[90,7808,1702],{"class":1701},[90,7810,6012],{"class":1524},[90,7812,1491],{"class":1511},[90,7814,6786],{"class":1639},[90,7816,1676],{"class":1511},[90,7818,6344],{"class":107},[90,7820,1892],{"class":1511},[90,7822,7823],{"class":92,"line":3865},[90,7824,206],{"emptyLinePlaceholder":205},[90,7826,7827],{"class":92,"line":3876},[90,7828,7829],{"class":1547},"            \u002F\u002F TODO 这里暂时用硬编码地址，真正的RPC框架都有注册中心和服务发现机制解决\n",[90,7831,7832,7834,7836,7838,7841,7843,7846,7848,7851,7853,7856,7859,7862,7864,7867,7869,7872,7874],{"class":92,"line":3881},[90,7833,6148],{"class":1483},[90,7835,2440],{"class":1511},[90,7837,7359],{"class":1618},[90,7839,7840],{"class":1622}," httpResponse",[90,7842,1702],{"class":1701},[90,7844,7845],{"class":1524}," HttpRequest",[90,7847,1491],{"class":1511},[90,7849,7850],{"class":1639},"post",[90,7852,1676],{"class":1511},[90,7854,7855],{"class":111},"\"http:\u002F\u002Flocalhost:8080\"",[90,7857,7858],{"class":1511},").",[90,7860,7861],{"class":1639},"body",[90,7863,1676],{"class":1511},[90,7865,7866],{"class":107},"bodyBytes",[90,7868,7858],{"class":1511},[90,7870,7871],{"class":1639},"execute",[90,7873,3096],{"class":1511},[90,7875,1606],{"class":1511},[90,7877,7878,7881,7883,7885,7887,7889,7891,7893],{"class":92,"line":3904},[90,7879,7880],{"class":1483},"                byte",[90,7882,2325],{"class":1511},[90,7884,3156],{"class":1622},[90,7886,1702],{"class":1701},[90,7888,7840],{"class":1524},[90,7890,1491],{"class":1511},[90,7892,7866],{"class":1639},[90,7894,2369],{"class":1511},[90,7896,7897],{"class":92,"line":3920},[90,7898,206],{"emptyLinePlaceholder":205},[90,7900,7901],{"class":92,"line":3925},[90,7902,7903],{"class":1547},"                \u002F\u002F 反序列化\n",[90,7905,7906,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931],{"class":92,"line":4936},[90,7907,7908],{"class":1618},"                RpcResponse",[90,7910,6222],{"class":1622},[90,7912,1702],{"class":1701},[90,7914,6012],{"class":1524},[90,7916,1491],{"class":1511},[90,7918,6164],{"class":1639},[90,7920,1676],{"class":1511},[90,7922,3088],{"class":107},[90,7924,3020],{"class":1511},[90,7926,5445],{"class":1524},[90,7928,1491],{"class":1511},[90,7930,4038],{"class":1524},[90,7932,1892],{"class":1511},[90,7934,7935,7937,7939,7941,7944],{"class":92,"line":4949},[90,7936,6292],{"class":1483},[90,7938,6222],{"class":1524},[90,7940,1491],{"class":1511},[90,7942,7943],{"class":1639},"getData",[90,7945,2369],{"class":1511},[90,7947,7948],{"class":92,"line":4954},[90,7949,3169],{"class":1511},[90,7951,7952,7954,7956,7958,7960,7962,7964],{"class":92,"line":4959},[90,7953,2481],{"class":1511},[90,7955,4883],{"class":1483},[90,7957,2440],{"class":1511},[90,7959,4156],{"class":1618},[90,7961,4891],{"class":1682},[90,7963,1685],{"class":1511},[90,7965,1606],{"class":1511},[90,7967,7968,7970,7972,7974],{"class":92,"line":6268},[90,7969,4900],{"class":1524},[90,7971,1491],{"class":1511},[90,7973,4905],{"class":1639},[90,7975,2369],{"class":1511},[90,7977,7978],{"class":92,"line":6289},[90,7979,2510],{"class":1511},[90,7981,7982],{"class":92,"line":6297},[90,7983,206],{"emptyLinePlaceholder":205},[90,7985,7986,7988,7990],{"class":92,"line":6302},[90,7987,1650],{"class":1483},[90,7989,2346],{"class":2345},[90,7991,1512],{"class":1511},[90,7993,7994],{"class":92,"line":6307},[90,7995,1659],{"class":1511},[90,7997,7998],{"class":92,"line":6314},[90,7999,1715],{"class":1511},[20,8001,8002],{},"然后创建工厂类 ServiceProxyFactory，根据指定的类，创建对应的代理类。这也算是一种工厂设计模式吧。",[79,8004,8007],{"className":1473,"code":8005,"filename":8006,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.proxy;\n\nimport java.lang.reflect.Proxy;\n\n\u002F**\n * 服务代理工厂，用来创建代理对象\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F22\n *\u002F\npublic class ServiceProxyFactory {\n\n    public static \u003CT> T getProxy(Class\u003CT> serviceClass) {\n        return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class[]{serviceClass}, new ServiceProxy());\n    }\n}\n\n","ServiceProxyFactory.java",[87,8008,8009,8029,8033,8054,8058,8062,8067,8071,8079,8087,8091,8102,8106,8141,8189,8193],{"__ignoreMap":85},[90,8010,8011,8013,8015,8017,8019,8021,8023,8025,8027],{"class":92,"line":93},[90,8012,1484],{"class":1483},[90,8014,1487],{"class":1483},[90,8016,1491],{"class":1490},[90,8018,1494],{"class":1483},[90,8020,1491],{"class":1490},[90,8022,1499],{"class":1483},[90,8024,1491],{"class":1490},[90,8026,7311],{"class":1483},[90,8028,1512],{"class":1511},[90,8030,8031],{"class":92,"line":126},[90,8032,206],{"emptyLinePlaceholder":205},[90,8034,8035,8037,8039,8041,8043,8045,8047,8049,8052],{"class":92,"line":150},[90,8036,1521],{"class":1483},[90,8038,1525],{"class":1524},[90,8040,1491],{"class":1528},[90,8042,5863],{"class":1524},[90,8044,1491],{"class":1528},[90,8046,5868],{"class":1524},[90,8048,1491],{"class":1528},[90,8050,8051],{"class":1524},"Proxy",[90,8053,1512],{"class":1511},[90,8055,8056],{"class":92,"line":161},[90,8057,206],{"emptyLinePlaceholder":205},[90,8059,8060],{"class":92,"line":180},[90,8061,1548],{"class":1547},[90,8063,8064],{"class":92,"line":202},[90,8065,8066],{"class":1547}," * 服务代理工厂，用来创建代理对象\n",[90,8068,8069],{"class":92,"line":209},[90,8070,1558],{"class":1547},[90,8072,8073,8075,8077],{"class":92,"line":228},[90,8074,1563],{"class":1547},[90,8076,1567],{"class":1566},[90,8078,1570],{"class":1547},[90,8080,8081,8083,8085],{"class":92,"line":247},[90,8082,1563],{"class":1547},[90,8084,1577],{"class":1566},[90,8086,7552],{"class":1547},[90,8088,8089],{"class":92,"line":266},[90,8090,1585],{"class":1547},[90,8092,8093,8095,8097,8100],{"class":92,"line":271},[90,8094,1590],{"class":1483},[90,8096,1593],{"class":1483},[90,8098,8099],{"class":1596}," ServiceProxyFactory",[90,8101,1606],{"class":1511},[90,8103,8104],{"class":92,"line":429},[90,8105,206],{"emptyLinePlaceholder":205},[90,8107,8108,8110,8112,8114,8116,8118,8120,8123,8125,8128,8130,8132,8134,8137,8139],{"class":92,"line":440},[90,8109,1634],{"class":1483},[90,8111,2313],{"class":1483},[90,8113,4572],{"class":1511},[90,8115,4261],{"class":1618},[90,8117,189],{"class":1511},[90,8119,4373],{"class":1618},[90,8121,8122],{"class":1639}," getProxy",[90,8124,1676],{"class":1511},[90,8126,8127],{"class":1618},"Class",[90,8129,129],{"class":1511},[90,8131,4261],{"class":1618},[90,8133,189],{"class":1511},[90,8135,8136],{"class":1682}," serviceClass",[90,8138,1685],{"class":1511},[90,8140,1606],{"class":1511},[90,8142,8143,8145,8147,8149,8151,8154,8156,8159,8161,8164,8166,8169,8171,8173,8175,8178,8180,8183,8185,8187],{"class":92,"line":458},[90,8144,1650],{"class":1483},[90,8146,2440],{"class":1511},[90,8148,4261],{"class":107},[90,8150,1685],{"class":1511},[90,8152,8153],{"class":1524}," Proxy",[90,8155,1491],{"class":1511},[90,8157,8158],{"class":1639},"newProxyInstance",[90,8160,1676],{"class":1511},[90,8162,8163],{"class":1524},"serviceClass",[90,8165,1491],{"class":1511},[90,8167,8168],{"class":1639},"getClassLoader",[90,8170,4045],{"class":1511},[90,8172,2364],{"class":1483},[90,8174,3627],{"class":1618},[90,8176,8177],{"class":1511},"[]{",[90,8179,8163],{"class":107},[90,8181,8182],{"class":1511},"},",[90,8184,2364],{"class":1483},[90,8186,7565],{"class":1639},[90,8188,2141],{"class":1511},[90,8190,8191],{"class":92,"line":475},[90,8192,1659],{"class":1511},[90,8194,8195],{"class":92,"line":492},[90,8196,1715],{"class":1511},[20,8198,8199,8200,8203,8204,8207],{},"有了工厂类统一创建代理类之后，修改 ",[87,8201,8202],{"code":8202},"EasyConsumerExample"," 中 ",[87,8205,8206],{"code":8206},"UserService userService","对象的获取方式。",[79,8209,8211],{"className":1473,"code":8210,"filename":2172,"language":1476,"meta":85,"style":85},"package top.dhbxs.rpc.consumer;\n\nimport top.dhbxs.rpc.common.model.User;\nimport top.dhbxs.rpc.common.service.UserService;\nimport top.dhbxs.rpc.proxy.ServiceProxyFactory;\n\n\u002F**\n * 简单的服务消费者示例\n *\n * @author dhbxs\n * @since 2026\u002F4\u002F21\n *\u002F\npublic class EasyConsumerExample {\n\n    public static void main(String[] args) {\n        UserService userService = ServiceProxyFactory.getProxy(UserService.class);\n\n        User user = new User();\n        user.setName(\"灯火不休时\");\n\n        \u002F\u002F 如果没有 RPC 框架，这里调用会报 NPE，因为userService为空，不是实体对象，调用不了方法\n        \u002F\u002F 当前项目 pom 中，并没有引入 UserService 的实现 UserServiceImpl\n        \u002F\u002F UserServiceImpl 为服务提供者 provider 模块下的类，当前项目的 pom 也没有直接引入 provider 模块\n        \u002F\u002F 所以需要 RPC 框架帮我们完成调用\n        User newUser = userService.getUser(user);\n\n        if (newUser != null) {\n            System.out.println(newUser.getName());\n        } else {\n            System.out.println(\"user = null\");\n        }\n    }\n}\n\n",[87,8212,8213,8233,8237,8265,8293,8318,8322,8326,8330,8334,8342,8350,8354,8364,8368,8390,8415,8419,8433,8447,8451,8455,8460,8464,8468,8488,8492,8508,8530,8538,8556,8560,8564],{"__ignoreMap":85},[90,8214,8215,8217,8219,8221,8223,8225,8227,8229,8231],{"class":92,"line":93},[90,8216,1484],{"class":1483},[90,8218,1487],{"class":1483},[90,8220,1491],{"class":1490},[90,8222,1494],{"class":1483},[90,8224,1491],{"class":1490},[90,8226,1499],{"class":1483},[90,8228,1491],{"class":1490},[90,8230,799],{"class":1483},[90,8232,1512],{"class":1511},[90,8234,8235],{"class":92,"line":126},[90,8236,206],{"emptyLinePlaceholder":205},[90,8238,8239,8241,8243,8245,8247,8249,8251,8253,8255,8257,8259,8261,8263],{"class":92,"line":150},[90,8240,1521],{"class":1483},[90,8242,1487],{"class":1524},[90,8244,1491],{"class":1528},[90,8246,1494],{"class":1524},[90,8248,1491],{"class":1528},[90,8250,1499],{"class":1524},[90,8252,1491],{"class":1528},[90,8254,238],{"class":1524},[90,8256,1491],{"class":1528},[90,8258,1508],{"class":1524},[90,8260,1491],{"class":1528},[90,8262,1777],{"class":1524},[90,8264,1512],{"class":1511},[90,8266,8267,8269,8271,8273,8275,8277,8279,8281,8283,8285,8287,8289,8291],{"class":92,"line":161},[90,8268,1521],{"class":1483},[90,8270,1487],{"class":1524},[90,8272,1491],{"class":1528},[90,8274,1494],{"class":1524},[90,8276,1491],{"class":1528},[90,8278,1499],{"class":1524},[90,8280,1491],{"class":1528},[90,8282,238],{"class":1524},[90,8284,1491],{"class":1528},[90,8286,1744],{"class":1524},[90,8288,1491],{"class":1528},[90,8290,1992],{"class":1524},[90,8292,1512],{"class":1511},[90,8294,8295,8297,8299,8301,8303,8305,8307,8309,8311,8313,8316],{"class":92,"line":180},[90,8296,1521],{"class":1483},[90,8298,1487],{"class":1524},[90,8300,1491],{"class":1528},[90,8302,1494],{"class":1524},[90,8304,1491],{"class":1528},[90,8306,1499],{"class":1524},[90,8308,1491],{"class":1528},[90,8310,7311],{"class":1524},[90,8312,1491],{"class":1528},[90,8314,8315],{"class":1524},"ServiceProxyFactory",[90,8317,1512],{"class":1511},[90,8319,8320],{"class":92,"line":202},[90,8321,206],{"emptyLinePlaceholder":205},[90,8323,8324],{"class":92,"line":209},[90,8325,1548],{"class":1547},[90,8327,8328],{"class":92,"line":228},[90,8329,2267],{"class":1547},[90,8331,8332],{"class":92,"line":247},[90,8333,1558],{"class":1547},[90,8335,8336,8338,8340],{"class":92,"line":266},[90,8337,1563],{"class":1547},[90,8339,1567],{"class":1566},[90,8341,1570],{"class":1547},[90,8343,8344,8346,8348],{"class":92,"line":271},[90,8345,1563],{"class":1547},[90,8347,1577],{"class":1566},[90,8349,1580],{"class":1547},[90,8351,8352],{"class":92,"line":429},[90,8353,1585],{"class":1547},[90,8355,8356,8358,8360,8362],{"class":92,"line":440},[90,8357,1590],{"class":1483},[90,8359,1593],{"class":1483},[90,8361,2300],{"class":1596},[90,8363,1606],{"class":1511},[90,8365,8366],{"class":92,"line":458},[90,8367,206],{"emptyLinePlaceholder":205},[90,8369,8370,8372,8374,8376,8378,8380,8382,8384,8386,8388],{"class":92,"line":475},[90,8371,1634],{"class":1483},[90,8373,2313],{"class":1483},[90,8375,1670],{"class":1483},[90,8377,2318],{"class":1639},[90,8379,1676],{"class":1511},[90,8381,1679],{"class":1618},[90,8383,2325],{"class":1511},[90,8385,2328],{"class":1682},[90,8387,1685],{"class":1511},[90,8389,1606],{"class":1511},[90,8391,8392,8394,8396,8398,8400,8402,8405,8407,8409,8411,8413],{"class":92,"line":492},[90,8393,2337],{"class":1618},[90,8395,2340],{"class":1622},[90,8397,1702],{"class":1701},[90,8399,8099],{"class":1524},[90,8401,1491],{"class":1511},[90,8403,8404],{"class":1639},"getProxy",[90,8406,1676],{"class":1511},[90,8408,1992],{"class":1524},[90,8410,1491],{"class":1511},[90,8412,4038],{"class":1524},[90,8414,1892],{"class":1511},[90,8416,8417],{"class":92,"line":502},[90,8418,206],{"emptyLinePlaceholder":205},[90,8420,8421,8423,8425,8427,8429,8431],{"class":92,"line":512},[90,8422,2357],{"class":1618},[90,8424,1858],{"class":1622},[90,8426,1702],{"class":1701},[90,8428,2364],{"class":1483},[90,8430,1597],{"class":1639},[90,8432,2369],{"class":1511},[90,8434,8435,8437,8439,8441,8443,8445],{"class":92,"line":529},[90,8436,2374],{"class":1524},[90,8438,1491],{"class":1511},[90,8440,2379],{"class":1639},[90,8442,1676],{"class":1511},[90,8444,2384],{"class":111},[90,8446,1892],{"class":1511},[90,8448,8449],{"class":92,"line":547},[90,8450,206],{"emptyLinePlaceholder":205},[90,8452,8453],{"class":92,"line":564},[90,8454,2395],{"class":1547},[90,8456,8457],{"class":92,"line":573},[90,8458,8459],{"class":1547},"        \u002F\u002F 当前项目 pom 中，并没有引入 UserService 的实现 UserServiceImpl\n",[90,8461,8462],{"class":92,"line":582},[90,8463,2400],{"class":1547},[90,8465,8466],{"class":92,"line":600},[90,8467,2405],{"class":1547},[90,8469,8470,8472,8474,8476,8478,8480,8482,8484,8486],{"class":92,"line":618},[90,8471,2357],{"class":1618},[90,8473,2412],{"class":1622},[90,8475,1702],{"class":1701},[90,8477,2340],{"class":1524},[90,8479,1491],{"class":1511},[90,8481,2421],{"class":1639},[90,8483,1676],{"class":1511},[90,8485,2426],{"class":107},[90,8487,1892],{"class":1511},[90,8489,8490],{"class":92,"line":636},[90,8491,206],{"emptyLinePlaceholder":205},[90,8493,8494,8496,8498,8500,8502,8504,8506],{"class":92,"line":655},[90,8495,2437],{"class":1483},[90,8497,2440],{"class":1511},[90,8499,2443],{"class":107},[90,8501,2446],{"class":1701},[90,8503,2346],{"class":2345},[90,8505,1685],{"class":1511},[90,8507,1606],{"class":1511},[90,8509,8510,8512,8514,8516,8518,8520,8522,8524,8526,8528],{"class":92,"line":664},[90,8511,2457],{"class":1524},[90,8513,1491],{"class":1511},[90,8515,2118],{"class":1524},[90,8517,1491],{"class":1511},[90,8519,2123],{"class":1639},[90,8521,1676],{"class":1511},[90,8523,2470],{"class":1524},[90,8525,1491],{"class":1511},[90,8527,2138],{"class":1639},[90,8529,2141],{"class":1511},[90,8531,8532,8534,8536],{"class":92,"line":674},[90,8533,2481],{"class":1511},[90,8535,2484],{"class":1483},[90,8537,1606],{"class":1511},[90,8539,8540,8542,8544,8546,8548,8550,8552,8554],{"class":92,"line":679},[90,8541,2457],{"class":1524},[90,8543,1491],{"class":1511},[90,8545,2118],{"class":1524},[90,8547,1491],{"class":1511},[90,8549,2123],{"class":1639},[90,8551,1676],{"class":1511},[90,8553,2503],{"class":111},[90,8555,1892],{"class":1511},[90,8557,8558],{"class":92,"line":1450},[90,8559,2510],{"class":1511},[90,8561,8562],{"class":92,"line":3029},[90,8563,1659],{"class":1511},[90,8565,8566],{"class":92,"line":3045},[90,8567,1715],{"class":1511},[20,8569,8570],{},"至此开发完毕，可以 Debug 下有没有错误，然后接下来运行代码。",[10,8572,8573],{"id":8573},"测试运行",[20,8575,8576,8577,8579],{},"1.首先需要启动服务提供者，让他先在本地注册服务。以 Debug 模式启动 provider 模块中 ",[87,8578,3940],{"code":3940},"中的 main 方法。不出意外应该会看到如下控制台信息",[28,8581],{"caption":8582,"src":8583},"控制台信息截图","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777703216956_image.webp",[20,8585,8586,8587,8589],{},"2.接下来启动服务消费者 consumer 模块，以 debug 模式启动 consumer 模块中 ",[87,8588,8202],{"code":8202}," 里的 main 方法。",[20,8591,8592],{},"不出意外的话会看到如下信息",[28,8594],{"caption":8582,"src":8595},"https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777703256728_image.webp",[10,8597,8598],{"id":8598},"回顾整个流程",[20,8600,8601],{},"我们运行时，启动了两个 main 方法。",[20,8603,8604],{},"首先启动提供者 provider 中的 main 方法，这个方法启动后会做几件事：",[8606,8607,8608,8623],"ol",{},[8609,8610,8611,8612,8615,8616,8618,8619,8622],"li",{},"调用 easy-rpc 模块中的注册服务方法 ",[87,8613,8614],{"code":8614},"LocalRegistry.register","，首先在 rpc 框架的 ",[87,8617,3529],{"code":3529}," 中保存了提供者提供的服务。这个服务是 provider 模块中对 common 模块定义的 UserService 接口做了实现，提供了实现类 ",[87,8620,8621],{"code":8621},"UserServiceImpl","。",[8609,8624,8625],{},"启动 easy-rpc 模块中写好的 HTTP 服务程序，监听 8080 端口。",[20,8627,8628],{},"然后我们启动消费者 consumer 中的 main 方法，这个方法启动后会做几件事：",[8606,8630,8631,8634,8637,8640],{},[8609,8632,8633],{},"调用 easy-rpc 模块中的工厂方法，创建出 UserService 接口的实现类。主要是通过动态代理来创建出一个代理对象，但是这个代理对象本质上和目标对象已经基本没关系了，因为代理对象并没有直接通过反射调用 method.invok 方法来执行目标对象的目标方法，而仅仅是发送网络请求。",[8609,8635,8636],{},"然后代码中 new 了一个 User 对象，并且给它设置名称",[8609,8638,8639],{},"接下来通过 userService 这个代理对象，来获取 user。此时因为我们调用了代理对象的代理方法，所以动态代理中的 InvocationHandler 里的 invoke 方法会被执行，这个方法底层执行了很多代码，主要就是代替我们创建请求，序列化请求体，发送请求到我们 easy-rpc 模块中启动的 HTTP 服务器，然后 easy-rpc 模块中的请求处理器就开始接收到请求，反序列化请求体，获取请求参数，利用反射，调用 provider 模块中提供的 UserServiceImpl 类里的 getUser() 方法，并拿到返回值，然后再构造响应体，序列化响应体，然后发送序列化后的响应数据给 consumer 消费者模块",[8609,8641,8642],{},"打印通过 RPC 框架获取道德 newUser 对象中的名字",[8644,8645,8646],"style",{},"html pre.shiki code .sxizN, html code.shiki .sxizN{--shiki-default:#179299;--shiki-dark:#ABB2BF}html pre.shiki code .sGF2L, html code.shiki .sGF2L{--shiki-default:#1E66F5;--shiki-dark:#E06C75}html pre.shiki code .sK5Ct, html code.shiki .sK5Ct{--shiki-default:#DF8E1D;--shiki-dark:#D19A66}html pre.shiki code .sa2x1, html code.shiki .sa2x1{--shiki-default:#4C4F69;--shiki-dark:#ABB2BF}html pre.shiki code .sw_MA, html code.shiki .sw_MA{--shiki-default:#40A02B;--shiki-dark:#98C379}html pre.shiki code .sGpC2, html code.shiki .sGpC2{--shiki-default:#7C7F93;--shiki-dark:#D19A66}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSWcl, html code.shiki .sSWcl{--shiki-default:#8839EF;--shiki-dark:#C678DD}html pre.shiki code .sHUla, html code.shiki .sHUla{--shiki-default:#7C7F93;--shiki-dark:#C678DD}html pre.shiki code .sgT6j, html code.shiki .sgT6j{--shiki-default:#7C7F93;--shiki-dark:#ABB2BF}html pre.shiki code .szf8G, html code.shiki .szf8G{--shiki-default:#4C4F69;--shiki-dark:#E5C07B}html pre.shiki code .sGc2n, html code.shiki .sGc2n{--shiki-default:#7C7F93;--shiki-dark:#E5C07B}html pre.shiki code .skYY2, html code.shiki .skYY2{--shiki-default:#7C7F93;--shiki-default-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .szsGz, html code.shiki .szsGz{--shiki-default:#8839EF;--shiki-default-font-style:inherit;--shiki-dark:#C678DD;--shiki-dark-font-style:italic}html pre.shiki code .sIkkJ, html code.shiki .sIkkJ{--shiki-default:#DF8E1D;--shiki-default-font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:inherit}html pre.shiki code .sPahJ, html code.shiki .sPahJ{--shiki-default:#8839EF;--shiki-dark:#E5C07B}html pre.shiki code .sIGPt, html code.shiki .sIGPt{--shiki-default:#4C4F69;--shiki-dark:#E06C75}html pre.shiki code .seVD2, html code.shiki .seVD2{--shiki-default:#1E66F5;--shiki-default-font-style:italic;--shiki-dark:#61AFEF;--shiki-dark-font-style:inherit}html pre.shiki code .sddMY, html code.shiki .sddMY{--shiki-default:#E64553;--shiki-default-font-style:italic;--shiki-dark:#E06C75;--shiki-dark-font-style:italic}html pre.shiki code .sQee8, html code.shiki .sQee8{--shiki-default:#D20F39;--shiki-dark:#E5C07B}html pre.shiki code .sqgB4, html code.shiki .sqgB4{--shiki-default:#179299;--shiki-dark:#56B6C2}html pre.shiki code .slb6Y, html code.shiki .slb6Y{--shiki-default:#FE640B;--shiki-dark:#ABB2BF}html pre.shiki code .saiVi, html code.shiki .saiVi{--shiki-default:#FE640B;--shiki-dark:#E5C07B}html pre.shiki code .sFiMs, html code.shiki .sFiMs{--shiki-default:#D20F39;--shiki-dark:#D19A66}html pre.shiki code .sYQis, html code.shiki .sYQis{--shiki-default:#FE640B;--shiki-dark:#D19A66}html pre.shiki code .syBBb, html code.shiki .syBBb{--shiki-default:#7C7F93;--shiki-dark:#E06C75}html pre.shiki code .sT9Pd, html code.shiki .sT9Pd{--shiki-default:#DF8E1D;--shiki-default-font-style:italic;--shiki-dark:#E5C07B;--shiki-dark-font-style:italic}html pre.shiki code .sJVDc, html code.shiki .sJVDc{--shiki-default:#7C7F93;--shiki-dark:#61AFEF}",{"title":85,"searchDepth":161,"depth":161,"links":8648},[8649,8652,8677,8678],{"id":12,"depth":126,"text":13,"children":8650},[8651],{"id":17,"depth":150,"text":18},{"id":43,"depth":126,"text":43,"children":8653},[8654,8655,8661],{"id":53,"depth":150,"text":53},{"id":68,"depth":150,"text":68,"children":8656},[8657,8658,8659,8660],{"id":76,"depth":161,"text":77},{"id":280,"depth":161,"text":281},{"id":688,"depth":161,"text":689},{"id":1060,"depth":161,"text":1061},{"id":1459,"depth":150,"text":1459,"children":8662},[8663,8664,8665,8666],{"id":1462,"depth":161,"text":1463},{"id":1899,"depth":161,"text":1900},{"id":2160,"depth":161,"text":2161},{"id":2521,"depth":161,"text":2522,"children":8667},[8668,8669,8670,8671,8672,8673,8674,8675,8676],{"id":2563,"depth":180,"text":2564},{"id":2679,"depth":180,"text":2680},{"id":3187,"depth":180,"text":3188},{"id":3457,"depth":180,"text":3458},{"id":3930,"depth":180,"text":3931},{"id":4100,"depth":180,"text":4101},{"id":4964,"depth":180,"text":4965},{"id":5577,"depth":180,"text":5578},{"id":7270,"depth":180,"text":7271},{"id":8573,"depth":126,"text":8573},{"id":8598,"depth":126,"text":8598},[8680],"技术","2026-05-02 15:00:00","重复造轮子之实现一个简易的RPC框架，包含服务提供者、消费者、公共模块和RPC核心模块的设计与开发。通过使用Vert.x实现HTTP服务器，JDK序列化处理数据传输，动态代理实现远程调用，实现了类似本地调用的分布式服务通信。",false,"md","https:\u002F\u002Ffile.dhbxs.top\u002Fblog_img\u002F1777041101667_20260424.webp",{"slots":8687},{},"\u002Fposts\u002F39924a5",null,{"text":8691,"minutes":8692,"time":8693,"words":8694},"23 min read",22.77,1366200,4554,0,{"title":5,"description":8682},{"loc":8688},"posts\u002F2026\u002F重复造轮子之简易RPC框架",[8700,8701],"RPC","Java","tech","2026-05-02 15:02:00","2nKR3qfLLEUEVcjH8wUfiNV195WlD47VW-fLAU1ZCTo",[8706,8689],{"title":7283,"path":8707,"stem":8708,"date":8709,"type":8702,"children":-1},"\u002Fposts\u002F370adf0","posts\u002F2026\u002FSpring AOP 动态代理机制：从静态代理到 JDK 与 CGLIB 的实现","2026-04-20 11:18:07",1777705465747]