什么是Zuul?为什么要使用Zuul?https://github.com/Netflix/zuul/wiki
Zuul是从设备和网站到Netflix流应用程序后端的所有请求的前门。 作为边缘服务应用程序,Zuul旨在实现动态路由,监视,弹性和安全性。 它还可以根据需要将请求路由到多个Amazon Auto Scaling组。Zuul核心功能:过滤和路由。
zuul网关入门
1,pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>2,启动类注解@EnableZuulProxy
// @EnableZuulServer//该注解功能单一,有些过滤器会没有。 @EnableZuulProxy //启动zuul @SpringBootApplication public class GetwayApplication { public static void main(String[] args) { SpringApplication.run(GetwayApplication.class); } }3,application.yml配置文件
server: port: 8008 zuul: routes: #路由:分发给不同的微服务(服务名称) abc: #是路由id,任意值 path: /products-service/** #代表映射路径,会将符合该规则的所有以 /products-service/开头请求都映射到下面的url中。 url: http://127.0.0.1:8081 #映射路径对应的实际url地址访问测试:http://localhost:8008/products-service/products/1
4,面向服务的路由配置(Zuul+Eureka)
上面的zuul配置中,映射的实际路径写死了,这不好扩展。所以修改使用Eureka面向服务的路由配置
4-1,添加pom依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>4-2,修改application.yml配置文件
zuul: routes: abc: #是路由id,任意值 path: /products-service/** #代表映射路径,会将符合该规则的所有以 /products-service/开头请求都映射到下面的serviceId中。 serviceId: products-service #服务id会在Eureka注册中心中找到调用此服务请求的路径。 #配Eureka eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka配置路由的简化方式:
zuul: routes: products-service: /products-service/** #zuul的简化配置:key:服务id,value:映射路径,只要访问该映射路径都会转发到该服务 #配Eureka eureka: client: service-url: defaultZone: http://127.0.0.1:8761/eureka访问http://localhost:8008/products-service/products/2效果:
如果访问出现如下错误:
解决方法:zuul启用ribbon的负载均衡,需设置ribbon的超时时间大点,再如果不行,把zuul的默认连接超时时间也设置大点。
ribbon: ReadTimeout: 5000 #负载均衡读出时间 ConnectTimeout: 5000 #连接时间 zuul: host: connect-timeout-millis: 6000 #HTTP连接超时要比Hystrix的大,默认值2000 socket-timeout-millis: 6000 #socket超时,默认值10000注意:Ribbon的设置的时长不应大于Hystrix设置的时长。
其实,zuul配置文件中可以不用配置映射路由路径也可以,因为Eureka中已经默认为我们配置配置加载了相应格式的路径,即按照,Eureka中注册的服务名进行访问。
去掉zuul中路由配置,测试访问
http://localhost:8008/products-service/products/2
访问效果:
另一个注册服务访问效果:http://localhost:8008/consumer-demo/products/2
如果我们不想使用zuul中默认的路由规则的配置,那么我们可以进行如下修改:
zuul: routes: products-service: /products-service/** ignored-services: #值是一个set集合,Set<String> ignoredServices - consumer-demo #忽略该服务作为默认的路由规则。那么如果我们不配置该,那访问不了 #prefix: /a #默认prefix = "",即访问的时候需要加上/a,前缀才能访问。#http://localhost:8008/a/products-service/products/2访问测试: