文章目录
服务网关简介
服务网关能提供一种简单有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如熔断,限流,重试等
Gateway是基于spring5,springboot2和project reactor等技术
网关是所有微服务的入口
Gateway工作流程
三大核心概念
路由
- 路由是构建网关的基本模块,他由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
断言
- 判断接收到的请求和断言是否匹配,匹配则路由
过滤
- 过滤器拦截请求在路由之前或之后对请求进行修改
处理流程
web请求,首先会通过服务网关的断言匹配,通过一些匹配条件,定位到真正的服务节点,而在进入微服务前,还会经历过滤器,过滤器是一个无所不能的拦截器,可以对请求进行拦截修改
- client想gateway发出请求
- 然后在gateway handler mapping中找到与请求相匹配的路由,将其发送到gateway web handler
- handler在通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回
- 过滤器可以做参数校验,权限校验,流量监控,日志输出,也可以修改响应头等等
总结
- 通过断言找到指定的微服务,通过路由进行转发,过滤器可以实现在转发前或转发后对请求进行修改
demo
引入依赖
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
修改yaml配置文件
server:
port: 9528
spring:
application:
name: gateway9528
cloud:
gateway: # 所有的路由映射这里配置
routes:
- id: order8102 # 路由ID
uri: http://localhost:8102 # 路由的URI
predicates:
- Path=/get/gateway # 路由的路径
eureka:
client:
register-with-eureka: true # 向注册中心注册自己
fetch-registry: true # true表示自己不是注册中心
service-url:
defaultZone: http://eureka7779.com:7779/eureka/ # eureka服务端地址
# http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/ # eureka服务端地址
order8102服务路由
@RestController
@Slf4j
@RequestMapping("/get")
public class OrderController {
@Autowired
public RestTemplate restTemplate;
@RequestMapping("/gateway")
public String gateway(){
return UUID.randomUUID().toString();
}
进行了gateway网关配置后,原来访问order8102服务需要
http://localhost:8102/get/gateway
现在配置了网关后,域名那块会被隐藏起来,通过网关域名去请求,进而转发到真实的微服务
http://localhost:9528/get/gateway
通过微服务名进行动态路由
- 在实际情况下,一个微服务下可能有多台机器集群部署,那么这就要求我们的gateway能够实现负载均衡,根据服务名找到微服务集群,在通过负载均衡定位到指定的机器
server:
port: 9528
spring:
application:
name: gateway9528
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从服务注册中心动态创建路由的功能,利用微服务名称进行路由
routes:
- id: order # 路由ID
# uri: http://localhost:8102 # 路由的URI
uri: lb://order # 通过lb://微服务名
predicates:
- Path=/get/gateway # 路由的路径
eureka:
client:
register-with-eureka: true # 向注册中心注册自己
fetch-registry: true # true表示自己不是注册中心
service-url:
defaultZone: http://eureka7779.com:7779/eureka/ # eureka服务端地址
# http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/ # eureka服务端地址
order微服务集群
8102
@RestController
@Slf4j
@RequestMapping("/get")
public class OrderController {
@Value("${server.port}")
private String port;
@RequestMapping("/gateway")
public String gateway(){
return port + " --- " + UUID.randomUUID().toString();
}
}
8105
@RestController
@Slf4j
@RequestMapping("/get")
public class OrderController {
@Value("${server.port}")
private String port;
@RequestMapping("/gateway")
public String gateway(){
return port + " --- " + UUID.randomUUID().toString();
}
}
结果: