一、选择开源项目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中间件双机热备实现方式类似)。

 

 

Logo

前往低代码交流专区

更多推荐