美文网首页
SpringCloud之服务网关Zuul(一)

SpringCloud之服务网关Zuul(一)

作者: 千年城的羁绊 | 来源:发表于2019-02-28 19:29 被阅读0次

Zuul简介

Zuul的核心是一系列的过滤器,主要完成以下功能:
1.身份认证与安全
2.审查与监控
3.动态路由
4.压力测试
5.负载分配
6.静态相应处理
7.多区域弹性

Zuul使用

1、创建maven工程,添加pom.xml依赖
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>   
        
        <!-- 注册到eureka上 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Edgware.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
2、增加启动类,添加@EnableZuulProxy注解,声明zuul代理,该代理使用Ribbon来定位注册在EurekaServer中的微服务;同时,该代理还整合了Hystrix,从而实现了容错,所有经过Zuul的请求都会在Hystrix命令中执行。
@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
    
}
3、编写配置文件
server:
  port: 8040
spring:
  application: 
    name: gateway-zuul
management:
  security:
    enabled: false
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true

默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:
http://zuul_host:port/微服务在eureka上的serviceId/* 会被转发到serviceId对应的微服务。

管理端点

当@EnabledZuulProxy 与Spring Boot Actuator配合使用时,Zuul会暴露两个端点:/routes和/filters。借助>这些断点,可方便、直观地查看以及管理Zuul。

访问:http://zuul_host:port/routes?format=details,展示注册到Eureka上的服务详情

{
    "/provider-user/**":{
        "id":"provider-user",
        "fullPath":"/provider-user/**",
        "location":"provider-user",
        "path":"/**",
        "prefix":"/provider-user",
        "retryable":false,
        "customSensitiveHeaders":false,
        "prefixStripped":true
    }
}

访问:http://zuul_host:port/filters,展示error、post、pre、route四种类型过滤器有哪些,以及执行顺序、是否启用等信息。

{
    "error":[
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter",
            "order":0,
            "disabled":false,
            "static":true
        }
    ],
    "post":[
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter",
            "order":1000,
            "disabled":false,
            "static":true
        }
    ],
    "pre":[
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter",
            "order":1,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.pre.FormBodyWrapperFilter",
            "order":-1,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter",
            "order":-2,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.pre.ServletDetectionFilter",
            "order":-3,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.pre.PreDecorationFilter",
            "order":5,
            "disabled":false,
            "static":true
        }
    ],
    "route":[
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter",
            "order":100,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter",
            "order":10,
            "disabled":false,
            "static":true
        },
        {
            "class":"org.springframework.cloud.netflix.zuul.filters.route.SendForwardFilter",
            "order":500,
            "disabled":false,
            "static":true
        }
    ]
}

路由配置

1.自定义指定微服务访问路径
zuul:
  routes:
    serviceId(替换真实serviceId): /访问路径/**

完成设置后,serviceId微服务就会被映射到 /访问路径/**路径

2.忽略指定微服务
zuul:
  ignored-services: serviceId1,serviceId2

完成设置后,zuul忽略这两个微服务,只代理其他微服务

3.忽略所有微服务,只代理指定微服务
zuul:
  ignored-services: '*'
  routes:
    serviceId(替换真实serviceId): /访问路径/**

完成设置后,zuul只代理serviceId微服务

4.同时指定微服务的serviceId和对应路径或者url和路径
zuul:
  routes:
    user-route: /**user-route只是给路由起个名字*/
      service-id: serviceId /**service-id为注册Eureka微服务*/
      path: /访问路径/* 

配置效果同示例1

5.同时指定path和url
zuul:
  routes:
    user-route: /**user-route只是给路由起个名字*/
      url: http://localhost:8080/
      path: /访问路径/* 

完成配置后将 /访问路径/** 映射到http://localhost:8080/** 上,但注意这种方式不会作为Hystrix命令执行,也不能使用Ribbon来负载均衡多个url,示例6可以解决

6.同时指定path和url,并且不破坏Zuul的Hystrix和Ribbon特性
zuul:
  routes:
    user-route: /**user-route只是给路由起个名字*/
      path: /访问路径/* 
      service-id: serviceId
ribbon:
  eureka:
    enabled: false #为Ribbobn禁用Eureka#
serviceId:
  ribbon:
    listOfServices: localhost:8080,localhost:8081
7.使用正则表达式指定zuul的路由匹配规则
@Bean
public PatternServiceRouteMapper serviceRouteMapper() {
    //第一个参数指定微服务正则
    //第二个参数指定路由正则
    return new PatternServiceRouteMapper("(?<name>^.+)-(?<version>v.+$)", "${version}/${name}");
}
8.路由前缀
zuul:
  prefix: /api
  strip-prefix: false
  routes:
    serviceId(替换真实serviceId): /访问路径/**

示例1:访问Zuul的/api/serviceId/1路径的请求会被转发到serviceId 的/api/1

zuul:
  routes:
    serviceId(替换真实serviceId): 
      path: /访问路径/**
      strip-prefix: false

示例2: 访问zuul的/访问路径/1 会被转发到 serviceId的 /访问路径/1

9.忽略某些路径
zuul:
  ignoredPatterns: /**/admin/**
  routes:
    serviceId(替换真实serviceId): /访问路径/**

可以将微服务映射到 /访问路径/**路径,但会忽略微服务中包含/admin/的路径。

10.本地转发
zuul:
  routes:
    route-name:
      path: /path-a/**
      url: forward:/path-b

完成配置访问Zuul的/path-a/,将会转发到Zuul的/path-b/

可以将com.netflix包的日志级别设为DEBUG,这样zuul就会打印转发的所有细节,更好的排查问题和理解路由的规则

logging:
  level:
    com.netflix: DEBUG

相关文章

网友评论

      本文标题:SpringCloud之服务网关Zuul(一)

      本文链接:https://www.haomeiwen.com/subject/ztbquqtx.html