API网关是一个更为智能的应用服务器, 它的定义类似于面向对象设计模式中的Facade模式, 它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤。它除了要实现请求路由、 负载均衡、 校验过滤等功能之外, 还需要更多能力, 比如与服务治理框架的结合、 请求转发时的熔断机制、 服务的聚合等一系列高级功能
首先,对千路由规则与服务实例的维护间题。 SpringCloud Zuul 通过与Spring Cloud Eureka进行整合, 将自身注册为Eureka服务治理下的应用, 同时从Eureka中获得了所有其他微服务的实例信息;其次, 对千类似签名校验、 登录校验在微服务架构中的冗余问题。 理论上来说, 这些校验逻辑在本质上与微服务应用自身的业务并没有多大的关系, 所以 它们完全可以独立成一个单独的服务存在, 只是它们被剥离和独立出来之后, 并不是给各个微服务调用, 而是在API网关服务上进行统一调用来对微服务接口做前置过滤, 以实现对微服务接口的拦截和校验
构建网关
创建一个基础的Spring Boot工程, 命名为api-gateway, 并在 pom.xml中引入spring-cloud-starter-zuul依赖, 具体如下
<parent> <groupld>org.springframework.boot</groupid> <artifactld>spring-boot-starter-parent</artifacttd> <version>l.3.7.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupid>org.springframework.cloud</groupid> <artifactld>spring-cloud-starter-zuul</artifactid> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupld>org.springframework.cloud</groupld> <artifactid>spring-cloud-dependencies</artifactid> <version>Brixton.SRS</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
对于spring-cloud-starter-zuul依赖,该模块中不仅包含了Netflix Zuul的核心依赖 zuul-core,它还包含了下面这些网关服务需要的重要依赖:
- spring-cloud-starter-hystrix: 该依赖用来在网关服务中实现对微服务转发时候的保护机制, 通过线程隔离和断路器,防止微服务的故障引发API网关资源无法释放, 从而影响其他应用的对外服务
- spring-cloud-starter-ribbon:该依赖用来实现在网关服务进行路由转发时候的客户端负载均衡以及请求重试
- spring-boot-starter-actuator:该依赖用来提供常规的微服务管理端点。 另外, 在Spring Cloud Zuul中还特别提供了/routes端点来返回当前的所有路由规则
创建应用主类, 使用@EnableZuulProxy注解开启Zuul的API网关服务功能
@EnableZuulProxy @SpringCloudApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .web(true) .run(args); } }
在application.properties中配置Zuul应用的基础信息, 如应用名、 服务端口号等, 具体内容如下:
spring.application.name=api-gateway
server.port=5555