Spring Cloud 创建Spring Cloud Gateway网关服务
一、API网关简介
概念简介
在通信领域,网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。
在系统架构中,和上面定义类似,API网关负责联通多个微服务或者内部服务的通信,负责所有请求的鉴权转发等处理,可以说,**API网关是一个服务器,是系统的唯一入口。**API网关封装了系统内部架构,为每个客户端提供一个定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。
架构图示:
网关的基本功能
路由功能:路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。
负载均衡: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访问