码迷,mamicode.com
首页 > 编程语言 > 详细

SpringCloud(Greenwich版)新一代API网关Gateway

时间:2020-03-13 18:45:41      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:net   tab   splay   b2b   注解   使用   访问   发送   http   

一、Gateway简介

  Gateway 是在 Spring 生态系统之上构建的API网关服务,基于 Spring 5,Spring Boot 2 和 Project Reactor 等技术。Spring Cloud Gateway 旨在提供一种简单而有效的方法来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。

一句话概括:Spring Cloud Gateway 使用的 Webflux 中的 reactor-netty 响应式编程组件,底层使用了 Netty 通信框架。

Spring Cloud GateWay 具有如下特性:

  • 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0 进行构建;

  • 动态路由:能够匹配任何请求属性;

  • 可以对路由指定 Predicate (断言) 和 Filter (过滤器);

  • 集成 Hystrix 的断路器功能;

  • 集成 Spring Cloud 服务发现功能;

  • 易于编写的 Predicate (断言) 和 Filter (过滤器);

  • 请求限流功能;

  • 支持路径重写。

 

二、核心概念

  • Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。

  • Predicate(断言):参考的是 Java8 的 java.util.function.Predicate (函数式编程) 开发人员可以匹配 HTTP 请求中的所有内容 (例如请求头和请求参数),如果请求与断言相匹配则进行路由。

  • Filter(过滤器):指的是 Spring 框架中 GatewayFilter 的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

 

三、工作流程

  下图从总体上概述了 Spring Cloud Gateway 的工作方式:

技术图片

 

  客户端向 Spring Cloud Gateway 发出请求。然后 Gateway Handler Mapping (处理映射) 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,之后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前 ("pre") 或之后 ("post") 执行业务逻辑。Filter 在 "pre" 类型的过滤器可以做参数效验、权限效验、流量监控、日志输出和协议转换等,Filter 在 "post" 类型的过滤器中可以做响应内容、响应头的修改、日志的输出和流量监控等有着非常重要的作用。核心逻辑:路由转发 + 执行过滤器链。

 

四、路由与断言配置

1)创建gradle模块api-gateway并添加如下依赖, Gateway 是使用 netty+webflux 实现因此不需要再引入 web 模块

技术图片
dependencies {
   compile group: ‘org.springframework.cloud‘, name: ‘spring-cloud-starter-netflix-eureka-client‘, version: ‘2.1.5.RELEASE‘

   compile group: ‘org.springframework.cloud‘, name: ‘spring-cloud-starter-gateway‘
}
View Code

2)在启动类上添加@EnableDiscoveryClient注解,需要被注册中心发现

技术图片
package org.wesson.springcloud.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}
View Code

3)第一种方式,使用application.yaml配置文件进行网关的路由配置

技术图片
server:
  port: 5001
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: provider-route #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8081 #匹配后提供服务的路由地址
          predicates:
            - Path=/client/info/** #断言,路径相匹配的进行路由
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8761/eureka/
View Code

4)第二种方式,使用 Java 编码的方式进行网关的路由配置

技术图片
package org.wesson.springcloud.gateway.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();

        routes.route("provider-service", r -> r.path("/guonei").uri("https://news.baidu.com/guonei")).build();

        return routes.build();
    }

}
View Code

需要在配置类注入RouteLocator的Bean,配置了一个id为provider-service的路由规则, 访问地址http://localhost:5001/guonei时会自动转发到此地址:http://news.baidu.com/guonei

5)测试

Step1:运行 eureka-server 启动类,端口为8761

Step2:运行 provider-service 启动类,端口为8081

Step3:运行 api-gateway 启动类,端口为5001

Step4:访问http://localhost:8761/,注册到的服务如下图:

技术图片

Step5:访问添加网关之前路径:http://localhost:8081/client/info,直接获得返回结果:

  • hello, service provider port is from:8081

Step6:访问添加网关之后路径:http://localhost:5001/client/info,可以成功通过5001转发到8081返回数据:

  • hello, service provider port is from:8081

路由转发规则有点类似于按照上面的配置,慢慢得淡化真实访问地址以及端口号。

SpringCloud(Greenwich版)新一代API网关Gateway

标签:net   tab   splay   b2b   注解   使用   访问   发送   http   

原文地址:https://www.cnblogs.com/wessonshin/p/12488031.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!