** 基于Springcloud的javaweb项目部署集群环境,采用jdk运行(jar包),consul 进行注册服务监控健康,实现并发量大的时候可以快速响应的高并发效果**
操作过程如下
1.安装nfs服务
2.安装相应中间件服务
3.安装数据库以及缓存数据库
4.配置文件
5.运行文件调试
(监控健康服务节点consul /请求反向代理nginx/)
1.安装Net file system 共享文件服务(nfs)
离线安装(内网/脱网/局域网)/外网直接yum install nfs rpcbind即可~操作如下
NFS 服务需要依赖 RPC 服务,所以这里 NFS 服务端需要安装 rpcbind 和 nfs-utils,客户端只需要安装 nfs-utils。
1.首先确认服务端系统是否已安装nfs
rpm -qa nfs-utils rpcbind
2.安装服务
如果计算机可以连接到互联网,则可以通过以下命令进行安装:
#服务端
yum install -y nfs-utils rpcbind
#客户端
yum install -y nfs-utils
但是,很多时候由于安全的原因不能联网,所以只能离线安装。
下载离线安装包,
rpcbind:
libtirpc-0.2.4-0.15.el7.x86_64.rpm
rpcbind-0.2.0-47.el7.x86_64.rpm
nfs-utils:
nfs-utils-1.3.0-0.61.el7.x86_64
tcp_wrappers-7.6-77.el7.x86_64
...
#这个依赖有点多,需要的可以联系我,就不一一列出来了
百度网盘下载地址:https://pan.baidu.com/s/1mq7ZnWyn33krFcE3AnBQPQ
提取码:cfq2
安装离线包:
#安装路径下的所有rpm包
rpm -Uvh *.rpm --nodeps --force
#安装特定的rpm包
rpm -hvi dejagnu-1.4.2-10.noarch.rpm
最后,检查是否安装成功。
配置:
1.在服务端创建一个共享目录 /data/share ,作为客户端挂载的远端入口,然后设置权限。
mkdir -p /data/share
chmod 755 /data/share
2.修改 NFS 配置文件 /etc/exports
vim /etc/exports
#配置单个ip
/data/share 192.168.0.130(rw,sync,insecure,no_subtree_check,no_root_squash)
/data/share 192.168.0.131(rw,sync,insecure,no_subtree_check,no_root_squash)
#配置ip段
/data/share 192.168.0.130/139(rw,sync,insecure,no_subtree_check,no_root_squash)
#配置所有ip可以挂载
/data/share *(rw,sync,insecure,no_subtree_check,no_root_squash)
说明:
/data/share-共享目录
192.168.0.130-IP地址,可以是特定的ip地址、ip地址段或所有可以访问的ip
rw,sync,insecure,no_subtree_check,no_root_squash-访问控制参数,具体参考下面列表。
参数 | 说明 |
---|---|
ro | 只读 |
rw | 读写 |
sync | 同步共享-所有数据在请求时写入共享 |
async | 异步共享-nfs 在写入数据前可以响应请求 |
secure | nfs 通过 1024 以下的安全 TCP/IP 端口发送 |
insecure | nfs 通过 1024 以上的端口发送 |
wdelay | 如果多个用户要写入 nfs 目录,则归组写入(默认) |
no_wdelay | 如果多个用户要写入 nfs 目录,则立即写入,当使用 async 时,无需此设置 |
hide | 在 nfs 共享目录中不共享其子目录 |
no_hide | 共享 nfs 目录的子目录 |
subtree_check | 如果共享 /usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认) |
no_subtree_check | 不检查父目录权限 |
all_squash | 共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录 |
no_all_squash | 保留共享文件的 UID 和 GID(默认) |
root_squash | root 用户的所有请求映射成如 anonymous 用户一样的权限(默认) |
no_root_squash | root 用户具有根目录的完全管理访问权限 |
anonuid=xxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 UID |
anongid=xxx | 指定 nfs 服务器 /etc/passwd 文件中匿名用户的 GID |
启动服务并测试
1.启动rpc服务
service rpcbind start
#或者使用如下命令
/bin/systemctl start rpcbind.service
# 查看 NFS 服务项 rpc 服务器注册的端口列表
rpcinfo -p localhost
2.启动nfs服务
service nfs start
#或者使用如下命令亦可
/bin/systemctl start nfs.service
# 启动 NFS 服务后 rpc 服务已经启用了对 NFS 的端口映射列表
# rpcinfo -p localhost
3.在另一台 Linux 上挂载目录
#查看配置
showmoun -e 192.168.xxx.xxx
#新建目录
mkdir -p /share
#挂载共享目录(挂载远端目录到本地 /share 目录)
mount 192.168.0.130:/data/share /share
#查看挂载目录状况
df -h | grep 10.222.77.86
#如果要卸载目录
umount /share
2.安装注册服务consul
简介:Consul是一个分布式高可用的系统,一个发现和配置服务的工具。客户端可以利用它提供的API注册和发现服务,及监控检测功能实现服务的高可用。
下载
wget https://releases.hashicorp.com/consul/1.5.2/consul_1.5.2_linux_amd64.zip
离线环境下则直接拉包进来即可~
解压
-方法1
unzip consul_1.5.2_linux_amd64.zip -d /usr/bin ##解压到usr/bin目录下
unzip consul_1.5.2_linux_amd64.zip ##解压到当前目录下
-方法2
unzip consul_1.5.2_linux_amd64.zip ##解压
cp consul /usr/local/bin/ ##移动
验证
consul
启动开发模式(快速启动一个单节点Consul,但是不能数据持久化,不能用于生产环境)
consul agent -dev
consul server端的启动命令:
consul agent -server -bootstrap-expect 1 -client 0.0.0.0 -config-dir /etc/consul.d
或者 这样可以输出日志
nohup consul agent -server -bootstrap-expect 1 -client 0.0.0.0 -config-dir /etc/basic.json >consul.log &
-config-dir :就是指定加载置文件的目录,我们只需要填写配置文件的目录就可以帮助我们把该目录下所有的以.json结尾配置文件加载进去,它的加载顺序是根据26个字母的顺序加进行加载配置文件的。文件内容都是json格式的数据。默认后面文件定义配置会覆盖前面文件定义的配置。
{
"ports": {
"http": 8501 ,
"dns": 8601,
"grpc": 8401,
"serf_lan": 8311,
"serf_wan": 8312,
"server": 8310
}
启动consul server端后,会发现我们的端口全部变成上面描述的端口,consul web UI的端口不在是默认的8500 而变成了 8501 ,另外当我们启动其他consul时,通过-retry-join 加入server端时会报错,拒绝连接,原因就是因为server端的端口发生了改动,它默认去连接8301端口,此时-retry-join不能直接写ip地址,需要写对应的修改后的serf_lan端口 例如:
consul agent -data-dir /consul/data2 -advertise 127.0.0.1 -client 0.0.0.0 -join 127.0.0.1:8311
查看集群成员
consul members
ps:
查看最近历史日志
consul monitor
停止
gracefully或者forcefully
插入节点注册服务写一个json数据:
{
"service":{
"name":"test01",
"tags":[
"",
""
],
"address":"127.0.0.1",
"port":3010,
"enable_tag_override": false,
"check":{
"deregisterCriticalServiceAfter":"90m",
"http":"http://127.0.0.1:3010/health",
"interval":"10s"
}
}
}
名词解释:
tags:服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
address:服务注册到consul的IP,服务发现,发现的就是这个IP
port:服务注册consul的PORT,发现的就是这个PORT
enable_tag_override:标签是否允许覆盖
http:指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
interval:健康检查间隔时间,每隔10s,调用一次健康检查的URL
重启Agent
consul agent -dev -config-dir /etc/consul.d/
3.安装Nginx
1.首先下载Nginx前需要一些插件~
可以查看gcc版本,若无,则就基本无了
gcc -v
安装gcc,pcre、pcre-devel,zlib,zlib-devel,openssl,openssl-devel操作可以直接百度~
- gcc是linux下的编译器在此不多做解释,感兴趣的小伙伴可以去查一下相关资料,它可以编译 C,C++,Ada,Object C和Java等语言.
- pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库。
- zlib库提供了很多种压缩和解压缩方式nginx使用zlib对http包的内容进行gzip,
- openssl是web安全通信的基石,没有openssl,可以说我们的信息都是在裸奔
正式安装nginx
1、下载nginx安装包
wget http://nginx.org/download/nginx-1.9.9.tar.gz
2、把压缩包解压 usr/local/java
tar -zxvf nginx-1.9.9.tar.gz
3、切换到cd /usr/local/java/nginx-1.9.9/下面
执行三个命令:
初始化默认配置
./configure
编译
make
安装
make install
4、切换到/usr/local/nginx安装目录,nginx的配置文件nginx.conf文件,主要也就是端口
5、启动nginx服务 切换目录到/usr/local/nginx/sbin下面
./nginx
查看nginx服务是否启动成功
ps -ef | grep nginx
4.安装MySQL数据库下载工具
下载工具wget:网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。
yum -y install wget
下载mysql源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装mysql源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
以上两步都是必须的,以下就是检测源是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
安装mysql服务,此处看网速有快有慢(可以用阿里源,百度下)
yum install mysql-community-server
安装后,启动mysql服务
systemctl start mysqld
查看mysqld服务,此处要是查看到activity状态是running那就表明已经
systemctl status mysqld
安装成功了,设置开机启动
systemctl enable mysqld
重载服务
systemctl daemon-reload
mysql5.7安装时会产生一个默认的密码,查看此密码的文件一般存在于/var/log/mysqld.log上 查看初始密码
grep 'temporary password' /var/log/mysqld.log
设置参数
修改/etc/my.cnf,[mysqld]下面加入
取消密码复杂度
plugin-load=validate_password.so
validate-password=OFF
设置表大小写不敏感
设置默认端口为3307
port=3307
保存退出后,重启服务, 修改密码。
systemctl restart mysqld
设置密码和远程连接
修改密码
grep "password" /var/log/mysqld.log ## 查看自动生成的密码
mysql -uroot -p
输入root初始密码登录-- 密码设为123456
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
设置密码为"123456"(为初始化方便,生产环境可以设置密码)
mysql> use mysql;
mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql> GRANT ALL ON *.* TO root@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
mysql>quit;
5.安装Redis Nosql类型数据库(缓存数据库)
安装工具以及redis
yum install epel-release
yum install redis
systemctl start redis && systemctl enable redis
配置外网可访问
vi /etc/redis.conf
找到
bind 127.0.0.1
protected-mode yes
改为
bind 0.0.0.0
protected-mode no
重启服务生效
systemctl restart redis
############# ** 以下操作为部署Myapps平台系统的操作 ,微服务框架部署完毕 ** #############
6.部署Myapps
6.1导入相应JAR包(runtime,signon,designer主要jar包)
6.2编写启动文件,启动后查看jar包是否启动并且注册到consul节点
cat > /data/myapps/run-gateway-service.sh <<EOF
nohup java -server -jar -Xms256M -Xmx512M obpm-gateway-consul-5.x.nightbuild.jar --spring.cloud.consul.host=192.168.0.26 >/data/myapps/logs/gateway.log 2>&1 &
EOF
chmod +x /data/myapps/run-gateway-service.sh
cat > /data/myapps/run-runtime-service.sh <<EOF
nohup java -server -jar -Xms512M -Xmx2048M obpm-runtime-consul-5.x.nightbuild.jar --myapps.storage.root=/data/myapps/storage --spring.cloud.consul.host=192.168.0.26 --spring.datasource.url="jdbc:mysql://192.168.0.27:3306/obpm2?characterEncoding=UTF-8&serverTimezone=GMT" --spring.datasource.username=root --spring.datasource.password=123456 --spring.redis.host=192.168.0.27 >/data/myapps/logs/runtime.log 2>&1 &
EOF
chmod +x /data/myapps/run-runtime-service.sh
cat > /myapps/run-signon-service.sh <<EOF
nohup java -server -jar -Xms256M -Xmx512M obpm-signon-consul-5.x.nightbuild.jar --myapps.storage.root=/myapps/storage --spring.cloud.consul.host=192.168.89.10:10500 --spring.datasource.url="jdbc:mysql://192.168.88.141:3307/obpm5?characterEncoding=UTF-8&serverTimezone=GMT" --spring.datasource.username=root --spring.datasource.password=123456 --spring.redis.host=192.168.89.10 >/myapps/logs/signon.log 2>&1 &
EOF
chmod +x /myapps/run-signon-service.sh
cat > /myapps/run-message-service.sh <<EOF
nohup java -server -jar -Xms256M -Xmx512M obpm-message-consul-5.x.nightbuild.jar --myapps.storage.root=/myapps/storage --spring.cloud.consul.host=192.168.89.10:10500 --spring.datasource.url="jdbc:mysql://192.168.89.141:3307/message5?characterEncoding=UTF-8&serverTimezone=GMT" --spring.datasource.username=root --spring.datasource.password=123456 --spring.redis.host=192.168.89.10 >/myapps/logs/message.log 2>&1 &
EOF
chmod +x /myapps/run-message-service.sh
cat > /myapps/run-designer-service.sh <<EOF
nohup java -server -jar -Xms512M -Xmx2048M obpm-designer-consul-5.x.nightbuild.jar --myapps.storage.root=/myapps/storage --spring.cloud.consul.host=192.168.89.10:10500 >/myapps/logs/designer.log 2>&1 &
EOF
cmod +x /myapps/run-designer-service.sh
6.3查看jar包是否启动并且注册到consul节点
去到consul ui里面就行查看即可~若有出现节点 则证明服务启动成功
若无则需要检查consul地址是否配置错误
6.4导入静态资源文件以及nfs服务共享文件进行存放软件
ps!!!:微服务采用前后端分离 静态资源文件存放于nginx进行http代理即可
共享文件则需要存放到开启NFS共享服务的相应文件夹目录下(obpm-demo)
6.5配置NGINX静态资源地址以及服务器地址进行负载均衡
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream runtime {
server 192.168.89.12:8083;
server 192.168.89.11:8083;
}
upstream signon {
server 192.168.89.12:8010;
server 192.168.89.11:8010;
}
upstream designer {
server 192.168.89.12:8082;
server 192.168.89.11:8082;
}
upstream message {
server 192.168.89.12:8084;
server 192.168.89.11:8084;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
### 静态资源
location /static {
alias /myapps/static;
index index.html;
}
location /designer {
proxy_pass http://designer/designer;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
location /signon {
proxy_pass http://signon/signon;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
location /obpm {
proxy_pass http://runtime/obpm;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
location /message {
proxy_pass http://message/message;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET,POST,DELETE,PUT';
add_header 'Access-Control-Allow-Header' 'Content-Type,*';
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}