之前我一直用的是Zuul网关,用过gateway以后感觉比Zuul功能还是强大很多。

Spring Cloud Gateway是基于Spring5.0,Spring Boot2.0和Project Reactor等技术开发的,用来为微服务架构提供一种简单有效统一的API路由管理方式。

相比Zuul,GateWay不仅仅提供统一的路由方式,还提供了例如:安全,限流,监控/指标,重试机制,熔断回调,过滤等功能,这些都是可配置的。

原理什么的就不多说了,可以看下官方文档

首先添加Maven依赖

<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 熔断器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!-- 限流 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--暴露各种指标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- zipkin-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

yml配置详情如下:

#连接Eureka配置
eureka:
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
server:
port: 8770
spring:
main:
banner-mode:
application:
name: dkjk-gateway-service #应用程序名
# redis:
# host: localhost
# port: 6379
cloud:
gateway:
routes:
- id: my-service-one #我们自定义的路由 ID,保持唯一
#目标服务地址,也可以是http://localhost:8182 PS: 当所用协议为lb时,
#gateway将使用 LoadBalancerClient把服务名通过eureka解析为实际的主机和端口,并进行负载均衡。
uri: lb://Eureka中的服务名称1
# order: 0
#路由规则,Predicate 接受一个输入参数,返回一个布尔值结果。
#该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
predicates:
# PS:以下规则可以组合使用
#接收一个匹配路径的参数来判断是否走路由。当访问地址 http://localhost:8770/spring-cloud时
#会自动转发到地址:http://www.ityouknow.com/spring-cloud
- Path=/em/**
#可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。可以用postman测试,如果符合规则进行路由,否则不进行路由(报404)
# - Method=GET
#请求时间在 2019年11月04日6点6分6秒之前可以进行路由,在这时间之后停止路由(报404)
# - Before=2019-11-04T06:06:06+08:00[Asia/Shanghai]
#请求时间在 2019年11月04日16点31分00秒之前不可以进行路由(报404),在这时间之后可以进行路由
# - After=2019-11-05T16:31:00+08:00[Asia/Shanghai]
#在这个时间段内可以匹配到此路由,超过这个时间段范围则不会进行匹配(报404)。可以用在限时抢购的一些场景中。
# - Between=2019-11-04T06:06:06+08:00[Asia/Shanghai], 2019-11-06T06:06:06+08:00[Asia/Shanghai]
#两个参数:1.请求头中属性名称2.正则表达式(也可以是固定值),可以用postman测试,如果符合规则进行路由,否则不进行路由(报404)
# - Header=apikey, \d+
#两个参数:1.Cookie name 值2.正则表达式(也可以是固定值),可以用postman测试,如果符合规则进行路由,否则不进行路由(报404)
# - Cookie=apikey, \d+
#只要请求中包含apikey属性的参数即可匹配路由。如果符合规则进行路由,否则不进行路由(报404)
# - Query=apikey
# - Host=**.ityouknow.com
#通过设置某个 ip 区间号段的请求才会路由,即符合这个网段的可以访问,例如:http://192.168.1.131:8770/
# - RemoteAddr=192.168.1.1/24
# 过滤规则
filters:
#截取路径的个数
- StripPrefix=1
#在URL路径前面添加一部分的前缀,例如:配置 - Path=/** , 请求路径为localhost:8770/idcard,
#会转变为localhost:8770/identity/idcard
# - PrefixPath=/identity
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback #如果服务调用异常会回调自定义的/fallback请求
- id: credit-service
uri: lb://Eureka中的服务名称2
predicates:
- Path=/credit/**
filters:
- StripPrefix=1
- name: Hystrix
args:
name: fallbackcmd
fallbackUri: forward:/fallback #如果服务调用异常会回调自定义的/fallback请求
- name: RequestRateLimiter #名称必须是 RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 2 #允许用户每秒处理多少个请求
redis-rate-limiter.burstCapacity: 3 #令牌桶的容量,允许在一秒钟内完成的最大请求数
key-resolver: "#{@userKeyResolver}" #使用 SpEL 按名称引用 bean
- name: Retry
args:
#重试次数,默认值是3次
retries: 3
series:
- SERVER_ERROR
#满足的status
statuses:
- BAD_GATEWAY
methods:
- GET
- POST
exceptions:
- java.io.IOException
- java.util.concurrent.TimeoutException
- java.lang.RuntimeException
#是否与服务注册于发现组件进行结合,通过 serviceId 转发到具体的服务实例。
#默认为 false,设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能。
#这个不用配置也可以
# discovery:
# locator:
# enabled: true
# hystrix 信号量隔离,30秒后自动超时
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 30000
logging:
level:
org.springframework.cloud.gateway: debug

以上配置启动类中用到的注解

package com.dkjk.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class DkjkGatewayServiceApplication { public static void main(String[] args) {
SpringApplication.run(DkjkGatewayServiceApplication.class, args);
} }

限流配置代码

package com.dkjk.gateway.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono; /**
* @Description:
* @Author: qjc
* @Date: 2019/11/6
*/
@Configuration
public class Config {
@Bean
KeyResolver userKeyResolver() {
// return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));//根据请求参数中的 user 字段来限流
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());//根据请求 IP 地址来限流
}
}

