之前我一直用的是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. Python爬虫实例项目

    WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- ...

  2. 阿里云mysql数据库恢复到本地

    本地环境为win10,mysql引擎为InnoDB 第一步:服务里面停掉mysql 第二步:把my.ini 的 innodb_force_recovery  设置为0 第三步:把.frm和.idb文件 ...

  3. odoo开发笔记 -- 借助模块queue_job实现异步方法调用

    场景描述: 对比了几个定时调度的框架,发现各有优缺点: celery 很强,异步定时调度,异步周期调度,也有延时调度的功能,但是延时调度的案例比较少,遂暂时不使用. queue_job,一个odoo第 ...

  4. MQTT研究之EMQ:【EMQX使用中的一些问题记录(3)】

    EMQX功能强大,但是帮助信息或者可用资料的确有限,遇到个问题,比较难找到处理的头绪,今天,我要记录的是,使用中出现EMQX宕机,但是呢,启动也启动不了. 今天记录的内容,就以操作EMQX 3.2.3 ...

  5. C# 语音技术

    1.使用DotNetSpeech.dll. /// <summary> /// 朗读/// </summary>/// <param name="text&qu ...

  6. Vue打包发布到Tomcat后,刷新报错404解决方法

    在应用下面加 WEB-INF 建 web.xml 内容如下 <?xml version="1.0" encoding="ISO-8859-1"?> ...

  7. (原)理解码率控制模式(x264,x265,vpx)

    理解码率控制模式(x264,x265,vpx) 原文链接:https://slhck.info/video/2017/03/01/rate-control.html 翻译:lihaiping1603@ ...

  8. javascript Round Function

    var rounded = Math.round( number * 10 ) / 10; // round to one digit var rounded = Math.round( number ...

  9. 实现一个java锁

    AQS是实现java锁的核心,但是实现起来还是仅仅只需继承该类重写它的几个主要方法即可. 1.首先,定义一个同步类,继承AQS. //这里要有个Sync内部类,实现锁需要继承AQSprivate st ...

  10. SQL Server 从Excel导入到数据库操作遇到的科学计数法问题

    问题描述 今天在做从Excel导入数据到SQL Server 中将数据更新到表中,可惜就这一个简单的操作中出现了一点小插曲,就在我根据Excel中的编号关联表编号以此更新姓名字段时出现转换错误问题.如 ...