• Gateway 网关


    源码:https://gitee.com/GXQ205153964/gateway-parent.git 

    简介:

     

    • 网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
    • 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求。
    • 存在的问题:
    1. 客户端多次请求不同的微服务,增加客户端的复杂性
    2. 认证复杂,每个服务都要进行认证
    3. http请求不同服务次数增加,性能不高
    • 网关就是系统的入口,封装了应用程序的内部结构,为客户端提     供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,     诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等
    • 在目前的网关解决方案里,有Nginx+ Lua、Netflix Zuul 、Spring Cloud Gateway等等

    路由搭建

    流程:

    1. 搭建网关模块
    2. 引入依赖:starter-gateway
    3. 编写启动类
    4. 编写配置类
    5. 启动测试

     静态路由:

     http默认端口是80,不写就是80,这样用户访问更加方便。

     

     pom.xml

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.cloudgroupId>
    4. <artifactId>spring-cloud-starter-gatewayartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloudgroupId>
    8. <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    9. dependency>
    10. dependencies>

    启动类

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

    application.yml

    1. server:
    2. port: 80
    3. spring:
    4. application:
    5. name: api-gateway-server
    6. cloud:
    7. #网关配置
    8. gateway:
    9. #路由配置:转发规则
    10. routes: #集合
    11. #id: 唯一标识 默认UUID
    12. - id: gateway-provider
    13. #uri: 转发路径
    14. uri: http://localhost:8000/
    15. #predicates: 条件,用于请求网关路径的匹配规则
    16. predicates:
    17. - Path=/goods/**
    18. #当web访问 http://localhost:80/goods/finds 时,gateway会自动和上面匹配,
    19. #predicates里的Path相同时,会把端口后拼接到Path后
    20. - id: gateway-consumer
    21. uri: http://localhost:9000/
    22. predicates:
    23. - Path=/order/**

    转换规则: 

    当web访问  http://localhost:80/goods/finds 时,gateway会自动和上面匹配,predicates里的Path相同时,会把端口后拼接到Path后

    动态路由:

     当路由发生变化后,网关里的配置就需要修改,相当麻烦。

    动态路由使用到Eureka里注册的url地址,直接拉取,不用再自己配置了。

    流程:

    1.  引入eureka-client配置
    2. 修改uri属性:uri:Ib  //服务名称

     application.yml

    1. server:
    2. port: 80
    3. spring:
    4. application:
    5. name: api-gateway-server
    6. cloud:
    7. #网关配置
    8. gateway:
    9. #路由配置:转发规则
    10. routes: #集合
    11. #id: 唯一标识 默认UUID
    12. - id: gateway-provider
    13. #uri: 转发路径(静态路由)
    14. #uri: http://localhost:8000/
    15. #动态路由
    16. uri: lb://gateway-provider
    17. #predicates: 条件,用于请求网关路径的匹配规则
    18. predicates:
    19. - Path=/goods/**
    20. #当web访问 http://localhost:80/goods/finds 时,gateway会自动和上面匹配,
    21. #predicates里的Path相同时,会把端口后拼接到Path后
    22. - id: gateway-consumer
    23. #uri: http://localhost:9000/
    24. uri: lb://gateway-consumer
    25. predicates:
    26. - Path=/order/**
    27. eureka:
    28. client:
    29. service-url:
    30. defaultZone: http://localhost:8761/eureka

    结果 

    微服务名称设置

    为了防止服务多了后uri地址重名,所以加入微服务名称,经行区分。

    application.yml

    1. server:
    2. port: 80
    3. spring:
    4. application:
    5. name: api-gateway-server
    6. cloud:
    7. # 网关配置
    8. gateway:
    9. # 路由配置:转发规则
    10. routes: #集合。
    11. # id: 唯一标识。默认是一个UUID
    12. # uri: 转发路径
    13. # predicates: 条件,用于请求网关路径的匹配规则
    14. # filters:配置局部过滤器的
    15. - id: gateway-provider
    16. # 静态路由
    17. # uri: http://localhost:8001/
    18. # 动态路由
    19. uri: lb://GATEWAY-PROVIDER
    20. predicates:
    21. - Path=/goods/**
    22. filters:
    23. - AddRequestParameter=username,zhangsan
    24. - id: gateway-consumer
    25. # uri: http://localhost:9000
    26. uri: lb://GATEWAY-CONSUMER
    27. predicates:
    28. - Path=/order/**
    29. # 微服务名称配置
    30. discovery:
    31. locator:
    32. enabled: true # 设置为true 请求路径前可以添加微服务名称
    33. lower-case-service-id: true # 允许为小写
    34. eureka:
    35. client:
    36. service-url:
    37. defaultZone: http://localhost:8761/eureka

     

    Gateway 过滤器

    •  Gateway支持过滤功能,对请求或响应进行拦截,完成一些通用操作 
    •  Gateway提供两种过滤器转发方式:pre 和post
    • pre过滤器在群转发之前可以做参数校验,权限校验,流量监控,日志输出协议转换等。
    • post过滤器,再响应之前执行,可以做响应内容,响应头的修改,日志的输出,流量监控等。
    • Gateway还提供了两种类型过滤器
    1. GatewayFilter: 局部过滤器,针对单个路由
    2. GlobalFilter:全局过滤器,针对所有路由

     局部过滤器

    • GatewayFilter 局部过滤器,是针对单个路由的过滤器
    • 再SpringCloudGateway组件中提供了大量内置的局部过滤器,对请求和响应做过滤操作。
    • 遵循约定大于配置的思想,只需要在配置文件局部过滤器名称,并为其指定对应的值,就可以让其生效

     代码编写:

    api-gateway-server 添加配置文件

    1. - id: gateway-provider
    2. # 静态路由
    3. # uri: http://localhost:8001/
    4. # 动态路由
    5. uri: lb://GATEWAY-PROVIDER
    6. predicates:
    7. - Path=/goods/**
    8. filters:
    9. - AddRequestParameter=username,zhangsan

     provider的GoodsController findOne函数加参数String username

    加入输出语句输出,下面的函数 findOne_fallback 需要和finidOne参数保持一直,发生降级时被

    Hystrix的fallbackMethod调用

     

     过滤器全局过滤器

    •  GlobalFilter全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。
    • Spring Cloud Gateway核心的哦功能也是通过内置的全局过滤器来完成。
    • 自定义全局过滤器步骤:
    1. 定义类实现GlobalFilter和Ordered接口
    2. 重写方法
    3. 完成逻辑处理

     创建Myfilter类

    Myfilter

    1. package com.gao.gateway.filter;
    2. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    3. import org.springframework.cloud.gateway.filter.GlobalFilter;
    4. import org.springframework.core.Ordered;
    5. import org.springframework.core.annotation.Order;
    6. import org.springframework.stereotype.Component;
    7. import org.springframework.web.server.ServerWebExchange;
    8. import reactor.core.publisher.Mono;
    9. @Component
    10. public class MyFilter implements GlobalFilter, Ordered {
    11. @Override
    12. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    13. System.out.println("自定义全局过滤器执行~~~~");
    14. return chain.filter(exchange); //执行放行
    15. }
    16. /**
    17. * 过滤排序
    18. * @return 数值越小越先执行
    19. */
    20. @Override
    21. public int getOrder() {
    22. return 0;
    23. }
    24. }

     

     

    补充:

    在源码中下载md文档可以看到内置的过滤器工厂多有配置的使用方法和详情使用步骤

     

  • 相关阅读:
    git简单命令
    Ubuntu系统下: su:认证失败
    【VTK】关于VTK图像的系列功能
    【廉颇老矣,尚能饭否】传统的数据仓库是否还能发挥作用?
    【Android Studio】工程中文件Annotate with Git Blame 不能点击
    day26stream流和方法引用
    nodejs+Vue社区菜店线上买菜商城系统java springboot
    C++ 移动构造函数详解
    Java排序算法之基数排序
    新知实验室
  • 原文地址:https://blog.csdn.net/qq_51497041/article/details/126268279