【深入解析spring cloud gateway】05 gateway请求转发实验

一、环境准备

三个工程:

eureka-server

eureka-client

gateway

实验目的:通过网关访问对应的微服务:eureka-client。gateway和eureka-client注册到eureka-server上

二、eureka-server和eureka-client准备

eureka-server略

eureka-client

application.yml

yaml 复制代码
eureka:
    client:
        serviceUrl:
            defaultZone: http://localhost:8761/eureka/
server:
    port: 8081
spring:
    application:
        name: hello-service

提供一个接口

java 复制代码
@RestController
@Slf4j
public class HelloController {
  @RequestMapping("/hello")
  public String hello() {
    return "hello"
  }
}

三、gateway配置

pom.xml

xml 复制代码
 <dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

application.yml

yaml 复制代码
server:
  port: 8080
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
    instance:
      instance-id: gateway
      prefer-ip-address: true
---
spring:
  application:
    name: gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启自动路由功能,根据服务名称自动创建routes
          lower-case-service-id: true #识别小写服务名

定义一个filter用于去掉路径中的/gateway

java 复制代码
@Configuration(proxyBeanMethods = false)
public class FilterConfig {
    @Bean    public RemovePathFilter removePathFilter() {
        return new RemovePathFilter();    }
}

自定义一个GlobalFilter,用于去掉路径/gateway/

java 复制代码
@Slf4j
public class RemovePathFilter implements GlobalFilter, Ordered {

    private static final String PREFIX = "/gateway/";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("删除api前缀");
        ServerHttpRequest req = exchange.getRequest();

        addOriginalRequestUrl(exchange, req.getURI());
        String path = req.getURI().getRawPath();
        if (path.contains(PREFIX)) {
            String newPath = path.replace(PREFIX, "/");
            req = req.mutate().path(newPath).build();
            exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, req.getURI());
        }
        return chain.filter(exchange.mutate().request(req).build());
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

请求示例

通过访问 http://localhost:8080/hello-service/gateway/hello网关地址,可以正确请求到eureka-client的接口

bash 复制代码
C:\Users\Administrator>curl -X GET http://localhost:8080/hello-service/gateway/hello
hello

四、总结

1、gateway通过服务发现,将请求/hello-service/gateway/hello转发到hello-service上

2、自定义一个GlobalFilter,用于去掉路径/gateway/路径
项目源码地址

相关推荐
孤狼程序员3 天前
【Spring Cloud 微服务】2.守护神网关Gateway
spring cloud·微服务·gateway
whz-emm5 天前
vLLM加载lora
gateway
青衫客366 天前
Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析
大模型·llm·gateway·httpx
PXM的算法星球11 天前
spring gateway配合nacos实现负载均衡
spring·gateway·负载均衡
1990_super12 天前
使用ceph-deploy安装和配置RADOS Gateway (RGW)并使用S3访问集群
ceph·gateway
北极糊的狐15 天前
接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议:
数据库·gateway
sg_knight16 天前
Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合
java·spring boot·网关·spring·spring cloud·微服务·gateway
放纵日放纵18 天前
微服务—Gateway
微服务·架构·gateway
你我约定有三18 天前
分布式微服务--GateWay(1)
java·开发语言·分布式·微服务·架构·gateway
毛小茛20 天前
Spring Cloud Gateway 实现登录校验:构建统一认证入口
springcloud