稀土 2017-12-11
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
路由在微服务体系结构的一个组成部分。例如,/可以映射到您的Web应用程序,/api/users映射到用户服务,并将/api/shop映射到商店服务。Zuul是Netflix的基于JVM的路由器和服务器端负载均衡器。
Netflix使用Zuul进行以下操作:
Zuul的规则引擎允许基本上写任何JVM语言编写规则和过滤器,内置Java和Groovy。
服务网关 = 路由转发 + 过滤器
1、路由转发:接收一切外界请求,转发到后端的微服务上去;
2、过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
上述所说的横切功能(以权限校验为例)可以写在三个位置:
第一种,缺点太明显,基本不用;第二种,相较于第一点好很多,代码开发不会冗余,但是有两个缺点:
而服务网关恰好可以解决这样的问题:
所以,需要服务网关!!!

引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service。
1、总体流程:
2、引入网关的注意点
3、服务网关基本功能
4、技术选型
笔者准备自建一个轻量级的服务网关,技术选型如下:
新建项目spring-cloud-zuul-service
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
在程序的启动类 ZuulApplication 通过 @EnableZuulProxy 开启 Zuul 服务网关
package io.ymq.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}配置文件 application.yml
spring:
application:
name: zuul-service
server:
port: 9000
zuul:
routes:
blog:
path: /ymq/**
url: http://www.ymq.io/配置说明:
浏览器访问:http://127.0.0.1:9000/ymq 重定向到我的博客

项目继续改造,添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
配置文件 application.yml
zuul:
routes:
api:
path: /**
serviceId: eureka-provider
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/配置说明:
浏览器访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider服务以均衡负载的方式访问
在开始测试服务之前,我们先拿之前两篇博客,构建的两个微服务代码为基础,进行下面的操作,主要使用下面几个工程:
建议先阅读以下两篇文章
Spring Cloud(四) 服务提供者 Eureka + 服务消费者 Feign
Spring Cloud(三) 服务提供者 Eureka + 服务消费者(rest + Ribbon)
复制项目spring-cloud-eureka-provider 改为spring-cloud-eureka-provider-2 为了更好的体现 Zuul 访问服务负载均衡
修改EurekaProviderApplication.java home 方法的返回值
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
@Value("${server.port}")
String port;
@RequestMapping("/")
public String home() {
return "Hello Zuul ,port:" + port;
}
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
}修改application.yml 修改一下提供服务的端口,8762 改成8763
server: port: 8763
依次启动四个服务:spring-cloud-eureka-service,spring-cloud-eureka-provider,spring-cloud-eureka-provider-2,spring-cloud-zuul-service
查看 eureka 监控,看服务是否都注册成功

浏览器访问
访问:http://127.0.0.1:9000/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider服务以均衡负载的方式访问
F5 刷新


spring cloud zuul 默认情况下,Zuul会代理所有注册到Eureka Server的微服务,并且Zuul的路由规则如下: 微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务。
我们注释 spring-cloud-zuul-service项目中关于路由的配置:
#zuul: # routes: # api: # path: /** # serviceId: eureka-provider
浏览器访问
访问:http://127.0.0.1:9000/eureka-provider/ ,Zuul 会去 Eureka 服务注册中心,找到eureka-provider服务以均衡负载的方式访问


在下一章,会深入介绍 Zuul 高级功能使用,ZuulFilter ,支持下鹏磊,关注下屏幕下方的微信公众号
搜云库