这里写目录标题
SpringCloud服务网关——SpringCloud Gateway
服务网关简介简介
什么是服务网关?
简单理解服务网关就是一个网络关口、通道,是整个服务的统一入口。
所有客户端、消费端的请求都通过统一的网关接入服务。
网关的作用?
为微服务云平台提供统一的入口是API网关最主要的用途,除此之外,网关还可承担认证授权、访问控制、路由、负载均衡、缓存、日志、限流限额、转换、映射、过滤、熔断、注册、服务编排、API管理、监控、统计分析等等非业务性的功能。
- 负载均衡 网关接收外部请求后,可以对请求进行负载均衡转发(随机、轮询、权重、hash),避免将所有请求打到同一个服务上。
- 服务熔断 和Hystrix一样的原理,监控注册中心,如果发现当前某个服务不可用或多次调用某个服务失败(短时间内打到阈值),可以快速失败,防止雪崩效应。
- 限流 限流的主要目的是防止类似DDos的恶意攻击导致服务器瘫痪。常见的限流算法有:滑动窗口限流、漏斗限流、令牌桶限流。
- 认证鉴权 服务网关作为用户请求的统一入口,会拦截用户请求并对用户进行鉴权认证。
- 其他功能暂不叙述
Zuul和Gateway
SpringCloud Finchley 版本出来之前使用的服务网关是 Zuul,Finchley开始使用官方的SpringCloud Gateway。
- Zuul 可以提供动态路由、监视、安全性等功能的边缘服务,是一个基于JVM路由和服务端的负载均衡器。Zuul.1版本的编程模型是同步阻塞,Zuul.2开始使用异步调用,SpringCloud只集成了Zuul.1 并没有使用Zuul.2 。
- SpringCloud Gateway 基于Java 8 编码、基于springboot2,是SpringCloud官方服务网关项目。官方的测试报告中,SpringCloud Gateway的RPS是Zuul的1.6倍。
SpringCloud Gateway 服务网关
服务网关执行步骤
- 初始化配置,在加入SpringCloud Gateway依赖后,服务启动后会自动加载初始化相关的类,主要有:微服务注册发现自动配置类,Redis自动配置类(鉴权和限流),GatewayAutoConfiguration 核心配类(配置路由规则、过滤器等)。
- 请求发送到网关,DispatcherHandler是HTTP请求的中央分发器,核心方法handler将请求匹配到相应的HandlerMapping。
- 请求与处理器之间有一个映射关系,也就是这个请求应该映射到哪个服务中,网关会对请求进行路由
- 随后进入网关的Web处理器WebHandler,它是一系列网关过滤器和全局过滤器的实例,对请求进行过滤和封装
- 将封装后的请求转发到对应的服务中

SpringCloud Gateway实例演示
eureka注册中心
沿用之前的eureka server
producer 服务提供者
沿用之前的producer服务提供者,这里新增一个接口:
@RestController
@RequestMapping("/producer")
@Api(description = "producer,provide service")
@Slf4j
public class ProducerController {
@ApiOperation(value = "response to gateway",notes = "gateway")
@GetMapping("/gateway")
public String gateRes(){
return "hello gateway ,I`m producer !";
}
}
SpringCloud Gateway 服务网关
添加服务依赖:
<dependencies>
<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-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-core</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<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>
在启动类中加上 @EnableDiscoveryClient 注解将网关注册到eureka server。
在application.yml配置文件中配置路由规则:这里配置了一个id为gateway-service的路由,所有访问 /producer/**路径的请求将被转发到
http://localhost:10011/producer
server:
port: 10061
spring:
application:
name: gateway-server
cloud:
gateway:
routes:
- id: gateway-service
uri: http://localhost:10011/producer
predicates:
- Path=/producer/**
eureka:
instance:
ip-address: true
instance-id: gateway
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://luht:eureka@192.168.160.136:8761/eureka/
启动服务测试

可以看到服务已经注册打eureka server中。
直接访问producer服务的gateway接口:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4SB92Z0-1597300777395)(DAFEF8EB0699467C89B71B14FE69A8A6)]](https://img-blog.csdnimg.cn/20200813144115454.png#pic_center)
通过服务网关来访问:![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbGW8cZA-1597300777397)(305AC9B0DD8B4F74BCA58C54FDC4CDE4)]](https://img-blog.csdnimg.cn/20200813144127602.png#pic_center)
版权声明:本文为qq_34528297原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。