本文介绍Zuul的相关的内容,主要包括如下内容
服务网关的作用,其作用类似我们常用Ngnix
cloud-registration-center
注册中心,比较简单,这里代码略
cloud-service-zuul
作为服务方的工程,提供服务的工程,这里代码略。其具体实现方法可以参数Spring cloud系列一 包含所有基本要素的完整Spring Cloud demo。这个服务的注册名称为”cloud-service-zuul”。此服务提供一个服务:URL为http://127.0.0.1:14606/zuul-test/simple。
cloud-zuul
提供服务网关的功能。本工程我们演示通过各种配置实现访问cloud-zuul的URL达到访问cloud-service-zuul服务接口(URL为http://127.0.0.1:14606/zuul-test/simple)的目的
引入zuul的依赖jar
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zuulartifactId>
dependency>
@EnableZuulProxy:注解此服务为zuul代理服务
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulSimpleCloudApplication {
public static void main(String[] args) {
args = new String[1];
args[0] = "--spring.profiles.active=zuul-simple";
SpringApplication.run(ZuulSimpleCloudApplication.class, args);
}
….
}
有一个和@EnableZuulProxy很相似的@EnableZuulServer,这里说明这两个异同:@EnableZuulProxy包括@EnableZuulServer的所有功能,@EnableZuulServer是@EnableZuulProxy的功能子集。@EnableZuulProxy比@EnableZuulServer的多了代理的功能
bootstrap-zuul-simple.yml
bootstrap-zuul-simple.yml :配置服务注册到注册中心,服务名称为cloud-zuul
# port
server:
port: 14601
spring:
application:
# 本服务注册到注册到服务器的名称, 这个名称就是后面调用服务时的服务标识符
name: cloud-zuul
eureka:
client:
serviceUrl:
# 服务器注册/获取服务器的zone
defaultZone: http://127.0.0.1:10761/eureka/
instance:
prefer-ip-address: true
application-zuul-simple.yml
配置URL的路由关系,下节会详细介绍
属性配置在application-zuul-simple.yml,本节对配置进行详细说明
路由配置以“zuul.routes.**”开头
如果我们没有配置任何路由,则zuul默认已经自动配置类似的关系:
"/服务名称/**":"服务名称"
"/cloud-service-zuul/**":"cloud-service-zuul"
此时:访问http://127.0.0.1:14601/cloud-service-zuul/zuul-test/simple等价于 http://127.0.0.1:14606/zuul-test/simple
如果设置为*,则相当于关闭默认路由
zuul:
# 此参数设置忽略哪些服务,如果是*,则忽略所有服务
ignoredServices: '*
Zuul的规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/上
也就是说当我们访问http://127.0.0.1:14601/api-a-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档
zuul:
routes:
# 此名称任意
api-url:
# 所有到Zuul的中规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/上,
# 也就是说当我们访问http://127.0.0.1:14601/api-a-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
path: /api-a-url/**
# 对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档
url: http://127.0.0.1:14606
所有访问/api-a/开头的URL都会转到服务 cloud-service-zuul上
如访问 http://127.0.0.1:14601//api-a//zuul-test/simple 等价于 http://127.0.0.1:14606/zuul-test/simple
zuul:
routes:
# 此名称任意
api-application-name:
# 服务名与服务实例地址的关系: 即 http://127.0.0.1:14601//api-a//zuul-test/simple 等介于 http://127.0.0.1:14606/zuul-test/simple
path: /api-a/**
url: cloud-service-zuul
默认值为true,如果设置为false,则重定向时,访问的新的URL,不删除path部分的前缀
如访问http://127.0.0.1:14601/zuul-test/simple 等价于 http://127.0.0.1:14606/zuul-test/simple
路径请不要使用/zuul测试,这是zuul自己预留的
zuul:
routes:
# 此名称任意
api-strip-prefix:
# http://127.0.0.1:14601/zuul-test/simple 等介于 http://127.0.0.1:14606/zuul-test/simple
# 路径请不要使用/zuul测试,这是zuul自己使用的
path: /zuul-test/**
url: cloud-service-zuul
# 默认值为true,如果设置为false,则重定向时,访问的新的URL,不删除path部分的前缀
stripPrefix: false
忽略所有URL中二级路径是admin的请求
zuul:
# 此参数可以设置忽略以下的请求
ignoredPatterns: /**/admin/**
management:
security:
# 关闭安全监管, 查看详细信息,可以访问这个接口 http://127.0.0.1:14601/routes
enabled: false
先关闭安全监管,再访问这个接口 http://127.0.0.1:14601/routes,可以获取所有的当前的路由
{
"/api-a-url/**":"http://127.0.0.1:14606/",
"/api-a/**":"cloud-service-zuul",
"/zuul-test/**":"cloud-service-zuul",
"/cloud-service-zuul/**":"cloud-service-zuul",
"/cloud-registration-center/**":"cloud-registration-center"
}
运行ZuulSimpleCloudApplication服务,可以进行以上的测试
我们可以通过 ZuulFilter的扩展Zuul的功能,这是Zuul最强大的地方
ZuulFilter各个方法的说明:
filterType() 方法
设置过滤器类型,主要有4类filter类型
- 1 pre:在请求被路由前被调用
- 2 routing:在路由请求时被调用
- 3 post:在routing和error过滤器之后被调用
- 4 error:发生异常时被调用
filterOrder()
设置执行的顺序,值越小越早执行。不同过滤器的值可以相同
shouldFilter()
这个方法决定是否启用这个过滤器,可以通过配置属性完成
run()
真正的处理逻辑
我们定义一个ZuulFilter ,功能是在请求被路由前打印请求的IP地址
详细内容见代码
@Component // 初始化过滤类,zuul启动时,会自动找到此filter
public class MyPreFilter extends ZuulFilter {
@Override
public String filterType() {
// 设置过滤器类型:error post pre route
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
// 设置执行的顺序,值越小越早执行。不同过滤器的值可以相同
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1; // run before PreDecoration
}
@Override
public boolean shouldFilter() {
// 这个方法决定是否启用这个过滤器,可以通过配置属性完成,这里简单测试,直接使用返回true
return true;
}
@Override
public Object run() {
// 通过 RequestContext的getCurrentContext获取RequestContext对象可以进行相关的操作
RequestContext ctx = RequestContext.getCurrentContext();
// 这里只打印一些请求信息
HttpServletRequest request = ctx.getRequest();
System.out.println("================ MyPreFilter begin================");
System.out.println("请求来源:" + request.getRemoteAddr() + ":" + request.getRemotePort());
System.out.println("================ MyPreFilter end================");
return null;
}
@EnableZuulProxy:注释此类
@SpringBootApplication
@EnableEurekaClient // 配置本应用将使用服务注册和服务发现
@EnableZuulProxy
public class ZuulFilterCloudApplication {
public static void main(String[] args) {
args = new String[1];
args[0] = "--spring.profiles.active=zuul-filter";
SpringApplication.run(ZuulFilterCloudApplication.class, args);
}
…
}
application-zuul-filter.yml
zuul:
routes:
api-url:
# 通过url直接映射
# 所有到Zuul的中规则为:/api-a-url/**的访问都映射到http://127.0.0.1:14606/上,
# 也就是说当我们访问http://127.0.0.1:14602/api-url/zuul-test/simple的时候,Zuul会将该请求路由到:http://127.0.0.1:14606/zuul-test/simple
path: /api-url/**
# 对于url映射不是通过HystrixCommand执行,也不能通过ribbon进行负载,需要进行额外配置,详细见spring 文档
url: http://127.0.0.1:14606/
访问http://127.0.0.1:14602/api-url/zuul-test/simple
控制台输出:说明我们filter启作用了
================ MyPreFilter begin================
请求来源:127.0.0.1:54256
================ MyPreFilter end================
以上的详细的代码见下面
github代码,请尽量使用tag v0.10,不要使用master,因为我不能保证master代码一直不变