一 什么是Zuul
Zuul是Netflix提供的基于JVM的路由器和服务器端负载平衡器。
特别注意:spring cloud集成的zuul网关还是1.x版本的,是阻塞IO模型,Spring cloud也也没有计划会集成zuul2.x版本(非阻塞IO)的网关,意味着spring cloud集成的zuul网关会长期处于维护模式,所以新项目在选择网关的时候,要非常注意这点。Netflix包含以下模块,都已经被Spring标位维护模式:
spring-cloud-netflix-archaius
spring-cloud-netflix-concurrency-limits
spring-cloud-netflix-hystrix-contract
spring-cloud-netflix-hystrix-dashboard
spring-cloud-netflix-hystrix-stream
spring-cloud-netflix-hystrix
spring-cloud-netflix-ribbon
spring-cloud-netflix-turbine-stream
spring-cloud-netflix-turbine
spring-cloud-netflix-zuul
Spring官方给出的Zuul的用途:
- Authentication(认证)
- Insights
- Stress Testing(压测)
- Canary Testing(金丝雀测试)
- Dynamic Routing(动态路由)
- Service Migration(服务迁移)
- Load Shedding(减载)
- Security(安全)
- Static Response handling(静态响应处理)
- Active/Active traffic management(流量管理)
Zuul的规则引擎使规则和过滤器基本上可以用任何JVM语言编写,并内置对Java和Groovy的支持。
二 快速上手Zuul网关
到 http://start.spring.io 生成项目框架
同时生成一个业务服务如下:
三 修改生成的项目
针对zuul-demo项目
修改SpringBoot启动类,增加注解
@EnableZuulProxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package com.qicoder.gateway.zuul.zuuldemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulServer;
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
}
删除resources下的application.properties,创建application.yaml,并粘贴以下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15server:
port: 8888
spring:
application:
name: zuul-demo
zuul:
ignored-services: "*" # 去掉服务发现的服务,避免暴露出去
routes:
business-api:
path: /business/** # 路由路径
customSensitiveHeaders: true # 是否去除敏感头 true为去除
sensitiveHeaders: Cookie,Set-Cookie # 需要去除的敏感头 去除了 即不会往下游转发
url: http://localhost:9999/api # 需要转发的url
针对demo-business项目
application.properties增加配置
1
server.port=9999
在包
com.qicoder.business
下增加controller
包,并在该controller包下创建一个controller如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.qicoder.business.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* business demo
*/
"/api") (
public class MyBusinessController {
"/test1") (
public String testApi() {
return "test 11111";
}
"/test2") (
public String testApi2() {
return "test 2222";
}
}
四 验证
分别启动两个服务的application
在浏览器浏览业务服务接口地址,看返回情况如下:
通过上面两个图片情况可知,网关转发生效了,至此,恭喜你,你的最基础的一个网关服务已经完成了。