SpringCloud框架中的GateWay组件

Gateway-概述

当我们使用微服务的时候,有时候我们不仅需要调用一个微服务,可能我们同时需要发送多个请求到多个服务器来完成一个请求。如果直接将我们微服务的ip暴露给用户,那么无疑是降低顾客的体验,而且如果面对一些服务ip更换,也会造成很多麻烦,通常这种时候,我们将这些多个请求都集成在一个服务器里面,这个就被称为网关。
网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务。并且一些与业务本身功能无关的公共逻辑可以在这里实现,诸如:认证,鉴权,监控,缓存,负载均衡等
常用的网关解决方案有:Nginx+Lua Netflix Zuul SpringCloud Gateway等等 ,我主要介绍的是基于springCloud框架的Gateway。
网关

Gateway-快速入门

网关也是一个独立的模块,需要单独注册到erueka里面。
1,引入依赖

<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>

编写启动类

package com.itheima.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient//注入到eureka中
public class ApiGatewayApp {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(ApiGatewayApp.class,args);
    }

}

编写配置文件

application.yml

server:
  port: 80

spring:
  application:
    name: api-gateway-server

  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则


      - id: gateway-provider
        uri: http://localhost:8001/  #路径,后面可以改为eureka中的名称,用来动态获取到ip
        #  uri: lb://gateway-provider
        predicates:
        - Path=/goods/**

Gateway-过滤器

Gateway支持过滤功能,对请求和相应进行拦截,完成一些通用操作,这里主要介绍两种过滤器:
GatewayFilter:局部过滤器,针对单个路由
GlobalFilter :全局过滤器,针对所有路由
局部过滤器直接修改配置文件。

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

测试配置

api-gateway-server application.yml

server:
  port: 80
spring:
  application:
    name: api-gateway-server
  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则
      # filters:配置局部过滤器的

      - id: gateway-provider
        # 静态路由
        # uri: http://localhost:8001/
        # 动态路由
        uri: lb://GATEWAY-PROVIDER
        predicates:
        - Path=/goods/**
        filters:
        - AddRequestParameter=username,zhangsan

gateway-provider模块中GoodsController中的findOne添加username参数

 public Goods findOne(@PathVariable("id") int id,String username){
    
    

        System.out.println(username);

        //如果id == 1 ,则出现异常,id != 1 则正常访问
        if(id == 1){
    
    
            //1.造个异常
            int i = 3/0;
        }

        /*try {
            //2. 休眠2秒
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        Goods goods = goodsService.findOne(id);

        goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
        return goods;
    }

** 全局过滤器只需要在gateway模块中添加过滤代码**

  • GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。
  • Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。
    MyFilter
package com.itheima.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class MyFilter implements GlobalFilter, Ordered {
    
    
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    

        System.out.println("自定义全局过滤器执行了~~~");

        return chain.filter(exchange);//放行
    }

    /**
     * 过滤器排序
     * @return 数值越小 越先执行
     */
    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34518487/article/details/109025775