`

Spring cloud zuul

阅读更多
什么是zuul

在微服务架构中,如何把拆分好的大量微服务服务对外提供统一的访问接口,从而将APP的具体实现细节对使用透明化是一个共同的挑战,Netflix zuul可以完美的解决这个问题。可以把它看做是微服务架构的门户,把请求代理到对应的后台应用,能够使浏览器、手机APP、或者是应用接口访问分布在不同主机的服务而不用考虑跨域访问问题( CORS)。zuul能够和其他的Netflix组件结合使用,如Hystrix一起提供熔断机制,利用Eureka做服务发现,也能够用来做路由过滤,负载均衡等。

应用

1. API网关模式



特点
  • 通过增加API网关使得客户端和具体的实现隔离开来
  • 客户端不用关心具体的服务部署的位置
  • 可以把合并逻辑放在API网关层来减少客户端复杂性
  • 引入网关层增加了系统的复杂性
  • 相比直接访问,因为追加了一层路由跳跃,响应时间会增加


简单路由
zuul:
  routes:
    get:
      path: /portal/**
      url: http://portal
    links:
      path: /bd/**
      url: http://bdip
    images:
      path: /sd/**
      url: http://sd
ribbon:
  eureka:
    enabled: false


上面的配置中包含三个命名路由,每个都包含一个path和一个url,其中path定义了在zull server中匹配的路径,path定义了所代理的服务的URL。

追加负载均衡
因为spring cloud zuul已经和客户端负载均衡组件ribbon,所以可以很方便的实现集成,我们只需要把它们启用就可以了。

zuul:
  routes:
    portal:
      path: /**
      serviceId: portal

portal:
  ribbon:
    listOfServers: http://portal1.http://portal2

ribbon:
  eureka:
    enabled: false



利用服务发现

zuul:
  routes:
    portal:
      path: /portal/**
      serviceId: portal

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URL:http://user:password@localhost:5000}/eureka/


其中portal就是真正的服务在eureka中的名字

2. 动态路由

  zuul内置framework支持动态的read, compile, and run filters,


private void initGroovyFilterManager() {
        FilterLoader.getInstance().setCompiler(new GroovyCompiler());

        String scriptRoot = System.getProperty("zuul.filter.root", "");
        if (scriptRoot.length() > 0) scriptRoot = scriptRoot + File.separator;
        try {
            FilterFileManager.setFilenameFilter(new GroovyFileFilter());
            FilterFileManager.init(5, scriptRoot + "pre", scriptRoot + "route", scriptRoot + "post");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


package filters.pre

import com.netflix.zuul.ZuulFilter
import com.netflix.zuul.context.RequestContext

/**
 * @author mhawthorne
 */
class PreDecorationFilter extends ZuulFilter {

    @Override
    int filterOrder() {
        return 5
    }

    @Override
    String filterType() {
        return "pre"
    }

    @Override
    boolean shouldFilter() {
        return true;
    }

    @Override
    Object run() {
        RequestContext ctx = RequestContext.getCurrentContext()

        // sets origin
        ctx.setRouteHost(new URL("http://httpbin.org"));

        // sets custom header to send to the origin
        ctx.addOriginResponseHeader("cache-control", "max-age=3600");
    }

}

3. zuul filter



4.配置重试:

@EnableZuulProxy->ZuulProxyConfiguration->HttpClientRibbonConfiguration(默认)->HttpClientRibbonCommandFactory创建HttpClientRibbonCommand(利用SpringClientFactory创建RetryableRibbonLoadBalancingHttpClient(调用execute方法是委托给RetryTemplate,若是发生Hystrix times out,则直接返回500,所以The hystrix timeout needs to be slightly greater than the aggregate timeouts of the original request and all retries(hsytrix timeout 需要比 原始请求时间*单个server的总请求次数*总请求server个数 的结果要长,总的请求次数为1+最大重试次数:MaxAutoRetries,总请求server个数为1+最大请求server个数:MaxAutoRetriesNextServer);在executeWithRetry方法中调用loadBalancedRetryPolicyFactory.create方法创建重试策略LoadBalancedRetryPolicy,此类的registerThrowable方法中,当同一个instance重试的次数达到最大值,并且能重试下一个instance时(nextServerCount<=设定的最大重试次数,如果成立LoadBalancedRetryPolicy类重新调用RetryableRibbonLoadBalancingHttpClient.choose()方法,委托调用ZoneAwareLoadBalancer.chooseServer(serverId)方法,在不分zone的时候,调用BaseLoadBalancer.chooseServer(serverId),之后委托调用PredicateBasedRule.choose(key),采用RoundRobin的方法获取下一个实例;否则调用LoadBalancedRetryContext.setExhaustedOnly()方法将RetryContextSupport中的terminate设置成true,retryTemplate退出doExecute的while循环,整个重试结束),配置信息如下


spring:
  application:
    name: zuul-gateway

server:
  port: 8989

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    leaseRenewalIntervalInSeconds: 10
    metadataMap:
      instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}}
      cluster: MAIN
zuul:
  routes:
    mcsas_bd:
      path: /UserServer/**
      serviceId: UserServer
      retryable: true
management:
  security:
    enabled: false

ribbon:
    MaxAutoRetriesNextServer: 1
    MaxAutoRetries: 1
    ReadTimeout: 3000
    OkToRetryOnAllOperations: true #false to only allow get to retry

hystrix:
  command:
    mcsas_bd:
      execution:
        isolation:
          strategy: THREAD
          thread:
            timeoutInMilliseconds: 13000


5.配置信息对应的类ZuulProperties,例如修改zuulServlet对应的path,可以在application.yml 文件中设置 zuul.servletPath=/
  • 大小: 26.5 KB
  • 大小: 13.7 KB
分享到:
评论

相关推荐

    spring cloud zuul

    **Spring Cloud Zuul** 是一个基于 Spring Framework 和 Netflix Zuul 的边缘服务工具,它作为微服务架构中的边缘服务器,提供动态路由、流量控制、安全、监控等功能。Zuul 主要是作为 API 网关,它负责处理所有来自...

    springcloud zuul网关服务

    SpringCloud Zuul是基于Spring Cloud框架的一个核心组件,它扮演着API网关的角色,负责路由转发、过滤器处理以及安全控制等任务。Zuul的主要功能包括动态路由、过滤器机制、安全控制、负载均衡、健康检查等。下面将...

    SpringCloud zuul jar包

    SpringCloud Zuul是Spring Cloud生态系统中的一个边缘服务和API网关组件。它的主要功能是作为微服务架构中的统一入口,负责路由转发、过滤器处理、负载均衡以及安全控制等任务。Zuul允许开发者在微服务架构中实现...

    详解Spring Cloud Zuul重试机制探秘

    Spring Cloud Zuul重试机制探秘 Spring Cloud Zuul 是一个基于 Netflix Zuul 的路由器和服务器端负载均衡器,它提供了动态路由、监控、弹性扩展、安全等功能。 Zuul 的重试机制是指在请求失败的情况下, Zuul 会...

    springcloud zuul gateway 服务网关

    SpringCloud Zuul Gateway 服务网关是Spring Cloud生态系统中的一个重要组件,它主要负责微服务架构中的路由转发和过滤器功能。Zuul是Netflix开源的一个边缘服务,而Gateway则是Spring Cloud针对Zuul进行的升级版,...

    Springcloud Zuul config eureka ribbon实例

    在本实例中,我们主要探讨的是Spring Cloud框架中的几个关键组件——Zuul、Config、Eureka和Ribbon,这些都是微服务架构中的重要工具。让我们逐一解析这些组件及其作用。 首先,Spring Cloud Config是一个集中式的...

    微服务 Springcloud Zuul

    Zuul是Spring Cloud生态中的一个关键组件,它扮演着边缘服务的角色,负责微服务间的路由转发和过滤器功能。本文将深入探讨Spring Cloud Zuul在微服务架构中的应用和重要性。 1. **Zuul简介** Zuul是Netflix开源的...

    spring cloud 客户端和spring cloud zuul

    spring cloud 客户端和spring cloud zuul ,和前面的两个是一个系列,先打开cloud service 的服务,然后打开 product ,在打开客户端,最后可以打开zuul 可以实现eurake的负载均衡,zuul的负载均衡。

    Spring Cloud Zuul动态路由demo

    本篇文章将深入探讨如何使用Spring Cloud Zuul实现动态路由,并通过实际的代码示例——"Spring Cloud Zuul动态路由demo"来展示这一功能。 1. **Zuul简介** Zuul是Netflix开源的一个边缘服务,主要功能包括路由转发...

    《深入理解Spring Cloud与微服务构建》学习笔记(十七)~路由网关Spring Cloud Zuul~负载均衡

    在本篇学习笔记中,我们将深入探讨Spring Cloud框架中的一个重要组件——Spring Cloud Zuul,它作为微服务架构中的路由网关和负载均衡器。Spring Cloud是基于Java的微服务工具集,它为开发者提供了在分布式系统(如...

    spring cloud zuul 使用

    Spring Cloud Zuul是Spring Cloud生态系统中的一个边缘服务和API网关组件。它作为一个过滤器路由,为微服务架构提供统一的入口,同时处理预处理、安全、限流等功能。这篇博客文章“Spring Cloud Zuul使用”可能详细...

    06Spring Cloud Zuul:API网关服务1

    Spring Cloud Zuul:API网关服务详解 Spring Cloud Zuul 是 Spring Cloud Netflix 子项目的核心组件之一,可以作为微服务架构中的 API 网关使用,支持动态路由与过滤功能。API 网关为微服务架构中的服务提供了统一...

    springcloud zuul 网关实现源码

    springcloud zuul 网关开发实践,模拟了在Spring Cloud微服务系统中,客户端的请求首先经过负载均衡(zuul、Ngnix),再到达服务网关(zuul集群),然后再到具体的服的实现过程。

    《深入理解Spring Cloud与微服务构建》学习笔记(十六)~路由网关Spring Cloud Zuul

    在本篇学习笔记中,我们将深入探讨Spring Cloud框架中的一个重要组件——Spring Cloud Zuul,它是一个强大的路由网关。Zuul的主要职责是为微服务架构提供统一的入口,进行请求过滤、路由转发等操作,使得后端服务对...

    Spring Cloud Zuul带注册中心Consul

    Spring Cloud Zuul是基于Spring Boot实现的微服务网关,它提供路由转发、过滤器等功能,使得客户端可以方便地访问到后端微服务。在这个示例中,Zuul与Consul结合,使得Zuul能够动态地发现注册在Consul中的服务,实现...

    《深入理解Spring Cloud与微服务构建》学习笔记(十八)~路由网关Spring Cloud Zuul~熔断器

    在深入探讨Spring Cloud和微服务构建的过程中,Spring Cloud Zuul是一个关键组件,它扮演着路由网关和熔断器的角色。本文将详细讲解Zuul的功能、原理以及如何在Spring Boot应用中集成和配置。 首先,Spring Cloud ...

    使用SpringCloud Zuul Proxy构建API网关.docx

    Spring Cloud Zuul Proxy 是一个非常流行的工具,用于构建这样的 API 网关。在本文中,我们将深入探讨如何使用 Spring Cloud Zuul Proxy 实现 API 网关,并分析其优点和缺点。 **为什么要使用 API 网关?** API ...

    第六章 SpringCloud Zuul网关.pdf

    Spring Cloud Zuul网关 Spring Cloud Zuul网关是微服务架构中的一种网关解决方案,主要用于解决微服务之间的调用和路由问题。在本章节中,我们将了解Zuul网关的基本概念和使用方法,以及如何将其应用于微服务架构...

Global site tag (gtag.js) - Google Analytics