zoukankan      html  css  js  c++  java
  • spring cloud 学习(Gateway)网关

    spring cloud  之 Gateway

    网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式

    在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户端可能通过调用N个微服务的接口完成一个用户请求

    存在的问题:

    1.  客户端多次请求不同的微服务,增加客户端的复杂性
    2. 认证复杂,每个服务都要进行认证
    3. http请求不同服务次数增加,性能不高

      网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等

     在目前的网关解决方案里,有Nginx+ Lua、Netflix Zuul 、Spring Cloud Gateway等等 

    1、Gateway的搭建

    • 注入依赖
      •  <dependencies>
                <!--引入gateway 网关-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-gateway</artifactId>
                </dependency>
                <!-- eureka-client -->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
                </dependency>
            </dependencies>

        注意:不能加 web这个文件,否则你会很开心,如果需要动态配置的话,需要添加eureka坐标

    • 启动类需要添加eureka注解
    • 编写配置类
      • 1.静态编写配置类
        • server:
            port: 80
          
          spring:
            application:
              name: api-gateway-server
          
            cloud:
              # 网关配置
              gateway:
                # 路由配置:转发规则
                routes: #集合。
                # id: 唯一标识。默认是一个UUID
                # uri: 转发路径
                # predicates: 条件,用于请求网关路径的匹配规则
                # filters:配置局部过滤器的
                - id: gateway-provider
                  # 静态路由
                  uri: http://localhost:8001/
                  predicates:
                  - Path=/goods/**
      • 动态编写配置  从Eureka中动态获取
          •  1 server:
             2   port: 80
             3 
             4 spring:
             5   application:
             6     name: api-gateway-server
             7 
             8   cloud:
             9     # 网关配置
            10     gateway:
            11       # 路由配置:转发规则
            12       routes: #集合。
            13       # id: 唯一标识。默认是一个UUID
            14       # uri: 转发路径
            15       # predicates: 条件,用于请求网关路径的匹配规则
            16       # filters:配置局部过滤器的
            17       - id: gateway-provider
            18         # 静态路由
            19         uri: http://localhost:8001/
            20         predicates:
            21         - Path=/goods/**
            22 eureka:
            23   instance:
            24     hostname: localhost
            25   client:
            26     service-url:
            27       defaultZone: http://eureka-server:10086/eureka

     微服务名称配置

    1 # 微服务名称配置
    2       discovery:
    3 
    4         locator:
    5 
    6           enabled: true # 设置为true 请求路径前可以添加微服务名称
    7           lower-case-service-id: true # 允许为小写

    解决服务过多可能存在的路径冲突问题

      http://localhost:10010/eureka-consumer/order/goods/1

    2、Gateway过滤器

     Gateway支持过滤器功能,对请求或者响应进行拦截

    Gateway 提供两种过滤器方式:“pre”和“post”

        pre 过滤器,在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等。

        post 过滤器,在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等。

      Gateway 还提供了两种类型过滤器

        GatewayFilter:局部过滤器,针对单个路由

        GlobalFilter :全局过滤器,针对所有路由

    局部过滤器配置方式:

     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 
    16       - id: gateway-provider
    17         # 静态路由
    18         # uri: http://localhost:8001/
    19         # 动态路由
    20         uri: lb://GATEWAY-PROVIDER
    21         predicates:
    22         - Path=/goods/**
    23         filters:
    24         - AddRequestParameter=username,zhangsan
    25 #该过滤器会在请求同上添加请求参数

    这个参数后端可以直接接受到

    全局过滤器配置

      定义类实现GlobalFilter和Ordered接口

      重写方法

      添加注解 ,注入ioc容器

     

     1 @Component
     2 public class MyFilter implements GlobalFilter, Ordered {
     3     @Override
     4     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
     5 
     6         System.out.println("自定义全局过滤器执行了~~~");
     7 
     8         return chain.filter(exchange);//放行
     9     }
    10 
    11     /**
    12      * 过滤器排序
    13      * @return 数值越小 越先执行
    14      */
    15     @Override
    16     public int getOrder() {
    17         return 0;
    18     }
    19 }

           

  • 相关阅读:
    焦虑:都说程序员是青春饭,那么程序员老了何去何从呢?
    数据库查询语句优化,mysql优化,join语句优化附带YYC松鼠短视频系统详细demo效果
    IT行业:为什么大部分人都不认可php语言呢?
    拇指赚点赞无加密源码发布分享仅供学习
    区块鼠区块养殖系统源码无加密源码发布分享仅供学习
    3月1日晚突遭大量攻击,网站/APP突然遭遇黑客攻击时该如何应对?
    ThinkPHP内核全行业小程序运营管理系统源码免费分享下载
    2020年不管打工还是创业,居然还有人相信读书无用论?
    在IT界,应聘企业去上班如果老板一点不懂技术那绝对是作茧自缚
    看了这篇文章你还不懂傅里叶变换,那我就真没办法呢!
  • 原文地址:https://www.cnblogs.com/luckysupermarket/p/13812531.html
Copyright © 2011-2022 走看看