熔断回调代码:

package com.dkjk.gateway.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; /**
* @Description:
* @Author: qjc
* @Date: 2019/11/6
*/
@RestController
@Slf4j
public class FallbackController { @GetMapping("/fallback")
public String fallback() {
log.info("回调了");
return "Hello World!\nfrom gateway";
} }

springcloud中gateway的实际应用的更多相关文章

  1. Springcloud 中 SpringBoot 配置全集 (收藏版)

    Springcloud 中 SpringBoot 配置全集 (收藏版) 疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群 ...

  2. SpringCloud之Gateway

    一.为什么选择SpringCloud Gateway而不是Zuul? Gateway和Zuul的职责一样,都承担着请求分发,类似Nginx分发到后端服务器. 1.SpingCloud Gateway ...

  3. SpringCloud中eureka配置心跳和剔除下线的服务的时间

    在默认的springCloud中eureka注册中心在服务下线时表现的非常不灵敏,用惯了dubbo的zk注册中心表示很不习惯,eureka设计的本意是在服务不会频繁上下线和网络稳定的内网,这种设计在生 ...

  4. springcloud中servcie层调用fegin异常以及异步方法的实现

    近日在做业务上的短信推送和APP消息推送,通过调用别的模块的接口来实现,在springcloud中通过fegin进行调用.这里要说明的事情并不是如何开发推送功能,而是在调试过程中碰到的一些小问题.我把 ...

  5. 描述下什么是springcloud,springcloud中的组件有哪些?分别描述下它的原理?

    1.什么是springcloud,springcloud中的组件有哪些? Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的微服务:就是把 ...

  6. 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

    [SpringCloud]Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了. 获取请求参数RequestBod ...

  7. 非常全面的讲解SpringCloud中Zuul网关原理及其配置,看它就够了!

    Zuul是spring cloud中的微服务网关.网关:是一个网络整体系统中的前置门户入口.请求首先通过网关,进行路径的路由,定位到具体的服务节点上. Zuul是一个微服务网关,首先是一个微服务.也是 ...

  8. springCloud中的服务调用feign

    springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...

  9. springCloud中的注册中心Nacos

    springCloud中的注册中心Nacos 三个模块: 1.注册中心 2.服务提供者(生产者) 提供服务 3.服务消费者(消费者)调用服务 流程:消费者和生产者都要向注册中心注册,注册的是二者中服务 ...

随机推荐

  1. docker部署spring boot项目在服务器上

    IDE:idea 工具:docker spring boot:2.0.1 ======================================== 简单记录一下流程,以供参考: 第一步:首先得 ...

  2. ipa重签名最直接的教程

    ipa 包重签名最新最简单教程 重签名的意义:ipa 重签名最大的用处是,不必重新打包,和配置其它第三方获取 appkey 等操作,直接重签名之后依然可以拥有这些功能,更快的发布测试或者灰度版本. 本 ...

  3. springMVC:为MultipartFilte配置了上传文件解析器,报错或不能使用

    一.问题描述为支持restful风格请求,并且应对可能上传文件的情况,需要在配置hiddenHttpMethodFilter过滤器之前配置MultipartFilter.目的是让MultipartFi ...

  4. 爬虫中采集动态HTML介绍

    JavaScript JavaScript 是网络上最常用也是支持者最多的客户端脚本语言.它可以收集 用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏. 我们可以在网 ...

  5. Qt编写控件属性设计器

    一.前言 自从研究Qt编写自定义控件以来,一发不可收拾,越多越多人有类似的需求找我定制控件,陆陆续续写了上百个控件,目前已超过150个,于是逐渐衍生了另外一个需求,提供一个控件属性设计器,类似QtDe ...

  6. Ubuntu16.04安装CDH

    官方参考文档: https://www.cloudera.com/documentation/enterprise/5-15-x/topics/configure_cm_repo.html 安装cdh ...

  7. windows zip命令

    针对 Windows 用户的提示: win不自带zip,因此 Windows 用户可以从 GnuWin32 项目页面 上下载zip ,并将 C:\Program Files\GnuWin32\bin( ...

  8. laravel5.8ajax请求auth认证返回302的解决方法。

    注册 /app/Http/Controller/Auth/RegisterController.php <?php namespace App\Http\Controllers\Auth; us ...

  9. Celery-系统守护进程

    1. 使用systemd控制Celery 用法: systemctl {start|stop|restart|status} celery.service 配置文件: /etc/celery/cele ...

  10. Django框架 + Djiango安装 + First Djiango + 常用命令

    一.Django框架 MVC框架和MTV框架 参考:https://www.cnblogs.com/taosiyu/p/11260016.html MVC,全名是Model View Controll ...