• SpringCloud-Gateway网关


    简介

    微服务架构中,一个系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端想要直接请求这些服务,就需要知道它们具体的地址信息,例如 IP 地址、端口号等。这时就需要用到GateWay服务网关。

    Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供跨领域关注点,例如:安全性,监控/指标和弹性。Spring Cloud Gateway 是基于 WebFlux 框架实现的,使用的是Reactor-Netty响应组件,而 WebFlux 框架底层则使用了高性能的 Reactor 模式通信框架 Netty。

    Spring Cloud Gateway 的目标是提供统一的路由方式且基于Filter链的方式提供了网关基本功能,例如:安全,监控/指标和限流。

    核心概念

    路由Route

    网关最基本的模块。它由一个 ID、一个目标 URI、一组断言(Predicate)和一组过滤器(Filter)组成。

    默认情况下,Spring Cloud Gateway 会根据服务注册中心中维护的服务列表,以服务名(spring.application.name)作为路径创建动态路由进行转发,从而实现动态路由功能。

    断言Predicate

    断言是路由转发的判断条件,可以通过 Predicate 对 HTTP 请求进行匹配,例如请求方式、请求路径、请求头、参数等,如果请求与断言匹配成功,则将请求转发到相应的服务。

    Spring Cloud Gateway 通过 Predicate 断言来实现 Route 路由的匹配规则。简单点说,Predicate 是路由转发的判断条件,请求只有满足了 Predicate 的条件,才会被转发到指定的服务上进行处理。

    过滤Filter

    过滤器,我们可以使用它对请求进行拦截和修改,还可以使用它对上文的响应进行再处理。

    通常情况下,出于安全方面的考虑,服务端提供的服务往往都会有一定的校验逻辑,例如用户登陆状态校验、签名校验等。

    在微服务架构中,系统由多个微服务组成,所有这些服务都需要这些校验逻辑,此时我们就可以将这些校验逻辑写到 Spring Cloud Gateway 的 Filter 过滤器中。

    搭建网关

    搭建spring cloud项目

    以consul为注册中心搭建spring cloud项目

    创建maven子模块,命名为cloud-gateway9527

    ①导入依赖

    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-consul-discoveryartifactId>
    9. dependency>
    10. dependencies>

    ②创建application.yml配置文件,设置路由router断言predicate参数

    1. server:
    2. port: 9527
    3. spring:
    4. application:
    5. name: cloud-gateway
    6. cloud:
    7. consul: #consul注册中心配置
    8. discovery:
    9. service-name: ${spring.application.name}
    10. hostname: localhost
    11. port: 8500
    12. gateway:
    13. discovery: #允许服务发现
    14. locator:
    15. enabled: true
    16. routes: #配置路由
    17. - id: cloud-provider-1 #路由id自定义,必须唯一
    18. uri: lb://cloud-provider #lb(负载均衡)://注册到注册中心的服务提供者的昵称
    19. predicates: #断言(相关内容:https://www.jianshu.com/p/966abedb7e57)
    20. - Path=/provider/** #访问路径匹配

    ③创建启动类

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

    ④创建GatewayLog类,简单实现过滤器filter功能(必须实现GlobalFilter, Ordered接口才能实现

    1. @Component
    2. public class GatewayLog implements GlobalFilter, Ordered {
    3. //过滤逻辑
    4. @Override
    5. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    6. MultiValueMap params = exchange.getRequest().getQueryParams();
    7. System.out.println(params);
    8. return chain.filter(exchange);
    9. }
    10. //加载优先级
    11. @Override
    12. public int getOrder() {
    13. return 0;
    14. }
    15. }

    测试

    ①启动注册中心

    ②依次启动provider8001,provider8002,provider8003

    ③启动gateway9527网关

    ④访问http://localhost:9527/provider/getUUID?num=1

     

     

     ⑤查看gateway9527控制台日志

     

  • 相关阅读:
    零基础学Python:Numpy用法
    MybatisPlus生成主键策略方法
    FFmpeg 命令:从入门到精通 | ffmpeg 命令转封装
    Centos7.9中使用Docker安装云崽机器人
    Go Gin中间件
    tcpdump 异常错误
    (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
    Jmeter 分布式压测,你的系统能否承受高负载?
    tailwind免费模版
    m分集2跳OFDM系统中基于功率分配和子载波配对算法的信道容量matlab仿真
  • 原文地址:https://blog.csdn.net/weixin_46899412/article/details/127615275