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官网的图:
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/
发现注册中心里面有三个服务,其中producer-server是我们的服务提供者,api-gateway是我们的api网关服务。
为了加以区分服务,我把api网关所在的服务端口也做了二级域名映射。
浏览器访问 api网关服务 https://api.apiboot.cn/
我们的api网关服务目前只有一个根路径控制器,我们现在测试一下配置文件中配置的路径,看看能否实现重定向。
打开浏览器,输入地址: https://api.apiboot.cn/producer/hello?name=lanshiqin
可以看到api网关服务已经成功将url重定向到producer-service所在的服务上。