SpringCloud组件之Gateway微服务网关

学习SprinngCloud到了网关这一组件,照例简单记录下网关的作用

网关有以下几个作用:

  • 统一入口:未全部为服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性。
  • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求。
  • 动态路由:动态的将请求路由到不同的后端集群中。
  • 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射。

SpringCloud组件之Gateway微服务网关_第1张图片 

在1.x版本中都是采用Zuul网关。但是在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关代替Zuul,就是SpringCloud Gateway,Gateway就是原zuul1.x版的替代。

Spring Cloud Gateway 里明确的区分了 Router 和 Filter,并且一个很大的特点是内置了非常多的开箱即用功能,并且都可以通过 SpringBoot 配置或者手工编码链式调用来使用。

比如内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。

比如区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便。

接着开始实战,首先创建一个新的moudule,就叫gateway

SpringCloud组件之Gateway微服务网关_第2张图片

 然后引入依赖


        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

接着创建启动类

package com.wl.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author wl
 * @date 2022/3/7 16:34
 */
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("o(* ̄▽ ̄*)o启动成功!!!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄");
    }
}

然后对配置文件进行配置

server:
  port: 10010

spring:
  application:
    name: gateway
  cloud:
    gateway:
      # 网关路由配置
      routes:
        - id: user-service
          # lb表示负债均衡
          uri: lb://user-service
          # 断言
          predicates:
            # 按照路径匹配
            - Path=/user/**
          # 过滤器
          filters:
            - AddRequestHeader=topic, wl is a good man

其中predicates意为断言,配置Path=/user/**表示只有以/user开头的请求路径才会放行,否则拦截。除了可以按路径匹配,还可以设置按时间,比如Before=xx时间表示在xx时间前放行,After=xx时间表示在xx时间后放行,一共有11种选项可进行配置

SpringCloud组件之Gateway微服务网关_第3张图片

 filter过滤器则可以对请求和响应进行修改处理,此处配置为给user-service这个服务的请求头添加一段话。Spring Cloud Gateway 内置的过滤器工厂一览表如下:

 启动服务,访问10010端口,如图

SpringCloud组件之Gateway微服务网关_第4张图片

 除此以外,还有一个GlobalFilter可以作为全局的过滤器,这里同样参考黑马程序员视频写了个小例子,针对权限为admin的用户放行,否则拦截。

package com.wl.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author wl
 * @date 2022/3/7 17:00
 */
@Order(Ordered.HIGHEST_PRECEDENCE)
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap queryParams = request.getQueryParams();
        //2.获取请求参数中的authorization参数
        String authorize = queryParams.getFirst("authorization");
        //3.判断参数是否等于admin
        if ("admin".equals(authorize)) {
            //4.是,放行
            return chain.filter(exchange);
        }
        //5.1 设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        //5.2 拦截请求
        return exchange.getResponse().setComplete();
    }
}

重新启动,再次访问

SpringCloud组件之Gateway微服务网关_第5张图片

 显示401,在url后面加上?authorization=admin再次访问

SpringCloud组件之Gateway微服务网关_第6张图片

 另外,如果有多个过滤器,可以配置@Order注解里的数字来进行排序,数字越小,执行顺序越靠前。

你可能感兴趣的:(java,SpringCloud,spring,cloud,gateway,微服务)