Spring Cloud Gateway使用

Spring Cloud Gateway是Spring Cloud的一个子项目,它是一个基于Spring Framework 5,Spring Boot 2和Project Reactor等技术的API网关,可以用于构建微服务架构中的网关服务。

使用步骤:

前置配置:配置Nacos注册中心(略)

Nacos用来管理微服务的注册与发现以及配置中心

1.创建SpringBoot项目(略)

2.添加依赖(SpringBoot基础依赖以及Nacos依赖略)


        
        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework
                    spring-webmvc
                
            
        

        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
            2.2.5.RELEASE
        
        
        
            org.springframework.boot
            spring-boot-starter-actuator
            2.2.5.RELEASE
        

        
        
            com.alibaba.cloud
            spring-cloud-alibaba-sentinel-gateway
            2.2.5.RELEASE
        
    

3.配置文件(bootstrap.yml)

server:
  port: 8100 #网关服务访问端口
spring:
  application:
    name: gateway #网关服务名称
  cloud:
    #配置中心
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      #路由的id,唯一,一个网关里面可以建多个路由
      #一个路由指向一个服务,起名字一般与服务相关
      routes:
        - id: producer_route
          uri: lb://producer #lb代表负载均衡,从nacos中获取微服务,使用负载均衡策略访问
          predicates:
            - Path=/producer-api/**  #使用断言:条件 判断url里面是否包含它
          filters:
            - StripPrefix=1 #过滤器

4.启动类

@SpringBootApplication
@EnableDiscoveryClient //服务注册与发现
public class GateWayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GateWayApplication.class,args);
    }
}

5.浏览器输入localhost:8100/producer-api/xxx,该路径下的资源都会经过网关处理

过滤器

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。

生命周期:

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的 HTTPHeader、收集统计信息和指标、将响应从微服务发送给客户端等。

根据 Filter 的作用范围可以分成两种:GatewayFilter 与 GlobalFilter。

GatewayFilter:应用到单个路由或者一个分组的路由上。

GlobalFilter:应用到所有的路由上。

其中局部过滤器一般用的比较少,这里只对全局过滤器进行介绍

全局过滤器配置

全局过滤器作用于所有路由, 无需配置。通过全局过滤器可以实现对权限的统一校验,安全性验证等功能。

GateWay内置了一些全局过滤器,它们都实现 GlobalFilter 和 Ordered 接口。有兴趣的读者可以自行查看 GlobalFilter 的实现类或浏览下文提供的官方文档获取详细信息。

这里我们主要演示自定义全局过滤器。比如:我们在接受请求时需要验证 token。

1.自定义全局过滤器类

@Component
public class LoginGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        List token = request.getHeaders().get("token");

        if(token!=null && token.size()>0 ){
            //token存在,继续从redis中获取token校验
            //校验通过,放行
            return chain.filter(exchange);

        }else{
            //token校验失败,返回错误信息
            //方式一:通过抛出异常,在全局异常处理中返回错误信息
            //方式二:正常返回

            //注意ServerHttpResponse包别导错了
            ServerHttpResponse response = exchange.getResponse();
            response.getHeaders().add("content-type","application/json");

            ResultObject result = new ResultObject(301, "token校验错误");
            String s = JSONObject.toJSONString(result);

            DataBuffer wrap = response.bufferFactory().wrap(s.getBytes());
            return response.writeWith(Flux.just(wrap));
        }
    }

    @Override
    public int getOrder() {
        //过滤器执行顺序,值越小越优先
        return 0;
    }
}

只需要添加这个配置类就完成了全局过滤器的配置

在全局过滤器中还可以统一处理跨域问题:

注意:配置了GateWay跨域之后需要把SpringMVC的跨域关闭

@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        CorsConfiguration config=new CorsConfiguration();
        //config.addAllowedOrigin("*"); //-过时的
        //允许哪些域名访问
      config.addAllowedOriginPattern("*");
        //是否允许前端传递验证信息   cookie
        config.setAllowCredentials(true);
        //允许所有的方法  POST GET ...
        config.addAllowedMethod("*");
        //允许哪些请求头
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //设置允许哪些接口可以被跨域访问
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",config);

        return new CorsFilter(source);
    }
}

你可能感兴趣的:(spring,spring,boot,springcloud)