微服务网关背景及简介
不同的微服务一般有不同的网络地址,而外部的客户端可能需要调用多个服务的接口才能完
成一个业务需求。比如一个电影购票的收集APP,可能回调用电影分类微服务,用户微服
务,支付微服务等。如果客户端直接和微服务进行通信,会存在一下问题:
# 客户端会多次请求不同微服务,增加客户端的复杂性
# 存在跨域请求,在一定场景下处理相对复杂
# 认证复杂,每一个服务都需要独立认证
# 难以重构,随着项目的迭代,可能需要重新划分微服务,如果客户端直接和微服务通信,
那么重构会难以实施
# 某些微服务可能使用了其他协议,直接访问有一定困难
上述问题,都可以借助微服务网管解决。微服务网管是介于客户端和服务器端之间的中间
层,所有的外部请求都会先经过微服务网关,架构演变成:
这样客户端只需要和网关交互,而无需直接调用特定微服务的接口,而且方便监控,易于认
证,减少客户端和各个微服务之间的交互次数
zuul微服务网关
Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul
组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
# 动态路由:动态将请求路由到不同后端集群
# 压力测试:逐渐增加指向集群的流量,以了解性能# 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
# 静态响应处理:边缘位置进行响应,避免转发到内部集群
# 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
Spring Cloud对Zuul进行了整合和增强。目前,Zuul使用的默认是Apache的HTTP
Client,也可以使用Rest Client,可以设置ribbon.restclient.enabled=true.
编写一个简单微服务网关,见示例:08-ms-gateway-zuul
添加依赖并在启动类上增加注解@EnableZuulProxy,声明一个zuul代理。该代理使用
Ribbon来定位注册在 Eureka server中的微服务;同时,该代理还整合了Hystrix,从而实
现了容错,所有经过 zuul的请求都会在 Hystrix命令中执行。
配置文件application.yml如下:
运行项目(需启动两个用户微服务和一个订单微服务,参看视频),访问地址:
http://localhost:8040/microservice-provider-user/getIpAndPort
发现zuul会代理所有注册到eureka server的微服务,并使用ribbon做负载均衡,zuul的路
由规则如下,可以访问地址:http://localhost:8040/routes
http://ZUUL_HOST:ZUUL_PORT/微服务在Eureka上的serviceId/**会被转发到
serviceId对应的微服务
zuul还自动整合了hystrix,访问地址:http://localhost:8040/hystrix.stream