最近做项目使用到了springcloude gateway作为网关,因此在此记录下springcloud gateway的入门操作,后续再将源码解读写出来,先立个flag。

回归正题,Springcloud gateway是spring 最新推出的网关中间件,用于代替 Netflix Zuul,因为 Netflix Zuul是基于mvc实现的,并发性能较低,springcloud gateway底层是通过基于netty的webflux实现的,并发性能比较好,因为比较适合高并发的网关。

一、依赖配置(pom文件配置)

配置property和dependencyManagement(用于声明版本,给pom的子类直接引用)

    <properties><!-- <spring-cloud.version>Greenwich.SR2</spring-cloud.version>--><spring-cloud.version>Hoxton.SR1</spring-cloud.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>0.9.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

添加依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><exclusions><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion></exclusions></dependency>

二、yml文件以及property文件的配置

1、bootstrap.yml文件(启动优先级最高)的配置

spring:application:#声明服务名称name: test-gateway-servicecloud:gateway:discovery:locator:#这里配置声明是否使用springcloud gateway的服务注册,false 代表不使用enabled: falsedefault-filters:#声明默认的filter为Hystrix- name: Hystrixargs:name : default#声明默认的回调接口fallbackUri: 'forward:/defaultFallback'#这里配置路由规则,可以通过配置文件配置,也可以通过写代码配置,#这里只展示通过配置文件配置的方式,往后展示通过代码配置的方式routes:- id: test1-inside-router#这里指定命中path中的路径的请求会跳转到test1-service的微服务中uri: lb://test1-servicepredicates:- Path=/justTest/**filters:- StripPrefix=1- id: test2-inside-router-  #这里指定命中path中的路径的请求会跳转到test2-service的微服务中uri: lb://test2-servicepredicates:- Path=/test/shop/**filters:#这里单独声明hystrix熔断服务配置
hystrix:command:default:execution:isolation:strategy: SEMAPHOREthread:timeoutInMilliseconds: 4000

至此,springboot集成springcloud gateway即完成

对于路由规则的配置,除了可以通过yml或者property文件配置之外,还可以通过代码的形式,代码的形式样例代码如下:

@Configuration
@Log4j2
public class FilterConfigration {@Beanpublic RouteLocator testOutSideRoute(RouteLocatorBuilder builder) {return builder.routes().route(r ->r.path("/justTest/**").filters(f -> f.filters(new CommonAuthFilter())).uri("lb://test1-service")).build();}@Beanpublic RouteLocator shopOutSideRoute(RouteLocatorBuilder builder) {return builder.routes().route(r ->r.path("test/shop/**").filters(f -> f.filters(new CommonAuthFilter())).uri("lb://test2-service")).build();}
}

至此,网关已经可以跑起来,并路由到相应的接口,但是,网关的作用并不是仅限于此,还可以做鉴权、给修改、增加请求的参数等等(暂时先不说限流、熔断的功能,后续会详聊),如果想拦截请求,并做相应的修改或者做日志记录等,springcloud gateway给我们开了口子,可以通过定义全局的filter或者自定义的filter来实现。

这里仅仅展示做简单的认证并记录请求的全局filter。


import com.alibaba.fastjson.JSON;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
@Log4j2
public class AuthAndLogFilter implements GlobalFilter, Ordered {@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest serverHttpRequest = exchange.getRequest();ServerHttpResponse serverHttpResponse = exchange.getResponse();log.info("==========网关收到请求:{}==========", serverHttpRequest.getPath());StringBuilder logBuilder = new StringBuilder();List<String> tokenList = serverHttpRequest.getHeaders().get("token");Map<String, Object> mapResult = new HashMap<>();String requestUrl = exchange.getRequest().getPath().toString();if (requestUrl.startsWith("/test/a/b/")) {log.info("白名单路径,无需校验token");} else {if (!CollectionUtils.isEmpty(tokenList)) {String token = tokenList.get(0);log.info("上送的token为:{}" , token);if (!redisTemplate.hasKey(token)) {log.info("登录超时,需要重新登录");mapResult.put("code", 500);mapResult.put("message", "登录超时,请重新登录");DataBuffer bodyDataBuffer = serverHttpResponse.bufferFactory().wrap(JSON.toJSONString(mapResult).getBytes());serverHttpResponse.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");return serverHttpResponse.writeWith(Mono.just(bodyDataBuffer));}} else {log.info("没有上送token");mapResult.put("code", 500);mapResult.put("message", "登录超时,请重新登录");DataBuffer bodyDataBuffer = serverHttpResponse.bufferFactory().wrap(JSON.toJSONString(mapResult).getBytes());serverHttpResponse.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");return serverHttpResponse.writeWith(Mono.just(bodyDataBuffer));}}return chain.filter(exchange);}@Overridepublic int getOrder() {/*** Get the order value of this object.* Higher values are interpreted as lower priority. As a consequence,* the object with the lowest value has the highest priority (somewhat* analogous to Servlet {@code load-on-startup} values).* Same order values will result in arbitrary sort positions for the* affected objects.* 这个值越大,优先级越低,也就是加载的顺序越往后*/return -20;}
}

