【分布式】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

原文地址:https://www.cnblogs.com/yif0118/p/14617687.html