1、Zuul是什么?
zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
Zuul 在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。
zuul的例子可以参考 netflix 在github上的 simple webapp,可以按照netflix 在github wiki 上文档说明来进行使用。
2、为什么要使用Zuul?
Zuul和Ribbon以及Eureka相结合,可以实现智能路由和负载均衡的功能,可以将流量按照某种策略分发到集群中的多个实例。统一了对外暴露接口,外界系统不需要知道微服务系统中各服务之间调用的复杂性,也保护了内部微服务的api接口。可以统一做用户身份认证,权限验证,这样就不用在每个微服务中进行认证了。可以统一实现监控、日志的输出。客户端请求多个微服务时,可以只请求Zuul一次,在Zuul中请求多个微服务,减少客户端和微服务的交互次数1、创建一个Maven工程,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 https://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.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springclouddemo</groupId> <artifactId>gateway-zuul</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gateway-zuul</name> <description>微服务网关</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </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>2、application配置文件编写
spring.application.name=gateway-zuul server.port=7400 eureka.client.service-url.defaultZone=http://localhost:7001/eureka/,http://localhost:7002/eureka/ eureka.instance.prefer-ip-address=true management.endpoints.web.exposure.include=routes3、Main方法内添加对应的注解
package com.springclouddemo.gatewayzuul; import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; /** * @author krz */ @SpringBootApplication @EnableZuulProxy public class GatewayZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayZuulApplication.class, args); } }4、测试
调用请求,启动之前大数据篇的server、provider、feign工程启动成功后访问:http://localhost:7400/eureka-client-consumer-feign/demo/krz 可以看到请求转发到了我们Feign上访问http://localhost:7400/eureka-client-provider/demo/krz可以看到请求也转发到了Provider上
默认情况下Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则是:http://ZUUL_HOST:ZUUL_PORT/微服务名称/**会转发到对应的微服务上。
Zuul是默认继承了负载均衡和熔断的,负载均衡无需任何操作。只需要在启动类上加上配置即可
package com.springclouddemo.gatewayzuul; import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; /** * @author krz */ @SpringBootApplication @EnableZuulProxy public class GatewayZuulApplication { public static void main(String[] args) { SpringApplication.run(GatewayZuulApplication.class, args); } @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; } }访问http://localhost:7400/hystrix.stream 后 可以看到我们日志信息,代表Hystrix整合成功
当@EnableZuulProxy与Spring Boot Actuator配合使用时,Zuul会暴露一个路由管理端点/actuator/routes(低版本为/routes端点)。借助这个端点,可以方便、直观地查看以及管理Zuul的路由。
由于spring-cloud-starter-netflix-zuul已经包含了spring-boot-starter-actuator,只需要在配置文件中加上
management.endpoints.web.exposure.include=routes
访问http://localhost:7400/actuator/routes 可以看到我们的整体路由信息:
1.自定义指定微服务的访问路径 配置zuul.routes,指定微服务的serviceId=指定路径 即可:
zuul.routes.eureka-client-consumer-feign=/feign/**
2.忽略指定微服务
zuul.ignored-services=eureka-client-provider,eureka-client-consumer-feign
这样配置,Zuul就会忽略eureka-client-provider,eureka-client-consumer-feign微服务,只代理其他微服务。
3.忽略所有微服务,只路由指定微服务 某些场景下我们只想让Zuul代理指定微服务:
zuul.ignored-services=’*’ zuul.routes.eureka-client-consumer-feign=/feign/**
这样配置,Zuul就会只路由eureka-client-consumer-feign这个微服务。
更多的一些配置信息,详情可以参考官网API文档进行配置,小编在这里就不一一指出。