从0到1构建微服务之服务网关-gateway(四)

文章推荐
从0到1构建微服务之基础工程创建(一)
从0到1构建微服务之服务注册-nacos(二)
从0到1构建微服务之服务通信-feign(三)

简介

前面的章节已经提前将gateway名字的工程服务创建好了,只是没引入gateway组件依赖,本章节主要引入gateway依赖,添加相应的配置并能完成服务的转发。另外会着重介绍相关配置的使用方式。

注:目前所有的代码构建肯定不是最优的,比如版本依赖的版本号抽取管理等等,后续都会一步一步去做。

1、Gateway功能简介

Gateway是网关组件,后期规划所有的服务都需要经过网关。其主要的功能有请求路由转发、权限控制以及流量限制等
在这里插入图片描述

2、pom添加gateway依赖

		<dependency>
            <!--gateway网关-->
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>3.0.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

3、application.yml新增配置

server:
  port: 8003

spring:
  main:
    web-application-type: reactive
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: share-dev
    gateway:
      enabled: true
      routes:
        - id: adminbiz-server
          uri: lb://adminbiz-server
#          uri: http://127.0.0.1:8001
          predicates:
            - Path=/adminbiz/**
        - id: user-server
          uri: lb://user-server
#          uri: http://127.0.0.1:8002
          predicates:
            - Path=/user/**
      globalcors: # 全局的跨域处理
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" # 允许在请求中携带的头信息
            allowCredentials: true # 是否允许携带cookie
            maxAge: 360000 # 这次跨域检测的有效期

4、启动服务测试结果

将gateway重新启动,访问localhost:8003/biz/test/testFeign,结果是能正常访问的,和直接访问8001端口是没区别的。到此为止,我们gateway的转发服务路由功能暂时实现了。

biz服务8001
user服务8002
gateway服务8003

5、过滤器介绍

在这里插入图片描述

(1)默认过滤器

默认过滤器是网关提供了过滤器工厂,将其设置到路由默认项,对经过网关的请求都进行过滤。
如下yaml配置文件举例,添加default-filters项


spring:
  main:
    web-application-type: reactive
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: share-dev
    gateway:
      enabled: true
      routes:
        - id: adminbiz-server
          uri: lb://adminbiz-server
#          uri: http://127.0.0.1:8001
          predicates:
            - Path=/adminbiz/**
        - id: user-server
          uri: lb://user-server
#          uri: http://127.0.0.1:8002
          predicates:
            - Path=/user/**
      default-filters: # 默认过滤项
        - AddRequestHeader=Truth, share! 

(2)路由过滤器

路由过滤器和默认过滤器差不多,都是采用网关的提供的过滤器工厂,区别在于路由过滤器配置在对应的路由下,只对该路由请求生效。如下yaml配置文件举例,给biz-server添加filters项


spring:
  main:
    web-application-type: reactive
  application:
    name: gateway-server
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: share-dev
    gateway:
      enabled: true
      routes:
        - id: adminbiz-server
          uri: lb://adminbiz-server
#          uri: http://127.0.0.1:8001
          predicates:
            - Path=/adminbiz/**
          filters:
            - AddRequestHeader=Truth, share!
        - id: user-server
          uri: lb://user-server
#          uri: http://127.0.0.1:8002
          predicates:
            - Path=/user/**

(3)全局过滤器

如果我们需要自己定义一些处理逻辑,如授权认证等,依靠前面两种过滤器是无法实现的,此时我们就需要用到全局过滤器。定义方式是实现GlobalFilter接口。下面举例代码说明

另外,如果配置了多个全局过滤器,可以用注解@order来定义过滤链中的执行先后顺序,order越小那么执行的越靠前


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

@order(1)
@Component
public class AuthFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.获取auth参数
        String auth = params.getFirst("auth");
        // 3.校验
        if ("success".equals(auth)) {
            // 放行
            return chain.filter(exchange);
        }
        // 4.拦截
        // 4.1.禁止访问,设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        // 4.2.结束处理
        return exchange.getResponse().setComplete();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值