一、前言
网关也被称为边缘服务,因为网关是微服务集群的统一入口处在微服务的外围所以被称为边缘服务。微服务集群搭建好之后便需要一个统一的入口来处理鉴权等逻辑,所以网关在微服务集群中也很重要。本篇博客便讲解Spring Cloud的zuul网关组件。
二、开发工具及相关版本号
开发工具 | 版本号 |
---|---|
idea | 2018.2.4 |
spring boot | 2.1.3 |
spring cloud | Greenwich.RELEASE |
java | 1.8 |
三、搭建zuul网关
新建一个spring boot项目,代码如下。
- maven依赖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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<!-- web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- zuul网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!-- eureka客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
- application.yml配置文件如下
spring:
application:
name: zuul-gateway
server:
port: 80
zuul:
routes:
api-a:
path: /micro-consumer/** #匹配后转发至某服务
service-id: micro-consumer
sensitive-header:
api-b:
path: /baidu/** #转发至具体的url
url: http://www.baidu.com
host:
connect-timeout-millis: 30000 #网关超时时间
eureka:
client:
service-url:
defaultZone: http://admin:admin@localhost:8080/eureka/
- 启动类添加@EnableEurekaClient注解和@EnableZuulProxy注解
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;
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
- 启动其他微服务,打开注册中心查看,zuul-gateway已经成功注册到注册中心
- 查看效果
现在通过网关访问http://localhost/micro-consumer/consumer/hello,如下图
- 通过网关访问 http://localhost/micro-provider/provider/hello ,如下图
可以看到在网关的配置中我们并没有配置生产者的路由转发,但是生产者也可以通过网关访问到。其实zuul网关默认就会匹配url如果匹配到了和微服务服务名一样的路由,默认就会将请求转发至该服务。
五、注意
- zuul网关默认会将"Cookie", “Set-Cookie”, "Authorization"这三个敏感的请求头屏蔽,如果不需要此动作在配置文件中将sensitive-header配置为空就好
2.zuul网关默认的超时时间很短需要手动配置,但是配置时要注意保证超时时间要比Hystrix的大
六、 小结
网关在微服务集群中出来做一些路由转发的工作外还会处理一些过滤鉴权操作,下一节中将讲解zuul网关的过滤器的使用。
博客中所有的代码都以上传到我的github上了,地址:俞兆鹏的github