前言
发现网上对于spring cloud的完整部署文章非常少,对于rabbitMq、redis、consul这些外部服务软件的配置讲解的非常少,并且总是缺少一些细节上的梳理,因此这次通过项目部署挖的坑来总结一下相关注意点,防止持续踩坑。
正文
目录
基本步骤
(在整个配置开始之前,对于服务器可以直接关闭防火墙或者打开相应端口,切记!)
- 撰写Dockerfile
- 将jar包、Dockerfile等资源摆放到合适的文件夹层次中
- 安装外围所需软件,如docker、rabbitMq、redis、数据中心(以consul为例)
- 微服务xml配置文件相关注意
- 打包镜像、运行等
撰写Dockerfile
Dockerfile主要任务就是获取java镜像以及将jar包加入到容器当中,并输入相应的运行命令,主要为如下内容:
FROM frolvlad/alpine-java:jdk8-slim AS builder
ADD target/xxx-service.jar /app/
CMD ["java","-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/xxx-service.jar"]
其中"-Djava.security.egd=file:/dev/./urandom"
只是对linux有效,windows部署不应加入。
注意:jar包名不要写错
整理资源文件
对于微服务,需要打多个jar包进行发布,而Dockerfile中ADD命令有依托相关路径的说法,因此放置位置十分重要,基本放置文件的位置图:
-- xxx-service
-- xxx-service.jar
-- Dockerfile
即将相应的jar与Dockerfile放置在同一目录下
安装配置所需软件与外部服务
这里以centos为例:
安装Docker
首先安装相关依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
设置仓库为稳定版
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看所有docker包的版本信息
yum list docker-ce --showduplicates | sort -r
指定一个版本进行安装
sudo yum install docker-ce-<VERSION STRING>
启动docker并且加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
可以运行hello-world镜像验证是否成功
sudo docker run hello-world
安装rabbitMq
转载:rabbitMq安装
安装erlang
首先安装erlang,这是rabbitMq必要组件。
如果有系统有wget则直接通过这样进行下载。
在usr/local下执行:
wget http://erlang.org/download/otp_src_21.1.tar.gz
tar -zxvf otp_src_21.1.tar.gz
cd otp_src_21.1
# 这里要新建一个erlang文件夹,因为erlang编译安装默认是装在/usr/local下的bin和lib中,这里我们将他统一装到/usr/local/erlang中,方便查找和使用。
mkdir -p /usr/local/erlang
# 在编译之前,必须安装以下依赖包
yum install -y make gcc gcc-c++ m4 openssl openssl-devel ncurses-devel unixODBC unixODBC-devel java java-devel
./configure --prefix=/usr/local/erlang
如果不报错,执行:
make && make install
然后需要将erlang/bin目录加入到环境变量中:
vim /etc/profile
######### 添加如下内容 ###############
PATH=$PATH:/usr/local/erlang/bin
########################################
source /etc/profile
执行erl
,如果运行成功,完成!(执行halt().退出)
安装rabbitMq
这里安装前一定要了解erlang与rabbitMq的版本配对问题,如果版本不对应可能会出现奇奇怪怪的问题,因此需要先从官网上进行确认。
# 在usr/local目录下载源码包
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.8/rabbitmq-server-generic-unix-3.7.8.tar.xz
# 解压
tar -xvf rabbitmq-server-generic-unix-3.7.8.tar.xz -C /usr/local/
# 添加环境变量
vim /etc/profile
------ 添加如下内容 ------
PATH=$PATH:/usr/local/rabbitmq_server-3.7.8/sbin
# 重载一下环境变量
source /etc/profile
# 添加web管理插件
rabbitmq-plugins enable rabbitmq_management
rabbitMq命令相关
rabbitMq服务端页面端口: 15672
服务启动停止:
启动: rabbitmq-server -detached
停止: rabbitmqctl stop
用户管理:
添加用户: rabbitmqctl add_user username password
删除用户: rabbitmqctl delete_user username
修改密码: rabbitmqctl change_password username newpassword
设置用户角色: rabbitmqctl set_user_tags username tag
列出用户: rabbitmqctl list_users
注意: 如果需要外部访问,务必更改账号密码,不要使用默认guest,默认guest只支持本地访问。
更改配置文件(可省略)
一般情况下rabbitMq在本地运行下不需要conf文件。
rabbitMq需要更改配置文件,则比较复杂。
需要借鉴一下rabbitMq.example:rabbitMq配置文件模板
如果是rpm或者压缩包安装,则将此配置文件命名为rabbitMq.conf放置到安装包路径下的/etc/rabbitmq/rabbitMq.conf
下。
安装Redis
redis安装
安装包url:redis最新安装包
在/usr/local
下执行
wget http://download.redis.io/releases/redis-6.0.1.tar.gz
tar -zxvf redis-4.0.6.tar.gz
yum install gcc
cd redis-6.0.1
# 编译安装
make MALLOC=libc
将/usr/local/redis-6.0.1/src目录下的文件加到/usr/local/bin目录
cd src && make install
配置redis
一般情况下redis服务肯定不能使用localhost,因此配置我们需要更改安装包下redis.conf文件:
配置redis外网可连接
(1)将redis.conf中bind 127.0.0.1
注释,保证文件中没有一个bind生效,则启动redis默认配置,外网全部允许连接。
当然如果觉得不够安全,可以只bind相关ip,保证微服务的正常连接。
(2)将protected_mode
从yes改为no
设置开机自启
将redis.conf中的daemonize
从no改为yes,即允许开启守护线程。
启动或关闭redis
# 在redis目录下执行,并指定redis.conf
./redis-server /path/to/redis.conf
# 关闭redis
./redis-cli shutdown
安装consul
consul安装
(1)下载安装包地址:consul安装包下载
(2)解压相应安装包
unzip consul_1.x.x_linux_amd64.zip
(3)解压完毕后只有一个consul文件,我们需要在本目录建立一个consul文件夹,并将consul执行文件放进去:
mkdir consul_1.x.x
mv consul /usr/local/consul_1.x.x/
(4)在consul_1.x.x
目录下建立/data以及/log文件夹,用于存放consul的运行信息。
(5)在本文件夹下创建start.sh,内容为consul命令
标题栏中的命令
(6)到/usr/lib/systemd/system/
目录下创建consul.service,内容如下:
[Unit]
Description=consul
After=network.target
[Service]
ExecStart=/usr/local/consul_1.x.x/start.sh
KillSignal=SIGTERM
[Install]
WantedBy=multi-user.target
(6)执行以下命令:
systemctl start consul
systemctl enable consul
如果想要停止则执行:
systemctl stop consul
consul命令
如果只有一台服务器部署,则进入consul目录下执行以下命令:
./consul agent -bootstrap-expect 1 -server -data-dir /usr/local/consul_1.x.x/data \
-bind x.x.x.x -datacenter=joker -client=0.0.0.0 -ui
-bind
即为本服务器ip。
-client
设置所有外部可连接client
如果是多服务器配置,则需要更改-bootstrap-expect
后的数字,部署几台服务器就设定数字为几。
微服务xml注意事项
(1)远程获取服务配置
如果是远程获取微服务配置,如通过consul从github上获取配置文件,在bootstrap.xml
文件中一定要加上spring.cloud.consul.discovery.prefer-ip-address=true
的选项,当然如果直接指定ip-address
则无需考虑。
原因: docker容器在进行发现服务时默认返回的是容器号而不是ip,因此发布可能会出现问题。
(2)保证服务器联网
(3)检查spring.cloud.config.profile
配置是否为发布所需的配置文件
(4)打包时,务必在pom.xml中添加以下依赖,保证跳过运行测试检查:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
docker微服务部署
run.sh基本配置
完成上面的基本配置后,需要进行镜像打包、容器生成的操作,我们在任意位置创建run.sh
文件,文件内容如下:(假设项目相关文件在/home/joker/文件夹下)
docker build -t xxx-service:1.0 -f /home/joker/xxx-service/Dockerfile /home/joker/xxx-service/
docker run -it -p x:x --name 容器名 xxx-service:1.0
注意:
(1)docker build的最后一个参数为build的路径,一定要设置在jar包目录,否则可能出现Dockerfile找不到jar包的情况。
(2)docker run的-p
是设置服务器与容器端口号,一般保持两者一致即可。
执行
调用sh run.sh
以后,如果在docker run执行完成后发现没有什么错误,就可以将docker设置为后台运行,执行:
# 找到对应容器的容器号
docker ps -a
# 启动容器
docker start xxx
发布完成!