Zuul的主要功能是路由转发和过滤器,对外提供统一的访问入口,并且做路由转发,例如将/param的路由请求发到parameter-consumer服务,将/login的路由请求发到customer服务等。
Zuul网关作为微服务组件的一部分,相对于eureka server注册中心而言,是eureka client,同样需注册到注册中心
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
完整的pom.xml文件如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
2.修改application.yml配置文件
server:
port: 8791 #端口号
spring:
application:
name: zuul #服务注册中心测试名
zuul:
routes:
api-a:
path: /index/**
serviceId: parameter-consumer #如果是/index/**路径下的请求,则跳转到parameter-module
api-b:
path: /resource/**
serviceId: parameter-consumer #如果是/resource/**路径下的请求,则跳转到parameter-consumer
api-c:
path: /customer/**
serviceId: parameter-consumer #如果是/customer/**路径下的请求,则跳转到parameter-consumer
# 授权原生端点访问authentication
management:
security:
enabled: false
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/ #服务注册中心
注:关于授权原生端点访问授权,spring cloud提供了很多原生端点(如/info、/health、/env等,提供微服务框架的一些配置或运行时信息),如下图,就是访问原生端点/health返回的信息:
以及启动时控制台的如下日志,显示的就是原生端点:
路由转发部分,有两点需要注意:
/index/** 和/index/* 以及/index/?的含义是不同的
若访问http://localhost:8791/index/aaa,请求被转发到parameter-consumer服务模块时,路由是/aaa,前面的/index会被截掉
路由配置规则(图片来源:https://blog.csdn.net/u012702547/article/details/78399406/):
3.启动类添加注解@EnableZuulProxy启用网关和@EnableEurekaClient启用eureka client
package com.example.zuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
启动zuul网关应用程序,访问http://localhost:8761/,可以看到zuul网关已经被注册到注册中心:
访问网关http://localhost:8791/index/hello?name=world,可以看到确实转发了请求: