一、SpringCloud-Config
SpringCloud-Config是用于对服务配置的集中化远程管理的工具,支持配置文件存储在git或者svn中,可以根据文件夹或者不同分支来获取不同的配置文件。配合 .sh 脚本启动服务,可以做到针对不同环境,配置进行进行快速切换。
SpringCloud的config,在使用git的情况下,可以使用如下的方式进行配置:
server的bootstarp.yml配置:
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://gitee.com/zhouzhongzhi/properties.git
search-paths: config
server:
port: 8099
client的bootstarp.yml配置:
spring:
application:
name: customer
cloud:
config:
uri: "http://localhost:8099"
profile: "default"
label: "dev"
在上方的配置中,我们首先在server端配置了git的地址(因为访问不需要密码,所以没有设置账号密码),然后指定该地址下的config文件夹,就不再需要多余配置了。
之后,在client的配置中,我们配置了uri,这个地址就是config服务的地址。如果不想配置config的uri,配置eureka的uri也是可以的,config会自动去eureka中获取注册的config服务,但是这里更推荐配置config服务的地址。
profile与label两个配置项中,profile为git上的配置文件的后缀,label为访问的git分支。例如我么的service-name为 customer,那么,我们访问的就是 https://gitee.com/zhouzhongzhi/properties.git 这个git仓库下的config文件中的 application.yml、customer.yml、customer-default.yml三个配置文件的内容(在三个文件具有相同配置项的情况下,后面的配置项会覆盖前面的)。
配置文件的结构如下:
二、配合启动参数进行环境的切换
这里,首先贴上一个main方法代码:
public static void main(String args[]){
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
我们在main方法中,都有一个args[]的字符串数组,这个字符串,在我们正常启动的情况下,都是一个空字符串数组,里面没有任何内容,但是如果在启动时,添加新的参数,这个args[]就不会再为空,例如使用下方设置启动服务时,args[]就会存在两个String对象,分别为--PROFILE=dev --LABEL=dev。之后,这个args[]会被传入到Spring容器中,我们就可以使用启动参数来对项目的信息进行修改。
利用这一点,我们就可以对client端的bootstarp.yml进行改造:
spring:
application:
name: customer
cloud:
config:
uri: "http://localhost:8099"
profile: ${PROFILE:default}
label: ${LABEL:dev}
我们在启动时,传入不同的参数,就可以对这个这个服务的配置文件进行环境切换,而不用对代码层面,XML文件层面的工程内的东西进行修改。
三、sh文件启动服务
下方的代码就是我做的一个在docker环境中进行自动进行eureka服务发布部署的脚本文件 start.sh:
#!/bin/sh
PORT=$1
PROFILE=$2
LABEL=$3
SERVER_PORT=0
if test -z ${PORT}
then
SERVER_PORT="10100"
else
SERVER_PORT=${PORT}
fi
SERVER_NAME="eureka-server"
CONTAINER_NAME=${SERVER_NAME}-${SERVER_PORT}
echo ${CONTAINER_NAME}
echo "执行脚本"
git pull
mvn clean
echo "删除旧版jar包"
rm -rf target/
echo "重新打包"
mvn -U clean compile package -Dmaven.test.skip=true
echo "停止旧版服务"
docker stop ${CONTAINER_NAME}
docker rm ${CONTAINER_NAME}
echo "删除旧版镜像"
docker rmi ${SERVER_NAME}
echo "部署新版本镜像"
docker build -t ${SERVER_NAME} -f script/Dockerfile .
echo "启动新服务"
docker run -ti -d --net host --name ${CONTAINER_NAME} --publish ${SERVER_PORT}:${SERVER_PORT}\
--env SERVER_PORT=${SERVER_PORT} PROFILE=${PROFILE} LABEL=${LABEL}
echo "打印服务日志"
docker logs -f ${CONTAINER_NAME}
接下来是Dockerfile
FROM java:8
COPY . /data
VOLUME /data/logs
WORKDIR /data
ENV SERVER_PORT=10100
CMD exec java -jar target/eureka.jar --PORT=${SERVER_PORT} --PROFILE=${PROFILE} --LABEL=${LABEL}
在有了上方的配置后,我们进行发布时,只需要使用下方命令,即可进行快速的发布部署,在需要切换环境的情况下,主需要进行切换sh文件参数即可。
sh shart.sh 8080 dev dev