SpringCloud模拟微服务8-Zuul网关
官网:https://github.com/Netflix/zuul
一.Zuul定义
Zuul是Netflix开源的微服务网关,它可以和Eureka,Ribbon,Hystrix等组件的配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精准的生产视图。
- 动态路由:动态的将请求路由到不同的后端集群。
- 压力测试:逐渐增加指向集群的流量。以了解性能。
- 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。
- 多区域弹性:跨越AWS Region进行请求路由,旨在实现ELB(Elastic Load Balancing)使用的多样化,以及让系统的边缘更贴近系统的使用者。
网关核心功能:过滤和路由
二.Zuul加入后的架构图
Zuul成为了统一入口。
三.项目操作
1.创建新module项目
2.引入依赖
<dependencies>
<!--Zuul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.application.yaml的配置(可以直接看第5点)
server:
port: 10010
# 配路由的规则
spring:
application:
name: gateway
zuul:
routes:
hehe: # 这个hehe代表路由的id
path: /user-service/** # 截断以这个为路径的请求
url: http://127.0.0.1:8081 #将请求转发到此处
缺点服务请求写死了,万一服务改地址(127.0.0.1)改端口(8081)了呢?
4.上述写法还不正确,应该面向服务而不是url
应该这么写
server:
port: 10010
# 配路由的规则
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
spring:
application:
name: gateway
zuul:
routes:
haha: #这个hehe代表路由的id
path: /user-service/** #截断以这个为路径的请求
serviceId: user-service #之前编写的时候服务列表都叫user-service
简化写法:
server:
port: 10010 #配路由的规则
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #注册到eureka服务中心
spring:
application:
name: gateway
zuul:
routes:
user-service: /user-service/** #这个hehe代表路由的id(简化)
5.真实情况
其实zuul你配不配都可以执行,因为它默认的为每一个微服务创建这个路径映射
server:
port: 10010 #配路由的规则
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #注册到eureka服务中心
spring:
application:
name: gateway
但是大都数情况下我们不用默认的,比如:
zuul:
routes:
user-service: /user-service/** #这是默认的情况,我觉得太长了,就可以自己自定义
//并且在默认情况下:它所找到的所有微服务都会配置,但是如果有不想对外暴露的微服务就采取以下办法
zuul:
routes:
user-service: user/** #自定义
ignored-service:
- consumer-service #忽略掉,使得该url不起作用
6.去除前缀(为了网页输入的ip地址请求再短一点)
zuul:
routes:
user-service:
path: /user/**
serviceId: user-service
strip-prefix: false #默认去除,这里设置为不去除,user/?会转发到真正的微服务
//原本: http://localhost:10010/user-service/user/1
//使用以上配置后,输入地址: http://localhost:10010/user/1
7.添加前缀
zuul:
prefix: /api #添加前缀
routes:
user-service: /user/**
//原来: http://localhost:10010/user-service/user/1
//现在必须要: http://localhost:10010/api/user-service/user/1