一.Zuul简介
Zuul是Netflix开源的微服务网关,可以和Eureka、Ribbon、Hystrix等组件配合使用,Spring Cloud对Zuul进行了整合与增强,Zuul的主要功能是路由转发和过滤器。
二.项目现状
一个注册中心(registry),服务提供微服务(provider),消费者(ribbon),消费者(feign)。
三.注册网关服务
- 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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.lll</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
</project>
- yml配置文件
server:
port: 8084
spring:
application:
name: zuul-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka
- 启动类添加注解
@SpringBootApplication
@EnableEurekaClient
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
四.开启网关服务
- 启动类上添加注解
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
- 配置文件添加配置
我们的目的在于:127.0.0.1:8084/feign/** 转发到 feign-server服务,以下的两种配置都可以
zuul:
routes:
FEIGN-SERVER: /feign/**
api-a:
path: /ribbon/**
serviceId: RIBBON-SERVER
五.过滤器
- 编写自己的Filter类继承ZuulFilter,实现其中的抽象方法,并实例化实体类注入IOC容器。
@Component
@Slf4j
public class MyFilter extends ZuulFilter {
/**
* filterType表示返回一个字符串代表过滤器的类型
* pre:路由之前
* routing:路由之时
* post: 路由之后
* error:发送错误调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 过滤的顺序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否要过滤,可添加逻辑
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体逻辑
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
log.info("网关的过滤器正在执行!!!");
return null;
}
}