SpringCloud:Gateway服务网关

文章目录

Gateway服务网关

网关(Gateway)是将两个使用不同协议的网络段连接在一起的设备。

网关的作用就是对两个网络段中的使用不同传输协议的数据进行互相的翻译转换。

快速入门

  1. 创建服务
  1. 导入依赖
xml 复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery
            </artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>
  1. 编写启动类
java 复制代码
package com.lhs;

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

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args){
        SpringApplication.run(GatewayApplication.class,args);
    }
}
  1. 添加配置
yml 复制代码
server:
  port: 10010   # 网关端口
spring:
  application:
    name: gateway   # 服务的名称
  cloud:
    nacos:
      server-addr: localhost:8848   # nacos的地址
    gateway:
      routes:   # 网关路由配置
        - id: user-service   # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice   # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates:   # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/**   # 这个是按照路径匹配,只要以/user/开头就符合要求

断言工厂

Route Predicate Factories :: Spring Cloud Gateway

默认过滤器

对所有路径都生效

yml 复制代码
server:
  port: 10010 # 网关端口
spring:
  application:
    name: gateway # 服务的名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos的地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
      default-filters: 
        - AddRequestHeader=name,lhs  # 默认过滤器

自定义过滤器

全局过滤器的作用也是处理一切进入网关的请求和微服务相应,与网关过滤器的作用一样,区别在于网关过滤器通过配置定义,处理逻辑是固定的。而全局过滤器的逻辑需要自己写代码实现。定义方式是实现GlobalFilter接口。

代码实现:7

java 复制代码
@Order(-1)  // 设置优先级,数字越小优先级越高
@Component
public class AuthorizeFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求
        ServerHttpRequest request = exchange.getRequest();
        // 获取请求参数
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        // 获取授权信息
        String authorization = queryParams.getFirst("authorization");
        // 判断是否为管理员
        if("admin".equals(authorization)){
            // 如果是管理员,则继续执行过滤器
            return chain.filter(exchange);
        }
        // 如果不是管理员,则返回未授权
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 拦截请求
        return exchange.getResponse().setComplete();
    }
}

过滤器执行顺序

  • 每个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
  • 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增
  • 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter 的顺序执行

跨域问题处理

浏览器禁止请求的发起者与服务端发生跨域ajax请求

yml 复制代码
spring:
  application:
    name: gateway # 服务的名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos的地址
    gateway:
      routes: # 网关路由配置
        - id: user-service # 路由id,自定义,只要唯一即可
          # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
          uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
      default-filters:
        - AddRequestHeader=name,lhs
      globalcors: # 全局的跨域配置
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
          # options请求 就是一种询问服务器是否浏览器可以跨域的请求
        # 如果每次跨域都有询问服务器是否浏览器可以跨域对性能也是损耗
        # 可以配置本次跨域检测的有效期maxAge
        # 在maxAge设置的时间范围内,不去询问,统统允许跨域
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求 
              - "http://localhost:8090"
            allowedMethods: # 允许的跨域ajax的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*"    # 允许在请求中携带的头信息
            allowCredentials: true    # 允许在请求中携带cookie
            maxAge: 360000            # 本次跨域检测的有效期(单位毫秒)
            # 有效期内,跨域请求不会一直发option请求去增大服务器压力
相关推荐
张国荣家的弟弟17 分钟前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S28 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos35 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊1 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全1 小时前
Java的基础概念(一)
java·开发语言·python
liwulin05061 小时前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc1 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
qxlxi1 小时前
【Spring事务】深入浅出Spring事务从原理到源码
spring
Yuan_o_1 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言