1. 概念部分

1.1 什么是API网关?

api网关就是应用程序接口网关,在微服务架构中分布着许多微服务,这些微服务不直接给用户调用,而是通过一个api网关的url为用户提供一致的服务。

1.2 为什么需要API网关?

为了简化调用逻辑,api网关对外提供一致的调用接口,可以简化客户端调用的复杂度。api网关可以将多个微服务的调用逻辑进行聚合,减少客户端的请求次数,优化客户端的使用体验。

1.3 API网关的主要功能是什么?

API网关主要功能是路由和服务治理。在微服务架构中,每个不同的后端服务可能都有用户维护的业务,所以在微服务中会有很多冗余的登录校验和签名校验,我们可以把微服务中的这些功能独立出来做成单独的OAuth2鉴权授权服务器,然后通过API网关调用OAuth2服务器来过滤用户的请求,保证对外服务的安全性。

Spring Cloud 提供了基于Netflix Zuul 实现的API网关组件 Spring Cloud Zuul,在Zuul中封装了API网关的各种功能,比如路由,过滤,Cookie和熔断与Ribbon的支持。
下面引用了Spring官网的图:

API接口连接云服务 api接口服务器_API

2. 代码示例

创建项目 api-gateway , 在build.gradle中为项目添加依赖

dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-zuul')
   compile('org.springframework.cloud:spring-cloud-starter-eureka')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}

创建项目配置文件 application.yml

#服务器配置
server:
  #端口
  port: 8080

#服务器发现注册配置
eureka:
  client:
    serviceUrl:
      #配置服务中心(可配置多个,用逗号隔开)
      defaultZone: https://www.apiboot.cn/eureka

#spring配置
spring:
  #应用配置
  application:
    #名称: api网关服务
    name: api-gateway

#API网关配置
zuul:
  #路由配置
  routes:
    producer:
      #响应的路径
      path: /producer/**
      #重定向到的服务(根据服务id名称从注册中心获取服务地址)
      serviceId:  producer-service

启动类添加注解

/**
* API网关服务
* @ EnableZuulProxy 支持网关路由
*/
@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

   public static void main(String[] args) {
      SpringApplication.run(ApiGatewayApplication.class, args);
   }
}

启动项目(为了测试方便,我把服务部署到自己的服务器上并用域名绑定)

打开服务注册中心 https://www.apiboot.cn/

API接口连接云服务 api接口服务器_API接口连接云服务_02

发现注册中心里面有三个服务,其中producer-server是我们的服务提供者,api-gateway是我们的api网关服务。

为了加以区分服务,我把api网关所在的服务端口也做了二级域名映射。
浏览器访问 api网关服务 https://api.apiboot.cn/

API接口连接云服务 api接口服务器_spring_03

我们的api网关服务目前只有一个根路径控制器,我们现在测试一下配置文件中配置的路径,看看能否实现重定向。
打开浏览器,输入地址: https://api.apiboot.cn/producer/hello?name=lanshiqin

API接口连接云服务 api接口服务器_微服务_04

可以看到api网关服务已经成功将url重定向到producer-service所在的服务上。