zoukankan      html  css  js  c++  java
  • 【分布式】SpringCloud(7)--Zuul路由网关

    1.Zuul概述

    1.1.什么是Zuul

    由于有如此众多的客户端和服务器,在您的云体系结构中包括一个API网关通常会很有帮助。网关可以负责保护和路由消息,隐藏服务,限制负载以及许多其他有用的事情。Spring Cloud Gateway 使您可以精确控制API层,集成Spring Cloud服务发现和客户端负载平衡解决方案以简化配置和维护。

    Zuul包含了对请求的路由过滤两个最主要的功能:

    其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其它微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。

    注意:Zuul服务最终还是会注册进Eureka

    1.2.Zuul的作用

    Zuul有三大功能:

    • 代理
    • 路由
    • 过滤

    其中路由过滤是Zuul的主要功能。

    2.Zuul的基本配置

    项目工程基于原项目: springcloud_hello ,可以查看我之前的博客。这里基于zuul新创建一个springcloud-zuul-gateway-9527的Module模块。

    2.1.导入pom.xml依赖

    导入相关pom依赖包:

     <!--zuul组件、zuul需要注册至eureka中-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-zuul</artifactId>
         <version>1.4.6.RELEASE</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-eureka</artifactId>
         <version>1.4.6.RELEASE</version>
     </dependency>
    
     <!--actuator:完善监控信息-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-actuator</artifactId>
     </dependency>
     <!--引入hystrix-->
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-hystrix</artifactId>
         <version>1.4.6.RELEASE</version>
     </dependency>
     <!--需要拿到实体类,引入api module-->
     <dependency>
         <groupId>com.fengye</groupId>
         <artifactId>springcloud-api</artifactId>
         <version>1.0-SNAPSHOT</version>
     </dependency>
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-test</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
     <!--jetty服务器-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jetty</artifactId>
     </dependency>
     <!--热部署工具-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-devtools</artifactId>
     </dependency>

    2.2.配置application.yml

    server:
      port: 9527  #端口信息
    
    #spring的配置
    spring:
      application:
        name: springcloud-zuul-gateway  #注册进eureka中的实例名称(显示大写)
    
    
    #eureka的配置,确定客户端服务注册到eureka服务列表内
    eureka:
      client:
        service-url:
          #集群配置
          defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
      instance:
        instance-id: gateway-9527.com  #修改eureka上默认的服务描述信息
        prefer-ip-address: true  #访问路径可以显示ip地址
    
    #info配置
    info:
      app.name: fengye-springcloud
      company.name: blog.fengye.com
      build.artifactId: $project.artifactId$
      build.version: $project.version$

    这里在本机单机电脑上测试,增加了hosts文件配置:

    2.3.编写启动项

    新建启动项配置,增加@EnableZuulProxy注解,表示网关代理:

    @SpringBootApplication
    @EnableZuulProxy  //增加zuul网关代理支持
    public class Zuul_9527_StartSpringCloudApp {
        public static void main(String[] args) {
            SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
        }
    }

    2.4.启动测试

    需要启动三个Eureka注册中心集群、一个服务提供者dept-8001、一个zuul 9527路由网关:

    启动后访问:http://eureka7001.com:7001/,可以看到zuul网关服务已经注册进了Eureka注册中心。

    路由访问测试,访问服务提供者的接口地址:

    ①使用原来的Restful风格进行访问:http://localhost:8001/dept/queryById/1   

    ②使用API网关路由地址进行访问:http://myzuul.com:9527/springcloud-provider-dept/dept/queryById/1

    其中myzuul.com:9527为域名映射后的访问地址+port端口号,springcloud-provider-dept为服务名称(使用小写),/dept/queryById/1是Restful风格的地址。

    这样就是用zuul对服务的请求访问进行了最基本的配置,达到了可以使用Zuul进行访问地址的配置。

    3.Zuul访问映射规则配置

    基于上面的操作我们实现了zuul的基本配置,但是在实际开发中我们不想对外暴露出我们微服务的具体名称,可能会自定义做一些安全访问的策略。

    那么就可以进行一些访问规则的配置。zuul可以基于application.xml中一些自定义的简单配置实现路由映射url地址自定义访问。

    3.1.zuul替换服务名配置

    application.yml配置:

    #避免真实服务名暴露,可以自定义修改,key-value形式,key:原真实服务名,value:自定义映射地址
    zuul:
      routes:
        mydept.serviceId: springcloud-provider-dept  #不暴露原来的服务名,将springcloud-provider-dept作为key替换
        mydept.path: /mydept/**  #现在的服务路径修改为/mydept/**

    before:http://myzuul.com:9527/springcloud-provider-dept/dept/queryById/1

    after:http://myzuul.com:9527/mydept/dept/queryById/1

    但是这样after路径与before路径都能访问:

     

    3.2.Zuul忽略原服务名配置

    如果我们要去除原来的地址,只保留我们想要映射的地址(单一入口)访问,那么需要添加如下配置:

    #避免真实服务名暴露,可以自定义修改,key-value形式,key:原真实服务名,value:自定义映射地址
    zuul:
      ignored-services: springcloud-provider-dept  #原来的springcloud-provider-dept无效,使用新的
      routes:
        mydept.serviceId: springcloud-provider-dept  #不暴露原来的服务名,将springcloud-provider-dept作为key替换
        mydept.path: /mydept/**  #现在的服务路径修改为/mydept/**

    可以看到真实的路径已经被忽略:

     

    实际开发中如果涉及多个微服务需要忽略配置:

    ignored-services: "*"  #多个微服务统一忽略原微服务名,使用现在给的value值

    3.3.Zuul统一域名前缀配置

    表示所有的请求访问都要加上前缀/fengye才能访问:

    #避免真实服务名暴露,可以自定义修改,key-value形式,key:原真实服务名,value:自定义映射地址
    zuul:
      prefix: /fengye  #统一路径名前缀
      ignored-services: springcloud-provider-dept  #原来的springcloud-provider-dept无效,使用新的
      routes:
        mydept.serviceId: springcloud-provider-dept  #不暴露原来的服务名,将springcloud-provider-dept作为key替换
        mydept.path: /mydept/**  #现在的服务路径修改为/mydept/**

     3.4.Zuul配置总结:

    #避免真实服务名暴露,可以自定义修改,key-value形式,key:原真实服务名,value:自定义映射地址
    zuul:
      prefix: /fengye  #统一路径名前缀
      ignored-services: springcloud-provider-dept  #原来的springcloud-provider-dept无效,使用新的;使用"*"表示多个微服务统一忽略原微服务名,使用现在给的value值
      routes:
        mydept.serviceId: springcloud-provider-dept  #不暴露原来的服务名,将springcloud-provider-dept作为key替换
        mydept.path: /mydept/**  #现在的服务路径修改为/mydept/**

    Zuul是SpringCloud Netflix  Greenwich版本中Gateway的一种实现方式,目前随着SpringCloud Alibaba的出现,Zuul网关实现已经随SpringCloud切换到了Hoxton版本。

    更多Zuul特性如拦截器请参阅以下博文及官方文档:

    SpringCloud系列(九) 使用Zuul实现服务网关

    Zuul官方文档

    本博客涉及示例代码均已上传至Github地址:

    https://github.com/devyf/SpringCloud_Study

  • 相关阅读:
    面向安全需求的VANET信道拥塞联合控制框架
    多普勒频移
    5G-Enabled Cooperative Intelligent Vehicular (5GenCIV) Framework: When Benz Meets Marconi
    Vehicle-to-Vehicle Channel Modeling and Measurements: Recent Advances and Future Challenges
    python之对象
    python之数字类型
    python之序列
    数据库进阶
    python之coding style
    python之web开发(待续)
  • 原文地址:https://www.cnblogs.com/yif0118/p/14617687.html
Copyright © 2011-2022 走看看