专栏名称: SpringForAll社区
「文艺版」Spring 的一切「接地气版」Spring For All 玩最纯粹的技术!做最专业的 Spring 民间组织~
目录
相关文章推荐
鲁中晨报  ·  四部门发文!紧急提醒! ·  14 小时前  
深圳特区报  ·  广东省省长给大家拜年啦! ·  19 小时前  
鲁中晨报  ·  刚刚,突破10亿! ·  19 小时前  
德州晚报  ·  明确了!春节期间德州严查酒驾! ·  昨天  
山东省交通运输厅  ·  滨州 | 助力企业“走出去” TIR实现零突破 ·  3 天前  
51好读  ›  专栏  ›  SpringForAll社区

Spring Cloud Gateway - 快速开始

SpringForAll社区  · 公众号  ·  · 2019-10-28 08:00

正文

点击上方☝SpringForAll社区,轻松关注!
及时获取有趣有料的技术文章

Spring Cloud Gateway 工作原理

客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则将其发送到网关 Web 处理程序,此处理程序运行特定的请求过滤器链。

过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求之前或之后执行逻辑。所有 "pre" 过滤器逻辑先执行,然后执行代理请求,代理请求完成后,执行 "post" 过滤器逻辑。

如何启动 Spring Cloud Gateway

1、新建 Maven 工程,添加相关依赖 pom.xml

xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0modelVersion>

<groupId>com.anoyigroupId>
<artifactId>core-gatewayartifactId>
<version>0.0.1-SNAPSHOTversion>

<name>core-gatewayname>
<description>gateway for miroservicedescription>

<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-gatewayartifactId>
<version>2.0.0.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>

<dependencies>

<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>

dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>

project>

2、添加启动类 Application.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;

@Configuration
@SpringBootApplication
public class Application {

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

}

3、启动 Application(和 Spring Boot 项目一样)

访问 http://localhost:8080/ 报错 404,同时日志输出:

2018-06-27 09:18:48.981  WARN 44156 --- [ctor-http-nio-2] .a.w.r.e.DefaultErrorWebExceptionHandler : 
Failed to handle request [GET http://localhost:8080/]: Response status 404

配置服务的路由:配置文件方式

假设本地启动了另外两个 Spring Boot 服务,分别是 服务A( http://localhost:8081 )、服务B( http://localhost:8082 ),下面通过 Spring Cloud Gateway 来路由到这两个服务。

1、在 resources 路径下添加配置文件 application.yml

spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://localhost:8081
predicates:
- Path=/a/**
filters:
- StripPrefix=1
- id: host_route
uri: http://localhost:8082
predicates:
- Path=/b/**
filters:
- StripPrefix=1
  • id:固定,不同 id 对应不同的功能,可参考 官方文档

  • uri:目标服务地址

  • predicates:路由条件

  • filters:过滤规则

2、重启 Gateway 服务

3、测试

访问 http://localhost:8080/a/ 路由到 服务A http://localhost:8081/

访问 http://localhost:8080/b/ 路由到 服务B http://localhost:8082/

其他地址,例如 http://localhost:8080/a/user/all 路由到 服务A http://localhost:8081/user/all

配置服务的路由:编码方式

实现如上服务路由,还可以通过编码的方式实现。

1、删除配置文件 application.yml

2、修改 Application.java, 添加自定义路由配置

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.factory.StripPrefixGatewayFilterFactory;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
StripPrefixGatewayFilterFactory.Config config = new StripPrefixGatewayFilterFactory.Config();
config.setParts(1);
return builder.routes()
.route("host_route", r -> r.path("/a/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8081"))
.route("host_route", r -> r.path("/b/**").filters(f -> f.stripPrefix(1)).uri("http://localhost:8082"))
.build();
}

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

}

其他功能

http://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html

官方提供了大量的路由规则,比如Time、Host、Header 等等,同时也提供了大量的过滤器,比如AddRequestHeader、AddRequestParameter、AddResponseHeader 等等。仅通过简单的配置即可实现功能强大的网关服务。

© 著作权归作者所有,转载或内容合作请联系作者



● APM工具寻找了一圈,发现SkyWalking才是我的真爱

● Spring Boot 注入外部配置到应用内部的静态变量

● 将 HTML 转化为 PDF新姿势

● Java 使用 UnixSocket 调用 Docker API

● Fastjson致命缺陷

● Service Mesh - gRPC 本地联调远程服务

● 使用 Thymeleaf 动态渲染 HTML

● Fastjson致命缺陷

● Spring Boot 2 集成log4j2日志框架

● Java面试通关要点汇总集之核心篇参考答案

● Java面试通关要点汇总集之框架篇参考答案

● Spring Security 实战干货:如何保护用户密码

● Spring Boot RabbitMQ - 优先级队列

推荐文章
鲁中晨报  ·  四部门发文!紧急提醒!
14 小时前
深圳特区报  ·  广东省省长给大家拜年啦!
19 小时前
鲁中晨报  ·  刚刚,突破10亿!
19 小时前
山东省交通运输厅  ·  滨州 | 助力企业“走出去” TIR实现零突破
3 天前
爆笑gif图  ·  这样抢劫就特么尴尬了。。。
7 年前
十点读书  ·  婚姻好不好,看这一刻就知道
7 年前