到这里,gateway网关可以跑起来了,但是如果放到生产环境还元不行,主要是有两个地方需要改进:

1)、路由规则都是写死的,万一又接口改动或者新增或者删除,则需要停服,重新发布才能生效。

2)、这里没有使用服务发现中间件,不适合微服务环境

针对问题1,可以使用基于分布式配置平台,将路由规则配置到分布式配置中间件,要改路由规则,只需要修改分布式配置文件即可,无需重启服务,或者通过开发api接口,实现代码层级自动化动态修改路由规则。

针对问题2,可以使用springcloud gateway + nacos的组合来实现服务发现和分布式配置。

以上两点,下一篇文章再做详细在展开。

Springboot 集成Springcloud gateway的入门相关推荐

  1. SpringBoot集成beetl模板快速入门

    SpringBoot集成beetl模板快速入门 本文引导 SpringBoot集成beetl模板快速入门 创建SpringBoot工程(idea) 新建工程 修改maven本地仓库位置 配置Sprin ...

  2. SpringCloud Gateway 快速入门_01

    文章目录 一.网关模块搭建 1. 引入依赖 2. 配置 3. 启动类 二.产品服务模块搭建 2.1. 引入依赖 2.2. 配置 2.3. 控制层 2.4. 启动类 2.5. 启动产品模块 三.启动中间 ...

  3. springboot集成flowable简单实例入门

    此案例是demo.功能有创建流程.完成审批.生成流程图.适合有java基础的人员看. 第一步.画流程图 resources资源包下,新建processes包,新建一个文件,我命名他apply-rest ...

  4. 微服务网关:SpringCloud Gateway保姆级入门教程

    什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...

  5. 什么是微服务网关?SpringCloud Gateway保姆级入门教程

    什么是微服务网关 SpringCloud Gateway是Spring全家桶中一个比较新的项目,Spring社区是这么介绍它的: 该项目借助Spring WebFlux的能力,打造了一个API网关.旨 ...

  6. SpringCloud Gateway入门

    本文是介绍一下SpringCloud Gateway简单路由转发使用. SpringCloud Gateway简介 SpringCloud是基于Spring Framework 5,Project R ...

  7. springboot md5加密_SpringSecurity入门-SpringBoot集成SpringSecurity

    前言 至今Java能够如此的火爆Spring做出了很大的贡献,它的出现让Java程序的编写更为简单灵活,而Spring如今也形成了自己的生态圈,今天咱们探讨的是Spring旗下的一个款认证工具:Spr ...

  8. SpringCloud Gateway 集成 oauth2 实现统一认证授权_03

    文章目录 一.网关搭建 1. 引入依赖 2. 配置文件 3. 增加权限管理器 4. 自定义认证接口管理类 5. 增加网关层的安全配置 6. 搭建授权认证中心 二.搭建产品服务 2.1. 创建boot项 ...

  9. SpringBoot与SpringCloud集成

    SpringBoot与SpringCloud集成 : 简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册 ...

最新文章

  1. asp实现UNIX时间戳功能
  2. 利用simhash计算文本相似度
  3. i2s传输中左右声道数据格式
  4. Vue.js 对比其他框架
  5. 前后端分离模式下的权限设计方案
  6. C#医疗挂号系统试题
  7. 前端学习(2080):计算属性和methods得对比
  8. java简单创建图片面板_图像界面编程简单窗体创建
  9. WPF自定义控件 —— 布局
  10. Spring-IOC推导
  11. python stackless_Stackless Python的缺点是什么?
  12. HDOJ水题集合11:桶排序, 折半搜索
  13. 【Java6学习笔记】多线程编程中使用volatile保障原子性
  14. 零元学Expression Design 4 - Chapter 4 教你如何自制超炫笔刷
  15. 计量常用知识——自用备查
  16. AES对称加密原理及服务
  17. 在 Intel NUC8i7HVK 上安装CentOS7
  18. IOS开发之——音乐播放器-概述(01)
  19. 品牌笔记本预装windows的OEM分区解决方案(联想)
  20. One Mathematic Problem

热门文章

  1. 导出SAP表结构到EXCEl
  2. SAP配置webdynpro完全手册
  3. abap的子程序参数 USING 和 CHANGING 使用问题
  4. Data Remove 程序总结
  5. yytextview多种格式_Android 一个TextView字体设置多种不同颜色
  6. php5.5 mysql网站空间_PHP环境配置IIS5.0+PHP5.23+MYSQL5+phpMyAdmin
  7. 如何用python生成表格_用 Python 生成 HTML 表格
  8. php中如何比较数组和字符串,PHP中数组和字符串的相互转换-PHP数组和字符串互相转换方法-吾爱编程网...
  9. flash写保护原理_老司机带路:LPC82x 存储器及读写保护 手到擒来!
  10. Python函数的装饰器,两层装饰器和三层装饰器