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特性如拦截器请参阅以下博文及官方文档:
本博客涉及示例代码均已上传至Github地址:
https://github.com/devyf/SpringCloud_Study