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-server/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-user/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(); 
  }
   }

到此这篇关于Spring Cloud详细讲解zuul集成Eureka流程的文章就介绍到这了,更多相关Spring Cloud Eureka内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Spring Cloud详细讲解zuul集成Eureka流程的更多相关文章

  1. ios – Swift Eureka Form中的循环

    我正在构建一个Eureka表单,并希望在表单中放置一个循环来构建基于数组的步进器列表.我试图使用的代码是:但是,当我这样做时,我在StepperRow行上出现了一个错误:所以看起来Swift不再认为它在形式之内并且正在关注

  2. [快速学会Swift第三方库] Eureka篇

    [快速学会Swift第三方库]Eureka篇Eureka可以帮你简单优雅的实现动态table-view表单。目录快速学会Swift第三方库Eureka篇目录编码之前导入Eureka其他操作创建表单基础表单选择类型表单Segment风格选择器标准选择器pickerView风格选择器三种风格选择器效果对比带输入框的表单自定义Row深入学习编码之前导入Eureka推荐使用CocoaPods进行导入,CocoaPods是一个负责管理iOS项目中第三方开源库的工具,安装CocoaPods之后使用命令行就能轻松地对所

  3. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

  4. SpringCloud超详细讲解微服务网关Zuul基础

    这篇文章主要介绍了SpringCloud Zuul微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. Spring Batch批处理框架操作指南

    Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作,这篇文章主要介绍了Spring Batch批处理框架操作指南,需要的朋友可以参考下

  6. Spring详细讲解@Autowired注解

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入

  7. 使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. Spring Security认证器实现过程详解

    一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制,这篇文章主要介绍了Spring Security认证器实现过程,需要的朋友可以参考下

  9. spring学习JdbcTemplate数据库事务管理

    这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. Spring Boot 集成Redisson实现分布式锁详细案例

    这篇文章主要介绍了Spring Boot 集成Redisson实现分布式锁详细案例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

随机推荐

  1. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  3. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  4. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  5. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  8. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

返回
顶部