十九章 网关引擎打包镜像部署

api-gateway-engine 是一个用于启动网关算力服务的引擎工程,它的代码内容几乎没有多少,主要负责的是工程的启动操作,因为镜像的打包也是从这个工程中处理。

实现

  1. api-gateway-core:核心通信模块,处理网关对接口的协议转换和映射操作以及泛化调用对应的 RPC 接口。
  2. api-gateway-assist:将 api-gateway-core 包装,提供简化的使用方式。
  3. api-gateway-engine 则是一个打包的执行引擎工程,打包后提供可部署到容器的 Jar 包。

这里的 engine 其实和之前的 assist-test 大体一致,只不过相当于从 assist 中抽取出来,做一个整理分类的动作。

工程相关

引入 assist 的 Jar 包

1
2
3
4
5
<dependency>
<groupId>cn.ray.gateway</groupId>
<artifactId>api-gateway-assist-04</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

在 application.yml 中配置所需要的网关配置信息

1
2
3
4
5
6
7
8
9
server:
port: 8004

api-gateway:
address: http://10.17.223.250:80 # 注册中心;从这里获取接口信息以及完成注册网关操作【你需要更换为你自己的IP】
groupId: 10001 # 网关分组;每一个网关通信组件都分配一个对应的分组
gatewayId: api-gateway-g4 # 网关标识;
gatewayName: 电商配送网关 # 网关名称
gatewayAddress: 10.17.223.250:7397 # 网关服务;网关的通信服务Netty启动时使用IP和端口【你需要更换为你自己的IP】

Tips:因为网关需要部署到 Docker 那么就不能指定 IP,因为这里的 IP 是自动分配的。所以需要把 api-gateway-core-09.GatewaySocketServer#bind 方法处理下,只提供端口即可。

19-实现

打包相关

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"]

这是一个用于打包工程的 Dockerfile 文件,最主要的就是添加应用

ADD target/api-gateway-engine.jar /api-gateway-engine.jar

build.sh 构建文件

1
docker build -f ./Dockerfile -t api-gateway-engine:1.0.1 .

start.sh 启动脚本

1
docker run -p 8004:8004 -p 7397:7397 --name api-gateway-engine -d api-gateway-engine:1.0.1

这里有2个端口映射,一个是 8004 engine 自身应用的端口,还有一个 7397 网关 Netty 服务的端口。

测试

前置步骤

  1. 启动 Docker 容器,因为打包镜像时候需要。
  2. 启动 zookeeper 注册中心。
  3. 在步骤 2 的基础上,启动 RPC 服务应用 api-gateway-test。
  4. 启动 api-gateway-center 注册中心,这样才能从注册中心拉取接口。
  5. 确保 api-gateway-core-09、api-gateway-assist-04、api-gateway-engine-01 都已 clean 后并 install 打包了。

网关镜像

19-测试-1

19-测试-2

19-测试-3

测试调用

GET

Postman

19-测试-4

日志

19-测试-5

POST

Postman

19-测试-6

日志

19-测试-7

思考

SpringBoot工程是打包 War 包还是 Jar 包?

可能大部分伙伴经常看到工程中有的是配置 \war\有的是配置 \jar</packaging>这是咋回事呢,自己要配置啥呢?

其实早在以前,大家对于 Spring 的 Web 工程,为了把一些资源类的文件包括 WEB 等都进行打包,通常是默认配置 war 包,并把打包后的文件放到 Tomcat 中进行部署,部署时会进行自动解压缩。而随着后来前后端分离以及容器化的兴起,通常会把 SpringBoot 打包成 Jar 包,也就是打包成单一可执行的程序【镜像】,放到 Docker 中启动。

问题:包部署 Docker 后无法使用 localhost 或者 127.0.0.1 这样的 IP 地址访问服务

对于 Docker 容器中不能直接使用 localhost 或者 127.0.0.1 这样的 IP 地址表示本机,因为当我们的包部署在容器中,“本机” 此时就是容器本身了,必须使用确定的 IP 地址来访问本机服务。