1. 项目准备
项目demo简述:
前端:nginx部署页面,并反向代理后端api接口
后端:SpringBoot + Mybatis,web项目访问mysql数据库
1.1 后端项目
1.1.1 数据库表
user
表
CREATE DATABASE IF NOT EXISTS `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `demo`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jack', 22);
INSERT INTO `user` VALUES (2, 'Tom', 21);
SET FOREIGN_KEY_CHECKS = 1;
1.1.2 SpringBoot项目
同普通SpringBoot项目一样,整合Mybatis,可参考我其他的博客。下面只给出Controller,和访问结果。
package ace.gjh.controller;
import ace.gjh.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author ACE_GJH
* @date 2021/5/7
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user")
public Object userInfo(){
return userService.listUsers();
}
}
访问效果
GET http://localhost:8888/test/user
[
{
"id": 1,
"name": "Jack",
"age": 22
},
{
"id": 2,
"name": "Tom",
"age": 21
}
]
1.2 前端项目
1.2.1 页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<script src="js/jquery-3.4.1.min.js"></script>
<script>
$(function () {
test()
})
/*加载文件列表*/
function test() {
$.ajax({
url: "/api/test/user",
type: "GET",
dataType: "json",
success: function (result) {
$("#result").text("name: " + result[0].name + " age: " + result[0].age + " | name: " + result[1].name + " age: " + result[1].age)
}
})
}
</script>
</head>
<body>
<h2>测试页面</h2>
访问后台数据结果:<p id="result"></p>
</body>
</html>
1.2.2 nginx代理
注意反向代理需要配置后端Service的Cluster-IP和端口,因为nginx的配置文件无法从环境变量中获取值(无法通过服务发现获取后端服务的IP和端口)。
server {
listen 18888;
server_name localhost;
location / {
root <你的前端文件夹路径>\k8s-test-frontend;
index index.html index.htm;
}
# 反向代理后端api
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://<后端Service的Cluster-IP>:<后端Service的端口>/;
}
}
1.2.3 页面效果
2. Docker镜像准备
2.1 数据库镜像
2.1.1 初始化sql脚本
CREATE DATABASE IF NOT EXISTS `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `demo`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'Jack', 22);
INSERT INTO `user` VALUES (2, 'Tom', 21);
SET FOREIGN_KEY_CHECKS = 1;
2.1.2 Dockerfile
FROM mysql:8.0.24
MAINTAINER ACE_GJH
COPY ./demo.sql /docker-entrypoint-initdb.d
制作镜像
docker build -f Dockerfile -t demo-mysql:0.1.0 .
2.2 后端镜像
2.2.1 Dockerfile
注意:脚本中最后的java运行命令,需要从环境变量中注入Mysql服务Service的Cluster-IP和对应的端口,需要参照MySQL的Service中的名称进行对应,例如下面的mysql服务IP地址为环境变量DEMO_MYSQL_SERVICE_SERVICE_HOST
,mysql端口DEMO_MYSQL_SERVICE_SERVICE_PORT_MYSQL_PORT
,还要注意这坑爹的时区serverTimezone=UTC
,一定要和你的服务器对应,否则一直连接超时。
FROM java:8-alpine
MAINTAINER ACE_GJH
RUN mkdir /app
WORKDIR /app
COPY k8s-deploy-1.0-SNAPSHOT.jar /app
EXPOSE 8888
ENV JAVA_OPT="-Xmx32m -Xms32m -Xmn16m"
CMD java $JAVA_OPT -Dspring.datasource.url="jdbc:mysql://${DEMO_MYSQL_SERVICE_SERVICE_HOST}:${DEMO_MYSQL_SERVICE_SERVICE_PORT_MYSQL_PORT}/demo?characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" -jar k8s-deploy-1.0-SNAPSHOT.jar
制作镜像
docker build -f Dockerfile -t demo-backend:0.1.0 .
2.3 前端镜像
FROM nginx:1.20.0-alpine
MAINTAINER ACE_GJH
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
COPY ./webpack/dist /usr/share/nginx/webpack/dist
制作镜像
docker build -f Dockerfile -t demo-frontend:0.1.0 .
3. k8s配置文件
3.1 数据库
3.1.1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-mysql
namespace: gjh
spec:
selector:
matchLabels:
app: demo-mysql
replicas: 1
template:
metadata:
labels:
app: demo-mysql
spec:
volumes:
# mysql数据
- name: mysql-data
hostPath:
path: /root/data/demo/mysql
containers:
- name: demo-mysql
image: demo-mysql:0.1.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-data
3.1.2 Service
apiVersion: v1
kind: Service
metadata:
name: demo-mysql-service
namespace: gjh
spec:
ports:
- port: 3306
name: mysql-port
selector:
app: demo-mysql
3.2 后端项目
3.2.1 ReplicationController
为了起到负载均衡的作用,这里副本数选择2
apiVersion: v1
kind: ReplicationController
metadata:
name: demo-backend-rc
namespace: gjh
labels:
app: demo-backend
spec:
selector:
app: demo-backend
replicas: 2
template:
metadata:
labels:
app: demo-backend
spec:
containers:
- name: demo-backend
image: demo-backend:0.1.0
ports:
- containerPort: 8888
3.2.2 Service
apiVersion: v1
kind: Service
metadata:
name: demo-backend-service
namespace: gjh
spec:
type: NodePort
ports:
- port: 8888
name: backend-port
nodePort: 38888
selector:
app: demo-backend
3.3 前端项目
3.3.1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-frontend
namespace: gjh
spec:
selector:
matchLabels:
app: demo-frontend
replicas: 1
template:
metadata:
labels:
app: demo-frontend
spec:
containers:
- name: demo-frontend
image: demo-frontend:0.1.0
ports:
- containerPort: 18888
3.3.2 Service
apiVersion: v1
kind: Service
metadata:
name: demo-frontend-service
namespace: gjh
spec:
type: NodePort
ports:
- port: 18888
name: frontend-port
nodePort: 38889
selector:
app: demo-frontend