在上一篇文章中,我已成功创建了一个基本的管理功能的WEB应用,提供了几个REST API用于对产品进行管理。
在这个文章中,我将把提供这些API服务的WEB后端应用程序创建一个Docker镜像,放到服务器上运行。然后再把这些API注册发布到KONG API Gateway
创建Docker镜像:
1. 在服务器上安装Docker,具体安装步骤参照Docker官网。Doker安装好之后,运行命令sudo docker pull java, 获取Java镜像。
2. 把之前创建的Spring boot的Rest API进行打包发布。运行maven projects里面的package, 打包完成之后生成的JAR文件在target目录,上传到服务器的myweb目录。
3. 创建Docker文件,在myweb目录新建一个Dockerfile文件,输入以下信息:
FROM java:latest VOLUME /tmp ADD myweb-0.0.1-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
4. 在myweb目录下创建镜像,运行以下命令:
sudo docker build -t myweb:0.1 .
镜像创建成功后,运行一下命令来运行镜像(注意—net=’host’是使得镜像与宿主机的网络连通,不然的话没法访问mysql服务。这个选项好像会有些安全隐患,留待以后再做进一步研究):
sudo docker run --net='host' myweb:0.1
镜像运行成功后,打开网页http://server ip:9090/all,可以见到有输出全部的产品信息
配置KONG API Gateway:
1. 首先安装postgresql,按照官网的步骤,创建/etc/apt/sources.list.d/pgdg.list,在文件里面添加一行debhttp://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main, 然后执行以下命令:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update Sudo apt-get install postgresql-10
2. 安装好postgresql之后,执行以下命令来创建kong user:
createuser kong
输入以下命令进入psql命令行,设置kong的密码:
sudo -u postgres psql \password kong \q
创建kong数据库:
CREATE DATABASE kong OWNER kong
3. 安装KONG,在kong的网站下载对应的安装包,然后执行以下命令:
$ sudo apt-get update $ sudo apt-get install openssl libpcre3 procps perl $ sudo dpkg -i kong-community-edition-0.13.1.*.deb
安装好之后,去到/etc/kong目录,把kong.conf备份一下。把kong里面的和psql数据库相关的几行去掉注释,另外还要设置kong用户的密码,然后执行以下命令来migrate:
kong migrations up [-c /etc/kong/kong.conf]
执行以下命令来启动kong:
sudo kong start [-c /etc/kong/kong.conf]
访问http://localhost:8001即可看到kong启动完成后的配置信息
4. 发布API到KONG,首先要定义多个Service,分别对应之前创建的多个REST API。
创建获取所有产品信息的service, 执行以下的命令:
创建获取产品详细信息的service, 执行以下的命令:curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=get-all-products' \ --data 'url=http://server ip:9090/all'
curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=get-product' \ --data 'url=http://server ip:9090/productdetail/'
创建添加产品的service, 执行以下的命令:
curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=create-product' \ --data 'url=http://server ip:9090/createproduct/'
创建更新产品信息的service, 执行以下的命令:
创建删除产品的service, 执行以下的命令:curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=update-product' \ --data 'url=http://server ip:9090/updateproduct/'
curl -i -X POST \ --url http://localhost:8001/services/ \ --data 'name=delete-product' \ --data 'url=http://server ip:9090/deleteproduct/'
5. 为Services配置相应的routes,执行以下的命令:
curl -i -X POST \ --url http://localhost:8001/services/get-all-products/routes \ --data 'hosts[]=server ip' \ --data 'paths[]=/all' curl -i -X POST \ --url http://localhost:8001/services/get-product/routes \ --data 'hosts[]=server ip' \ --data 'paths[]=/productdetail' curl -i -X POST \ --url http://localhost:8001/services/create-product/routes \ --data 'hosts[]=server ip' \ --data 'paths[]=/createproduct' curl -i -X POST \ --url http://localhost:8001/services/update-product/routes \ --data 'hosts[]=server ip' \ --data 'paths[]=/updateproduct' curl -i -X POST \ --url http://localhost:8001/services/delete-product/routes \ --data 'hosts[]=server ip' \ --data 'paths[]=/deleteproduct'
KONG的API Gateway已经配置好了
前端代码修改:
修改前端的代码,把Angular的项目的product.service.ts中的指向API的链接全都更新为新的API Gateway的链接。
private productsUrl ='http://server ip:8000/all'; private productDetailUrl ='http:// server ip:8000/productdetail'; private productUpdateUrl ='http:// server ip:8000/updateproduct'; private productCreateUrl ='http:// server ip:8000/createproduct'; private productDeleteUrl ='http:// server ip:8000/deleteproduct';
启动Web前端,访问页面,可以看到系统实现的功能和之前一样,表明我们的API Gateway已经设置成功了。