应用系统定制开发Gateway原理及实例

目录


1、概念

1.1、作用

、鉴权、流量控制、应用系统定制开发熔断以及日志监控

1.2、应用系统定制开发中网关位置

1.3、核心功能

1.3.1、路由(Route)

  • 应用系统定制开发路由是构建网关的基本模块
  • 由ID,目标URI,应用系统定制开发一系列的断言和过滤器组成

1.3.2、断言()

  • 应用系统定制开发开发人员可以匹配HTTP应用系统定制开发请求中的所有内容(应用系统定制开发例如请求头或请求参数)
  • 如果请求与断言相匹配则进行路由

1.3.3、过滤(Filter)

  • 指的是Spring框架中GatewayFilter的实例
  • 使用过滤器,可以在请求被路由前或者之后对请求进行修改.

1.4、Gateway工作流程

1.4.1、流程

1.客户端向Getway发出请求,然后在Gateway Handler Mapping中找到与请求匹配的路由,并发送到Gateway Web Handler

2.Handler再通过指定的过滤器链,将请求发送到实际的服务执行业务逻辑,然后返回。

1.4.2、过滤器链

  • 发送代理请求之前(“pre”)作用:参数校验、权限校验、流量监控、日志输出和协议转换等。
  • 发送代理请求之后(“post”)作用:响应内容、响应头修改、日志输出、流量监控等

2、Gateway使用

2.1、固定IP地址进行路由

2.1.1、POM文件

        添加Gateway依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>

2.1.2、yaml配置文件

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. eureka:
  7. instance:
  8. hostname: cloud-gateway-service
  9. client:
  10. service-url:
  11. fetch-registry: true
  12. register-with-eureka: true
  13. defaultZone: http://eureka7001.com:7001/eureka/

2.1.3、业务类可以不添加业务类

2.1.4、主启动类

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class GatewayMain9527 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(GatewayMain9527.class, args);
  6. }
  7. }

2.1.5、添加匹配的路由地址

1)在yaml配置文件中添加

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  6. uri: http://localhost:8001 #匹配后提供服务的路由地址
  7. predicates:
  8. - Path=/payment/get/** # 断言,路径相匹配的进行路由(**通配符)
  9. - id: payment_route2
  10. uri: http://localhost:8001
  11. predicates:
  12. - Path=/payment/lb/** #断言,路径相匹配的进行路由

2)代码中注入RouteLocator的Bean

        1.新建配置类

         2.在配置类中,配置路由地址

  1. @Configuration
  2. public class GateWayConfig {
  3. /**
  4. * 配置了一个id为route-name的路由规则
  5. * 当访问地址http://localhost:9527/guonei时会自动转发到地址:http://news.baidu.com/guonei
  6. * */
  7. @Bean
  8. public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
  9. RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
  10. routes.route("path_rout_uclass", r -> r.path("/guonei")
  11. .uri("http://news.baidu.com/guonei")).build();
  12. return routes.build();
  13. }
  14. }

2.2、动态路由(利用微服务名称)

2.2.1、POM文件同2.1.1

2.2.2、yaml配置文件

        1.开启动态路由功能

        2.设置动态路由微服务名称(uri的协议lb,表示启用Gateway的负载均衡功能)

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
  11. routes:
  12. - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名
  13. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  14. uri: lb://cloud-payment-service # 匹配后提供服务的路由地址
  15. predicates:
  16. - Path=/payment/get/** # 断言,路径相匹配的进行路由(**通配符)
  17. - id: payment_route2
  18. #uri: http://localhost:8001
  19. uri: lb://cloud-payment-service # 匹配后提供服务的路由地址
  20. predicates:
  21. - Path=/payment/lb/** #断言,路径相匹配的进行路由
  22. eureka:
  23. instance:
  24. hostname: cloud-gateway-service
  25. client:
  26. service-url:
  27. fetch-registry: true
  28. register-with-eureka: true
  29. defaultZone: http://eureka7001.com:7001/eureka/

3、断言(Predicate)

3.1、作用

一个请求在抵达网关层后,首先就要进行断言匹配,在满足所有断言之后才会进入Filter阶段

3.2、Gateway断言类型

1)时间片断言:

  • After表示在xxx时刻之后,该路由有效
  • Before表示在xxx时刻之前,该路由有效
  • Between表示在两个时刻之间,该路由有效
  1. - id: payment_route2
  2. uri: lb://cloud-payment-service # 匹配后提供服务的路由地址
  3. predicates:
  4. - Path=/payment/lb/** #断言,路径相匹配的进行路由
  5. - After=2020-02-21T16:51:37.485+08:00[Asia/Shanghai]

2)路径匹配(Path):在断言中填上一段URL匹配规则

  1. - id: payment_route2
  2. uri: lb://cloud-payment-service # 匹配后提供服务的路由地址
  3. predicates:
  4. - Path=/payment/lb/** #断言,路径相匹配的进行路由

3)Cookie断言:Cookie验证的是Cookie中保存的信息,需要连同属性值一起验证

  1. - id: payment_route2
  2. uri: lb://cloud-payment-service # 匹配后提供服务的路由地址
  3. predicates:
  4. - Cookie=username,zzyy

4)Method断言:即Get/Post,请求方式的匹配

5)RequestParam断言

  • 属性名验证:此时断言只会验证QueryPrameters列表中某一属性是否存在
  • 属性值验证:不仅会验证属性是否存在,还会验证它的值是不是和断言相匹配

6)Header断言:检查Header中是否包含了响应的属性,可以用来验证请求是否携带了访问令牌

7)Host断言:**.another.org,匹配域名列表,参数中的主机地址进行匹配

4、过滤器(Filter)

4.1、概念

        用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

4.2、分类

4.2.1、生命周期

  • 发送代理请求之前(“pre”)作用:参数校验、权限校验、流量监控、日志输出和协议转换等。
  • 发送代理请求之后(“post”)作用:响应内容、响应头修改、日志输出、流量监控等

4.2.2、作用范围

  • 局部过滤器:作用于单个路由。
  • 全局过滤器:不需要配置路由,系统初始化作用到所有路由上。

4.3、Gateway自带Filter

4.4、自定义过滤器

4.4.1、新建过滤器实现类

4.4.2、实现GlobalFilter,OrderId两个接口

1)public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain):过滤器实现逻辑

2)public int getOrder():加载过滤器的优先级,数字越小,优先级越高

  1. @Component
  2. @Slf4j
  3. public class GateWayFilter implements GlobalFilter, Ordered {
  4. @Override
  5. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  6. log.info("come in 全局过滤器:" + new Date());
  7. String uname = exchange.getRequest().getQueryParams().getFirst("uname");
  8. if(uname == null){
  9. log.info("非法用户");
  10. exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
  11. return exchange.getResponse().setComplete();
  12. }
  13. return chain.filter(exchange);
  14. }
  15. //加载过滤器的优先级,数字越小,优先级越高
  16. @Override
  17. public int getOrder() {
  18. return 0;
  19. }
  20. }

 

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发