Zuul统一微服务网关

Zuul是Netflix开源的微服务网关,用于提供动态路由,监控,弹性,安全等边缘服务.可以和Eureka、Ribbon、Hystrix等组件配合使用; Zuul组件的核心是一系列的过滤器;这些过滤器可以完成以下功能:

  • 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
  • 审查与监控:
  • 动态路由: 动态将请求路由到不同后端集群.
  • 压力测试:逐渐增加指向集群的流量,以了解性能
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求.
  • 静态响应处理:边缘位置进行响应,避免转发到内部集群.
  • 多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化.

Spring Cloud对Zuul进行了整合和增强; 目前Zuul使用的默认是Apache的HTTP Client,也可以使用Rest Client,可以设置ribbon.restclient.enabled=true.

注册中心

示例注册中心地址

1
http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node1.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

服务注册

工程结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
zuul-server
├── pom.xml
├── src
│   └── main
│   ├── java
│   │   └── com
│   │   └── cloud
│   │   └── zuul
│   │   └── server
│   │   └── Application.java
│   └── resources
│   ├── application-node1.properties
│   ├── application-node2.properties
│   └── application.properties

Maven配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

主类示例

  • @EnableZuulProxy开启网关服务
  • @EnableDiscoveryClient开始实例自动发现并注册到注册中心
1
2
3
4
5
6
7
8
9
@EnableZuulProxy
@EnableDiscoveryClient
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

配置示例

application.properties主配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring.application.name=gateway-server

### 注册中心
eureka.client.service-url.defaultZone=http://admin:pwd123@node1.test.com:8001/eureka/,http://admin:pwd123@node1.test.com:8002/eureka/,http://admin:pwd123@node3.test.com:8003/eureka/

### 链路存储
spring.sleuth.sampler.percentage=1
spring.zipkin.base-url=http://172.30.12.197:9411/

### 网关定义
zuul.routes.api-ribbon.path=/ribbon/**
zuul.routes.api-ribbon.serviceId=CONSUMER-RIBBON

zuul.routes.api-feign.path=/feign/**
zuul.routes.api-feign.serviceId=CONSUMER-FEIGN

application-node1.properties 节点1配置示例

1
2
3
server.port=5301
logging.file=logs/gateway1.log
logging.level.root=INFO

application-node2.properties 节点2配置示例

1
2
3
server.port=5302
logging.file=logs/gateway2.log
logging.level.root=INFO

服务启动

1
2
[root@localhost target ]$ java -jar zuul-server-1.0-SNAPSHOT.jar --spring.profiles.active=node1 &
[root@localhost target ]$ java -jar zuul-server-1.0-SNAPSHOT.jar --spring.profiles.active=node2 &

注册查看

访问注册中心:http://admin:pwd123@node1.test.com:8001

服务访问

原始服务访问
1
2
3
4
[root@localhost ~ ]$ curl http://172.30.12.197:8080/api/invoke/select/5
测试数据5
[root@localhost ~ ]$ curl http://172.30.12.197:9090/api/invoke/select/7
测试数据7
通过网关访问
1
2
3
4
[root@localhost ~ ]$ curl http://172.30.12.197:5301/ribbon/api/invoke/select/5
测试数据5
[root@localhost ~ ]$ curl http://172.30.12.197:5302/feign/api/invoke/select/7
测试数据7
查看调用链