diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md index ec6c21e..ab4a8fb 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md @@ -64,7 +64,74 @@ - [GlobalLoginOrRegisterFilter.java] --- ## 9. 代码与文件两种方式配置网关路由 +- 文件进行配置 +```json +[ + { + "id": "dev-protocol-springcloud-nacos-client", + "order": 0, // order 越小优先级越高0 + "predicates": [ + { + "args": { + "pattern": "/dev-protocol-springcloud-gateway/dev-protocol-spring-cloud-nacos/**" + }, + "name": "Path" + } + ], + "uri": "lb://dev-protocol-spring-cloud-nacos" + "filters": [ + { + "name": "HeaderToken" + }, + { + "name": "StripPrefix", + "args": { + "parts": "1" // 用来跳过上面的 pattern 前面的配置, 因为 [bootstrap.yml] 中的配置 context-path + } + } + ] + } +] +``` +- 配置类进行配置: [RouteLocatorConfig.java] ## 10. 验证网关微服务功能可用性 -## 11. SpringCloud Gateway 微服务入口网关总结 \ No newline at end of file +- src/main/resources/http 下 +- [HeaderTokenGatewayFilterFactory.java] + - 注意配置文件中的过滤器名称就是 [HeaderToken]GatewayFilterFactory , 框内的名称 + +## 11. SpringCloud Gateway 微服务入口网关总结 + +- SpringCloud Gateway 在工程中的位置 + - SpringCloud Gateway 是工程的最前端 + - 网关是微服务工程架构下的唯一入口(客户端) + - Gateway 提供了统一的路由方式,基于Filter 链的方式提供了网关的基本功能 +--- +- SpringCloud Gateway 与Zuul 的区别 + - Zuul 1.X是一个基于阻塞 I/0 的 APIGateway + - 基于 Servlet2.5 使用阻塞架构,不支持任何长连接 + - Zuu 的设计模式与 Nginx 很像,每次 I/0 操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成 + - SpringCloud Gatewgy建立在 Spring5、Project Reactor 和 SpringBoot2 之上,使用非阻塞API + - SpringCloud Gateway 支持 WebSocket,并且与 Spring 紧密集成拥有更好的开发体验 +--- +- SpringCloud Gateway 三大核心概念(Route、Predicate、Filter) + - Route(路由):是构建网关的基本模块,由ID、URI、一系列的断言和过滤器组成 + - Predicate(断言):可以匹配 HTTP 请求中所有的内容(请求头、参数等等),请求与断言相匹配则通过当前断言 + - Filter(过滤器):包括全局和局部过滤器,可以在请求被路由前后对请求进行更改 + - 用户 -> SpringCloud Gateway -> Predicate(s) -> Filter(s) -> Service +--- +- SpringCloud Gateway 过滤器 + - 全局过滤器和局部过滤器 + - 全局过滤器作用于所有的路由,不需要单独配置,通常用来实现统一化处理的业务需求 + - 局部过滤器实现并生效的三个步骤 + - 需要实现 GatewayFiter, Ordered, 实现相关的方法 + - 加入到过滤器工厂,并且将工厂注册到 Spring 容器中 + - 在配置文件中进行配置,如果不配置则不启用此过滤器规则(路由规则) +--- +- SpringCloud Gateway 路由的配置 + - 常用的三种配置方式 + - 在代码中注入 RouteLocator Bean,并手工编写配置路由定义 + - 在 application.yml、bootstrap.yml 等配置文件中配置 spring.cloud.gateway + - 通过配置中心(Nacos)实现动态的路由配置 + diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/java/org/example/conf/RouteLocatorConfig.java b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/java/org/example/conf/RouteLocatorConfig.java new file mode 100644 index 0000000..195aee7 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/java/org/example/conf/RouteLocatorConfig.java @@ -0,0 +1,31 @@ +package org.example.conf; + + +import org.springframework.cloud.gateway.route.RouteLocator; +import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + *

配置登录请求转发规则

+ * */ +@Configuration +public class RouteLocatorConfig { + + /** + *

使用代码定义路由规则, 在网关层面拦截下登录和注册接口

+ * */ + @Bean + public RouteLocator loginRouteLocator(RouteLocatorBuilder builder) { + + // 手动定义 Gateway 路由规则需要指定 id、path 和 uri + return builder.routes() + .route( + "e_commerce_authority", + r -> r.path( + "/dev-protocol-springcloud-gateway/e-commerce/login", + "/dev-protocol-springcloud-gateway/e-commerce/register" + ).uri("http://localhost:9001/") + ).build(); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/login.http b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/login.http index 25e22f1..15d1964 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/login.http +++ b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/login.http @@ -1,17 +1,17 @@ -### 登录 -POST 127.0.0.1:9001/imooc/e-commerce/login +### 登录 -> 向网关发 +POST 127.0.0.1:9001/dev-protocol-springcloud-gateway/e-commerce/login Content-Type: application/json { - "username": "Qinyi@imooc.com", + "username": "q@by.com", "password": "25d55ad283aa400af464c76d713c07ad" } -### -POST 127.0.0.1:9001/imooc/e-commerce/register +### 注册 -> 向网关发 +POST 127.0.0.1:9001/dev-protocol-springcloud-gateway/e-commerce/register Content-Type: application/json { - "username": "ImoocQinyi@imooc.com", + "username": "q@by.com", "password": "25d55ad283aa400af464c76d713c07ad" } diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/nacos-client.http b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/nacos-client.http index a0a713c..0cde9d0 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/nacos-client.http +++ b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/src/main/resources/http/nacos-client.http @@ -1,5 +1,6 @@ -### 查询服务 -GET http://127.0.0.1:9001/imooc/ecommerce-nacos-client/nacos-client/service-instance?serviceId=e-commerce-gateway +### 查询服务 - (测试gateway) +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/ecommerce-nacos-client/nacos-client/service-instance?serviceId=e-commerce-gateway Accept: application/json e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjE3LFwidXNlcm5hbWVcIjpcIkltb29jUWlueWlAaW1vb2MuY29tXCJ9IiwianRpIjoiMGIxNzQyYWItMWU3OC00OTZjLWIyNTAtMjNkZGQ1ZGEyZTU1IiwiZXhwIjoxNjI0MjA0ODAwfQ.QKGHzohSHdYDHzUVHpe9gNPUgzfkPwrSbB-WiMWYjLlt2tr9BufzZM8bSt-whb_bd0hKoC6rkYYO0WUVR67uSML-2yaTL1xMIn8GH9Flyig3rpO4vefL3Hp2TXIpwHHa7WlKsLzcUpNk9lxWs2B5k0ICdYCH_jD5Tx6N7CzfSUG9u4fOnVeM9UFE2nX_DURupUh_DKCc2oOoMeyCSR7Ma8-Ab4WQU3r-U0YivR8G1A0kmKOIoTeRhM3LcPuxUPh3rCbrjzMg--fexRGw0O38Qsby6pz-ku2IlTyFXY6_jNOG1BZR34-jBOnaIciP1TExw9bFumeuC2GcowTHJVH1Nw token: imooc +# 这里的校验信息在 HeaderTokenGatewayFilter 中配置写死的 \ No newline at end of file