irpas技术客

【微服务~原始真解】Spring Cloud —— zuul集成 Eureka_桃花键神

未知 4312

🔎这里是【秒懂·云原生】,关注我学习云原生不迷路 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏??

👀专栏介绍

【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。

👀本期介绍

主要介绍Spring Cloud —— zuul集成 Eureka

文章目录 👀专栏介绍👀本期介绍zuul集成 EurekaZuul路由配置1. 指定具体服务路由2. 路由前缀 Zuul过滤器过滤器类型 使用过滤器

zuul集成 Eureka

通过刚才的示例,我们已经可以简单地使用 Zuul 进行路 由的转发了,在实际使用中我们通常是用 Zuul 来代理请 求转发到内部的服务上去,统一为外部提供服务。 内部服务的数量会很多,而且可以随时扩展,我们不可 能每增加一个服务就改一次路由的配置,所以也得通过 结合 Eureka 来实现动态的路由转发功能。 首先需要添加 Eureka 的依赖,代码如下所示。

<dependency> <groupId>org.springframework.cloud</groupId > <artifactId>spring-cloud- starter-netflix-eureka-client</artifactId> <version>2.2.9.RELEASE</version> </dependency>

说明:这里的eureka-client版本要使用 2.2.9.RELEASE,否则会报错!

启动类不需要修改,因为 @EnableZuulProxy 已经自带 了 @EnableDiscoveryClient。只需要在配置文件中增加 Eureka 的地址即可:

eureka: client: service-url: defaultZone: http://admin:1357@localhost:8761/eureka

重启服务,我们可以通过默认的转发规则来访问 Eureka 中的服务。访问规则是“网关服务地址+访问的服务名称 +接口 URI”。 如上面的访问改为: http://localhost:7000/ws-user-ser ver/user/23

Zuul路由配置

当 Zuul 集成 Eureka 之后,其实就可以为 Eureka 中所 有的服务进行路由操作了,默认的转发规则就是“网关 服 务地址+访问的服务名称+接口 URI”。 在给服务指定名称的时候,应尽量短一点,这样的话我 们就可以用默认的路由规则进行请求,不需要为每个服 务都定一个路由规则,这样就算新增了服务,API 网关 也不用修改和重启了。

1. 指定具体服务路由

我们可以为每一个服务都配置一个路由转发规则:

zuul: routes: #路由转发 ws-user-server: path: /api-user/**

上述代码将ws-user-server 服务的路由地址配置成了 api-user,也就是当需要访问 ws-user-server中的接口 时,我们可以通过 api-user/user/20 来进行。这其实就 是将服务名称变成了我们自定义的名称。 注意: /api-user/** 后面一定要配置两个星号,两个星 号表示可以转发任意层级的 URL,比如“/apiuser/user/1”。如果只配置一个星号,那么就只能转发 一级,比如“/api-user/user”。 默认的路由规则还适用!!!!

2. 路由前缀

有的时候我们会想在 API 前面配置一个统一的前缀,就可 以通过 Zuul 中的配置来实现:

zuul: prefix: /v1

上述访问地址变为: http://localhost:7000/v1/api-use r/user/20

Zuul过滤器 过滤器类型

Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可以通过配 置 urlPatterns 来拦截对应的请求。 而 Zuul 中的过滤器总共有 4 种类型,且每种类型都有对 应的使用场景。 1)pre 可以在请求被路由之前调用。适用于身份认证的场景, 认证通过后再继续执行下面的流程。 2)route 在路由请求时被调用。适用于灰度发布场景,在将要路 由的时候可以做一些自定义的逻辑。 3)post 在 route 和 error 过滤器之后被调用。这种过滤器将请 求路由到达具体的服务之后执行。适用于需要添加响应 头,记录响应日志等应用场景。 4)error 处理请求时发生错误时被调用。在执行过程中发送错误 时会进入 error 过滤器,可以用来统一记录错误信息。 请求生命周期

过滤器执行的顺序,请求发过来首先到 pre 过滤器,再 到 routing 过滤器,最后到 post 过滤器,任何一个过滤 器有异常都会进入 error 过滤器。 通过 com.netflix.zuul.http.ZuulServlet 也可以看出完整 执行顺序,ZuulServlet 类似 Spring-MVC 的 DispatcherServlet,所有的 Request 都要经过 ZuulServlet 的处理。 ZuulServlet 的service实现:

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { try { this.init((HttpServletRequest)servletReque st(HttpServletResponse)servletResponse); RequestContext context = RequestContext.getCurrentContext(); context.setZuulEngineRan(); try {this.preRoute(); } catch (ZuulException var13) { this.error(var13); this.postRoute(); return; }try {this.route(); } catch (ZuulException var12) { this.error(var12); this.postRoute(); return; }try {this.postRoute();} catch (ZuulException var11) { this.error(var11); } } catch (Throwable var14) { this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName())); } finally { RequestContext.getCurrentContext().unset() ; } } 使用过滤器

创建一个token验证的过滤器,继承抽象类ZuulFilter, 如下:

import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; public class TokenFilter extends ZuulFilter { /*** 过滤器类型,可选值有 pre、route、post、 error。* @return */ @Override public String filterType() { return "pre"; } /*** 过滤器的执行顺序,数值越小,优先级越高。 * @return */ @Override public int filterOrder() { return 0; } /*** 是否执行该过滤器,true 为执行,false 为不 执行,这个也可以利用配置中心来实现,达到动态的开启和 关闭过滤器。 * @return */ @Override public boolean shouldFilter() { return true; }/*** 执行自己的业务逻辑,判断是否 * @return * @throws ZuulException */ @Override public Object run() throws ZuulException { RequestContext requestContext=RequestContext.getCurrentCo ntext();String token= requestContext.getRequest().getHeader("tok en"); //如果token没传或 失效 if(null==token){ requestContext.setSendZuulResponse(false); //告诉 Zuul 不需要将当前请求转发到后端的服务了 requestContext.setResponseBody(" {code:0,msg:'返回给客户端的数据'}"); requestContext.getResponse().setContentTyp e("application/json; charset=utf-8"); }return null; } }

使过滤器生效:

@Configuration public class FilterConfig { @Bean public TokenFilter tokenFilter(){ return new TokenFilter(); } }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #微服务原始真解Spring #Cloud #zuul集成 #Eureka #zuul集成Eureka