Spring Cloud 创建Spring Cloud Gateway网关服务

一、API网关简介
概念简介

在通信领域,网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。

在系统架构中,和上面定义类似,API网关负责联通多个微服务或者内部服务的通信,负责所有请求的鉴权转发等处理,可以说,**API网关是一个服务器,是系统的唯一入口。**API网关封装了系统内部架构,为每个客户端提供一个定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

架构图示:

springcloud gateway多人开发 springcloud api gateway_微服务

网关的基本功能

路由功能:路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。

负载均衡:API网关结合负载均衡技术,利用Eureka或者Consul等服务发现工具,通过轮询、指定权重、IP地址哈希等机制实现下游服务的负载均衡。

统一鉴权:网关应该能够成功进行身份验证并仅允许可信客户端访问 API,并且还能够使用类似 RBA C等方式来授权。

灰度发布:网关完全可以做到对相同服务不同版本的实例进行导流,还可以收集相关的数据。这样对于软件质量的提升,甚至产品试错都有非常积极的意义。

协议转换:API网关的一大作用在于构建异构系统,API网关作为单一入口,通过协议转换整合后台基于REST、AMQP、Dubbo等不同风格和实现技术的微服务,面向Web Mobile、开放平台等特定客户端提供统一服务。

指标监控:网关可以统计后端服务的请求次数,并且可以实时地更新当前的流量健康状态,可以对URL粒度的服务进行延迟统计,熔断发生状态记录等。

限流熔断:在某些场景下需要控制客户端的访问次数和访问频率,一些高并发系统有时还会有限流的需求,网关能够主动进行熔断,保护后端服务,并保持前端用户体验良好。

日志审计:微服务网关可以作为统一的日志记录和收集器,对服务URL粒度的日志请求信息和响应信息进行拦截。

API 编排等:网关结合Swagger,可以将后端的微服务暴露给网关,网关作为统一的入口给接口的使用方提供查看后端服务的API规范,不需要知道每一个后端微服务的Swagger地址,这样网关起到了对后端API聚合的效果。

二、网关常见服务组件
  • 根据语言和技术分类
  • Nginx+lua:OpenResty、Kong、Orange、Abtesting gateway 等
  • Java:Zuul/Zuul2、Spring Cloud Gateway、Kaazing KWG、gravitee、Dromara soul 等
  • Go:Janus、fagongzi、Grpc-gateway
  • Dotnet:Ocelot
  • NodeJS:Express Gateway、Micro Gateway
  • 根据流行程度分类
  • OpenResty
  • Kong
  • Zuul、Zuul2
  • Spring Gateway
三、集成Spring Cloud Gateway服务【SpringCloud+Eureka+GateWay+Feign】
  • 1.基于 新建module,创建spring boot项目
    选择Spring Cloud Routing -> Gateway、Eureka Discovery Client【集合服务注册使用】
  • 启动入口新增注解
@EnableEurekaClient
@SpringBootApplication
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}
  • pom.xml引入父级坐标
<parent>
      <groupId>com.example</groupId>
      <artifactId>microservice</artifactId>
      <version>0.0.1-SNAPSHOT</version>
</parent>
  • 配置文件
#自定义微服务名称
spring:
  application:
    name: api-gateway
  cloud:
    discovery:
      enabled: true
    gateway:
      discovery:
        locator:
          enabled: true #是否与服务中心的发现组件进行整合
          lower-case-service-id: true
      httpclient:
        pool:
          max-connections: 500
          max-idle-time: 10000
      routes:
        # 路由id,可以根据自定义标准设置
        - id: microservice01
          uri: lb://consumer-service/  # 服务提供者在注册中心注册的服务名,通过服务名提供服务
          predicates:
            - Path=/microservice01/** #断言,路径相匹配的进行路由---断言也就是匹配方式,会跳转上面的uri
          filters: 
            - StripPrefix=1

  #端口
server:
  port: 7001
  #根据刚才定义的注册中心的对外暴露的地址填写。

# 需要引入actuator
management:
  endpoints:
    web:
      exposure:
        include: "*" # 暴露所有端点

# 服务注册
eureka:
  client:
    service-url:
      default-zone: http://localhost:8761/eureka/
      register-with-eureka: true
      fetch-registry: true
    #每隔3秒拉取最新的注册列表(默认30秒)
    registry-fetch-interval-seconds: 3
  #心跳间隔时间为3秒(默认30秒)
  instance:
    prefer-ip-address: true
    hostname: localhost
  • 依次启动服务
  • eureka-server【注册中心】
  • consumer-service【服务消费者】
  • manager-server【服务提供者】
  • api-gateway【api网关】- 本文创建
  • 测试结论
  • 通过consumer-service访问
  • 通过api-gateway网关访问,通过网关设置的别名microservice01访问