SpringCloud第十章zuul路由网关

十、zuul路由网关

(了解内容,上面神仙打架,下面程序员遭殃)

1、概述简介

  • 官网资料

    • https://github.com/Netflix/zuul/wiki/Getting-Started
    • https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.2.1.RELEASE/reference/html/#router-and-filter-zuul
  • 是什么

    Zuul是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。
    Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。

    在这里插入图片描述

    API网关为微服务架构中的服务提供了统一的访问入口,客户端通过API网关访问相关服务。API网关的定义类似于设计模式中的门面模式,它相当于整个微服务架构中的门面,所有客户端的访问都通过它来进行路由及过滤。它实现了请求路由、负载均衡、校验过滤、服务容错、服务聚合等功能。
    在这里插入图片描述
    在这里插入图片描述

    Zuul包含了如下最主要的功能:
    代理+路由+过滤三大功能

  • 能干嘛

    • 路由

    • 过滤

    • 负载均衡

    • 灰度发布

      又称金丝雀发布

      起源是,矿井工人发现,金丝雀对瓦斯气体很敏感,矿工会在下井之前,先放一只金丝雀到井中,如果金丝雀不叫了,就代表瓦斯浓度高。

      在这里插入图片描述

    在灰度发布开始后,先启动一个新版本应用,但是并不直接将流量切过来,而是测试人员对新版本进行线上测试,启动的这个新版本应用,就是我们的金丝雀。如果没有问题,那么可以将少量的用户流量导入到新版本上,然后再对新版本做运行状态观察,收集各种运行时数据,如果此时对新旧版本做各种数据对比,就是所谓的A/B测试。新版本没什么问题,那么逐步扩大范围、流量,把所有用户都迁移到新版本上面来。

2、路由基本配置

  • 功能

    路由功能负责将外部请求转发到具体的服务实例上去,是实现统一访问入口的基础

  • 新建Module模块cloud-zuul-gateway9527

  • POM

     
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>mscloud</artifactId>
            <groupId>com.likun.springcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-zuul-gateway9527</artifactId>
    
    
    
        <dependencies>
            <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-netflix-zuul</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    
    </project>
     
    
  • YML

    server:
      port: 9527
    
    spring:
      application:
        name: cloud-zuul-gateway
    
    eureka:
      client:
        service-url:
          #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
          defaultZone: http://eureka7001.com:7001/eureka
      instance:
        instance-id: gateway-9527.com
        prefer-ip-address: true 
     
    
  • hosts修改

    127.0.0.1 myzuul.com

  • 主启动类**@EnableZuulProxy**

    package com.likun.springcloud;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
     
    @SpringBootApplication
    @EnableZuulProxy
    public class Zuul_9527_StartSpringCloudApp
    {
      public static void main(String[] args)
      {
       SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
      }
    }
     
    
  • 启动

    在这里插入图片描述

  • 测试

    • 不用路由 http://localhost:8001/paymentInfo

    • 启用路由 zuul映射配置+注册中心注册后对外暴露的服务名称+rest调用地址

      http://myzuul.com:9527/cloud-provider-payment/paymentInfo

