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 }

           

  • 相关阅读:
    easyui 单元格超出鼠标放上弹出全部
    EasyUI datagrid单元格文本超出显示省略号,鼠标移动到单元格显示文本
    easyui 回车搜索
    js控制easyui文本框例子及控制html例子
    Android错误---NoClassDefFoundError: org.ksoap2.transport.HttpTransportSE
    [Android错误]The literal 100000000000000 of type int is out of range
    Eclipse错误:Conversion to Dalvik format failed with error 1
    Android微信分享音乐加网络图片失败分析
    android.view.WindowManager$BadTokenException异常
    Android错误--Attempted to add application window with unknown token
  • 原文地址:https://www.cnblogs.com/luckysupermarket/p/13812531.html
Copyright © 2011-2022 走看看