【Java】SpringCloud2020 spring-cloud-gateway 使用

核心概念

  • 路由(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-gateway
  cloud:
    # 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: 8888

spring:
   application:
     name: api‐gateway
   cloud:
     nacos:
       discovery:
         server‐addr: 127.0.0.1:8848
   gateway:
     routes:
       ‐ id: product_route
         uri: 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‐gateway
  cloud:
    nacos:
      discovery:
        server‐addr: 127.0.0.1:8848
    gateway:
      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 {
    @Bean
    public 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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想禁用Spring Cloud Gateway中的Swagger资源,可以在Gateway中添加一个过滤器来实现。 首先,在你的Gateway应用程序中,你需要创建一个过滤器类。这个过滤器将使用Spring Cloud Gateway中的RouteLocator来查找Swagger资源,然后将它们过滤掉。下面是一个示例过滤器类: ```java @Component public class SwaggerResourceFilter implements GlobalFilter, Ordered { @Autowired private RouteLocator routeLocator; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String requestPath = request.getPath().toString(); // 获取所有的路由 List<Route> routes = routeLocator.getRoutes().collectList().block(); // 遍历路由,查找是否包含Swagger资源 for (Route route : routes) { String routePath = route.getUri().toString(); if (requestPath.startsWith(routePath) && route.getMetadata().containsKey("swagger")) { // 如果请求路径包含Swagger资源,直接返回 return Mono.empty(); } } // 如果请求路径不包含Swagger资源,继续执行过滤器链 return chain.filter(exchange); } @Override public int getOrder() { return -1; } } ``` 在这个过滤器类中,我们首先使用RouteLocator获取所有的路由,然后遍历这些路由,查找是否包含Swagger资源。如果请求路径包含Swagger资源,直接返回,否则继续执行过滤器链。 接下来,在你的Gateway配置文件中,添加以下代码来注册这个过滤器类: ```yaml spring: cloud: gateway: default-filters: - SwaggerResourceFilter ``` 这将会在Gateway启动时自动注册这个过滤器类。当你访问Swagger资源时,Gateway将会过滤掉这些资源,从而禁用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值