SpringCloud开发学习总结(八)—— API网关服务Zuul(一)
大多数情况下,为了保证对外服务的安全性,我们在服务端实现的为服务接口时往往都会有一定的权限校验机制,比如对用户登录状态的校验等;同时为了防止客户端在发起请求时被篡改等安全方面的考虑,还会有一些签名校验的机制存在。这时候,由于使用了微服务架构的理念,我们将原本处于一个应用中的多个模块拆成了多个应用,但是这些应用提供的接口都需要这些校验逻辑,所以不得不在每个微服务应用中实现相同的逻辑,代码的冗余不言而喻。
再者,在维护路由规则与服务实例列表时,当有实例增减或是IP地址变动等情况发生的时候,也需要手工地去同步修改这些信息以保持实例信息与中间件配置内容的一致性。
为了解决上面这些常见的架构问题,API网关的概念应运而生。它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤,它不仅需要实现请求路由、负载均衡、校验过滤等功能之外,还得拥有与服务治理框架结合的能力、请求转发时的熔断机制、服务的聚合等一系列高级功能。
既然API网关对于微服务架构这么重要,那么在Spring Cloud中是否有相应的解决方案呢?答案是肯定的,在Spring Cloud中提供了基于Netflix Zuul实现的API网关组件——Spring Cloud Zuul。那么它是如何解决上面两个普遍的问题的呢?
首先,对于类似签名校验、登录校验在微服务架构中的冗余问题。理论上来说,这些校验逻辑本质上与微服务应用自身的业务并没有多大的关系,所以它们完全可以独立成一个单独的服务存在。Spring Cloud Zuul提供了一套过滤器机制,开发者可以通过使用Zuul来创建各种校验过滤器,然后制定哪些规则的请求需要执行校验逻辑,来进行控制。
其次,对于路由规则与服务实例的维护问题。Spring Cloud Zuul通过与Spring Cloud Eureka整合,将自身注册为Eureka 服务治理下的应用,同时从Eureka中获得所有其他微服务的实例信息。这样的设计非常巧妙地将服务治理体系中维护的实例信息利用起来,使得将维护服务实例的工作交给了服务治理框架自动完成,不再需要人工介入。而对于路由规则的维护,Zuul默认会将通过以服务名作为ContextPath的方式来创建路由映射。
微服务架构虽然可以将我们的开发单元拆分的更为细致,有效降低了开发难度,但是它所引出的各种问题如果处理不当会成为实施过程中的不稳定因素,甚至掩盖掉原本实施微服务带来的优势。所以,在微服务架构的实施方案中,API网关服务的使用几乎成为了必然的选择。下面我们将详细介绍Spring Cloud Zuul的使用方法、配置属性以及不足之处和需要进行的思考。
通俗语言解释
API
前端调用后端数据的一个通道,就是我们俗说的接口,通过这个通道,可以访问到后端的数据,但是又无需调用源代码。
SDK
工程师为辅助开发某类软件的相关文档、范例和工具的集合,使用SDK可以提高开发效率,更简单的接入某个功能。
举例说明:一个产品想实现某个功能,可以找到相关的SDK,工程师直接接入SDK,就不用再重新开发了。
快速入门
构建网关
首先,在实现各种API网关服务的高级功能之前,我们需要做一些准备工作,比如,构建起最基本的API网关服务,并且搭建几个用于路由和过滤使用的微服务应用等。(这里我们用之前章节创建的feign-provide和feign-consumer)
- 创建一个基础的Spring Boot工程,命名为api-gateway,并在pom.xml中引入spring-cloud-stater-zuul依赖,具体如下:
1 <dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-zuul</artifactId>① 4 </dependency>
- 创建应用主类,使用@EnableZuulProxy注解开启Zuul的API网关服务功能。
1 @EnableZuulProxy 2 @SpringBootApplication 3 public class ApiGatewayApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(ApiGatewayApplication.class, args); 7 } 8 9 }
- 在application.properties中配置Zuul应用的基础信息,如应用名、服务端口号等,具体内容如下: