springcloud+Zuul网关
springcloud + Zuul网关
1.Zuul简介
Zuul是spring cloud中的微服务网关。网关: 是一个网络整体系统中的前置门户入口。请求首先通过网关,进行路径的路由,定位到具体的服务节点上。
Zuul中提供了过滤器定义,可以用来过滤代理请求,提供额外功能逻辑。如:权限验证,日志记录等。
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
- 验证与安全保障: 识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
- 审查与监控: 在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
- 动态路由: 以动态方式根据需要将请求路由至不同后端集群处。
- 压力测试: 逐渐增加指向集群的负载流量,从而计算性能水平。
- 负载分配: 为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 静态响应处理: 在边缘位置直接建立部分响应,从而避免其流入内部集群。
- 多区域弹性: 跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
2.项目搭建
2.1 前置工作
1.Eureka server
https://blog.csdn.net/u013071014/article/details/111031306
2.服务提供者及消费者
https://blog.csdn.net/u013071014/article/details/111361176
2.2 Zuul的配置
1.在parent项目右键,New—> Maven Module,名称命名为springcloud-zuul
2.在springcloud-zuul的pom文件中新增依赖
<packaging>jar</packaging>
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
3.添加主启动类ZuulApplication.java,并使用@EnableEurekaClient注解和@EnableZuulProxy注解
package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(ZuulApplication.class, args);
}
}
4.配置application.yml
server:
port: 10000
spring:
application:
name: springcloud-zuul
zuul:
routes:
springcloud-service: #自定义的服务器名称
path: /springcloud-service/** #通过这个路径从外部访问服务器
service-id: springcloud-consumer1 #路由需要访问的服务名
host:
connect-timeout-millis: 10000
socket-timeout-millis: 60000
retryable: true
5.启动Eureka Server、Provider、consumer1、Zuul,call API测试
3.过滤器实现
Zuul可以进行请求过滤,自定义过滤器需要集成ZuulFilter,并使用@Component注解,交给spring容器管理。
package com.springcloud.filter;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
@Component
public class TestFilter extends ZuulFilter{
/**
* 当前filter是否生效;
* 默认为false
* 返回true代表开启filter
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 执行过滤的逻辑
*/
@Override
public Object run() throws ZuulException {
// TODO Auto-generated method stub
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
//TODO...
context.setResponseStatusCode(4000000);
context.setSendZuulResponse(false);
context.setResponseBody("XXX");
return null;
}
/**
* 过滤器类型
* pre 前置过滤,常用于身份验证、日志记录等
* route 路由后过滤
* error 异常过滤,常用于异常处理
* post 远程服务调用后过滤,常用于收集服务信息、统计服务性能指标等
*/
@Override
public String filterType() {
// TODO Auto-generated method stub
return "pre";
}
/**
* 同类型过滤器的执行顺序;值越小,执行优先级越高
*/
@Override
public int filterOrder() {
// TODO Auto-generated method stub
return 0;
}
}
4.容错处理
Zuul包含了Hystrix相关依赖,在Zuul工程中,默认提供了Hystrix Dashboard服务监控数据的(hystrix.stream),但是不会提供监控面板的界面展示。
Zuul的fallback容错处理逻辑,只针对timeout异常处理,当请求被Zuul路由后,只要服务有返回(包括异常),都不会触发Zuul的fallback容错逻辑。
因为对于Zuul网关来说,做请求路由分发的时候,结果由远程服务运算的。那么远程服务反馈了异常信息,Zuul网关不会处理异常,因为无法确定这个错误是否是应用真实想要反馈给客户端的。
package com.springcloud.fallback;
import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
@Component
public class TestFallBack implements FallbackProvider{
/**
* 当前fallback处理的是哪一个服务;
* return 返回的是服务名称
* 通配符“*”表示为所有服务提供容错处理。
*/
@Override
public String getRoute() {
// TODO Auto-generated method stub
return null;
}
/**
* 容错逻辑
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
// TODO Auto-generated method stub
return null;
}
}
5.源码地址
https://github.com/DamonLiu666/springcloud_test
本文地址:https://blog.csdn.net/u013071014/article/details/112004944
上一篇: 为什么说我们需要重新定义地方网站