IT教程 ·

Spring Cloud(六):效劳网关zuul

经过过程前面几篇文章的引见,Spring Cloud微效劳架构可经过过程Eureka完成效劳注册与发明,经过过程Ribbon或Feign来完成效劳间的负载平衡挪用,经过过程Hystrix来为效劳挪用供应效劳降级、熔断机制防止雪崩效应,经过过程Spring Cloud Config完成效劳设置的集中化治理。微效劳架构内部治理的基础组件差不多都已涵盖了,然则我们的效劳最终是须要供应给客户端接见的,客户端怎样来接见这些微效劳,就须要引入一个叫效劳网关的组件了。

zuul

zuul是netflix供应的一个基于JVM的路由与效劳端负载平衡器。它在客户端与后端效劳之间建立了一道关卡,客户端一切要求必需经过zuul转发到后端对应的微效劳,返回效果再经过zuul返回给客户端。zuul与Eureka,Config组合的基础构造如图

Spring Cloud(六):效劳网关zuul IT教程 第1张

zuul作为Eureka Client从Eureka Server猎取别的微效劳的设置信息,从而能够将客户端要求经过过程Service ID来负载平衡地转发到后端的效劳实例,同时也作为Config Client从Config Server猎取本身所需的设置信息。

在netflix内部,zuul被用来完成平安认证、动态路由、反向代办、效劳迁徙、效劳削峰、压力测试、金丝雀测试(灰度宣布测试)等功用。本文引见zuul的基础运用与路由划定规矩。

基础运用

建立maven项目 springcloud-zuul

1.pom.xml中引入依靠 spring-cloud-starter-netflix-zuul

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

2.application.yml设置文件中增加必要的设置,主假如eureka客户端设置

spring:
  application:
    name: zuul-server

server:
  port: 8765

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

3.启动类增加注解 @EnableZuulProxy

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

自始自终的简朴,Spring Cloud之所以盛行就是由于它基于Spring Boot将一些通用的功用举行了开箱即用的封装,使得开发者简朴几步就可以疾速集成一个微效劳框架。

顺次启动前文所建立的springcloud-eureka, springcloud-config, springcloud-eureka-client, springcloud-zuul,http://localhost:8765/hello-service/hello 返回 Hello, welcome to spring cloud. env: hello-service-dev, value: hello-service-dev 可见经过过程zuul的要求转发到了hello-service。

为了考证zuul转发要求具有负载平衡的才能,能够将springcloud-eureka-client 中的hello接口返回值做一些调解,并转变端口重启一个实例,再次要求http://localhost:8765/hello-service/hello 将能看到返回效果在两者之间切换。

以上设置文件中并没有加任何路由设置,zuul是怎样将要求准确转发到对应的微效劳的呢? 请看下面的路由划定规矩。

路由划定规矩

1.默许路由划定规矩

zuul供应了默许的路由划定规矩,不须要任何设置就会默许将注册的效劳举行途径映照。我们能够经过过程actuator供应的接口来检察,在application.yml中增加设置

management:
  endpoints:
    web:
      exposure:
        include: "*"

摊开actuator的别的接口接见(默许只摊开了/info 与/health接口), 浏览器中接见 http://localhost:8765/actuator/routes, 能够看到返回的zuul默许的路由映照关联

Spring Cloud(六):效劳网关zuul IT教程 第2张

zuul默许将 /service-id/** 的要求路由到Service ID(即spring.application.name的值)为 service-id的效劳,如 /hello-service/hello,将转发到hello-service效劳的/hello接口。

2.自定义路由划定规矩

我们看到zuul的默许路由划定规矩将config-server也映照出来了,关于这类内部效劳我们不愿望暴露,则能够经过过程 zuul.ignoredServices 来举行屏障,在application.yml设置文件中增加

zuul:
  ignored-services: "config-server"

重启,再次检察http://localhost:8765/actuator/routes , config-server已被屏障了。

经过过程zuul.routes可增加自定义路由,能够有 zuul.routes.{route-name}.path + zuul.routes.{route-name}.serviceId或urlzuul.routes.{service-id}: path 两个花样, 以下

zuul:
  ignored-services: "config-server"
  routes:
    hello:
      path: /hi/**
      serviceId: hello-service
    hello-service: /hi2/**
    jboost:
      path: /jboost/**
      url: http://blog.jboost.cn

接见 http://localhost:8765/hi/hello 或 http://localhost:8765/hi2/hello 都将路由到 hello-service的hello接口,接见 http://localhost:8765/jboost/ 将接见到jboost博客首页。增加自定义路由后,默许路由依然存在, 你依然能够经过过程 http://localhost:8765/hello-service/hello 来接见 hello-service的hello接口。

默许的路由划定规矩将Service ID作为婚配途径,看起来有点长,我们想将婚配途径收缩一点,比方hello-service的婚配途径想改成 /hello/**, 而不是/hello-service/**, 假如像上面设置,一个微效劳体系大概触及几十以至上百个效劳,那设置起来将是一场恶梦。别急, zuul供应了 ServiceRouteMapper 接口来处理这一问题,个中 PatternServiceRouteMapper 能够基于正则表达式来举行路由抽取。

建立一个设置类,注入一个 PatternServiceRouteMapper 的bean,以下

@Configuration
public class ZuulConfiguration {

    @Bean
    public PatternServiceRouteMapper serviceRouteMapper() {
        return new PatternServiceRouteMapper(
                "(?<name>^.+)-(?<postfix>.+$)",
                "${name}");
    }
}

该完成将会对一切效劳的路由举行调解,service id 形如 name-postfix的婚配途径为 /name/**, 如hello-service 婚配 /hello/**。 假如正则表达式婚配失利,则还是以默许划定规矩举行路由,假如婚配胜利,则默许划定规矩失效,但在设置文件中定义的路由依然有用。上述考证中,你都能够经过过程 http://localhost:8765/actuator/routes 来检察当前见效的路由。

别的设置

zuul运用Ribbon来定位效劳实例,一切要求都在hystrix command里实行,所以在zuul中能够增加Ribbon, Hystrix相干设置(详细参考前面Ribbon、Hystrix相干文章)

  • zuul.ignoredPatterns 对某些途径举行屏障,如 /**/admin/** 将会屏障一切途径中包含admin的接口接见
  • zuul.sensitiveHeaders 对一些header举行过滤,不传递给后端效劳,默许包含Cookie,Set-Cookie,Authorization, 假如要让zuul发送一切header,则须要显式地将sensitiveHeaders置空值
  • zuul.prefix 为一切映照增加前缀,如/api, 如许route里配的 /myusers/** 就可以婚配客户端要求的/api/myusers/**。默许zuul代办在转发时,前缀会被移除,经过过程设置zuul.stripPrefix=false可不移除

总结

本文简朴引见了zuul的基础运用与路由划定规矩,更高阶的运用我们背面继承。
仔细生活,快活分享

参与评论