二十八 网关组件工程模块合并

通过合并网关六个模块 【admin、center、core、assist、engine、sdk】 到统一服务下管理,完成 API 网关的多模块组装,为后续功能迭代做铺垫。

模块服务

截止到本章整个 API 网关的核心流程就已经全部开发完成了,并可以完成基本测试调用。从本章开始将是对网关功能的细节迭代,因为这些内容会涉及到对网关六个模块 【admin、center、core、assist、 engine、sdk】的开发。所以到本章开始把整个工程合并,后续的章节将按照创建分支的方式进行开发。

28-模块服务

目前网关系统的六大模块工程,主要分为三个大的部分在运行:

  1. 网关算力:由 api-gateway-core、api-gateway-assist、api-gateway-engine 组成,core 提供算力、assist 处理封装、engine 镜像打包和启动。
  2. 管理中心:由 api-gateway-admin、api-gateway-center 组成,admin 后台运营、center 注册中心。
  3. 接口上报:由 api-gateway-sdk 提供,它被应用系统引入,在应用系统中以注解的方式提取应用 RPC 接口信息并向注册中心发送。

模块合并

28-模块合并

  • 合并的方式是通过 IDEA 创建出一个多模块工程,再分别把网关各个模块的最新代码复制进去。
  • admin-管理后台、assist-助手、center-注册中心、core-核心通信、engine-启动引擎、sdk-上报接口、test-RPC测试工程
  • doc 包含了最新的 sql 文件、nginx 配置、postman 接口等内容,后续一些必备的配置也会放到这里。
  • 此外,api-gateway-center、api-gateway-engine,都是 Java 的部署工程,已经在工程下提供好了 Docker 配置,非常容易上手部署。

部署文件

api-gateway-center

打包镜像——Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像
FROM openjdk:8-jre-slim
# 作者
MAINTAINER Ray
# 配置
ENV PARAMS=""
# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用
ADD target/api-gateway-center.jar /api-gateway-center.jar
## 在镜像运行为容器后执行的命令
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /api-gateway-center.jar $PARAMS"]

部署镜像——start.sh

1
2
3
4
5
6
7
docker run \
--name Nginx \
-d \
-v /Users/ray/Source/api-gateway/api-gateway/doc/data/html:/usr/share/nginx/html \
-v /Users/ray/Source/api-gateway/api-gateway/doc/data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-p 8090:80 \
nginx

api-gateway-engine

打包镜像——Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
# 基础镜像
FROM openjdk:8-jre-slim
# 作者
MAINTAINER Ray
# 配置
ENV PARAMS=""
# 时区
ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用
ADD target/api-gateway-engine.jar /api-gateway-engine.jar
# 执行镜像
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /api-gateway-engine.jar $PARAMS"]

部署镜像——start-01.sh

1
2
3
4
5
6
7
8
9
docker run -p 8902:8902 -p 7397:7397 \
-e PARAMS="
--sever.port=8902
--api-gateway.address=http://10.17.91.135:8901
--api-gateway.groupId=10001
--api-gateway.gatewayId=api-gateway-g4
--api-gateway.gatewayName=电商配送网关
--api-gateway.gatewayAddress=10.17.91.135:7397" \
--name api-gateway-engine-01 -d api-gateway-engine:1.0.0

部署镜像——start-02.sh

1
2
3
4
5
6
7
8
9
docker run -p 8903:8903 -p 7398:7398 \
-e PARAMS="
--sever.port=8903
--api-gateway.address=http://10.17.91.135:8901
--api-gateway.groupId=10001
--api-gateway.gatewayId=api-gateway-g4
--api-gateway.gatewayName=电商配送网关
--api-gateway.gatewayAddress=10.17.91.135:7398" \
--name api-gateway-engine-02 -d api-gateway-engine:1.0.0

部署镜像——start-03.sh

1
2
3
4
5
6
7
8
9
docker run -p 8904:8904 -p 7399:7399 \
-e PARAMS="
--sever.port=8904
--api-gateway.address=http://10.17.91.135:8901
--api-gateway.groupId=10001
--api-gateway.gatewayId=api-gateway-g4
--api-gateway.gatewayName=电商配送网关
--api-gateway.gatewayAddress=10.17.91.135:7399" \
--name api-gateway-engine-03 -d api-gateway-engine:1.0.0

网关算力可以部署多套,所以这里直接提供了 start-01.sh、start-02.sh、start-03.sh 三个部署文件,方便测试网关算力的集群能力。

Nginx

1
2
3
4
5
6
7
docker run \
--name Nginx \
-d \
-v /Users/ray/Source/api-gateway/api-gateway/doc/data/html:/usr/share/nginx/html \
-v /Users/ray/Source/api-gateway/api-gateway/doc/data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-p 8090:80 \
nginx

容器部署

整个 API 网关所需的基础环境包括:MySQL、Zookeeper、Nginx、Redis:

28-容器部署

这里 MySQL 和 Redis 都是使用云服务器上的。

在有了基础配置以后,就可以通过 api-gateway 各个模块下的容器部署配置,来启动工程了。

测试验证

28-测试-1

28-测试-2

28-测试-3

28-测试-4

可以看到测试通过,三次请求分别打到了不同的服务上。

思考

一些优化想法

目前 assist 服务注册以及 sdk 接口上报都是利用 cn.hutool.http.HttpUtil#post 向网关中心 api-gateway-center 接口构建请求,后续可以优化为 MQ 实现异步更新(当注册网关服务或者上报接口方法时,向 MQ 发送一条信息,注册中心监听到该信息之后进行对应的处理),这样也就避免了因为网络问题导致请求无法正常接收处理的问题,不过也会引入一些关于 MQ 的问题(比如消息重复消费或者消息丢失等