3、路由访问映射规则

  • 工程microservicecloud-zuul-gateway-9527

  • 代理名称

    • YML

      before
      http://myzuul.com:9527/cloud-provider-payment/paymentInfo

       zuul:
        routes: # 路由映射配置
          mypayment.path: /mypayment/**                 #IE地址栏输入的路径
          mypayment.serviceId: cloud-provider-payment   #注册进eureka服务器的地址
      

      after
      http://myzuul.com:9527/weixin/paymentInfo

    • 此时问题

      • 路由访问OK http://myzuul.com:9527/weixin/paymentInfo
      • 原路径访问OK http://myzuul.com:9527/cloud-provider-payment/paymentInfo
  • 如果不想使用默认的路由规则,可以添加以下配置来忽略默认路由配置

  • 原有真实服务名忽略

    • YML

      zuul: 
        ignored-services: "*"
        routes: 
          mydept.serviceId: microservicecloud-dept
          mydept.path: /mydept/**
      
      
    • 上一步配置后,cloud-provider-payment就不行了 http://myzuul.com:9527/cloud-provider-payment/paymentInfo

    • 单个具体,多个可以用"*"

      zuul: 
        ignored-services: "*"
        routes: 
          mydept.serviceId: microservicecloud-dept
          mydept.path: /mydept/**
      
  • 路由转发和负载均衡功能

    • 服务提供者SMS短信模块

      • 建模块cloud-provider-sms8008

      • POM

        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <parent>
                <artifactId>mscloud</artifactId>
                <groupId>com.likun.springcloud</groupId>
                <version>1.0-SNAPSHOT</version>
            </parent>
            <modelVersion>4.0.0</modelVersion>
        
            <artifactId>cloud-provider-sms8008</artifactId>
              <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-actuator</artifactId>
              </dependency>
        
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-devtools</artifactId>
                  <scope>runtime</scope>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
        </project>
        
      • YML

        server:
            port: 8008
        
          ###服务名称(服务注册到eureka名称)
          spring:
              application:
                  name: cloud-provider-sms
        
          eureka:
            client: #服务提供者provider注册进eureka服务列表内
              service-url:
                register-with-eureka: true
                fetch-registry: true
                defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
                #defaultZone: http://127.0.0.1:7001/eureka,http://127.0.0.1:7002/eureka
                #defaultZone: http://eureka7001.com:7001/eureka   # eureka集群加@老本版
        
        
      • 业务类

        package com.likun.springcloud.controller;
        
        import org.springframework.beans.factory.annotation.Value;
        import org.springframework.web.bind.annotation.ControllerAdvice;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RestController;
        
        /**
         * @auther likun
         * @create 2021-04-29 14:35
         */
        @RestController
        public class SMSController
        {
            @Value("${server.port}")
            private String serverPort;
        
            @GetMapping("/sms")
            public String sms()
            {
                return "sms provider service: "+"\t"+serverPort;
            }
        }
        
        
      • 主启动

        package com.likun.springcloud;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
        
        /**
         * @auther zzyy
         * @create 2019-04-14 14:34
         */
        @SpringBootApplication
        @EnableEurekaClient
        public class MainAppSMS8008
        {
            public static void main(String[] args)
            {
                SpringApplication.run(MainAppSMS8008.class,args);
            }
        }
        
        
      • 启动8008并成功注册进eureka服务器上

        在这里插入图片描述

    • 修改我们的zuul服务9527

      • 修改YML,体现路由转发和负载均衡

      • YML

        server:
          port: 9527
        
        spring:
          application:
            name: cloud-zuul-gateway
        
        eureka:
          client:
            service-url:
              #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
              defaultZone: http://eureka7001.com:7001/eureka
          instance:
            instance-id: gateway-9527.com
            prefer-ip-address: true
        
        zuul:
          #ignored-services: cloud-provider-payment
          routes: # 路由映射配置
            mypayment.serviceId: cloud-provider-payment
            mypayment.path: /weixin/**
            mysms.serviceId: cloud-provider-sms
            mysms.path: /mysms/**
        
        
      • 由于Zuul自动集成了Ribbon和Hystrix,所以Zuul天生就有负载均衡和服务容错能力

    • 测试

      • http://myzuul.com:9527/weixin/paymentInfo 负载均衡
      • http://myzuul.com:9527/mysms/sms 路由转发
      • 微信服务找8001/8002
      • 短信服务找8008
  • 设置统一公共前缀

    • YML
    • http://myzuul.com:9527/likun/weixin/paymentInfo
    • http://myzuul.com:9527/likun/mysms/sms
    • http://myzuul.com:9527/likun/cloud-provider-payment/paymentInfo
  • 最后YML

    server:
      port: 9527
    
    spring:
      application:
        name: cloud-zuul-gateway
    
    eureka:
      client:
        service-url:
          #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
          defaultZone: http://eureka7001.com:7001/eureka
      instance:
        instance-id: gateway-9527.com
        prefer-ip-address: true
    
    zuul:
      #ignored-services: cloud-provider-payment
      prefix: /likun
      routes: # 路由映射配置
        mypayment.serviceId: cloud-provider-payment
        mypayment.path: /weixin/**
        mysms.serviceId: cloud-provider-sms
        mysms.path: /mysms/**
     
    

4、查看路由信息

  • POM

     
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    
  • YML

     
    # 开启查看路由的端点
    management:
      endpoints:
        web:
          exposure:
            include: 'routes' 
     
    
  • 查看路由详细信息

    http://localhost:9527/actuator/routes

5、过滤器

  • 功能

    过滤功能负责对请求过程进行额外的处理,是请求校验过滤及服务聚合的基础。

  • 过滤器的生命周期

    在这里插入图片描述

  • ZuulFilter

    • 过滤类型

      • pre:在请求被路由到目标服务前执行,比如权限校验、打印日志等功能;
      • routing:在请求被路由到目标服务时执行
      • post:在请求被路由到目标服务后执行,比如给目标服务的响应添加头信息,收集统计数据等功能;
      • error:请求在其他阶段发生错误时执行。
    • 过滤顺序

      数字小的先执行

    • 过滤是否开启

      shouldFilter方法为true

    • 执行逻辑

      自己的业务逻辑

  • 案例Case

    • 前置过滤器,用于在请求路由到目标服务前打印请求日志

    • 业务代码

    • 测试

      • http://myzuul.com:9527/likun/mysms/sms
      • 在调用8008之前会打印日志
    • 开关,YML配置

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值