至此,已实现基于Eureka的服务发现,基于Ribbon的负载均衡,Feign也为咱们提供了很不错的远程调用能力,使用Hystrix后,高并发场景下应用也不会被别人拖死——我们的微服务架构已经日趋完善!git
然而,迄今为止,只讨论了微服务之间的调用,尚没讨论如何应对外部请求。应对外部请求时,就会发现,咱们的架构依然存在一些问题——github
不一样的微服务通常会有不一样的网络地址,而外部客户端(例如手机APP)可能须要调用多个服务的接口才能完成一个业务需求。例如一个电影购票的手机APP,可能会调用多个微服务的接口,才能完成一次购票的业务流程,以下图所示。web
若是让客户端直接与各个微服务通讯,会有如下的问题:spring
以上问题可借助微服务网关解决。微服务网关是介于客户端和服务器端之间的中间层,全部的外部请求都会先通过微服务网关。使用微服务网关后,架构以下所示。数据库
此时,微服务网关封装了应用程序的内部结构,客户端只须跟网关交互,而无须直接调用特定微服务的接口。这样,开发就能够获得简化。不只如此,使用微服务网关还有如下优势:后端
Zuul是Netflix开源的微服务网关,它能够和Eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器帮助咱们完成如下功能:跨域
注1:以上介绍来自Zuul官方文档,但其实开源版本的Zuul以上功能一个都没有——开源的Zuul只是几个Jar包而已,以上能力指的应该是Netflix官方自用的Zuul的能力。浏览器
注2:Netflix自用的Zuul能力是比较强大的,可以使用Groovy编写过滤器,而且可动态加载/卸载、修改规则,并且使用Cassandra做为数据库,然而开源版本这些一个都没有。安全
注3:Spring Cloud中,Zuul绝大部分功能都是Spring Cloud团队为Zuul开发的。服务器
注4:因此Zuul 2.x的开源进度延后一年,Spring Cloud团队开发了本身的Spring Cloud Gateway,并宣布Spring Cloud不打算支持Zuul 2.x,你还以为意外吗?
注5:看到这里,不少人可能没有动力学习Zuul了,我的认为仍是能够了解一下的,后面讲到Spring Cloud Gateway时,你会发现不少设计理念是相通的。
Spring Cloud对Zuul进行了整合与加强。目前,Zuul使用的默认HTTP客户端是Apache HTTP Client,也可使用RestClient或者okhttp3.OkHttpClient
。 若是想要使用RestClient,能够设置ribbon.restclient.enabled=true
;想要使用okhttp3.OkHttpClient
,能够设置ribbon.okhttp.enabled=true
。
TIPS
Zuul的GitHub:https://github.com/Netflix/zuul
下面经过一个简单的例子帮助你们快速入门Zuul。
加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
加注解:@EnableZuulProxy
写配置:
server: port: 8040 spring: application: name: microservice-gateway-zuul eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
由代码可知,咱们编写了一个Zuul,并将其注册到了Eureka上。
启动多个应用,Eureka Server上展现以下:
http://127.0.0.1:8040/microservice-provider-user/users/1
,会发现请求被转发到了microservice-provider-user
服务的/users/1
端点;http://127.0.0.1:8040/microservice-consumer-movie/movies/users/1
,发现请求被转发到了microservice-consumer-movie
服务的/movies/users/1
端点;屡次访问访问http://127.0.0.1:8040/microservice-provider-user/users/1
,会发现两个microservice-provider-user
都会打印相似以下的日志:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=? ...
在application.yml
中添加以下配置后,并重启Zuul:
management: endpoints: web: exposure: include: '*' endpoint: health: show-details: always
此时,此时访问http://localhost:8040/actuator/health
,可看到相似以下结果:
{ ... "hystrix":{"status":"UP"} }
而且,当Zuul转发API后,访问http://localhost:8040/actuator/hystrix.stream
可看到相似以下的信息:
data: {"type":"HystrixCommand","name":"microservice-provider-user",.....}
说明Zuul整合了Hystrix。
http://www.itmuch.com/spring-cloud/finchley-16/