首页 > 编程知识 正文

路由器keepalive配置,springcloud五大神兽

时间:2023-05-05 03:02:47 阅读:136110 作者:4071

一、什么是Zuul? Zul是Netflix OSS的一员,基于JVM 路由器服务端的负载均衡器。 提供路由、监视、灵活性和安全性等服务框架。 zul可以与Eureka、Ribbon、Hystrix等组件协作。

zul核心功能是过滤器、路由、异常处理,通过过滤器还可以扩展其他功能:

1 )动态路由,2 )监控要求,3 )认证,4 )压力测试,5 )灰阶发布

二、Zuul根配置1 .在创建项目之前的项目中,创建新的springboot项目: zuul-server,并继承parent。

部署依赖关系:

! ----eureka-client---- dependencygroupidorg.spring framework.cloud/groupidartifactidspring-cloud-starter-Netflix---zuul-- dependencygroupidorg.spring framework.cloud/groupidartifactidspring-cloud-starter-Netflix-zul/artfactidspring-starter-Netflix-zul/artfactidspring

spring-cloud-starter-netflix-zuul:2.2.x 和Spring Boot 2.5.x之间的Spring 版本冲突

Spring Boot 2.4之后不支持zuul(改用Gateway)

项目开始失败了。 请告诉我解决方法

2 .配置路由规则Zuul集成到Eureka后,实际上可以对Eureka中的所有服务执行路由操作。 默认传输规则为“API网关地址访问的服务名接口URI”。

配置文件如下。

server.port=8088 # server.servlet.context-path=/zul-demo spring.application.name=zuul-servereureka.cliclit zuul.routes.client-provider-server.path=/client-provider/* * # URL映射# zul.routes.client-provider名称映射zuul.routes.client-provider-server.service-id=client-provider-server启动程序

3.Zuul过滤器的介绍和使用Zuul中的过滤器与以前使用的javax.servlet.Filter不同。 javax.servlet.Filter只有一种类型可以通过配置urlPatterns侦听相应的请求。

可以在路由请求之前调用过滤器类型使用场景pre。 适用于验证场景,验证通过后,继续下一个过程。 在路由请求时调用route。 它适用于灰度发布场景,并允许您在路由时创建定制的逻辑。 在error处理请求时发生错误时调用。 在执行过程中发送错误时,将进入error过滤器,可以汇总记录错误消息。 post在route和error过滤器之后调用。 在请求路由到达特定服务后执行此类筛选。 适用于需要添加响应标头或记录响应日志的APP应用场景。 过滤器执行生命周期

在上图中,可以清楚地看到执行的顺序。 收到请求后,先去pre过滤器,再去routing过滤器,最后去post过滤器。 如果任意一个过滤器有异常,就会进入error过滤器。

自定义Zuul过滤器如下所示,代码说明将写入注释中

import com.net flix.zuul.zuulfilter; import com.net flix.zuul.context.request context; import com.net flix.zuul.exception.zuulexception; import org.apache.commons.lang。

StringUtils;import javax.servlet.http.HttpServletRequest;/** * 自定义过滤器 */public class MyAccessFilter extends ZuulFilter { /** * 过滤器类型,可选值有 pre、route、post、error。 * * @return */ @Override public String filterType() { return "pre"; } /** * 通过int值来定义过滤器的执行顺序 * 过滤器的执行顺序,数值越小,优先级越高。 * * @return */ @Override public int filterOrder() { return 0; } /** * 是否执行该过滤器,true 为执行,false 为不执行 * 这个也可以利用配置中心来实现,达到动态的开启和关闭过滤器。 * 配置文件中禁用过滤器: * 【zuul.过滤器的类名.过滤器类型.disable=true,如:zuul.MyAccessFilter.pre.disable=true】 * * @return */ @Override public boolean shouldFilter() { return true; } /** * 过滤器具体逻辑 * * @return * @throws ZuulException */ @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); HttpServletRequest request = ctx.getRequest(); System.out.println(String.format("%s AccessFilter request to %s", request.getMethod(), request.getRequestURL().toString())); String accessToken = request.getParameter("accessToken"); // 有权限令牌 if (!StringUtils.isEmpty(accessToken)) { // 设置是否路由到服务 ctx.setSendZuulResponse(true); ctx.setResponseStatusCode(200); // 设置下一个过滤器是否执行,当为 true 的时候,后续的过滤器才执行,若为 false 则不执行。 ctx.set("isSuccess", true); } else { ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401); ctx.setResponseBody("{"result":"accessToken is not correct!"}"); //可以设置一些值 ctx.set("isSuccess", false); } return null; }}

配置过滤器

import com.local.springboot.zuul.zuulserver.filter.MyAccessFilter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class FilterConfiguration { @Bean public MyAccessFilter myAccessFilter(){ return new MyAccessFilter(); }}

访问:http://localhost:8088/client-provider/api/provider

重新访问:http://localhost:8088/client-provider/api/provider?accessToken=12358

异常处理

与Spring Boot中用 @ControllerAdvice 注解统一异常处理不同,@ControllerAdvice 注解主要用来针对 Controller 中的方法做处理,作用于 @RequestMapping 标注的方法上,只对我们定义的接口异常有效,在 Zuul 中是无效的。

我们可以定义一个 error 过滤器来记录异常信息或者通过实现ErrorController 的方式处理异常。

public class ErrorFilter extends ZuulFilter { private Logger log = LoggerFactory.getLogger(ErrorFilter.class); @Override public String filterType() { return "error"; } @Override public int filterOrder() { return 10; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); Throwable throwable = ctx.getThrowable(); log.error("Filter Erroe : {}", throwable.getCause().getMessage()); return null; }} 动态路由

Zuul 实现动态路由,是因为Zuul 集成的有负载均衡、有负载均衡的效果。详情请戳SpringCloud入门 —— Ribbon负载均衡

创作不易,关注、点赞就是对作者最大的鼓励,欢迎在下方评论留言
欢迎关注微信公众号:键指JAVA,定期分享Java知识,一起学习,共同成长。

« 上一章:SpringCloud入门 —— Ribbon负载均衡
» 下一章:SpringCloud入门 —— SSO 单点登录

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。