在上篇文章中, 我们知道了微服务是怎么在注册中心注册服务,获取服务的,那小伙伴可能会有一个疑问. 各个模块之间的访问ip,端口都不相同,那前端调用接口岂不是很麻烦? 所以就使用到了spring cloud zuul路由功能
一 : 定义 :
Zuul 是 Netflix 开源的微服务网关,Spring Cloud 对 Zuul 进行了整合和增强。在 SpringCloud 体系中,Zuul 担任着网关的角色,对发送到服务端的请求进行一些预处理,比如安全验证、动态路由、负载分配等 .
Zuul 的核心是FIlters
二 : 作用 :
spring cloud eureka管理注册了众多微服务, 这些微服务是各自独立的模块,访问路径均不相同,那我们就需要考虑前端外部怎么去访问各式各样的微服务,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。
三 : 本项目中的使用 :
① : 新建一个zuul-service 的子模块管理
注解说明 :
@EnableDiscoveryClient : 我们也把zuul 注册到eureka上面 ,加这个注解是让eureka可以扫描到这个微服务
@EnableZuulProxy : ,当Zuul与Eureka、Ribbon等组件配合使用时,我们用@EnableZuulProxy, 核心是一个过滤器,来对url进行路由控制

② : 配置文件application.yml :
spring:
application:
name: zuul-server -- 服务名称
http: -- http 设置
multipart:
max-file-size: 10MB #单个文件最大限制
max-request-size: 100MB #单次请求最大限制
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ -- 默认地址
server:
port: 8080 -- 这个路由微服务端口
zuul:
ignoredServices: '*' -- 表示我们忽略所有默认匹配的path,只能路由到我们手动配置的路径
add-host-header: true -- 见下方解释
retryable: true -- 开启zuul的请求重试策略 详情见下方
# host:
# connect-timeout-millis: 2000
# socket-timeout-millis: 10000
routes: -- 路由的路径配置
##系统服务(平台管理)
system: -- 服务名
path: /sys/** -- 路径规则
sensitiveHeaders: -- 过滤客户端附带的headers
stripPrefix: true -- 这里的stripPrefix默认为true,也就是所有/demo/xxxx的请求转发 给http://demo.com.cn/xxxx ,去除掉demo前缀
serviceId: system-service -- 服务id 对应微服务yml中spring.application.name=system-service
对配置文件的补充 :
重定向问题的原因和解决 :
zuul.add-host-header=true :

retryable: true :
我们一般部署服务的时候,都会部署一个网关服务,内部所有的其他微服务的调用,都将通过网关路由过去,不对外直接暴露,对外只暴露网关服务。而且一般内部服务会部署多个实例,zuul集成了ribbon,会自动负载均衡的方式去调用内部服务。
当内部服务滚动重启的时候,通过网关的一个请求刚好路由到重启的那个实例的话,因为默认没有开启zuul的请求重试策略,该请求将会报错,其实理想的方式可以通过重试路由到另外一个活动的服务实例上去。
要开启zuul网关请求重试,首先需要添加spring-retry依赖:
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
然后配置:
zuul.retryable=true
这样,所有路由都将会进行重试。(此属性默认是false,所以不会重试)
通过路由配置我们实现了 :
http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**
例如 :
parking-base获取token路径
ip:9010/v1/security/logon
路由给前端的路径 :
ip:8080/base/v1/security/logon
网友评论