spring cloud gateway hello world(Finchley.RELEASE版本)

oyhk 学习笔记

spring cloud 最近发布了最新版本为 Finchley.RELEASE,Spring cloud ,今天来尝试一下最新版本的spring cloud gateway hello world。


api网关用处

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务

工作原理

spring cloud gateway 介绍(Finchley.RELEASE版本)

准备

  • jdk8 以上版本
  • maven3.3 以上版本
  • idea
  • git

拉去demo代码

git clone https://gitee.com/381895649/mkfree-sample.git

代码拉取后直接使用idea打开就可以了,目录结构如下

网关代理请求

  • 在项目spring-cloud-gateway-hello-world-api已提供简单的api接口,简单贴一下controller代码
import com.mkfree.sample.spring_cloud_gateway_hello_world_api.domain.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {

    private static Map<Integer, User> userMap = new HashMap<>();

    // 这里模拟存在用户
    static {
        userMap.put(1, new User(1, "oyhk"));
        userMap.put(2, new User(2, "路人甲"));
    }

    /**
     * 通过id获取用户
     * @param id
     * @return
     */
    @GetMapping(value = "/api/v1/user/findOne")
    public User findOneV1(int id) {
        return userMap.get(id);
    }
    /**
     * 通过id获取用户
     * @param id
     * @return
     */
    @GetMapping(value = "/api/v2/user/findOne")
    public User findOneV2(int id){
        return userMap.get(id);
    }
}

把spring-cloud-gateway-hello-world-api跑起来,访问 http://127.0.0.1:9011/api/v1/user/findOne?id=1 ,可以返回模拟用户id为1的数据。
blob.jpg

  • 通过网关代理请求
    自定义路由方式代理,贴一下配置文件方式代码 application.yml
# EMBEDDED SERVER CONFIGURATION (ServerProperties)
spring.application.name: gateway

server:
  port: 9000
  tomcat.uri-encoding: UTF-8

spring:
  cloud:
    gateway:
      routes:
        - id: api
          uri: http://127.0.0.1:9011 #转发代理服务
          predicates:
          - Path=/api/v1/** #以 /api/v1 前缀

ok,以上就已经完成通过网关转发请求,在浏览器分别输入
http://127.0.0.1:9011/api/v1/user/findOne?id=1
http://127.0.0.1:9000/api/v1/user/findOne?id=1
blob.jpg
当以上请求能正常返回数据,那么网关最简单的hello world已经成功了!

  • Fluent Java Routes API 方式,贴一下具体代码
    这里我添加了/api/v2的版本,为了区分自定义路由方式和配置文件方式
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class BootstrapGateway {

    private static Logger log = LoggerFactory.getLogger(BootstrapGateway.class);

    public static void main(String[] args) {
        ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(BootstrapGateway.class, args);
        String[] strings = configurableApplicationContext.getBeanDefinitionNames();
    }


    /**
     * 自定义路由方式
     *
     * @param builder
     * @return
     */
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                // 路由为/api/v2 前缀的转发到 127.0.0.1:9000
                .route(r -> r.path("/api/v2/**").uri("http://127.0.0.1:9011"))
                .build();
    }
}

下面尝试一下访问
http://127.0.0.1:9011/api/v2/user/findOne?id=2
http://127.0.0.1:9000/api/v2/user/findOne?id=2
返回的数据一样就成功通过网关代理。
blob.jpg

原文链接:spring cloud gateway hello world(Finchley.RELEASE版本)

spring cloud gateway 介绍(Finchley.RELEASE版本)

oyhk 学习笔记

spring cloud gateway介绍

Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,弹性,和限流等。
spring cloud gateway 官方网站

Spring Cloud Gateway 特征

  • Java 8
  • Spring Framework 5
  • Spring Boot 2
  • 动态路由
  • 内置到Spring Handler映射中的路由匹配
  • 基于HTTP请求的路由匹配 (Path, Method, Header, Host, etc…​)
  • 过滤器作用于匹配的路由
  • 过滤器可以修改下游HTTP请求和HTTP响应 (Add/Remove Headers, Add/Remove Parameters, Rewrite Path, Set Path, Hystrix, etc…​)
  • 通过API或配置驱动
  • 支持Spring Cloud DiscoveryClient配置路由,与服务发现与注册配合使用

spring cloud Gateway 工作流程


客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

vs Netflix Zuul

Zuul基于servlet 2.5(使用3.x),使用阻塞API。 它不支持任何长连接,如websockets。而Gateway建立在Spring Framework 5,Project Reactor和Spring Boot 2之上,使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的开发体验。

原文链接:spring cloud gateway 介绍(Finchley.RELEASE版本)