Zuul是从设备和网站到后端应用程序全部请求的前门,为内部的服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器,它具有如下的功能:spring
Zuul具有上面的功能,它底层是基于Servlet,本质是一系列Filter所构成的责任链。编程
ZuulServer的主要依赖以下:后端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
复制代码
配置以下:app
pring:
application:
name: zuul-server-1
server:
port: 8093
undertow:
worker-threads: 4000
io-threads: 200
eureka:
client:
serviceUrl:
defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8092}/eureka/
instance:
prefer-ip-address: true
zuul:
routes:
zuul-gateway:
path: /client/**
serviceId: zuul-client-1
复制代码
启动类的代码以下:负载均衡
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableZuulProxy
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class,args);
}
}
复制代码
依赖以下:dom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
复制代码
配置以下:测试
server:
port: 8094
spring:
application:
name: zuul-client-1
eureka:
client:
serviceUrl:
defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8092}/eureka/
instance:
prefer-ip-address: true
复制代码
启动类以下:网站
@SpringBootApplication
@EnableDiscoveryClient
@EnableEurekaClient
public class ZuulClientApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulClientApplication.class,args);
}
}
复制代码
测试Controllerurl
@RestController
public class TestController {
@GetMapping("/add")
public Integer add(Integer a, Integer b){
return a + b;
}
}
复制代码
测试结果:spa
到此一个简单的Zuul网关的例子已经完成了。
路由配置以下:
zuul: routes: zuul-client-1: path: /client/** serviceId: zuul-client-1
上面的这段路由配置也能够写成这样:
zuul:
routes:
zuul-gateway:
path: /client/**
serviceId: zuul-client-1
复制代码
上面的配置还能够简化成这个样子:
zuul:
routes:
zuul-client-1:
path: /client/**
复制代码
zuul: routes: zuul-client-1: path: /client/** url: http://localhost:9093 #就是client的物理地址
在默认的状况下Zuul会使用Eureka中集成的基本负载均衡功能,若是要是有Ribbon的负载均衡的功能,就须要指定一个serviceId,此操做须要禁止Ribbon是Eureka,在E版以后,新增了负载均衡的策略的配置,配置以下:
ribbon-route: ribbon: NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #Ribbon LB Strategy listOfServers: localhost:8092,localhost:8093 #client services for Ribbon LB
若是须要在访问某个接口的时候跳转到这个方法上来处理,就须要用到Zuul的本地跳转
zuul: routes: zuul-client-1: path: /client/** url: forward:/client
zuul: routes: zuul-client-1: path: /client/** serviceId: zuul-client-1 zuul-client-2: path: /client/** serviceId: zuul-client-2
通过屡次的实验后面的会将前面的覆盖掉。
路由前缀的配置 在配置路由规则的时候,我么不能够配置一个统一的代理前缀。
zuul: prefix: /pre routes: zuul-client-1: /client/**
咱们在经过网关访问后端的接口的时候就须要加上这个前缀,请求的路径就编程了/pre/client/add,可是实际起做用的是/client/add,也就是Zuul会把代理路径从请求路径中移除。可使用stripPrefix=false来关闭这个功能。
zuul:
routes:
zuul-client-1:
path: /client/**
serviceId: zuul-client-1
stripPrefix: false
复制代码
此时请求的路径是/pre/client/add,实际起做用的仍是/pre/client/add,可是通常的状况下是选择无视这个配置。
zuul: ignored-services: zuul-client-2 ignored-patterns: /div/ prefix: /pre routes: zuul-client-1: /client/**
上面的配置在Zuul在拉去服务列表,建立映射规则的时候,就会忽略掉zuul-client-2服务和/**/div/**接口
zuul: ignored-services: zuul-client-2 ignored-patterns: /div/ prefix: /pre routes: zuul-client-1: /client/** sentiveHeaders: Cookie,Set-Cookie,Authorization