一、概述
在分布式项目架构中,我们会将服务进行拆分,不同的微服务负责各自的业务功能,实现软件架构层面的解耦合。但是如果拆分之后的微服务数量太多,是不利于系统开发的,因为每个服务都有不同的网络地址,客户端多次请求不同的微服务需要调用不同的 URL,如果同时去维护多个不同的 URL 无疑会增加开发的成本。
二、原理
这个解决方案就是 API 网关,API 网关可以对所有的 API 请求进行管理维护,相当于为系统开放出一个统一的接口,所有的外部请求只需要访问这个统一入口即可,系统内部再通过 API 网关去映射不同的微服务。对于开发者而言就不需要关注具体的微服务 URL 了,直接访问 API 网关接口即可,API 网关的结构如下图所示。
三、实现
1、在父工程下创建 Module gateway。
2、在 pom.xml 中添加 Zuul 和 Eureka Client 依赖,Zuul 也作为一个 Eureka Client 在注册中心完成注册。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3、在 resources 路径下创建配置文件 application.yml,添加网关相关配置。
server:
port: 8030 #当前 Eureka Client 服务端口
spring:
application:
name: gateway #当前服务注册在 Eureka Server 上的名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/ #注册中心的访问地址
#zuul.routes.*:自定义微服务的访问路径,如 zuul.routes.provider:/p/**,provider 微服务就会被映射到 gateway 的 /p/** 路径。
zuul:
routes:
provider: /p/**
4、创建springboot启动类 GateWayApplication
/**
* @EnableZuulProxy
* 包含 @EnableZuulServer 的功能,而且还加入了 @EnableCircuitBreaker 和 @EnableDiscoveryClient。
*
* @EnableAutoConfiguration
* 可以帮助 Spring Boot 应用将所有符合条件的 @Configuration 配置都加载到当前 Spring Boot 创建并使用的 IoC 容器。
*/
@EnableZuulProxy
@EnableAutoConfiguration
public class GateWayApplication {
public static void main(String[] args) {
SpringApplication.run(GateWayApplication.class,args);
}
}
5、依次启动注册中心、服务提供者 provider,运行 GateWayApplication。
6、访问注册中心网关 gateway 已经在 Eureka Server 完成注册。
7、调用服务。
同时 Zuul 自带了负载均衡功能 ,修改provider端口再启动一个服务提供者,访问两次 http://localhost:8030/p/student/index,分别请求了端口为 8011 和 8012 的 provider 微服务,实现了负载均衡。
四、总结
本节使用 Zuul 组件实现服务网关的具体操作,Zuul 需要结合 Eureka Client 在注册中心完成注册,Zuul 是一个在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架,相当于客户端和 Netflix 流应用 Web 网站后端所有请求的中间层,可以简化代码的开发。
完整demo下载地址:
https://gitee.com/zhengj/myspringcloud.git