Spring Cloud Gateway 路由转发

简介

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用。
网关常见的功能有

  • 协议转换,路由转发
  • 流量聚合,对流量进行监控,日志输出
  • 可以在网关层做权限的判断
  • 限流,作为整个系统的前端工程,对流量进行控制
  • 作为系统的前端边界,外部流量只能通过网关才能访问系统
  • 缓存

如上图所示,客户端向Spring Cloud Gateway发出请求。 如果Gateway Handler Mapping确定请求与路由匹配(这个时候就用到predicate),则将其发送到Gateway web handler处理。 Gateway web handler处理请求时会经过一系列的过滤器链。 过滤器链被虚线划分的原因是过滤器链可以在发送代理请求之前或之后执行过滤逻辑。 先执行所有“pre”过滤器逻辑,然后进行代理请求。 在发出代理请求之后,收到代理服务的响应之后执行“post”过滤器逻辑。这跟zuul的处理过程很类似。在执行所有“pre”过滤器逻辑时,往往进行了鉴权、限流、日志输出等功能,以及请求头的更改、协议的转换;转发之后收到响应之后,会执行所有“post”过滤器的逻辑,在这里可以响应数据进行了修改,比如响应头、协议的转换等。

增新一个项目 分别是服务提供方provider,消费方comsumer,注册中心eureka,网关gateway

provider

@RequestMapping("/hello")
@RestController
public class HelloController {
    @GetMapping("")
    public String hello(@RequestParam String name) {
        return "Hello, " + name + "!";
    }
}
复制代码

comsumer

使用Feign调用

@CommonsLog
@RequestMapping("/hello")
@RestController
public class HelloController {

    @Autowired
    HelloFeignService helloRemote;

    @GetMapping("/{name}")
    public String index(@PathVariable("name") String name)  {
        log.info("the name is " + name);
        return helloRemote.hello(name) + "\n" + new Date().toString();
    }
    
}
复制代码

增加 Hystrix 断路器

@FeignClient(name = "producer", fallback = HelloFeignProviderHystrix.class)
public interface HelloFeignService {

    /**
     * @param name
     * @return
     */
    @GetMapping("/hello/")
    String hello(@RequestParam(value = "name") String name);

}
复制代码

gateway

Spring Cloud gateway内置了很多校验条件谓语(predicate)来实现路由功能。
有两种方式配置,一种是配置文件application的方式,一种是代码配置

a.application配置:
spring:
  application:
    name: sc-gateway-server
  cloud:
    gateway:
      discovery:
        locator:
          # 是否可以通过其他服务的serviceId来转发到具体的服务实例。默认为false
          # 为true,自动创建路由,路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问
          enabled: true
      routes:
        - id: host_route
          uri: http://httpbin.org:80/get
          predicates:
            - Host=**.csdn.** # 请求域名携带csdn的,则转发
        - id: query_route
          uri: http://httpbin.org:80/get
          predicates:
            - Query=username, zzz* # 请求参数含有username,且值满足zzz开头的,则转发(对值的匹配可以省略)
        - id: header_route
          uri: http://httpbin.org:80/get
          predicates:
            - Header=request, \d+ # 如果请求头含有request,且为数字,则转发

复制代码
b.代码配置

gateway也提供了代码的方式配置,比如我们注释掉上面的application配置,然后建一个配置类

@Configuration
public class GateWayConfig {

  @Bean
  public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route(r -> r.path("/fluent/**")
                    .uri("http://httpbin.org:80/get"))
            .build();

  }

}
复制代码

在上面的代码中,我们使用了一个router,该router使用host去断言请求是否进入该路由,当请求的host有“/fluent/**”,都会进入该router,重定向到了“httpbin.org:80/get”。

Spring Cloud Gateway内置了许多Predict,这些Predict的源码在org.springframework.cloud.gateway.handler.predicate包中。

列举各种Predicate如下图:

启动项目

输入URL 可以看到转到了 comsumer 的地址返回了provider的内容

项目地址:github.com/codeyuyu/Sp…

推荐阅读

互联网公司面试必问的Redis题目

互联网公司面试必问的mysql题目(下)

学习Java进阶技术干货、实践分享,职位内推,一起聊聊理想。志同道合的朋友,欢迎你的加入。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Gateway是基于Spring Boot 2.x和Spring WebFlux实现的网关服务,提供统一的负载均衡和路由转发的功能。它支持多种路由方式,比如URL路径匹配、请求头匹配、请求参数匹配等等。 路由转发Spring Cloud Gateway的一个重要功能,可以通过路由转发把来自客户端的请求转发到指定的目标服务。路由转发的过程中,网关会根据预定义的路由规则来匹配请求,并选择合适的目标服务进行转发Spring Cloud Gateway路由规则可以通过配置文件或者编程方式进行定义。在配置文件中,可以使用YAML或者Properties格式来定义路由规则。下面是一个YAML格式的路由规则示例: ``` spring: cloud: gateway: routes: - id: my_route uri: http://localhost:8080 predicates: - Path=/my_service/** ``` 这个示例定义了一个名为my_route的路由规则,它会把以/my_service开头的请求转发到http://localhost:8080。 除了Path,Spring Cloud Gateway还支持其他各种路由方式,比如Header、Cookie、Method、Query等等。你可以根据自己的需求选择合适的路由方式。 在路由转发过程中,Spring Cloud Gateway还可以实现负载均衡的功能。它可以根据定义的负载均衡策略来选择合适的目标服务。目前Spring Cloud Gateway支持的负载均衡策略有Round Robin、Weighted Response Time等等。 总之,Spring Cloud Gateway是一个非常强大的网关服务框架,它可以提供统一的负载均衡和路由转发的功能,并且支持多种路由方式和负载均衡策略。如果你的微服务架构需要一个可靠的网关服务,Spring Cloud Gateway是一个非常不错的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值