API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部 客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服 务通信,会有以下的问题:
以上这些问题可以借助 API 网关解决。API 网关是介于客户端和服务器端之间的中间层, 所有的外部请求都会先经过 API 网关这一层。也就是说,API 的实现方面更多的考虑业务 逻辑,而安全、性能、监控可以交由 API 网关来做,这样既提高业务灵活性又不缺安全性: 使用 API 网关后的优点如下:
客户端发送请求给网关,弯管 HandlerMapping 判断是否请求满足某个路由,满足就发给网 关的 WebHandler。这个 WebHandler 将请求交给一个过滤器链,请求到达目标服务之前,会 执行所有过滤器的 pre 方法。请求到达目标服务处理之后再依次执行所有过滤器的 post 方 法。
一句话:满足某些断言(predicates)就路由到指定的地址(url),使用指定的过滤器(filter)
1.创建一个项目作为api网关
然后选择gateway作为依赖
2.在gateway的pom文件中引入common依赖
<!--依赖common-->
<dependency>
<groupId>com.sysg.gulimail</groupId>
<artifactId>gulimail-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
3.在gateway的主启动类添加@EnableDiscoveryClient注解,开启服务的注册和发现
4.在application.properties文件中配置nacos地址
#nacos注册发现地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#当前应用名称
spring.application.name=gulimail-gateway
5.新建bootstrap.properties文件,用来配置nacos的配置中心,来动态加载配置
#应用名称
spring.application.name=gulimail-gateway
#注册发现中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置命名空间
spring.cloud.nacos.config.namespace=24a39c61-8e45-4234-ac43-d4f2c2133012
6.在nacos的命名空间中,添加gateway的配置
注:如果启动发生依赖冲突,可以将gateway项目pom文件当中,引入的common依赖注释掉spring-boot-stater
<dependency>
<groupId>com.sysg.gulimailgroupId>
<artifactId>gulimail-commonartifactId>
<exclusions>
<exclusion>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
exclusion>
exclusions>
<version>0.0.1-SNAPSHOTversion>
dependency>
7.新建application.yml文件
spring:
cloud:
gateway:
#路由规则
routes:
- id: test_route
uri: https://www.baidu.com
#断言规则
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
访问
http://localhost:8888/?url=baidu