SpringCloud项目(七)Zuul路由网关
3.7 Zuul路由网关
3.7.1 创建工程,配置pom.xml
创建maven module工程klblog-zuul-gateway,配置pom.xml依赖项
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- zuul路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
3.7.2 配置application.yml
server:
port: 8090
#网关名称
spring:
application:
name: klblog-zuul-gateway
eureka:
client:
serviceUrl:
defaultZone: http://eureka8051.com:8051/eureka/,http://eureka8052.com:8052/eureka/
instance:
instance-id: gateway-8090
prefer-ip-address: true
info:
app.name: klblog-zuul-gateway
company.name: www.klfront.com
build.artifactId: $project.artifactId$
build.version: $project.version$
#配置网关反向代理 针对消费者工程
zuul:
routes:
api-c:
path: /api/**
serviceId: klblog-consumer
api-c-f:
path: /api-feign/**
serviceId: klblog-consumer-feign
3.7.3 主启动类
@SpringBootApplication
@EnableZuulProxy // @EnableZuulProxy 开启Zuul网关代理
public class ZuulMainApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulMainApplication.class, args);
}
// 如需启用登录验证过滤器,请取消以下注释
// @Bean
// public TokenFilter accessFilter() {
// return new TokenFilter();
// }
}
/**
* 登录验证过滤器
*/
public class TokenFilter extends ZuulFilter {
public Object run() {
// 拦截参数执行业务逻辑
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String token = request.getParameter("token");
if (StringUtils.isEmpty(token)) {
// 直接不能够继续执行下面业务逻辑
ctx.setSendZuulResponse(false); // 不继续执行下面业务逻辑
ctx.setResponseStatusCode(500);// 不继续执行下面业务逻辑
ctx.setResponseBody("token is null");
return null;
}
// 继续正常执行业务逻辑
return null;
}
public boolean shouldFilter() {
return true; // 是否开启当前filter
}
@Override
public int filterOrder() {
return 0; // 过滤器优先级 数字越大 越优先执行大
}
@Override
public String filterType() {
return "pre";// 前置执行
}
3.7.4 测试
测试基于ribbon自定义负载均衡的consumer(每个provider服务连续5次后切换的轮询)
http://localhost:8090/api/category/discovery
测试基于feign的consumer(轮询 轮流访问8061和8062)
http://localhost:8090/api-feign/category/discovery
测试登录验证
3.7.5 应用场景说明
在设计中消费者工程是提供给外部访问的,因此这里klblog-zuul-gateway对相关的消费者工程进行路由映射了,而不关心服务提供者,否则结构就比较繁杂了。
上述示例中消费者工程是klblog-consumer和klblog-consumer-feign,这两个工程是在架构构建过程中的示例工程,使用他们来测试zuul网关主要暂时是没有别的consumer工程可用于测试。
按照klblog项目的功能模块文章、书评、知识百科、相册,实际可以设计4个consumer工程,对应4个provider微服务(每个微服务都可以部署多个实例实现集群,consumer以负载均衡方式访问其接口)为klblog-consumer-article、klblog-consumer-book、klblog-consumer-knowledge、klblog-consumer-photo。klblog-zuul-gateway则可以配置路由,通过类似 http://zuul.klfront.com/api-article、http://zuul.klfront.com/api-book、http://zuul.klfront.com/api-knowledge、http://zuul.klfront.com/api-photo的地址来访问4各消费者工程。
后续通过zuul-gateway与consumer共同完成验证与安全、动态路由、负载分配、静态响应处理、压力测试等功能,甚至consumer工程上针对controller集成swagger文档。
从而让provider工程则专注于业务功能和数据访问,并提供相关的接口。
3.7.6 网关选型,zuul的替代者Spring Cloud Gateway
由于zuul 1.x系列的性能问题,以及zuul 2.0未集成到Spring Cloud,Spring Cloud Gateway逐渐成为zuul的替代方案。由于准备使用IDEA基于SpringCloud 2.x对本项目代码框架进行重构,因此新的内容将不再这里展开。