【深入解析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/路径
项目源码地址

相关推荐
研究司马懿1 天前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
Java后端的Ai之路2 天前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
CodeCaptain2 天前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Dragon Wu3 天前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
七夜zippoe5 天前
分布式配置中心终极对决 Spring Cloud Config与Apollo架构深度解析
分布式·架构·springcloud·apollo·配置中心
研究司马懿6 天前
【云原生】Gateway API介绍
云原生·gateway
研究司马懿6 天前
【云原生】Gateway API路由、重定向、修饰符等关键操作
云原生·gateway
研究司马懿6 天前
【云原生】初识Gateway API
云原生·gateway
没有bug.的程序员7 天前
Spring Cloud Alibaba:Nacos 配置中心与服务发现的工业级深度实战
java·spring boot·nacos·服务发现·springcloud·配置中心·alibaba
七夜zippoe7 天前
API网关设计模式实战 Spring Cloud Gateway路由过滤限流深度解析
java·设计模式·gateway·路由·api网关