运维学习(五)前后端分离项目的部署运维实践
一、选择开源项目renren-fastrenren-fast是一款前后端分离的开源项目,前端主要技术是vue,后端主要技术java,我将以开源项目renren-fast做为这次部署运维实践的素材。访问www.renren.io,点击下载后端源码以及前端源码,跳转gitee,从gitee上获得前后端源码。二、Windows中运行和查看项目三、Linux中部署项目...
一、选择开源项目renren-fast
renren-fast是一款前后端分离的开源项目,前端主要技术是vue,后端主要技术java。我以开源项目renren-fast做为这次部署运维实践的素材。
访问www.renren.io,点击下载后端源码以及前端源码,跳转gitee,从gitee上获得前后端源码。
二、Windows中查看项目
2.1 运行后端项目
使用eclipse导入renren-fast的后端项目代码:
db文件夹中是项目将要使用到的数据,这里就使用mysql数据库,选用db文件夹中的mysql.sql把数据表建立好:
application.yml中配置了运行项目时使用的是dev环境的配置 ,那么需要把application-dev.yml中的数据源配置做修改,
将其中的数据库连接信息修改成自己的:
之后运行项目即可。
renren-fast中使用了swagger技术便于接口测试,在人人网的开发文档中提供了swagger的接口测试页面地址。
访问该页面,就可以对接口进行测试 :
2.2 运行前端项目
前端项目主要采用到的技术是VUE、NodeJS、ElementUI。
NodeJS要运行需要先下载安装NodeJS环境,下载后傻瓜式安装即可:
进入前端项目文件夹,
cmd运行命令安装npm:npm install
cmd运行命令启动前端项目:npm run dev
之后会自动弹出前端项目的登录页,填写用户名/密码:admin/admin 登录即可。
通过运行前端项目,在页面中进行操作,可以去eclipse中查看后端服务是否正常响应。
在windows中运行项目只是为了简单查看一下项目,之后就是在Linux中对项目进行部署和运维了。
三、Linux中部署后端项目
3.1 创建数据库及导入数据
之前在Linux上搭建了数据库集群,也实现了负载均衡中间件的高可用:
之前在Linux中使用Docker搭建了mysql的pxc集群,使用Keepalived占用了linux的ip 192.168.132.150,
数据库请求发送到这个ip时,会通过Keepalived被路由到Docker的虚拟ip 172.18.0.15,
又被主Keepalived转发给负载均衡中间件Harpoxy,最后分发请求给数据库集群其中某一个节点。
因此现在的操作是,在@192.168.132.150中新建数据库renren_fast,集群中也便会存在了此数据库,之后导入renren_fast后端项目中的sql文件,完成数据的导入。
3.2 修改mysql数据源配置
把application-dev.yml中的数据库连接、用户和密码修改成linux环境中的。
3.3 修改redis配置
之前在linux中搭建了redis集群。
把application.yml中的redis配置给修改成linux中redis集群的:
3.4 修改Tomcat配置
将Tomcat端口从8080修改为6001:
为什么要改tomcat端口?
注意,之后会将java程序部署成多个Docker容器,做服务集群。
因为Docker虚拟机禁止跨网段去访问,如果java程序运行时被划分到了net3网段,想使用net1网段的数据库集群、net2网段的redis集群,就会出问题。
解决办法是将java程序所在容器的网络对接到宿主机的网络上,不为这个java容器划分网段,直接使用宿主机的网络,就可以访问net1、net2的网段了。
(让应用使用宿主机网络)
但是现在又存在一个问题,在java容器里启动了一个tomcat,假如这个端口是8080,这个端口直接映射到宿主机的8080上。
将来要运行的java容器又不止一个,第二个要运行的容器中tomcat端口也是8080,也映射宿主机的8080,就会出现端口冲突的问题。
所以为tomcat设置不同的端口,第一个tomcat端口6001,第二个tomcat端口6002。。。从而避免端口冲突。
(避免多个应用容器与宿主机端口映射造成端口冲突)
3.5 用maven打包后端项目
由于renren-fast使用了springboot,包含了tomcat.jar,不需要打包成war包再在tomcat运行了。
把工程打包成jar包即可,运行jar文件就启动了tomcat,在其中部署了后端工程。
进入项目文件夹,运行maven打包命令:
mvn clean install -Dmaven.test.skip=true
注意,win10下 Shift+右击 打开的是 PowerShell 窗口,而 PowerShell 窗口下,执行带参数的需要’单引号’包起来才可以,
win10的PowerShell命令行工具运行时需使用 mvn clean package install '-Dmaven.test.skip=true'
或者 使用 cmd 进入命令行执行:mvn clean package install -Dmaven.test.skip=true
在项目target目录下打包生成了renren-fast.jar文件,之后会将其放到docker容器去运行。
3.6 运行java容器并部署后端项目
切换到linux
创建数据卷供java应用的容器使用:
docker volume create j1
将renren_fast.jar拷贝到linux数据卷中:
我以前就已经拉取过Java8的镜像,现在直接启动
运行java容器:
docker run -it -d --name j1 -v j1:/home/soft --net=host java
参数说明:
-v j1:/home/soft j1数据卷和容器内部的目录映射
--net=host 容器采用主机的网络
进入java容器交互界面:
jdocker exec -it j1 bash
启动后端应用:
java -jar /home/soft/renren-fast.jar 或 后台启动( nobup java -jar /home/soft/renren-fast.jar )
访问swagger测试界面,这次使用的是linux中部署的服务所在机器的IP:
可以正常访问,到此,单节点后端服务部署完成。
3.7 多节点部署
应用程序只启动了一个节点,很容易出现故障,导致服务无法访问。
现在开始部署java应用的第二个节点:
修改后端代码中的application.yml,将tomcat端口改为6002,然后重新打包。
创建数据卷j2:
docker volume create j2
将打好的jar包复制到j2数据卷中:
运行java容器:
docker run -it -d --name j2 -v j2:/home/soft --net=host java
进入java容器交互界面:
jdocker exec -it j2 bash
启动后端应用:
java -jar /home/soft/renren-fast.jar 或 后台启动( nobup java -jar /home/soft/renren-fast.jar )
之后第三个节点也是相同的操作即可部署。
3.8 用nginx实现后端项目集群节点间的负载均衡
已经成功部署了三个节点的后端应用,但是还没有实现负载均衡。
对于http请求的负载均衡,一般Nginx的实现最好,因此就采用Nginx来做。
拉取nginx镜像:
docker pull nginx
准备nginx的配置文件:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
upstream tomcat {
server 192.168.132.106:6001;
server 192.168.132.106:6002;
server 192.168.132.106:6003;
}
server {
listen 6101;
server_name 192.168.132.106;
location / {
proxy_pass http://tomcat;
index index.html index.htm;
}
}
}
注意修改配置文件中如下图中内容,将三个后端应用的ip和端口配置正确,设置nginx监听的端口和ip。
nginx实现负载均衡的原理就是当请求发到nginx监听的ip和端口上,就会被nginx转发到三个服务地址的其中一个。
在宿主机中创建/home/n1目录,将nginx.conf拷贝到此目录:
运行nginx容器:
docker run -it -d --name n1 -v /home/n1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
成功运行nginx后,通过ngixn监听请求的ip端口 192.168.132.106:6101 访问swagger测试页面。正常访问,说明nginx正常运行。
还可以尝试暂停一个后端应用节点j1,再次访问,发现即使有应用节点挂掉,仍是可以通过其他节点访问。
只有一台ngixn显然还是不够的,一台挂掉,负载均衡的功能就失效了。
因此还需再多运行一台:
创建n2目录,把nginx.conf中nginx监听的端口修改成6102(6101已经被nginx1所占用)
之后拷贝配置文件,运行nginx容器即可。
3.9 实现Nginx双机热备
已经部署运行了两台nginx,但是到底请求访问哪台nginx呢,这就还需要使用keepalived实现nginx双机热备(和之前的haproxy中间件双机热备实现方式类似)。
更多推荐
所有评论(0)