网关的作用
微服务一般会有不同的网络地址,而客户端(如手机APP,PC,H5等),可能为了完成一个业务需要调用不同服务的接口。例如电商平台APP,可能需要调用多个微服务接口,才能完成一次下单
如果让客户端直接与各个微服务通信,会有以下的问题:
- 客户端会多次请求不同的微服务,增加了客户端的复杂性。
- 存在跨域请求,在一定场景下处理相对复杂。
- 认证复杂,每个服务都需要独立认证。
- 难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。
- 某些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会有一定的困难。
以上问题可借助微服务网关解决。微服务网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关。使用微服务网关后,架构如下所示。
Zuul简介
Zuul 是netflix开源的微服务网关, 本质上是一个web servlet应用。在SpringCloud中,可以与consul,rabbon,Hystrix等组件配合使用,他的核心是一系列的过滤器,通过这些过滤器来完成以下功能
Zuul有以下功能:
- 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求;
- 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而为我们带来精确的生产视图;
- 动态路由:动态地将请求路由到不同的后端集群;
- 压力测试:逐渐增加指向集群的流量,以了解性能;
- 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求;
- 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群;
Demo
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
application中增加配置
server.port=8777
# springcloud-consul配置
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# springcloud-gateway 配置
zuul.routes.fc.path=/server-client1/**
zuul.routes.fc.serviceId=server-client1
zuul.routes.fc.path=/server-client2/**
zuul.routes.fc.serviceId=server-client1
main函数中增加注解 @EnableZuulProxy
// 增加cosul的clinet和zuul的配置
@EnableDiscoveryClient
@EnableZuulProxy
public class FcGatewayStart {
public static void main(String[] args) {
SpringApplication.run(FcGatewayStart .class, args);
}
}
效果
首先指定服务注册中心的地址为http://localhost:8500/server1/,服务的端口为8777,服务名为service-zuul;以/server-client1/ 开头的请求都转发给server-client1服务;以/server-client2/开头的请求都转发给server-client2服务,达到动态地将请求路由到不同的后端集群的功能
网友评论