> 文章列表 > 【Java】SpringCloud2020 spring-cloud-gateway 使用

【Java】SpringCloud2020 spring-cloud-gateway 使用

【Java】SpringCloud2020 spring-cloud-gateway 使用

springCloudGateway使用

  • 核心概念
  • 快速开始
    • 2.1 环境搭建
    • 2.2 集成nacos
      • 一般集成
      • 简写
  • Reactor Netty 访问日志
  • 跨域配置

核心概念

  • 路由(route)
    路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。
  • 断言(predicates)
    Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。
  • 过滤器(Filter)
    SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。

快速开始

2.1 环境搭建

引入依赖

  <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

编写配置

server:port: 8088
spring:application:name: api-gatewaycloud:# gateway配置gateway:routes:- id: unify_route # 路由的唯一标识uri: http://localhost:8020 # 需要转发的地址# 断言规则predicates:- Path=/unify-service/filters:- StripPrefix=1

服务地址: http://localhost:8020/order/get
网关地址: http://localhost:8088/unify-service/order/get/
断言的意思就是匹配到了就进行转发
此处过滤器的意思是,转发的时候去掉一层 即去掉了 /unify-service
过滤器中还可以做一些其他操作,比如添加请求头,设置cookies等等

2.2 集成nacos

父pom文件导入依赖管理

<dependencyManagement><dependencies><!-- spring boot 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.4</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.2</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2020.0.RC1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

gateway服务导入依赖

<!--服务注册-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入loadbalancer springcloud.2020 剔除了ribbon 所以需要导入,不导入则会报503错误 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

一般集成

编写配置文件

server:port: 8888spring:application:name: api‐gatewaycloud:nacos:discovery:server‐addr: 127.0.0.1:8848gateway:routes:‐ id: product_routeuri: lb://service‐product # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略predicates:‐ Path=/product‐serve/filters:‐ StripPrefix=1

简写

去掉关于路由的配置,自动寻找服务,也就是按照服务名来进行断言
比如一个服务spring.application.name=order-service
那么通过网关访问这个服务地址就是: http:localhost:8888/order-service/

server:port: 8888
spring:application:name: api‐gatewaycloud:nacos:discovery:server‐addr: 127.0.0.1:8848gateway:discovery:locator:enabled: true

我们一般不这么进行配置:
因为这么配置,配置不够清晰,具体的访问路径还得去nacos上查看,且少了很多gateway的功能入断言工厂以及过滤器工厂

Reactor Netty 访问日志

要启用Reactor Netty访问日志,需要设置

# 它必须是 Java 系统属性,而不是 Spring Boot 属性。也就是在application.yaml中配置无效
-Dreactor.netty.http.server.accessLogEnabled=true

跨域配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;
import java.util.Collections;@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowedHeader("*");config.setAllowCredentials(true);config.setExposedHeaders(Collections.singletonList("Content-disposition"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());source.registerCorsConfiguration("/", config);return new CorsWebFilter(source);}
}