这篇文章,主要介绍微服务组件之Gateway服务网关基础环境搭建、高可用网关环境搭建。
目录
一、Gateway服务网关
1.1、什么是Gateway
1.2、Gateway基础环境搭建
(1)基础环境介绍
(2)引入依赖
(3)添加路由配置信息
(4)运行测试
1.3、Gateway三个核心概念
1.4、Gateway配置信息
(1)routes路由信息配置
(2)defaultFilters默认过滤器配置
(3)predicates断言配置
1.5、高可用网关环境搭建
(1)搭建nginx环境
(2)创建两个Gateway工程
一、Gateway服务网关
1.1、什么是Gateway
在微服务架构里面,会存在很多的微服务应用程序,这些服务集群部署在一起对外提供服务,一般实际开发中,都会通过一个公共的入口地址将微服务应用暴露给客户端,这个公共的入口将其单独作为一个微服务应用,这个应用程序就叫做:服务网关,常见的网关有:zuul、Gateway等,其中Gateway的出现就是为了替代zuul网关。基于网关,可以实现统一用户认证、统一权限校验、接口限流、服务降级、接口调用统计、协议适配等功能。
有五种实现网关功能的方案,分别是:
- 第一种:nginx + Lua。
- 第二种:Kong。
- 第三种:Traefik。
- 第四种:Spring Cloud Netflix Zuul。
- 第五种:Spring Cloud Gateway。
1.2、Gateway基础环境搭建
(1)基础环境介绍
这篇文章搭建的基础环境主要包含下面几个工程:
- 注册中心:eureka服务端(直接使用前几篇文章的应用程序)。
- 服务提供者:搭建一个服务消费者(consumer-client)、一个服务提供者(provider-client)(直接使用前几篇文章的应用程序)。
- 网关工程(gateway-server):搭建Gateway网关工程(这篇文章需要创建的新工程)。
(2)引入依赖
- 创建一个【gateway-server】工程,引入【gateway】依赖。
<!-- 引入 Gateway 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
(3)添加路由配置信息
server:
port: 8888
spring:
application:
name: gateway-server
# 配置 gateway 路由信息
cloud:
gateway:
# 指定路由信息
routes:
- id: consumer-client # 路由唯一标识,一般和微服务应用名称相同即可
# 目标路由的服务地址,这里采用的是静态路由(将微服务的地址写死在配置文件里面)
uri: http://localhost:8081/
# 配置断言,也就是请求的URI满足哪些规则,才可以匹配当前这个routes路由信息
predicates:
# 这里使用路由断言,所有 /api/consumer 开头的请求,都将转发到 http://localhost:8081/ 这个服务上面
- Path=/api/consumer/**
(4)运行测试
依次启动eureka、consumer-client、provider-client、gateway-server四个工程,打开postman,访问gateway-server网关工程访问接口【http://localhost:8888/api/consumer/getUserInfo?username=csdn2023】,此时可以正常返回响应结果,就表示网关工程的基础环境就搭建成功。
1.3、Gateway三个核心概念
Gateway网关中,有三个重要的核心概念,分别是:路由Routes、断言Predicates、过滤器Filter。路由Routes是Gateway网关中最基本的一个组成部分,它主要负责定义微服务的路由信息,它是由路由ID、目标URI、一组断言、一组过滤器组成的。
当客户端一个请求到达Gateway网关的时候,首先会被Gateway Handler Mapping处理,根据URI找到能够匹配的Routes路由信息,然后将路由信息发送到Global Web Handler进行微服务应用程序的接口调用,调用之前会经过一系列的Filter,接口调用成功之后,也会经过一系列的Filter,最终返回给客户端,这就是Gateway网关的一个大致工作原理。
断言是指定路由信息满足哪些规则时候,才会匹配成功,简单的理解为,断言就是一系列的if判断语句,只有当前客户端请求满足条件的时候,才能够找到这个路由信息,然后根据这个路由信息去调用微服务。
过滤器Filter是在调用微服务的过程中,可以在过滤器中增加一些额外的操作,比如:增加header头信息、去掉某些请求参数等等,有两种类型的过滤器:Gateway Filter路由过滤器 和 Global Filter全局过滤器。
1.4、Gateway配置信息
在GatewayProperties类中定义了Gateway网关相关的配置信息,其中大致包含:routes、defaultFilters、streamingMediaTypes等信息,如下所示:
(1)routes路由信息配置
其中routes是最关键的配置信息,用于定义路由信息,每一个路由信息都被抽象成了RouteDefination对象,这个类中包含:id、uri、order、predicates、filters、metadata。
id用于指定路由的唯一标识,一般和微服务名称相同即可;uri用于指定目标微服务的服务地址(可以指定具体的服务地址,也可以结合注册中心实现动态路由功能);order用于指定多种路由中的优先级;predicates用于指定断言;filters用于设置过滤器;metedata用于设置元数据信息。
(2)defaultFilters默认过滤器配置
Gateway给我们提供了一些默认的过滤器,使用的时候通过defaultFilters属性指定,每一个过滤器对象被抽象成一个FilterDefination类。
(3)predicates断言配置
predicates属性用于指定路由的断言,满足断言的URI将匹配当前这个路由信息。断言可以有多个,只要满足其中一个条件,就可以匹配当前这个路由信息,按照顺序依次匹配,只要前面匹配成功了,后面的断言就不会执行了,每一个断言对象都被抽象成了一个PredicateDefination类。
1.5、高可用网关环境搭建
在高并发的场景下,一台Gateway网关服务没办法处理大量的请求,如果此时Gateway服务宕机了,那么整个微服务系统也将不可用,所以为了提高服务的可用性,需要对Gateway部署多台服务结点,也就是集群部署Gateway网关。
那这里就有一个问题啦,客户端应该和哪个Gateway进行交互呢???为了解决这个问题,就需要借助于Nginx服务器来实现请求的分发,将请求依次分发到不同的Gateway网关中,从而实现高可用的网关环境。
(1)搭建nginx环境
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream gateway {
server 127.0.0.1:8888;
server 127.0.0.1:9999;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /api-gateway {
# 负载均衡
proxy_pass http://gateway;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
(2)创建两个Gateway工程
要实现Gateway网关的高可用,就需要部署多台网关工程,然后通过nginx请求转发,指定通过哪一台Gateway网关进行请求处理。采用这种模式搭建的Gateway网关,就可以实现高可用,即使其中一台Gateway宕机了,也有其他的Gateway可以继续提高服务。
到此, Gateway服务网关的基础环境、高可用网关环境搭建就搭建完啦。
综上,这篇文章结束了,主要介绍微服务组件之Gateway服务网关基础环境搭建、高可用网关环境搭建。