热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud教程第十弹第二代网关springcloudgateway

更多Spring与微服务相关的教程请戳这里Spring与微服务教程合集1、核心概念1.1、路由route路由是网关最基础的部分。路由信息由一个ID、一个目的url、一组断言工厂

更多Spring与微服务相关的教程请戳这里 Spring与微服务教程合集


1、核心概念

1.1、路由route

路由是网关最基础的部分。路由信息由一个ID、一个目的url、一组断言工厂和一组Filter组成。如果路由断言为真,则说明请求的url和配置的路由匹配。


1.2、断言predicate

Java8中的断言函数。spring cloud gateway中的断言函数输入类型是spring5.0框架中的ServerWebExchange。spring cloud gateway中的断言函数允许开发者去定义来自于Http Request中的任何信息,比如请求头和参数等。


1.3、过滤器filter

一个标准的spring webfilter。spring cloud gateway中的filter分为两种类型:分别是gateway filter和global filter


2、工作原理

  1. gateway客户端向gateway发起请求
  2. 请求首先被HttpWebHandlerAdapter进行提取组装成网关的上下文
  3. 然后网关上下文会传递到DispatcherHandler
  4. DispatcherHandler是所有请求的分发处理器,主要负责分发请求对应的处理器。比如将请求分发到对应的RoutePredicate-HandlerMapping(路由断言处理映射器)
  5. 路由断言处理映射器主要用于路由的查找,以及找到路由后返回对应的FilterWebHandler
  6. FilterWebHandler主要负责组装Filter链表并调用Filter执行一系列的Filter处理,然后把请求转到后端对应的代理服务处理
  7. 处理完毕后,将response返回给gateway客户端

注意:

  • 过滤器分为Pre和Post,分别在转发请求之前处理和接收到代理服务返回的结果之后处理
  • 在配置路由时,如果不指定端口,则http默认端口为80,https默认端口为443
  • gateway目前只支持netty容器

2、路由断言和过滤

2.1、概述

路由断言:

  • Path路由断言工厂
  • Before路由断言工厂
  • Between断言工厂
  • COOKIE路由断言工厂
  • Header路由断言工厂
  • Host路由断言工厂
  • Method路由断言工厂
  • Query路由断言工厂
  • RemoteAddr路由断言工厂

路由过滤:

spring cloud gateway内置了很多的路由过滤工厂,也可以根据需要自定义路由过滤工厂

路由过滤器允许以某种方式修改request或response


2.2、基于yml配置

spring:cloud:gateway:routes:- id: findAlluri: http://localhost:8130predicates:- Path=/findAll- id: findOneuri: http://localhost:8130predicates:- Path=/findOne

2.3、基于JavaConfig配置

import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.GatewayFilterSpec;
import org.springframework.cloud.gateway.route.builder.PredicateSpec;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.cloud.gateway.route.builder.UriSpec;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.function.Function;@Configuration
public class GatewayRouteConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder){ZonedDateTime dateTime = ZonedDateTime.of(2020, 10, 17, 22, 40, 0, 0, ZoneId.systemDefault());return builder.routes()//普通path断言.route(r->r.path("/getStudentName").filters(new Function() {@Overridepublic UriSpec apply(GatewayFilterSpec gatewayFilterSpec) {return gatewayFilterSpec.addRequestHeader("stuName", "bobo");}}).uri("http://localhost:8130").id("getStudentName"))//after断言+path断言.route(new Function() {@Overridepublic Route.AsyncBuilder apply(PredicateSpec predicateSpec) {predicateSpec.path("/listStudent").and().after(dateTime);Route.AsyncBuilder asyncBuilder = predicateSpec.uri("http://localhost:8130");asyncBuilder.id("listStudent");return asyncBuilder;}})//path通配符断言.route(r->r.path("/student/**").uri("http://localhost:8130").id("student")).build();}
}

3、gateway集成eureka服务注册中心

3.1、pom.xml

注意springboot和springcloud的版本,如果是其它版本,启动项目的时候可能会报错

org.springframework.bootspring-boot-starter-parent2.2.6.RELEASE 1.8Hoxton.SR4org.springframework.cloudspring-cloud-starter-gatewayorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-actuatororg.springframework.cloudspring-cloud-starter-netflix-eureka-clientorg.springframeworkspring-expressionorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimport

3.2、application.yml关键配置

spring:cloud:gateway:discovery:locator:#与服务注册中心集成enabled: true#因为eureka的serviceId默认是大写,设为true之后,在gateway中可以用小写的serviceId进行路由转发lowerCaseServiceId: true
eureka:client:service-url:defaultZone: http://localhost:8000/eureka/register-with-eureka: true

3.3、自动路由匹配

gateway与eureka集成后,即使不配置路由,也会进行自动路由匹配

比如在eureka上注册了一个服务提供者service-a,service-a的上下文是/service-a,端口是8080,且暴露了一个接口,路径为/student/getName

gateway的端口是9000,则访问http://localhost:9000/service-a/service-a/student/getName,可自动匹配到service-a

通过gateway的日志可以看到,自动路由的信息如下:

Route{id='ReactiveCompositeDiscoveryClient_SERVICE-A', uri=lb://SERVICE-A, order=0, predicate=Paths: [/service-a/**], \
其中,lb表示该uri从注册中心查找


4、Filter

4.1、概述

spring cloud gateway的Filter实际上分两种:

  • GatewayFilter:应用到单个路由或一组路由,前面讲的路由过滤器工厂就是GatewayFilter
  • GlobalFilter:应用到所有的路由

4.2、自定义GatewayFilter

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.List;
import java.util.Map;
import java.util.Set;public class PrintHeaderGatewayFilter implements GatewayFilter {@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("执行PrintHeaderFilter");ServerHttpRequest request = exchange.getRequest();HttpHeaders headers = request.getHeaders();Set>> entries = headers.entrySet();for (Map.Entry> entry : entries) {System.out.println(entry.getKey()+"----"+entry.getValue());}return chain.filter(exchange);}
}

4.3、自定义GlobalFilter

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.List;@Component
public class TokenGlobalFilter implements GlobalFilter {@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {MultiValueMap queryParams =exchange.getRequest().getQueryParams();List list = queryParams.get("token");if(CollectionUtils.isEmpty(list)){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}
}

4.4、自定义GatewayFilterFactory

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.List;@Component
public class PrintParamGatewayFilterFactory extends AbstractGatewayFilterFactory{@Overridepublic GatewayFilter apply(Config config) {return new GatewayFilter() {@Overridepublic Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {String url = exchange.getRequest().getURI().getPath();if (!config.getIgnoreUrl().contains(url)){MultiValueMap queryParams = exchange.getRequest().getQueryParams();for (String s : queryParams.keySet()) {System.out.println(s+"----"+queryParams.get(s));}}return chain.filter(exchange);}};}public PrintParamGatewayFilterFactory(){super(Config.class);}/*** 自定义config类,能读取到yml中的配置*/public static class Config{private List ignoreUrl;public List getIgnoreUrl() {return ignoreUrl;}public void setIgnoreUrl(List ignoreUrl) {this.ignoreUrl = ignoreUrl;}}}

spring:cloud:gateway:routes:- id: methodGetorder: -100uri: http://localhost:8130predicates:- Method=GETfilters:- name: PrintParam # 如果类名为 ???GatewayFilterFactory,则过滤器名为???args:ignoreUrl:- /findAll- /findOne


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
author-avatar
罗然8_907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有