之前我一直用的是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. RocketMQ安装部署

    一.简介RocketMQ RocektMQ是阿里巴巴在2012年开源的一个纯java.分布式.队列模型的第三代消息中间件,不仅在传统高频交易链路有着低延迟的出色表现,在实时计算等大数据领域也有着不错的 ...

  2. Ubuntu 16.04 catkin_make 常见操作

    参考博客:https://answers.ros.org/question/54178/how-to-build-just-one-package-using-catkin_make/ 1. catk ...

  3. sublime的注册方法 非常好用

    摘自:https://blog.csdn.net/weixin_42444922/article/details/81006107 转载 阿东的天空之城 发布于2018-07-11 20:03:43 ...

  4. org.apache.hadoop.fs.FsUrlStreamHandlerFactory 在哪个jar包

    org.apache.hadoop.fs.FsUrlStreamHandlerFactory在org.apache.hadoop类中,org.apache.hadoop在hadoop安装目录下.

  5. python办公自动化(一)PPTX

    简介: python-pptx是python处理PPT的一个库,注重的是读和写,无法导出,没有渲染功能. 办公自动化,说的是大了一点,但是最常见的office三件套,word,excel,ppt.这还 ...

  6. CPU时序信号和分频

  7. linux用户态和内核态理解

    1.特权级         Intel x86架构的cpu一共有0-4四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查.硬件已经提供了一套特权级使用的相关机制 ...

  8. 【Spring Cloud学习之五】配置中心

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 Spring Cloud 1.2 一.什么是配置中心在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实 ...

  9. activiti学习3:流程引擎对象和流程引擎配置对象

    目录 activiti学习3:流程引擎对象和流程引擎配置对象 一.activiti的简单使用流程 二.流程引擎配置对象ProcessEngineConfiguration的介绍 三.activiti配 ...

  10. git diff/difftool

    参考好文:使用命令和P4Merge进行diff::https://www.cnblogs.com/cgzl/p/8597066.html git difftool 即可弹出比较工具的界面 哈哈 === ...