为什么需要网关?来看一个示意图:
订单微服务中对商品微服务进行调用,没有问题。但是对于客户端,对微服务进行调用,就会暴露出当前架构下的问题:
- 客户端需要维护服务端的各个地址,代码编写以及维护困难
- 认证 鉴权复杂
- 跨域问题
API网关就是用来解决这些问题的。所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,比如认证、鉴权、监控、路由转发等。
目录
1 创建一个api-gateway的模块,导入相关依赖
<dependencies>
<!--gateway网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
2 创建主类
package cn.jack;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
3 添加配置文件
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
gateway:
routes: # 路由数组(路由:就是当指定请求满足什么条件的时候,转发到哪个微服务)
- id: product_route # 当前路由的标识,要求唯一。默认uuid
uri: http://localhost:8081 # 请求要转发的地址
order: 1 # 路由的优先级,数字越小级别越高
predicates: # 断言(就是路由转发要满足的条件)
- Path=/product-serv/** # 当请求路径满足Path指定的规则时,才进行路由转发
filters: # 过滤器,请求在传递过程中可以通过过滤器对其进行一定的修改
- StripPrefix=1 # 转发之前去掉1层路径
4 启动项目,并通过网关去访问微服务
到这里,已经实现了通过网关访问微服务。但还存在点问题:配置文件中要转发的地址写死了,也就是说服务信息并没有从nacos获取。关于这点参看另一篇文章:Gateway从nacos中获取服务信息
5 扩展:网关的执行流程