使用Spring Cloud搭建分布式项目一般需要有服务注册,网关,配置中心等服务。
使用Spring Boot构建的项目可以直接使用jar包来启动,但是整合成Spring Cloud之后直接用jar来启动的话会很麻烦。因此引入docker虚拟容器技术来部署服务。
以下指南的前提是你已经在本地环境使用Spring Cloud测试成功。
首先改造每一个服务中的pom.xml:
在docker中有两个很重要的概念:镜像和容器。在之前我们都是把服务打成jar包,添加这个插件之后,就可以使用maven命令将服务打成docker中的镜像了。
之后编写Dockerfile文件:
在服务器上安装maven和代码管理git或者svn以及docker。在服务器上把代码下载好之后,进入项目使用命令①:mvn package docker:build // 构建镜像
执行成功之后使用docker命令②:docker images // 查看所有镜像
首先部署服务注册与发现eureka server,使用docker命令③:docker run -p xxxx:xxxx -t image-name
这一步不会有什么问题,正常启动之后,可以使用docker命令④: docker ps // 查看所有容器
使用docker命令⑤: docker logs container-id //查看容器日志
现在已经用docker启动一个最主要的服务了。查看网址: ip:port 可以看到euraka server的管理页面。
之后重复命令①③构建网关服务。
我们会发现单独的网关服务可以正常启动,但是euraka server并不能发现网关服务,使用命令⑤查看网关服务日志可以看到错误,找不到euraka server。
这是因为在docker中部署的服务其实相当于在不同的虚拟机中,虽然部署在同一台服务器上,但是使用localhost或者127.0.0.1是找不到对方的。
我们一般可能会在容器启动后进入容器,常用的是docker attach 镜像id,但是启动镜像的时候如果没有带 参数 -it的话,attach进去后可能是日志界面,并不能执行命令。所以我们会用docker exec -it 镜像id /bin/bash/ 平常的容器一般都可以执行/bin/bash,很是alpine没有,改成 docker exec -it 镜像id sh 就好了。
使用 docker exec -it eureka服务器id bash 进入eureka注册中心的docker容器中,
然后使用cat /etc/hosts命令查看容器的IP地址
然后我们修改网关服务的yml/yaml/property配置文件,将网关服务中的服务注册地址的ip改成容器的ip,使用docker命令⑥:docker stop container-id // 停止容器
使用docker命令⑦:docker rm container-id // 删除容器
之后重复命令①③构建网关服务。使用命令⑤查看网关服务日志可以看到刚刚的错误已经解决。
接下来重复命令①③构建我们自己的服务,通过网关服务访问我们自己的服务会发现在网关服务中又会报另一个错,意思是找不到你要的那个服务。这是因为容器之间现在还不能通信。
重复命令⑥⑦,使用docker命令⑧:docker run -p xxxx:xxxx -t zull-service-name --link eureka-server-name // 使容器可以通信
但是最好的解决方案是是使用docker-compose。
编写docker-compose.yml:
修改yml/yaml/property配置文件:
在服务器安装docker-compose,重新生成所有需要的镜像之后,执行命令:
docker-compose up -d
在服务都启动之后,可以发现部署成功。
当然后期还可以引进各种技术来优化部署方案。
具体的部署方法见这篇文章