目录
1、在start.spring.io中添加Web、Actuator、Zuul模块
4、在启动类中添加@EnableZuulProxy启动服务,并且注册自定义Filter位Bean
项目地址为:https://github.com/kevin-lihongmin/spring-cloud-project-kevin/tree/master/zuul-demo
在Spring Cloud Zuul官网上的一句话简介: Zuul is a JVM-based router and server-side load balancer from Netflix.Zuul是一个基于内存的路由器,是服务端的负载均衡器。主要功能包括:
Authentication:安全验证,基于filter实现
Stress Testing:压力测试
Dynamic Routing: 动态路由
Static Response handling: 静态资源处理,类似Nginx
1、在start.spring.io中添加Web、Actuator、Zuul模块
2、application.properties配置
为了理解方便把部分应该放到bootstrap.properties中的配置也放到了该配置中。需要注意:
zuul.routes.user-consumer中的user-consumer为注册到Eureka Server中的服务名称
# 服务注册名称 spring.application.name=zuul-gateway # 服务端口 server.port=8800 # 注册中心地址 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/,\ http://localhost:8760/eureka/,http://localhost:8759/eureka/ # 将IP注册到Eureka Server上,如果不配置就是机器的主机名 eureka.instance.prefer-ip-address=true # 默认路由规则是使用Eureka注册的服务名称 http://ZUULHOST:ZUULPORT/serviceId/** # 配置路由规则 zuul.routes.ribbon-user-consumer-eureka = /kevin-user/** # 忽略的服务 zuul.ignored-services=ribbon-provider
3、自定义Filter
在上面说到Zuul可以作为(Authentication:安全验证,基于filter实现)的实现,所以就自己写一个Filter继承自 ZuulFilter ,以实现服务请求的时候打印日志,当然也可以在这里做服务的安全验证等。需要实现多个Filter的时候,可以按照实现的filterOrder()方法返回的值进行排序这些后面再去深入研究。
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
public class PreRequestLogFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
System.out.print(String.format("send %s request to %s", request.getMethod(),
request.getRequestURL()));
return null;
}
}
4、在启动类中添加@EnableZuulProxy启动服务,并且注册自定义Filter位Bean
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
/**
* 路由Api gateway
* 默认路由规则为: http://ZUUL-HOST:ZUUL-PORT/serviceId/**
*
* @author kevin
* @date 2019/5/30 9:15
* @since 1.0
*/
@SpringBootApplication
@EnableZuulProxy
public class ZuulDemoApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulDemoApplication.class, args);
}
@Bean
public PreRequestLogFilter preRequestLogFilter(){
return new PreRequestLogFilter();
}
}
5、启动服务,查看路由规则
由于zuul只是做代理服务,所以需要将请求进行mapping到一个具体的注册到Eureka Server的注册中心的服务,选择了之前搭建过的ribbon-demo项目:地址为 Spring Cloud-Ribbon负载均衡实现中启动ribbon-provider和 ribbon-consumer-eureka两个服务。
需要注册:当在start.spring.io中添加zuul的时候,依赖添加了ribbon相关的包,并且zuul代理的服务需要引入ribbon,否则就会报错。刚开始搭建的时候就遇到了问题。
1)、服务启动之后,ribbon-consumer-rureka的服务访问地址为: http://localhost:8769/getRemoteUser/1
2)、添加zuul.routes.ribbon-user-consumer = /kevin-user/**
配置后,访问地址为:
http://localhost:8800/kevin-user/getRemoteUser/1
3)、去掉zuul.routes.ribbon-user-consumer = /kevin-user/**
配置后,默认路由规则是使用Eureka注册的服务名称 http://ZUULHOST:ZUULPORT/serviceId/**
,如我们要访问ribbon-user-consumer-eureka服务
,访问地址为:
http://localhost:8800/ribbon-user-consumer-eureka/getRemoteUser/1
6、自定义日志filter
当请求访问服务的时候,打印日志如下:
send GET request to http://localhost:8800/ribbon-user-consumer-eureka/getRemoteUser/1