微服务架构中,是很多微小的服务组成,那么调用这些服务接口,如果直接调用每个服务提供的接口,是不现实的,这个时候我们就需要一个请求的统一入口,也就是服务网关,而 Spring Cloud 已为我们提供了 Zuul。
Zuul 的特点是路由+过滤器,核心是一系列的过滤器,Zuul 定义了四种过滤器
Zuul 默认集成 Ribbon 实现了负载均衡的功能。
spring-cloud-componets
com.geny
1.0-SNAPSHOT
4.0.0
spring-cloud-gateway
org.springframework.cloud
spring-cloud-config-client
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul
org.springframework.boot
spring-boot-maven-plugin
server:
port: 9001
spring:
application:
name: spring-cloud-gateway
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
management:
endpoints:
web:
exposure:
include: '*'
@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
在启动类上添加 @EnableZuulProxy 注解,开启 Zuul 的功能
依次启动 eureka-server、spring-cloud-config、spring-demo-service、spring-cloud-gateway,访问 localhost:8761
可以看到,服务都已经注册到 eureka 中了
在 spring-cloud-gateway 启动中,查看启动日志,截图如下
可以看到,/actuator/routes 这个被暴露的接口,我们访问 http://localhost:9001/actuator/routes
这个接口是可以查看所有的路由规则,按照上面这个路由的规则,我们访问一下 http://localhost:9001/spring-demo-service/port,结果如下
这说明路由功能已经起作用了,但是这个是按照 Zuul 的默认规则路由,不灵活,我们可以实现自定义的路由规则。
自定义路由规则很简单,只需要在配置文件里进行一些配置即可,如下对 spring-demo-service 服务进行自定义路由规则:
server:
port: 9001
spring:
application:
name: spring-cloud-gateway
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
management:
endpoints:
web:
exposure:
include: '*'
zuul:
routes:
demoService:
path: /demoService/**
serviceId: spring-demo-service
加了红色部分,即可自定义路由规则,以 /demoService/ 开头的请求都转发给 spring-demo-service 服务,重新启动 spring-cloud-gateway 服务,访问 http://localhost:9001/demoService/port
由此可见,我们自定义的路由规则也已生效,再次访问 http://localhost:9001/actuator/routes,可以看到,我们自定义的路由规则已在其中。
Zuul 可以路由接口服务,也可以让服务接口不暴露给外界调用,同样只需在配置文件里进行相应的配置即可。
server:
port: 9001
spring:
application:
name: spring-cloud-gateway
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
management:
endpoints:
web:
exposure:
include: '*'
zuul:
routes:
# demoService:
# path: /demoService/**
# serviceId: spring-demo-service
#简洁写法
spring-demo-service: /demoService/**
ignored-patterns:
- /spring-demo-service/port
只需要配置上面红色部分,就可以让 /spring-demo-service/port 这个接口不能被外界访问,重启 spring-cloud-gateway,访问 http://localhost:9001/spring-demo-service/port,结果如下
返回状态 404,可见配置已经生效,但是这个时候,我们自定义的 /demoService/** 还能继续访问,访问 http://localhost:9001/demoService/port,结果如下
所以要想这个接口服务不能被调用,还要加上 /demoService/port
zuul:
routes:
# demoService:
# path: /demoService/**
# serviceId: spring-demo-service
#简洁写法
spring-demo-service: /demoService/**
ignored-patterns:
- /spring-demo-service/port
- /demoService/port
再次访问 http://localhost:9001/demoService/port,结果如下
此时也返回 404,配置已生效。
Zuul 除了路由功能,还有过滤器功能,过滤功能在下一篇讲解。