网关的概念
1、什么是路由网关
网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能。它将"1对N"问题转换成了"1对1”问题。
通过服务路由的功能,可以在对外提供服务时,只暴露 网关中配置的调用地址,而调用方就不需要了解后端具体的微服务主机。
2、为什么要使用微服务网关
不同的微服务一般会有不同的网络地址,而客户端可能需要调用多个服务接口才能完成一个业务需求,若让客户端直接与各个微服务通信,会有以下问题:
1)客户端会多次请求不同微服务,增加了客户端复杂性
2)存在跨域请求,处理相对复杂
3)认证复杂,每个服务都需要独立认证
4)难以重构,多个服务可能将会合并成一个或拆分成多个
如下:
3、网关的优点
微服务网关介于服务端与客户端的中间层,所有外部服务请求都会先经过微服务网关客户只能跟微服务网关进行交互,无需调用特定微服务接口,使得开发得到简化
总的理解网关优点
服务网关 = 路由转发 + 过滤器
(1)路由转发:接收一切外界请求,转发到后端的微服务上去。
(2)过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
Zuul简介
Zuul是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用。
Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能:
1、身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求;
2、审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图;
3、动态路由:动态地将请求路由到不同的后端集群;
4、压力测试:逐渐增加指向集群的流量,以了解性能;
5、负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求;
6、静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群;
7、多区域弹性:跨域AWS Region进行请求路由。
Spring Cloud对Zuul进行了整合与增强。
github地址:https://github.com/Netflix/zuul
Zuul网关项目搭建
使用到的组件包括:Eureka、Zuul、Hystrix、Ribbon,包括以下四个项目:
(1)cloud-eureka-server: 8761 Eureka注册中心
(2)cloud-gateway-zuul: 5555 Zuul网关
(3)cloud-order : 8000 服务消费者
(4)cloud-payment-service :8001 服务提供者
注册中心、服务消费者、服务提供者搭建,参考:【SpringCloud】快速入门(一)
搭建Zuul网关
1、新建模块(springcloud-gateway-zuul5555),引入Zuul、Eureka依赖
1 <!-- zuul --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-starter-netflix-zuul</artifactId> 5 </dependency> 6 7 <!-- eureka client --> 8 <dependency> 9 <groupId>org.springframework.cloud</groupId> 10 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 11 </dependency>
可以看到Zuul依赖关联了Hystrix,Ribbon
完整依赖如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <parent> 6 <artifactId>test-springcloud</artifactId> 7 <groupId>com.test</groupId> 8 <version>1.0-SNAPSHOT</version> 9 </parent> 10 <modelVersion>4.0.0</modelVersion> 11 12 <artifactId>springcloud-gateway-zuul5555</artifactId> 13 14 <dependencies> 15 16 <!-- zuul --> 17 <dependency> 18 <groupId>org.springframework.cloud</groupId> 19 <artifactId>spring-cloud-starter-netflix-zuul</artifactId> 20 </dependency> 21 22 <!-- eureka client --> 23 <dependency> 24 <groupId>org.springframework.cloud</groupId> 25 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 26 </dependency> 27 28 <!-- spring boot --> 29 <dependency> 30 <groupId>org.springframework.boot</groupId> 31 <artifactId>spring-boot-starter-web</artifactId> 32 </dependency> 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-starter-actuator</artifactId> 36 </dependency> 37 <dependency> 38 <groupId>org.springframework.boot</groupId> 39 <artifactId>spring-boot-devtools</artifactId> 40 <scope>runtime</scope> 41 <optional>true</optional> 42 </dependency> 43 44 <dependency> 45 <groupId>org.projectlombok</groupId> 46 <artifactId>lombok</artifactId> 47 <optional>true</optional> 48 </dependency> 49 <dependency> 50 <groupId>org.springframework.boot</groupId> 51 <artifactId>spring-boot-starter-test</artifactId> 52 <scope>test</scope> 53 </dependency> 54 55 </dependencies> 56 </project>
2、编辑配置文件application.yml如下:
1 # 端口 2 server: 3 port: 5555 4 5 spring: 6 application: 7 name: cloud-gateway-zuul 8 9 eureka: 10 client: 11 register-with-eureka: true 12 fetch-registry: true 13 service-url: 14 defaultZone: http://localhost:8761/eureka
3、编辑主启动类,使用注解@EnableZuulProxy,启动Zuul网关
1 // 启用Zuul网关 2 @EnableZuulProxy 3 @SpringBootApplication 4 public class Zuul5555 { 5 public static void main(String[] args) { 6 SpringApplication.run(Zuul5555.class, args); 7 } 8 }
4、测试
1)启动项目,
2)验证,Zuul网关默认路由是否生效
访问地址:http://localhost:5555/cloud-order/consumer/payment/get/1
访问地址:http://localhost:5555/cloud-payment-service/payment/get/1
由此判断,Zuul网关默认路由已生效
3)在application.yml增加配置,增加网关前缀
1 zuul: 2 #网关前缀,默认无 3 prefix: /test
重新启动项目,访问地址:http://localhost:5555/test/cloud-payment-service/payment/get/1
由此判断,Zuul网关前缀已生效
4)在application.yml增加配置,关闭Zuul认默认路由
1 zuul: 2 #网关前缀,默认无 3 prefix: /test 4 #禁用这个微服务order-service 5 #ignored-services: order-service 6 #禁用所有的微服务 7 ignored-services: "*"
重新启动项目,访问地址:http://localhost:5555/test/cloud-payment-service/payment/get/1
地址无法正常访问
5)在application.yml增加配置,指定服务路由
1 zuul: 2 #网关前缀,默认无 3 prefix: /test 4 #禁用这个微服务order-service 5 #ignored-services: order-service 6 #禁用所有的微服务 7 ignored-services: "*" 8 routes: 9 api-payment: #对应服务名称,可以自定义(最好保持一致) 10 path: /payment_api/** 11 serviceId: cloud-payment-service #对应服务名称
重新启动项目,访问地址:http://localhost:5555/test/cloud-payment-service/payment/get/1
由此判断,Zuul指定路由配置生效
6)在application.yml增加配置,增加监控信息端口routes,filters
1 management: 2 endpoints: 3 web: 4 exposure: 5 include: health,info,routes,filters
重新启动项目,
查看路由信息:http://localhost:5555/actuator/routes
查看过滤器信息:http://localhost:5555/actuator/filters