大家好,又见面了,我是你们的朋友全栈君。
Zuul介绍
Zuul与Spring Cloud Gateway作用差不多,推荐还是使用Spring Cloud Gateway
,毕竟是Spring家族的,优先级高一些。他们都和Nginx一样,主要是用于服务器的反向代理;只要是反向代理,那么久可以提供路由、监控、弹性、安全等功能;一般也是说是网关,因为数据的入口都从这么流入流出。
Zuul 的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:
- 动态路由 动态地将客户端的请求路由到后端不同的服务,做一些逻辑处理,比如聚合多个服务的数据返回。
- 请求监控 可以对整个系统的请求进行监控,记录详细的请求响应日志,可以实时统计出当前系统的访问量以及监控状态。
- 认证鉴权 对每一个访问的请求做认证,拒绝非法请求,保护好后端的服务。
- 压力测试 压力测试是一项很重要的工作,像一些电商公司需要模拟更多真实的用户并发量来保证重大活动时系统的稳定。通过 Zuul 可以动态地将请求转发到后端服务的集群中,还可以识别测试流量和真实流量,从而做一些特殊处理。
- 灰度发布 灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
Zuul 简单使用
添加依赖配置,修改pom.xml文件
代码语言:javascript复制 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
添加配置信息,修改文件application.properties
代码语言:javascript复制spring.application.name=zuul-demo
server.port=2103
zuul.routes.test.path=/test/* zuul.routes.test.url=http://192.168.1.244:8081
激活zuul,添加启动注解@EnableZuulProxy
@EnableZuulProxy
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
测试,应用主机rest服务接口
测试代理网关
集成 Eureka,使用注册服务名称转发
修改文件application.properties
代码语言:javascript复制spring.application.name=zuul-demo
server.port=2103
#zuul.routes.test.path=/test/* #zuul.routes.test.url=http://192.168.1.244:8081 eureka.client.serviceUrl.defaultZone=http://192.168.1.244:8761/eureka/
启动Eureka
测试网关
Zuul路由配置
默认的转发规则就是API 网关地址 访问的服务名称 接口 URI
默认规则举例:
- API 网关地址:http://localhost:2103。
- 用户服务名称:user-service。
- 用户登录接口:/user/login。
eg. 上述我们访问的测试地址:http://localhost:2103/eureka-provider-app/hello
- 指定具体服务路由
zuul.routes.test.path=/test/* zuul.routes.test.url=http://192.168.1.244:8081
我们将服务/test开头的接口都转发到http://192.168.1.244:8081上
- 路由前缀 转发后的目标地址,加上前缀,如
zuul.prefix=v1.0
Zuul过滤器
基于Servlet实现过滤器,实现参考类com.netflix.zuul.http.ZuulServlet
,方法service
,流程如下图所示
对应代码
代码语言:javascript复制 try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
}
举例说明一下,定义一个token过滤器(随便找了一个实现类,如DebugFilter,仿写即可)
代码语言:javascript复制public class TokenFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String token = request.getHeader("H-TOKEN-X");
if (StringUtils.isBlank(token) || token.length() < 10) {
currentContext.setSendZuulResponse(false);
currentContext.getResponse().setContentType("application/json; charset=utf-8");
currentContext.setResponseBody("invalide token.");
}
return null;
}
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 1;
}
}
将对象注入到spring容器中
代码语言:javascript复制@Configuration
public class FilterConfig {
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
}
测试,Token成功案例
测试,Token失败案例
说明error类型,可以对异常进行处理,但是最终会跳转到/error uri
实际开发中参考例子开发即可,更升入理解可以研究类FilterProcessor
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170624.html原文链接:https://javaforall.cn