微服务架构中,是很多微小的服务组成,那么调用这些服务接口,如果直接调用每个服务提供的接口,是不现实的,这个时候我们就需要一个请求的统一入口,也就是服务网关,而 Spring Cloud 已为我们提供了 Zuul。
(一)简介
Zuul 的特点是路由+过滤器,核心是一系列的过滤器,Zuul 定义了四种过滤器
- 前置(Pre)
- 路由(Route)
- 后置(Post)
- 错误(Error)
Zuul 默认集成 Ribbon 实现了负载均衡的功能。
(二)创建 spring-cloud-gateway 模块
2.1 添加依赖,pom 文件:
-
<?xml version=“1.0” encoding=“UTF-8”?>
-
<project xmlns=“http://maven.apache.org/POM/4.0.0”
-
xmlns:xsi=
“http://www.w3.org/2001/XMLSchema-instance”
-
xsi:schemaLocation=
“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
-
<parent>
-
<artifactId>spring-cloud-componets
</artifactId>
-
<groupId>com.geny
</groupId>
-
<version>1.0-SNAPSHOT
</version>
-
</parent>
-
<modelVersion>4.0.0
</modelVersion>
-
-
<artifactId>spring-cloud-gateway
</artifactId>
-
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-config-client
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-client
</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud
</groupId>
-
<artifactId>spring-cloud-starter-netflix-zuul
</artifactId>
-
</dependency>
-
</dependencies>
-
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.springframework.boot
</groupId>
-
<artifactId>spring-boot-maven-plugin
</artifactId>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
2.2 配置文件 bootstrap.yaml 如下:
-
server:
-
port:
9001
-
-
spring:
-
application:
-
name: spring-cloud-gateway
-
eureka:
-
client:
-
service-url:
-
defaultZone: http:
//localhost:8761/eureka
-
management:
-
endpoints:
-
web:
-
exposure:
-
include:
'*'
2.3 启动类
-
@SpringBootApplication
-
@EnableZuulProxy
-
public
class GatewayApplication {
-
-
public static void main(String[] args) {
-
SpringApplication.run(GatewayApplication.class, args);
-
}
-
}
在启动类上添加 @EnableZuulProxy 注解,开启 Zuul 的功能
2.4 启动相关服务
依次启动 eureka-server、spring-cloud-config、spring-demo-service、spring-cloud-gateway,访问 localhost:8761
可以看到,服务都已经注册到 eureka 中了
2.5 实现路由功能
在 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:
'*'
-
<span style=
"color:#ff0000;">zuul:
-
routes:
-
demoService:
-
path:
/demoService/**
-
serviceId: spring-demo-service<
/span>
加了红色部分,即可自定义路由规则,以 /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/**
-
<span style=
"color:#ff0000;"> ignored-
patterns:
-
-
/spring-demo-service/port<
/span>
只需要配置上面红色部分,就可以让 /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 除了路由功能,还有过滤器功能,过滤功能在下一篇讲解。