{"id":435,"date":"2022-04-29T22:15:37","date_gmt":"2022-04-29T14:15:37","guid":{"rendered":"https:\/\/blog.lijiajia.top\/?p=435"},"modified":"2026-06-19T21:33:51","modified_gmt":"2026-06-19T13:33:51","slug":"springcloud%e7%ac%ac%e4%ba%8c%e5%ad%a3%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%ef%bc%9agateway%e6%96%b0%e4%b8%80%e4%bb%a3%e7%bd%91%e5%85%b3%e5%8d%81%e4%ba%8c","status":"publish","type":"post","link":"https:\/\/blog.ttwow.top\/?p=435","title":{"rendered":"SpringCloud\u7b2c\u4e8c\u5b63\u5b66\u4e60\u7b14\u8bb0\uff1aGateway\u65b0\u4e00\u4ee3\u7f51\u5173(\u5341\u4e8c)"},"content":{"rendered":"<h2>\u6982\u8ff0\u7b80\u4ecb<\/h2>\n<h3>\u5b98\u7f51<\/h3>\n<p>\u4e0a\u4e00\u4ee3zuul 1.X<\/p>\n<p><a href=\"https:\/\/github.com\/Netflix\/zuul\/wiki\">https:\/\/github.com\/Netflix\/zuul\/wiki<\/a><\/p>\n<p>\u5f53\u524dgateway<\/p>\n<p><a href=\"https:\/\/cloud.spring.io\/spring-cloud-static\/spring-cloud-gateway\/2.2.1.RELEASE\/reference\/html\/\">https:\/\/cloud.spring.io\/spring-cloud-static\/spring-cloud-gateway\/2.2.1.RELEASE\/reference\/html\/<\/a><\/p>\n<h3>\u662f\u4ec0\u4e48<\/h3>\n<p>Cloud\u5168\u5bb6\u6876\u4e2d\u6709\u4e2a\u5f88\u91cd\u8981\u7684\u7ec4\u4ef6\u5c31\u662f\u7f51\u5173\uff0c\u57281.x\u7248\u672c\u4e2d\u90fd\u662f\u91c7\u7528\u7684Zuul\u7f51\u5173\uff1b<br \/>\n\u4f46\u57282.x\u7248\u672c\u4e2d\uff0czuul\u7684\u5347\u7ea7\u4e00\u76f4\u8df3\u7968\uff0cSpringCloud\u6700\u540e\u81ea\u5df1\u7814\u53d1\u4e86\u4e00\u4e2a\u7f51\u5173\u66ff\u4ee3Zuul\uff0c<br \/>\n\u90a3\u5c31\u662fSpringCloud Gateway\u4e00\u53e5\u8bdd\uff1agateway\u662f\u539fzuul1.x\u7248\u7684\u66ff\u4ee3<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241804767.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241804767.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u6982\u8ff0<\/p>\n<p>SpringCloud Gateway \u662f Spring Cloud \u7684\u4e00\u4e2a\u5168\u65b0\u9879\u76ee\uff0c\u57fa\u4e8e Spring 5.0+Spring Boot 2.0 \u548c Project Reactor \u7b49\u6280\u672f\u5f00\u53d1\u7684\u7f51\u5173\uff0c\u5b83\u65e8\u5728\u4e3a\u5fae\u670d\u52a1\u67b6\u6784\u63d0\u4f9b\u4e00\u79cd\u7b80\u5355\u6709\u6548\u7684\u7edf\u4e00\u7684 API \u8def\u7531\u7ba1\u7406\u65b9\u5f0f\u3002<\/p>\n<p>SpringCloud Gateway \u4f5c\u4e3a Spring Cloud \u751f\u6001\u7cfb\u7edf\u4e2d\u7684\u7f51\u5173\uff0c\u76ee\u6807\u662f\u66ff\u4ee3 Zuul\uff0c\u5728Spring Cloud 2.0\u4ee5\u4e0a\u7248\u672c\u4e2d\uff0c\u6ca1\u6709\u5bf9\u65b0\u7248\u672c\u7684Zuul 2.0\u4ee5\u4e0a\u6700\u65b0\u9ad8\u6027\u80fd\u7248\u672c\u8fdb\u884c\u96c6\u6210\uff0c\u4ecd\u7136\u8fd8\u662f\u4f7f\u7528\u7684Zuul 1.x\u975eReactor\u6a21\u5f0f\u7684\u8001\u7248\u672c\u3002\u800c\u4e3a\u4e86\u63d0\u5347\u7f51\u5173\u7684\u6027\u80fd\uff0cSpringCloud Gateway\u662f\u57fa\u4e8eWebFlux\u6846\u67b6\u5b9e\u73b0\u7684\uff0c\u800cWebFlux\u6846\u67b6\u5e95\u5c42\u5219\u4f7f\u7528\u4e86\u9ad8\u6027\u80fd\u7684Reactor\u6a21\u5f0f\u901a\u4fe1\u6846\u67b6Netty\u3002<\/p>\n<p>Spring Cloud Gateway\u7684\u76ee\u6807\u63d0\u4f9b\u7edf\u4e00\u7684\u8def\u7531\u65b9\u5f0f\u4e14\u57fa\u4e8e Filter \u94fe\u7684\u65b9\u5f0f\u63d0\u4f9b\u4e86\u7f51\u5173\u57fa\u672c\u7684\u529f\u80fd\uff0c\u4f8b\u5982\uff1a\u5b89\u5168\uff0c\u76d1\u63a7\/\u6307\u6807\uff0c\u548c\u9650\u6d41\u3002<\/p>\n<p>\u4e00\u53e5\u8bdd\uff1aSpringCloud Gateway \u4f7f\u7528\u7684Webflux\u4e2d\u7684reactor-netty\u54cd\u5e94\u5f0f\u7f16\u7a0b\u7ec4\u4ef6\uff0c\u5e95\u5c42\u4f7f\u7528\u4e86Netty\u901a\u8baf\u6846\u67b6\u3002<\/p>\n<p>\u6e90\u7801\u67b6\u6784<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241817947.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241817947.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h3>\u80fd\u5e72\u561b<\/h3>\n<p>\u53cd\u5411\u4ee3\u7406<\/p>\n<p>\u9274\u6743<\/p>\n<p>\u6d41\u91cf\u63a7\u5236<\/p>\n<p>\u7194\u65ad<\/p>\n<p>\u65e5\u5fd7\u76d1\u63a7<\/p>\n<p>\u3002\u3002\u3002\u3002\u3002\u3002<\/p>\n<h3>\u5fae\u670d\u52a1\u67b6\u6784\u4e2d\u7f51\u5173\u5728\u54ea\u91cc<\/h3>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241831841.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241831841.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h3>\u6709Zuul\u4e86\u600e\u4e48\u53c8\u51fa\u6765\u4e86gateway<\/h3>\n<h4>\u6211\u4eec\u4e3a\u4ec0\u4e48\u9009\u62e9Gateway\uff1f<\/h4>\n<p>1.neflix\u4e0d\u592a\u9760\u8c31\uff0czuul2.0\u4e00\u76f4\u8df3\u7968\uff0c\u8fdf\u8fdf\u4e0d\u53d1\u5e03<\/p>\n<p>\u4e00\u65b9\u9762\u56e0\u4e3aZuul1.0\u5df2\u7ecf\u8fdb\u5165\u4e86\u7ef4\u62a4\u9636\u6bb5\uff0c\u800c\u4e14Gateway\u662fSpringCloud\u56e2\u961f\u7814\u53d1\u7684\uff0c\u662f\u4eb2\u513f\u5b50\u4ea7\u54c1\uff0c\u503c\u5f97\u4fe1\u8d56\u3002<br \/>\n\u800c\u4e14\u5f88\u591a\u529f\u80fdZuul\u90fd\u6ca1\u6709\u7528\u8d77\u6765\u4e5f\u975e\u5e38\u7684\u7b80\u5355\u4fbf\u6377\u3002<\/p>\n<p>Gateway\u662f\u57fa\u4e8e\u5f02\u6b65\u975e\u963b\u585e\u6a21\u578b\u4e0a\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u6027\u80fd\u65b9\u9762\u4e0d\u9700\u8981\u62c5\u5fc3\u3002\u867d\u7136Netflix\u65e9\u5c31\u53d1\u5e03\u4e86\u6700\u65b0\u7684 Zuul 2.x\uff0c<br \/>\n\u4f46 Spring Cloud \u8c8c\u4f3c\u6ca1\u6709\u6574\u5408\u8ba1\u5212\u3002\u800c\u4e14Netflix\u76f8\u5173\u7ec4\u4ef6\u90fd\u5ba3\u5e03\u8fdb\u5165\u7ef4\u62a4\u671f\uff1b\u4e0d\u77e5\u524d\u666f\u5982\u4f55\uff1f<\/p>\n<p>\u591a\u65b9\u9762\u7efc\u5408\u8003\u8651Gateway\u662f\u5f88\u7406\u60f3\u7684\u7f51\u5173\u9009\u62e9\u3002<\/p>\n<p>2.SpringCloud Gateway\u5177\u6709\u5982\u4e0b\u7279\u6027<\/p>\n<p>Spring Cloud Gateway \u5177\u6709\u5982\u4e0b\u7279\u6027\uff1a<\/p>\n<p>\u57fa\u4e8eSpring Framework 5, Project Reactor \u548c Spring Boot 2.0 \u8fdb\u884c\u6784\u5efa\uff1b<br \/>\n\u52a8\u6001\u8def\u7531\uff1a\u80fd\u591f\u5339\u914d\u4efb\u4f55\u8bf7\u6c42\u5c5e\u6027\uff1b<br \/>\n\u53ef\u4ee5\u5bf9\u8def\u7531\u6307\u5b9a Predicate\uff08\u65ad\u8a00\uff09\u548c Filter\uff08\u8fc7\u6ee4\u5668\uff09\uff1b<br \/>\n\u96c6\u6210Hystrix\u7684\u65ad\u8def\u5668\u529f\u80fd\uff1b<br \/>\n\u96c6\u6210 Spring Cloud \u670d\u52a1\u53d1\u73b0\u529f\u80fd\uff1b<br \/>\n\u6613\u4e8e\u7f16\u5199\u7684 Predicate\uff08\u65ad\u8a00\uff09\u548c Filter\uff08\u8fc7\u6ee4\u5668\uff09\uff1b<br \/>\n\u8bf7\u6c42\u9650\u6d41\u529f\u80fd\uff1b<br \/>\n\u652f\u6301\u8def\u5f84\u91cd\u5199\u3002<\/p>\n<p>3.Spring Cloud Gateway \u4e0e Zuul\u7684\u533a\u522b<br \/>\n\u5728SpringCloud Finchley \u6b63\u5f0f\u7248\u4e4b\u524d\uff0cSpring Cloud \u63a8\u8350\u7684\u7f51\u5173\u662f Netflix \u63d0\u4f9b\u7684Zuul\uff1a<\/p>\n<p>1\u3001Zuul 1.x\uff0c\u662f\u4e00\u4e2a\u57fa\u4e8e\u963b\u585e I\/ O \u7684 API Gateway<\/p>\n<p>2\u3001Zuul 1.x \u57fa\u4e8eServlet 2. 5\u4f7f\u7528\u963b\u585e\u67b6\u6784\u5b83\u4e0d\u652f\u6301\u4efb\u4f55\u957f\u8fde\u63a5(\u5982 WebSocket) Zuul \u7684\u8bbe\u8ba1\u6a21\u5f0f\u548cNginx\u8f83\u50cf\uff0c\u6bcf\u6b21 I\/ O \u64cd\u4f5c\u90fd\u662f\u4ece\u5de5\u4f5c\u7ebf\u7a0b\u4e2d\u9009\u62e9\u4e00\u4e2a\u6267\u884c\uff0c\u8bf7\u6c42\u7ebf\u7a0b\u88ab\u963b\u585e\u5230\u5de5\u4f5c\u7ebf\u7a0b\u5b8c\u6210\uff0c\u4f46\u662f\u5dee\u522b\u662fNginx \u7528C++ \u5b9e\u73b0\uff0cZuul \u7528 Java \u5b9e\u73b0\uff0c\u800c JVM \u672c\u8eab\u4f1a\u6709\u7b2c\u4e00\u6b21\u52a0\u8f7d\u8f83\u6162\u7684\u60c5\u51b5\uff0c\u4f7f\u5f97Zuul \u7684\u6027\u80fd\u76f8\u5bf9\u8f83\u5dee\u3002<\/p>\n<p>3\u3001Zuul 2.x\u7406\u5ff5\u66f4\u5148\u8fdb\uff0c\u60f3\u57fa\u4e8eNetty\u975e\u963b\u585e\u548c\u652f\u6301\u957f\u8fde\u63a5\uff0c\u4f46SpringCloud\u76ee\u524d\u8fd8\u6ca1\u6709\u6574\u5408\u3002 Zuul 2.x\u7684\u6027\u80fd\u8f83 Zuul 1.x \u6709\u8f83\u5927\u63d0\u5347\u3002\u5728\u6027\u80fd\u65b9\u9762\uff0c\u6839\u636e\u5b98\u65b9\u63d0\u4f9b\u7684\u57fa\u51c6\u6d4b\u8bd5\uff0c Spring Cloud Gateway \u7684 RPS\uff08\u6bcf\u79d2\u8bf7\u6c42\u6570\uff09\u662fZuul \u7684 1. 6 \u500d\u3002<\/p>\n<p>4\u3001Spring Cloud Gateway \u5efa\u7acb \u5728 Spring Framework 5\u3001 Project Reactor \u548c Spring Boot 2 \u4e4b\u4e0a\uff0c \u4f7f\u7528\u975e\u963b\u585e API\u3002<\/p>\n<p>5\u3001Spring Cloud Gateway \u8fd8 \u652f\u6301 WebSocket\uff0c \u5e76\u4e14\u4e0eSpring\u7d27\u5bc6\u96c6\u6210\u62e5\u6709\u66f4\u597d\u7684\u5f00\u53d1\u4f53\u9a8c<\/p>\n<h4>Zuul1.x\u6a21\u578b<\/h4>\n<p>Springcloud\u4e2d\u6240\u96c6\u6210\u7684Zuul\u7248\u672c\uff0c\u91c7\u7528\u7684\u662fTomcat\u5bb9\u5668\uff0c\u4f7f\u7528\u7684\u662f\u4f20\u7edf\u7684Servlet IO\u5904\u7406\u6a21\u578b\u3002<\/p>\n<p>\u5b66\u8fc7\u5c1a\u7845\u8c37web\u4e2d\u671f\u8bfe\u7a0b\u90fd\u77e5\u9053\u4e00\u4e2a\u9898\u76ee\uff0cServlet\u7684\u751f\u547d\u5468\u671f?servlet\u7531servlet container\u8fdb\u884c\u751f\u547d\u5468\u671f\u7ba1\u7406\u3002<br \/>\ncontainer\u542f\u52a8\u65f6\u6784\u9020servlet\u5bf9\u8c61\u5e76\u8c03\u7528servlet init()\u8fdb\u884c\u521d\u59cb\u5316\uff1b<br \/>\ncontainer\u8fd0\u884c\u65f6\u63a5\u53d7\u8bf7\u6c42\uff0c\u5e76\u4e3a\u6bcf\u4e2a\u8bf7\u6c42\u5206\u914d\u4e00\u4e2a\u7ebf\u7a0b\uff08\u4e00\u822c\u4ece\u7ebf\u7a0b\u6c60\u4e2d\u83b7\u53d6\u7a7a\u95f2\u7ebf\u7a0b\uff09\u7136\u540e\u8c03\u7528service()\u3002<br \/>\ncontainer\u5173\u95ed\u65f6\u8c03\u7528servlet destory()\u9500\u6bc1servlet\uff1b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241855390.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241855390.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u4e0a\u8ff0\u6a21\u5f0f\u7684\u7f3a\u70b9\uff1a<br \/>\nservlet\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u7f51\u7edcIO\u6a21\u578b\uff0c\u5f53\u8bf7\u6c42\u8fdb\u5165servlet container\u65f6\uff0cservlet container\u5c31\u4f1a\u4e3a\u5176\u7ed1\u5b9a\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u5728\u5e76\u53d1\u4e0d\u9ad8\u7684\u573a\u666f\u4e0b\u8fd9\u79cd\u6a21\u578b\u662f\u9002\u7528\u7684\u3002\u4f46\u662f\u4e00\u65e6\u9ad8\u5e76\u53d1(\u6bd4\u5982\u62bd\u98ce\u7528jemeter\u538b)\uff0c\u7ebf\u7a0b\u6570\u91cf\u5c31\u4f1a\u4e0a\u6da8\uff0c\u800c\u7ebf\u7a0b\u8d44\u6e90\u4ee3\u4ef7\u662f\u6602\u8d35\u7684\uff08\u4e0a\u7ebf\u6587\u5207\u6362\uff0c\u5185\u5b58\u6d88\u8017\u5927\uff09\u4e25\u91cd\u5f71\u54cd\u8bf7\u6c42\u7684\u5904\u7406\u65f6\u95f4\u3002\u5728\u4e00\u4e9b\u7b80\u5355\u4e1a\u52a1\u573a\u666f\u4e0b\uff0c\u4e0d\u5e0c\u671b\u4e3a\u6bcf\u4e2arequest\u5206\u914d\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u53ea\u9700\u89811\u4e2a\u6216\u51e0\u4e2a\u7ebf\u7a0b\u5c31\u80fd\u5e94\u5bf9\u6781\u5927\u5e76\u53d1\u7684\u8bf7\u6c42\uff0c\u8fd9\u79cd\u4e1a\u52a1\u573a\u666f\u4e0bservlet\u6a21\u578b\u6ca1\u6709\u4f18\u52bf<\/p>\n<p>\u6240\u4ee5Zuul 1.X\u662f\u57fa\u4e8eservlet\u4e4b\u4e0a\u7684\u4e00\u4e2a\u963b\u585e\u5f0f\u5904\u7406\u6a21\u578b\uff0c\u5373spring\u5b9e\u73b0\u4e86\u5904\u7406\u6240\u6709request\u8bf7\u6c42\u7684\u4e00\u4e2aservlet\uff08DispatcherServlet\uff09\u5e76\u7531\u8be5servlet\u963b\u585e\u5f0f\u5904\u7406\u5904\u7406\u3002\u6240\u4ee5Springcloud Zuul\u65e0\u6cd5\u6446\u8131servlet\u6a21\u578b\u7684\u5f0a\u7aef<\/p>\n<h4>GateWay\u6a21\u578b<\/h4>\n<p>WebFlux\u662f\u4ec0\u4e48<\/p>\n<p><a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/web-reactive.html#webflux-new-framework\">https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/web-reactive.html#webflux-new-framework<\/a><\/p>\n<p>\u4f20\u7edf\u7684Web\u6846\u67b6\uff0c\u6bd4\u5982\u8bf4\uff1astruts2\uff0cspringmvc\u7b49\u90fd\u662f\u57fa\u4e8eServlet API\u4e0eServlet\u5bb9\u5668\u57fa\u7840\u4e4b\u4e0a\u8fd0\u884c\u7684\u3002<br \/>\n\u4f46\u662f<br \/>\n\u5728Servlet3.1\u4e4b\u540e\u6709\u4e86\u5f02\u6b65\u975e\u963b\u585e\u7684\u652f\u6301\u3002\u800cWebFlux\u662f\u4e00\u4e2a\u5178\u578b\u975e\u963b\u585e\u5f02\u6b65\u7684\u6846\u67b6\uff0c\u5b83\u7684\u6838\u5fc3\u662f\u57fa\u4e8eReactor\u7684\u76f8\u5173API\u5b9e\u73b0\u7684\u3002\u76f8\u5bf9\u4e8e\u4f20\u7edf\u7684web\u6846\u67b6\u6765\u8bf4\uff0c\u5b83\u53ef\u4ee5\u8fd0\u884c\u5728\u8bf8\u5982Netty\uff0cUndertow\u53ca\u652f\u6301Servlet3.1\u7684\u5bb9\u5668\u4e0a\u3002\u975e\u963b\u585e\u5f0f+\u51fd\u6570\u5f0f\u7f16\u7a0b\uff08Spring5\u5fc5\u987b\u8ba9\u4f60\u4f7f\u7528java8\uff09<\/p>\n<p>Spring WebFlux \u662f Spring 5.0 \u5f15\u5165\u7684\u65b0\u7684\u54cd\u5e94\u5f0f\u6846\u67b6\uff0c\u533a\u522b\u4e8e Spring MVC\uff0c\u5b83\u4e0d\u9700\u8981\u4f9d\u8d56Servlet API\uff0c\u5b83\u662f\u5b8c\u5168\u5f02\u6b65\u975e\u963b\u585e\u7684\uff0c\u5e76\u4e14\u57fa\u4e8e Reactor \u6765\u5b9e\u73b0\u54cd\u5e94\u5f0f\u6d41\u89c4\u8303\u3002<\/p>\n<h2>\u4e09\u5927\u6838\u5fc3\u6982\u5ff5<\/h2>\n<h3>Route(\u8def\u7531)<\/h3>\n<p>\u8def\u7531\u662f\u6784\u5efa\u7f51\u5173\u7684\u57fa\u672c\u6a21\u5757\uff0c\u5b83\u7531ID\uff0c\u76ee\u6807URI\uff0c\u4e00\u7cfb\u5217\u7684\u65ad\u8a00\u548c\u8fc7\u6ee4\u5668\u7ec4\u6210\uff0c\u5982\u679c\u65ad\u8a00\u4e3atrue\u5219\u5339\u914d\u8be5\u8def\u7531<\/p>\n<h3>Predicate(\u65ad\u8a00)<\/h3>\n<p>\u53c2\u8003\u7684\u662fJava8\u7684java.util.function.Predicate<br \/>\n\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u5339\u914dHTTP\u8bf7\u6c42\u4e2d\u7684\u6240\u6709\u5185\u5bb9(\u4f8b\u5982\u8bf7\u6c42\u5934\u6216\u8bf7\u6c42\u53c2\u6570)\uff0c\u5982\u679c\u8bf7\u6c42\u4e0e\u65ad\u8a00\u76f8\u5339\u914d\u5219\u8fdb\u884c\u8def\u7531<\/p>\n<h3>Filter(\u8fc7\u6ee4)<\/h3>\n<p>\u6307\u7684\u662fSpring\u6846\u67b6\u4e2dGatewayFilter\u7684\u5b9e\u4f8b\uff0c\u4f7f\u7528\u8fc7\u6ee4\u5668\uff0c\u53ef\u4ee5\u5728\u8bf7\u6c42\u88ab\u8def\u7531\u524d\u6216\u8005\u4e4b\u540e\u5bf9\u8bf7\u6c42\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<h3>\u603b\u4f53<\/h3>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241979725.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241979725.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>web\u8bf7\u6c42\uff0c\u901a\u8fc7\u4e00\u4e9b\u5339\u914d\u6761\u4ef6\uff0c\u5b9a\u4f4d\u5230\u771f\u6b63\u7684\u670d\u52a1\u8282\u70b9\u3002\u5e76\u5728\u8fd9\u4e2a\u8f6c\u53d1\u8fc7\u7a0b\u7684\u524d\u540e\uff0c\u8fdb\u884c\u4e00\u4e9b\u7cbe\u7ec6\u5316\u63a7\u5236\u3002<br \/>\npredicate\u5c31\u662f\u6211\u4eec\u7684\u5339\u914d\u6761\u4ef6\uff1b<br \/>\n\u800cfilter\uff0c\u5c31\u53ef\u4ee5\u7406\u89e3\u4e3a\u4e00\u4e2a\u65e0\u6240\u4e0d\u80fd\u7684\u62e6\u622a\u5668\u3002\u6709\u4e86\u8fd9\u4e24\u4e2a\u5143\u7d20\uff0c\u518d\u52a0\u4e0a\u76ee\u6807uri\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u4e00\u4e2a\u5177\u4f53\u7684\u8def\u7531\u4e86<\/p>\n<h2>Gateway\u5de5\u4f5c\u6d41\u7a0b<\/h2>\n<p>\u5b98\u7f51\u603b\u7ed3<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241990833.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651241990833.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u5ba2\u6237\u7aef\u5411 Spring Cloud Gateway \u53d1\u51fa\u8bf7\u6c42\u3002\u7136\u540e\u5728 Gateway Handler Mapping \u4e2d\u627e\u5230\u4e0e\u8bf7\u6c42\u76f8\u5339\u914d\u7684\u8def\u7531\uff0c\u5c06\u5176\u53d1\u9001\u5230 Gateway Web Handler\u3002<\/p>\n<p>\u6838\u5fc3\u903b\u8f91<\/p>\n<p>\u8def\u7531\u8f6c\u53d1+\u6267\u884c\u8fc7\u6ee4\u5668\u94fe<\/p>\n<h2>\u5165\u95e8\u914d\u7f6e<\/h2>\n<p>\u65b0\u5efaModule<\/p>\n<p>cloud-gateway-gateway9527<\/p>\n<p>POM<\/p>\n<pre><code class=\"language-xml\">&lt;dependencies&gt;\n        &lt;!--gateway--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-gateway&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!--eureka-client--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-client&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;!-- \u5f15\u5165\u81ea\u5df1\u5b9a\u4e49\u7684api\u901a\u7528\u5305\uff0c\u53ef\u4ee5\u4f7f\u7528Payment\u652f\u4ed8Entity --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;com.springcloud&lt;\/groupId&gt;\n            &lt;artifactId&gt;cloud-api-commons&lt;\/artifactId&gt;\n            &lt;version&gt;${project.version}&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;!--\u4e00\u822c\u57fa\u7840\u914d\u7f6e\u7c7b--&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;<\/code><\/pre>\n<p>YML<\/p>\n<pre><code class=\"language-yaml\">server:\n  port: 9527\n\nspring:\n  application:\n    name: cloud-gateway\n  cloud:\n    gateway:\n      routes:\n        - id: payment_routh #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/get\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n\n        - id: payment_routh2 #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/lb\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n\neureka:\n  instance:\n    hostname: cloud-gateway-service\n  client: #\u670d\u52a1\u63d0\u4f9b\u8005provider\u6ce8\u518c\u8fdbeureka\u670d\u52a1\u5217\u8868\u5185\n    service-url:\n      register-with-eureka: true\n      fetch-registry: true\n      defaultZone: http:\/\/eureka7001.com:7001\/eureka<\/code><\/pre>\n<p>\u4e3b\u542f\u52a8\u7c7b<\/p>\n<pre><code class=\"language-java\">@SpringBootApplication\n@EnableEurekaClient\npublic class GateWayMain9527\n{\n    public static void main(String[] args)\n    {\n        SpringApplication.run(GateWayMain9527.class,args);\n    }\n}<\/code><\/pre>\n<p><del>9527\u7f51\u5173\u5982\u4f55\u505a\u8def\u7531\u6620\u5c04\u90a3\uff1f\uff1f\uff1f<\/del><\/p>\n<p>\u6211\u4eec\u76ee\u524d\u4e0d\u60f3\u66b4\u97328001\u7aef\u53e3\uff0c\u5e0c\u671b\u57288001\u5916\u9762\u5957\u4e00\u5c429527<\/p>\n<p>YML\u65b0\u589e\u7f51\u5173\u914d\u7f6e<\/p>\n<p>\u6d4b\u8bd5\uff1a<\/p>\n<p>\u542f\u52a87001<\/p>\n<p>\u542f\u52a88001\uff1acloud-provider-payment8001<\/p>\n<p>\u542f\u52a89527\u7f51\u5173<\/p>\n<p>\u8bbf\u95ee\u8bf4\u660e<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242031280.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242031280.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u6dfb\u52a0\u7f51\u5173\u524dhttp:\/\/localhost:8001\/payment\/get\/31<\/p>\n<p>\u6dfb\u52a0\u7f51\u5173\u540ehttp:\/\/localhost:9527\/payment\/get\/31<\/p>\n<h3>YML\u914d\u7f6e\u8bf4\u660e<\/h3>\n<p>Gateway\u7f51\u5173\u8def\u7531\u6709\u4e24\u79cd\u914d\u7f6e\u65b9\u5f0f\uff1a<\/p>\n<p>\u5728\u914d\u7f6e\u6587\u4ef6yml\u4e2d\u914d\u7f6e<\/p>\n<p>\u4ee3\u7801\u4e2d\u6ce8\u5165RouteLocator\u7684Bean<\/p>\n<p>\u4e1a\u52a1\u9700\u6c42:\u901a\u8fc79527\u7f51\u5173\u8bbf\u95ee\u5230\u5916\u7f51\u7684\u767e\u5ea6\u65b0\u95fb\u7f51\u5740<\/p>\n<pre><code class=\"language-java\">@Configuration\npublic class GateWayConfig\n{\n    \/**\n     * \u914d\u7f6e\u4e86\u4e00\u4e2aid\u4e3aroute-name\u7684\u8def\u7531\u89c4\u5219\uff0c\n     * \u5f53\u8bbf\u95ee\u5730\u5740 http:\/\/localhost:9527\/guonei\u65f6\u4f1a\u81ea\u52a8\u8f6c\u53d1\u5230\u5730\u5740\uff1ahttp:\/\/news.baidu.com\/guonei\n     * @param builder\n     * @return\n     *\/\n    @Bean\n    public RouteLocator customRouteLocator(RouteLocatorBuilder builder)\n    {\n        RouteLocatorBuilder.Builder routes = builder.routes();\n\n        routes.route(&quot;path_route_atguigu&quot;, r -&gt; r.path(&quot;\/guonei&quot;).uri(&quot;http:\/\/news.baidu.com\/guonei&quot;)).build();\n\n        return routes.build();\n\n    }\n    @Bean\n    public RouteLocator customRouteLocator2(RouteLocatorBuilder builder)\n    {\n        RouteLocatorBuilder.Builder routes = builder.routes();\n        routes.route(&quot;path_route_atguigu2&quot;, r -&gt; r.path(&quot;\/guoji&quot;).uri(&quot;http:\/\/news.baidu.com\/guoji&quot;)).build();\n        return routes.build();\n    }\n}<\/code><\/pre>\n<h2>\u901a\u8fc7\u5fae\u670d\u52a1\u540d\u5b9e\u73b0\u52a8\u6001\u8def\u7531<\/h2>\n<p>\u9ed8\u8ba4\u60c5\u51b5\u4e0bGateway\u4f1a\u6839\u636e\u6ce8\u518c\u4e2d\u5fc3\u6ce8\u518c\u7684\u670d\u52a1\u5217\u8868\uff0c<br \/>\n\u4ee5\u6ce8\u518c\u4e2d\u5fc3\u4e0a\u5fae\u670d\u52a1\u540d\u4e3a\u8def\u5f84\u521b\u5efa\u52a8\u6001\u8def\u7531\u8fdb\u884c\u8f6c\u53d1\uff0c\u4ece\u800c\u5b9e\u73b0\u52a8\u6001\u8def\u7531\u7684\u529f\u80fd<\/p>\n<p>\u542f\u52a8\uff1a<\/p>\n<p>\u4e00\u4e2aeureka7001 + \u4e24\u4e2a\u670d\u52a1\u63d0\u4f9b\u80058001\/8002<\/p>\n<p>POM<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-client&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<p>YML<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662furi\u7684\u534f\u8bae\u4e3alb\uff0c\u8868\u793a\u542f\u7528Gateway\u7684\u8d1f\u8f7d\u5747\u8861\u529f\u80fd\u3002<\/p>\n<p>lb:\/\/serviceName\u662fspring cloud gateway\u5728\u5fae\u670d\u52a1\u4e2d\u81ea\u52a8\u4e3a\u6211\u4eec\u521b\u5efa\u7684\u8d1f\u8f7d\u5747\u8861uri<\/p>\n<pre><code class=\"language-yaml\">spring:\n  application:\n    name: cloud-gateway\n  cloud:\n    gateway:\n      discovery:\n        locator:\n          enabled: true #\u5f00\u542f\u4ece\u6ce8\u518c\u4e2d\u5fc3\u52a8\u6001\u521b\u5efa\u8def\u7531\u7684\u529f\u80fd\uff0c\u5229\u7528\u5fae\u670d\u52a1\u540d\u8fdb\u884c\u8def\u7531\n      routes:\n        - id: payment_routh #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          # uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          uri: lb:\/\/cloud-payment-service #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/get\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n\n        - id: payment_routh2 #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          # uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          uri: lb:\/\/cloud-payment-service #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/lb\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<p><a href=\"http:\/\/localhost:9527\/payment\/lb\">http:\/\/localhost:9527\/payment\/lb<\/a><\/p>\n<p>8001\/8002\u4e24\u4e2a\u7aef\u53e3\u5207\u6362<\/p>\n<h2>Predicate\u7684\u4f7f\u7528<\/h2>\n<p>\u662f\u4ec0\u4e48<\/p>\n<pre><code class=\"language-markdown\">2022-04-29 16:11:50.392  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [After]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Before]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Between]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Cookie]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Header]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Host]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Method]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Path]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Query]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [ReadBodyPredicateFactory]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [RemoteAddr]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [Weight]\n2022-04-29 16:11:50.393  INFO 13400 --- [  restartedMain] o.s.c.g.r.RouteDefinitionRouteLocator    : Loaded RoutePredicateFactory [CloudFoundryRouteService]<\/code><\/pre>\n<p>Route Predicate Factories\u8fd9\u4e2a\u662f\u4ec0\u4e48\u4e1c\u4e1c?<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242059886.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242059886.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>Spring Cloud Gateway\u5c06\u8def\u7531\u5339\u914d\u4f5c\u4e3aSpring WebFlux HandlerMapping\u57fa\u7840\u67b6\u6784\u7684\u4e00\u90e8\u5206\u3002<br \/>\nSpring Cloud Gateway\u5305\u62ec\u8bb8\u591a\u5185\u7f6e\u7684Route Predicate\u5de5\u5382\u3002\u6240\u6709\u8fd9\u4e9bPredicate\u90fd\u4e0eHTTP\u8bf7\u6c42\u7684\u4e0d\u540c\u5c5e\u6027\u5339\u914d\u3002\u591a\u4e2aRoute Predicate\u5de5\u5382\u53ef\u4ee5\u8fdb\u884c\u7ec4\u5408<\/p>\n<p>Spring Cloud Gateway \u521b\u5efa Route \u5bf9\u8c61\u65f6\uff0c \u4f7f\u7528 RoutePredicateFactory \u521b\u5efa Predicate \u5bf9\u8c61\uff0cPredicate \u5bf9\u8c61\u53ef\u4ee5\u8d4b\u503c\u7ed9 Route\u3002 Spring Cloud Gateway \u5305\u542b\u8bb8\u591a\u5185\u7f6e\u7684Route Predicate Factories\u3002<\/p>\n<p>\u6240\u6709\u8fd9\u4e9b\u8c13\u8bcd\u90fd\u5339\u914dHTTP\u8bf7\u6c42\u7684\u4e0d\u540c\u5c5e\u6027\u3002\u591a\u79cd\u8c13\u8bcd\u5de5\u5382\u53ef\u4ee5\u7ec4\u5408\uff0c\u5e76\u901a\u8fc7\u903b\u8f91and\u3002<\/p>\n<h3>\u5e38\u7528\u7684Route Predicate<\/h3>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242071577.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/bucket-blog-img.oss-cn-shanghai.aliyuncs.com\/wp-content\/uploads\/2022\/04\/image-1651242071577.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>After Route Predicate<\/p>\n<pre><code class=\"language-yaml\">          predicates:\n       - Path=\/payment\/lb\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n             - After=2020-02-05T15:10:03.685+08:00[Asia\/Shanghai]         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531<\/code><\/pre>\n<p>Before Route Predicate<\/p>\n<pre><code class=\"language-yaml\">            - After=2020-02-05T15:10:03.685+08:00[Asia\/Shanghai]         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n            - Before=2020-02-05T15:10:03.685+08:00[Asia\/Shanghai]         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531<\/code><\/pre>\n<p>Between Route Predicate<\/p>\n<p>Cookie Route Predicate<\/p>\n<p>Cookie Route Predicate\u9700\u8981\u4e24\u4e2a\u53c2\u6570\uff0c\u4e00\u4e2a\u662f Cookie name ,\u4e00\u4e2a\u662f\u6b63\u5219\u8868\u8fbe\u5f0f\u3002<br \/>\n\u8def\u7531\u89c4\u5219\u4f1a\u901a\u8fc7\u83b7\u53d6\u5bf9\u5e94\u7684 Cookie name \u503c\u548c\u6b63\u5219\u8868\u8fbe\u5f0f\u53bb\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u4e0a\u5c31\u4f1a\u6267\u884c\u8def\u7531\uff0c\u5982\u679c\u6ca1\u6709\u5339\u914d\u4e0a\u5219\u4e0d\u6267\u884c<\/p>\n<p>\u4e0d\u5e26cookies\u8bbf\u95ee:curl <a href=\"http:\/\/localhost:9527\/payment\/lb\">http:\/\/localhost:9527\/payment\/lb<\/a><\/p>\n<p>\u5e26\u4e0acookies\u8bbf\u95ee:curl <a href=\"http:\/\/localhost:9527\/payment\/lb\">http:\/\/localhost:9527\/payment\/lb<\/a> --cookie &quot;username=zzyy&quot;<\/p>\n<p>\u52a0\u5165curl\u8fd4\u56de\u4e2d\u6587\u4e71\u7801:<a href=\"https:\/\/blog.csdn.net\/leedee\/article\/details\/82685636\">https:\/\/blog.csdn.net\/leedee\/article\/details\/82685636<\/a><\/p>\n<p>Header Route Predicate<\/p>\n<p>Host Route Predicate<\/p>\n<p>Method Route Predicate<\/p>\n<p>Path Route Predicate<\/p>\n<p>Query Route Predicate<\/p>\n<p>\u5c0f\u603b\u7ed3<\/p>\n<pre><code class=\"language-yaml\">\nserver:\n  port: 9527\n\nspring:\n  application:\n    name: cloud-gateway\n  cloud:\n    gateway:\n      discovery:\n        locator:\n          enabled: true #\u5f00\u542f\u4ece\u6ce8\u518c\u4e2d\u5fc3\u52a8\u6001\u521b\u5efa\u8def\u7531\u7684\u529f\u80fd\n      routes:\n        - id: payment_routh #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          # uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          uri: lb:\/\/cloud-payment-service #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/get\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n\n        - id: payment_routh2 #payment_route    #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          # uri: http:\/\/localhost:8001          #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          uri: lb:\/\/cloud-payment-service #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          predicates:\n            - Path=\/payment\/lb\/**         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n            - After=2020-02-05T15:10:03.685+08:00[Asia\/Shanghai]         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n            #- Before=2020-02-05T15:10:03.685+08:00[Asia\/Shanghai]         # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n            #- Between=2020-02-02T17:45:06.206+08:00[Asia\/Shanghai],2020-03-25T18:59:06.206+08:00[Asia\/Shanghai]\n            #- Cookie=username,zzyy\n            #- Header=X-Request-Id, \\d+  # \u8bf7\u6c42\u5934\u8981\u6709X-Request-Id\u5c5e\u6027\u5e76\u4e14\u503c\u4e3a\u6574\u6570\u7684\u6b63\u5219\u8868\u8fbe\u5f0f\n            #- Host=**.atguigu.com\n            - Method=GET\n            - Query=username, \\d+  # \u8981\u6709\u53c2\u6570\u540dusername\u5e76\u4e14\u503c\u8fd8\u8981\u662f\u6574\u6570\u624d\u80fd\u8def\u7531\n\neureka:\n  instance:\n    hostname: cloud-gateway-service\n  client: #\u670d\u52a1\u63d0\u4f9b\u8005provider\u6ce8\u518c\u8fdbeureka\u670d\u52a1\u5217\u8868\u5185\n    service-url:\n      register-with-eureka: true\n      fetch-registry: true\n      defaultZone: http:\/\/eureka7001.com:7001\/eureka\n\n#id\uff1a\u6211\u4eec\u81ea\u5b9a\u4e49\u7684\u8def\u7531 ID\uff0c\u4fdd\u6301\u552f\u4e00\n ##uri\uff1a\u76ee\u6807\u670d\u52a1\u5730\u5740\n ##predicates\uff1a\u8def\u7531\u6761\u4ef6\uff0cPredicate\u63a5\u53d7\u4e00\u4e2a\u8f93\u5165\u53c2\u6570\u8fd4\u56de\u4e00\u4e2a\u5e03\u5c14\u503c\u3002\n ##            \u8be5\u5c5e\u6027\u5305\u542b\u591a\u79cd\u9ed8\u8ba4\u65b9\u6cd5\u6765\u5c06Predicate\u7ec4\u5408\u6210\u5176\u4ed6\u590d\u6742\u7684\u903b\u8f91(\u6bd4\u5982\uff1a\u4e0e\uff0c\u6216\uff0c\u975e)\n<\/code><\/pre>\n<p>\u8bf4\u767d\u4e86\uff0cPredicate\u5c31\u662f\u4e3a\u4e86\u5b9e\u73b0\u4e00\u7ec4\u5339\u914d\u89c4\u5219\uff0c<br \/>\n\u8ba9\u8bf7\u6c42\u8fc7\u6765\u627e\u5230\u5bf9\u5e94\u7684Route\u8fdb\u884c\u5904\u7406\u3002<\/p>\n<h2>Filter\u7684\u4f7f\u7528<\/h2>\n<h3>\u662f\u4ec0\u4e48<\/h3>\n<p>\u8def\u7531\u8fc7\u6ee4\u5668\u53ef\u7528\u4e8e\u4fee\u6539\u8fdb\u5165\u7684HTTP\u8bf7\u6c42\u548c\u8fd4\u56de\u7684HTTP\u54cd\u5e94\uff0c\u8def\u7531\u8fc7\u6ee4\u5668\u53ea\u80fd\u6307\u5b9a\u8def\u7531\u8fdb\u884c\u4f7f\u7528\u3002<\/p>\n<p>Spring Cloud Gateway \u5185\u7f6e\u4e86\u591a\u79cd\u8def\u7531\u8fc7\u6ee4\u5668\uff0c\u4ed6\u4eec\u90fd\u7531GatewayFilter\u7684\u5de5\u5382\u7c7b\u6765\u4ea7\u751f<\/p>\n<h3>Spring Cloud Gateway\u7684Filter<\/h3>\n<p>\u751f\u547d\u5468\u671f\uff0cOnly Two<\/p>\n<p>pre<\/p>\n<p>post<\/p>\n<p>\u79cd\u7c7b\uff0cOnly Two<\/p>\n<p>GatewayFilter <\/p>\n<p><a href=\"https:\/\/cloud.spring.io\/spring-cloud-static\/spring-cloud-gateway\/2.2.1.RELEASE\/reference\/html\/#the-addrequestparameter-gatewayfilter-factory\">https:\/\/cloud.spring.io\/spring-cloud-static\/spring-cloud-gateway\/2.2.1.RELEASE\/reference\/html\/#the-addrequestparameter-gatewayfilter-factory<\/a><br \/>\n31\u79cd\u4e4b\u591a\u3002\u3002\u3002\u3002\u3002 <\/p>\n<p>GlobalFilter<\/p>\n<h3>\u5e38\u7528\u7684GatewayFilter<\/h3>\n<p>AddRequestParameter<\/p>\n<pre><code class=\"language-yaml\">spring:\n  application:\n    name: cloud-gateway\n  cloud:\n    gateway:\n      discovery:\n        locator:\n          enabled: true #\u5f00\u542f\u4ece\u6ce8\u518c\u4e2d\u5fc3\u52a8\u6001\u521b\u5efa\u8def\u7531\u7684\u529f\u80fd\n          lower-case-service-id: true #\u4f7f\u7528\u5c0f\u5199\u670d\u52a1\u540d\uff0c\u9ed8\u8ba4\u662f\u5927\u5199\n      routes:\n        - id: payment_routh #payment_route #\u8def\u7531\u7684ID\uff0c\u6ca1\u6709\u56fa\u5b9a\u89c4\u5219\u4f46\u8981\u6c42\u552f\u4e00\uff0c\u5efa\u8bae\u914d\u5408\u670d\u52a1\u540d\n          uri: lb:\/\/cloud-provider-payment #\u5339\u914d\u540e\u7684\u76ee\u6807\u670d\u52a1\u5730\u5740\uff0c\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          #uri: http:\/\/localhost:8001 #\u5339\u914d\u540e\u63d0\u4f9b\u670d\u52a1\u7684\u8def\u7531\u5730\u5740\n          filters:\n            - AddRequestParameter=X-Request-Id,1024 #\u8fc7\u6ee4\u5668\u5de5\u5382\u4f1a\u5728\u5339\u914d\u7684\u8bf7\u6c42\u5934\u52a0\u4e0a\u4e00\u5bf9\u8bf7\u6c42\u5934\uff0c\u540d\u79f0\u4e3aX-Request-Id\u503c\u4e3a1024\n          predicates:\n            - Path=\/paymentInfo\/**        # \u65ad\u8a00\uff0c\u8def\u5f84\u76f8\u5339\u914d\u7684\u8fdb\u884c\u8def\u7531\n            - Method=GET,POST<\/code><\/pre>\n<h3>\u81ea\u5b9a\u4e49\u8fc7\u6ee4\u5668<\/h3>\n<p>\u81ea\u5b9a\u4e49\u5168\u5c40GlobalFilter<\/p>\n<p>\u4e24\u4e2a\u4e3b\u8981\u63a5\u53e3\u4ecb\u7ecd:implements GlobalFilter,Ordered<\/p>\n<p>\u80fd\u5e72\u561b:<\/p>\n<p>\u5168\u5c40\u65e5\u5fd7\u8bb0\u5f55 <\/p>\n<p>\u7edf\u4e00\u7f51\u5173\u9274\u6743<\/p>\n<p>\u3002\u3002\u3002\u3002\u3002\u3002<\/p>\n<p>\u6848\u4f8b\u4ee3\u7801<\/p>\n<pre><code class=\"language-java\">@Component \/\/\u5fc5\u987b\u52a0\uff0c\u5fc5\u987b\u52a0\uff0c\u5fc5\u987b\u52a0\npublic class MyLogGateWayFilter implements GlobalFilter, Ordered\n{\n    @Override\n    public Mono&lt;Void&gt; filter(ServerWebExchange exchange, GatewayFilterChain chain)\n    {\n        System.out.println(&quot;time:&quot;+new Date()+&quot;\\t \u6267\u884c\u4e86\u81ea\u5b9a\u4e49\u7684\u5168\u5c40\u8fc7\u6ee4\u5668: &quot;+&quot;MyLogGateWayFilter&quot;+&quot;hello&quot;);\n\n        String uname = exchange.getRequest().getQueryParams().getFirst(&quot;uname&quot;);\n        if (uname == null) {\n            System.out.println(&quot;****\u7528\u6237\u540d\u4e3anull\uff0c\u65e0\u6cd5\u767b\u5f55&quot;);\n            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);\n            return exchange.getResponse().setComplete();\n        }\n        return chain.filter(exchange);\n    }\n\n    @Override\n    public int getOrder()\n    {\n        return 0;\n    }\n}<\/code><\/pre>\n<p>\u6d4b\u8bd5<\/p>\n<p>\u542f\u52a8:7001  9527 8001 8002<\/p>\n<p>\u6b63\u786e<\/p>\n<p><a href=\"http:\/\/localhost:9527\/payment\/lb?uname=z3\">http:\/\/localhost:9527\/payment\/lb?uname=z3<\/a><\/p>\n<p>\u9519\u8bef<\/p>\n<p>\u6ca1\u6709\u53c2\u6570uname<\/p>\n<p><a href=\"http:\/\/localhost:9527\/payment\/lb\uff1a\u65e0\u6cd5\u6b63\u5e38\u4f7f\u7528\u8f6c\u53d1\">http:\/\/localhost:9527\/payment\/lb\uff1a\u65e0\u6cd5\u6b63\u5e38\u4f7f\u7528\u8f6c\u53d1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6982\u8ff0\u7b80\u4ecb \u5b98\u7f51 \u4e0a\u4e00\u4ee3zuul 1.X https:\/\/github.com\/Netflix\/zuul\/wik [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[126],"tags":[70],"class_list":["post-435","post","type-post","status-publish","format-standard","hentry","category-java-microservices","tag-springcloud"],"_links":{"self":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=435"}],"version-history":[{"count":1,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/435\/revisions"}],"predecessor-version":[{"id":2119,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=\/wp\/v2\/posts\/435\/revisions\/2119"}],"wp:attachment":[{"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ttwow.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}