SpringCloud Gateway的使用

前言

在微服务架构中,不同的微服务可以有不同的网络地址,前端可以通过好几个地址访问不一样的服务,这样可能会出现每个服务都需要进行认证或者出现跨域请求等问题。 为了避免这些问题,微服务网关就在客户端和服务端之间增加了一个API网关,所有的外部请求先通过这个微服务网关,再由网关进行各个微服务的调用。

API网关就是所有微服务的一个统一入口,一句话说就是:
网关 = 路由转发 + 过滤器(编写额外功能)

gateway使用

应用场景

日常开发一个微服务,一般的网络请求是:协议+ip+端口+URL,例如有两个服务列表,需要访问admin服务:
在这里插入图片描述
直接访问是:
在这里插入图片描述
如果这个时候需要添加一个微服务,而且与admin服务端口和URL都不一样,那前端就需要单独访问这个服务的地址。如果加入API网关,前端就只需要跟网关进行交互,由网关进行各个微服务的调用。

简单路由转发

第一步 添加依赖

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

第二步 添加配置

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 是否从注册中心读取服务
          enabled: true
      routes:
          # 服务的ID,唯一即可一般与微服务的service name一致
        - id: cloud-admin
          # lb表示负载均衡
          uri: lb://cloud-admin
          predicates:
            # 路径匹配,所有admin的请求都转发到cloud-admin
            - Path=/test/**

注意:如果配置了locator.enabled = true,则表示从服务注册与发现组件(我这里使用的是nacos)中读取服务,网关会自动为每个注册的服务创建一个路由,就不需要手动配置每个服务的路由规则,如果你需要对某些特定的服务进行特殊处理,仍然可以在 routes 中手动配置这些服务的路由规则。

上面配置好后重启gateway服务,然后访问 “test/admin/student/1” 就可以成功转发到admin服务:
在这里插入图片描述

添加过滤器

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

@Component
public class previewFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("执行自定义的全局过滤器");
        String authorized= exchange.getRequest().getQueryParams().getFirst("Authorized");
        if(authorized== null) {
            System.out.println("认证失败");
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete(); //请求结束
        }
        return chain.filter(exchange); //如果存在,继续向下执行
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

重启后会访问 “test/admin/student/1” 失败:
在这里插入图片描述
后端日志:
在这里插入图片描述

总结

Spring Cloud Gateway 可以集成各种认证和授权机制,确保只有经过验证的请求才能访问后端服务,如:

  • OAuth2 和 JWT:集成 OAuth2 和 JWT 进行用户认证。
  • API 密钥:使用 API 密钥进行简单认证。
  • SSL/TLS:支持 HTTPS 和双向 SSL/TLS 证书认证。

Spring Cloud Gateway 内置了对 Ribbon 和 LoadBalancerClient 的支持,可以实现智能的负载均衡策略。

Spring Cloud Gateway是一个基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的API网关,它的作用是保护、增强和控制对于API服务的访问。 在使用Spring Cloud Gateway时,首先需要搭建网关项目。在网关项目的配置文件(application.yml)中,我们可以配置多个路由(routes),每个路由都有一个自定义的id和目标服务的URI。通过断言(predicates)来确定路由的条件,例如路径(path)。 例如,我们可以使用如下配置来创建一个路由到订单服务(Spring Cloud Order Service Provider)的路径"/order/**",并将请求转发到具体的订单服务实例。同样地,我们可以创建另一个路由到用户服务(Spring Cloud User Service Consumer)的路径"/user/**"。 除了路由配置,我们同样需要配置Eureka注册中心的地址,以便网关能够获取服务列表。可以通过配置eureka.client.service-url来指定Eureka Server的地址。 另外,我们还可以为网关配置多个profile,通过不同的端口启动不同的实例。例如可以配置两个profile(g1和g2),分别在8020和8021端口启动网关实例。 通过以上步骤,我们就可以成功使用Spring Cloud Gateway来管理和控制API服务的访问了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringCloudGateway使用篇](https://blog.youkuaiyun.com/yuanshangshenghuo/article/details/107101640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [SpringCloud gateway使用](https://blog.youkuaiyun.com/m0_37044584/article/details/115302516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值