本文基于上一篇http://t.csdnimg.cn/q3YrK 使用抽取的方案使用feign的基础上使用Spring Cloud Gateway。
API网关
API网关(简称网关)也是一个服务,通常是后端服务的唯一入口。它就像是整个微服务架构的门面,所有的外部客户端访问都需要经过它来进行调度和过滤。
网关核心功能
权限控制:作为微服务的入口,对用户进行权限校验,如果校验失败则进行拦截。
动态路由:一切请求先经过网关,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务。
负载均衡:当路由的目标服务有多个时,还需要做负载均衡。
限流:请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大。
常见网关的实现
Zuul
Zuul是Netflix公司开源的一个API网关组件,是Spring Cloud Netflix子项目的核心组件之一。
它可以和Eureka、Ribbon、Hystrix等组件配合使用。
在Spring Cloud Finchley正式版之前,Spring Cloud推荐的网关是Netflix提供的Zuul(此处指Zuul 1.X)。
然而,Netflix在2018年宣布一部分组件进入维护状态,不再进行新特性的开发。这部分组件中就包含Zuul。
Spring Cloud Gateway
Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,基于Spring + SpringBoot等技术开发,目的是为了替换掉Zuul。
旨在为微服务架构提供一种简单而有效的途径来转发请求,并为他们提供横切关注点,比如:安全性、监控/指标和弹性。
Spring Cloud Gateway的使用
创建模块(项目)
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
添加启动类
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
org.springframework.boot.SpringApplication.run(GatewayApplication.class, args);
}
}
添加配置
server:
port: 8370
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 网关相关配置
gateway:
routes:
- id: order-service # 路由规则id,随便起
uri: lb://order-service # 访问的路径 这里的order-service和order-service的application.yml中的name要一致
predicates:
- Path=/order/** # 满足这个条件,才会转发到上面的uri
id: 自定义路由ID,保持唯一。
uri: 目标服务地址,支持普通URI及lb://应用注册服务名称。lb表示负载均衡,使用lb://方式表示从注册中心获取服务地址。
predicates: 路由条件,根据匹配结果决定是否执行该请求路由。上述代码中,我们把符合Path规则的一切请求,都代理到uri参数指定的地址。
启动测试
没有配置的就访问不了
在配置文件中添加,重启查看效果
# 网关相关配置
gateway:
routes:
- id: order-service # 路由规则id,随便起
uri: lb://order-service # 访问的路径 这里的order-service和order-service的application.yml中的name要一致
predicates:
- Path=/order/**, /feign/** # 满足这个条件,才会转发到上面的uri</