一、API网关
API Gateway是一个服务器,也可以说是进入系统的唯一节点。这跟面向对象设计模式中的Facade模式很像。API Gateway封装内部系统的架构,并且提供API给各个客户端。它还可能有其他功能,如授权、监控、负载均衡、缓存、请求分片和管理、静态响应处理等。下图展示了一个适应当前架构的API Gateway。
如果客户端直接和各个微服务通信,会有如下问题:
- 客户端会多次请求不同的微服务,增加客户端复杂性
- 跨域请求
- 认证复杂
- 难以重构
二、 项目基础配置
Zuul是Netflix开源的微服务网关,只是API Gateway的一种实现,其他的还有Nginx Plus、Kong等等。SpringCloud对Zuul进行了整合和增强,Zuul的核心是一系列过滤器:
- 身份认证与安全
- 审查与监控
- 动态路由
- 压力测试
- 负载分配
- 静态响应处理
- 多区域弹性
为实现Zuul网关,需要几个基础的module,请参考上一节实战(3)。配置不变。
- eureka-server,作为eureka的server服务注册中心
- service-provider-1,eureka-client端,连接到eureka-server成为服务提供者1。
三、Zuul项目配置
1、pom.xml依赖
1 | <dependency> |
2、启动类中,增加注解@EnableZuulProxy激活zuul。
该注解整合了@EnableCircuitBreaker、@EnableDiscoveryClient,是个组合注解。
3、yml配置中,项目的spring.application.name为service-eureka-zuul,端口8040。
1 | server: |
4、测试
需要先依次启动项目基础配置中的2个module(eureka-server和service-provider-1)。才能启动zuul项目。
- 访问http://localhost:8001/1 会返回service1。代表原有service-provider-1项目启动成功。
- 访问http://localhost:8040/service-provider/1 也同样会返回service1。代表zuul项目启动成功。
- 访问http://localhost:8761 可以看到1个SERVICE-PROVIDER和1个SERVICE-EUREKA-ZUUL。
- zuul集成了Hystrix和Ribon负载均衡。
四、zuul路径设置
zuul集成了routes端点,可访问http://localhost:8040/actuator/routes 查看映射关系详情。
1 | #routes端点返回 |
默认规则
默认访问地址 http://localhost:8040/service-provider/1
访问http://GATEWAY:GATEWAY_PORT/想要访问的Eureka服务id的小写/** ,将会访问到,http://想要访问的Eureka服务id的小写:该服务端口/** 。
自定义路径
1 | # 自定义访问地址 http://localhost:8040/user/1 |
忽略微服务/微服务的某些路径
1 | # 忽略指定微服务 |
路由前缀
1 | # 以下用于路由前缀,访问Zuul的/api/service-provider/1路径,请求将被转发到service-provider的/api/1。 |
本地转发
1 | # 以下用于本地转发,访问Zuul的/path-a/**路径,请求将被转发到Zuul的/path-b/**。 |
同时指定path和URL
1 | # 改方式将/user/** 映射到http://localhost:8000/。但该方式不会使用Hystrix和Ribbon特性。 |
另外,还使用正则表达式指定Zuul的路由匹配规则借助PatternServiceRouteMapper,实现微服务到映射路由的正则配置。
若路由遇到问题,可以通过日志查看转发细节。
1 | logging: |
Header设置
1 | # 设置/忽略header |
五、Zuul的过滤器
查看过滤器
zuul集成了filters端点,可访问http://localhost:8040/actuator/filters 查看过滤器的详情。
1 | #filters端点返回 |
过滤器介绍
过滤器是Zuul的核心组件,定义了4种标准过滤器类型。
- PRE,在请求被路由前调用。可实现身份验证、集群中选择请求的微服务、记录调试信息等。还可以实现安全认证、灰度发布、限流等。
- ROUTING,将请求路由到微服务。
- POST,在请求路由到微服务后执行。可为响应添加Header、收集统计信息和指标、将响应从微服务发送到客户端等。
- ERROR,在其他阶段发生错误时执行。
- 自定义过滤性,可自行创建。
SpringCloud默认为Zuul编写并启用了一些过滤性,通过@EnableZuulServer和@EnableZuulProxy这两个注解实现。
@EnableZuulProxy是@EnableZuulServer的增强版,额外包含了RibbonRoutingFilter等其他几个过滤器。
自定义Zuul过滤器
自定义Zuul过滤器代码如下,继承抽象类ZuulFilter并实现4个抽象方法即可。
1 | public class PreRequestLogFilter extends ZuulFilter { |
禁用过滤器
1 | #格式 |
六、Zuul的其他特性
Zuul的容错与回退
为Zuul添加回退,需实现FallbackProvider接口。
1 |
|
Zuul中Hystrix隔离策略和线程池
1 | zuul: |
高可用性
1、如请求Zuul的客户端也注册到了Eureka上,则会自动实现Zuul的高可用性。
2、如请求Zuul的客户端未注册到了Eureka上,可借助额外的负载均衡器来实现Zuul的高可用性。
微服务聚合
Zuul可结合RxJava,由Zuul来请求多个微服务的请求,并组织好数据返回。
七、Sidecar整合非JVM微服务
非JVM微服务可操作Eureka的Rest端点实现注册与发现。也可以使用SpringCloud Netflix Sidecar来整合。
Node.js微服务
1、node-service.js
1 | var http = require('http'); |
2、命令启动
1 | $ node node-service.js |
3、访问http://localhost:8060/health.json 和http://localhost:8060/
Sidecar项目
1、POM依赖
1 | <dependency> |
2、yml配置
1 | server: |
3、service-provider-1增加testNode节点,使用Ribbon调用node服务。
1 |
|
4、测试
- 非JVM调用JVM,可访问地址http://localhost:8070/service-provider/1 来调用JVM微服务。
- JVM调用非JVM,http://localhost:8070/service-provider/testNode 来调用Node微服务。
- 查看service-sidecar在erureka上的注册信息,http://localhost:8761/eureka/apps/service-sidecar
- 停掉Node微服务node-service后,Eureka Server能感知到非JVM微服务的健康状态。
5、Sidecar端点
- /:展示常用端点
- /hosts/{serviceId}:指定微服务在Eureka的实例列表
- /ping:返回OK