spring cloud+docker 部署
这是本人第一次发表博客,而且中文水平比较差,所以大家凑合着看吧。本人现在在学习spring cloud+docker,发此博的目的是将自己踩过的坑说出来,让大家少走些弯路,这些坑我也在某度上找过,但都没有太详细的,希望对大家有帮助,有说的不对的地方大家一起讨论。最后说一句,本文中提到的都是经过本人亲测的。
1、spring cloud的使用,这个不说了,网上很多。
2、docker部署,简单的说一下,本人开发用idea,在项目中加入docker插件,具体代码如下:
<build>
<finalName>recognition_cloud</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<imageName>recognition-cloud-9001:${project.version}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<dockerHost>http://192.168.1.174:2375</dockerHost>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
Dockerfile:
From java:8
ADD recognition_cloud.jar recognition_cloud.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","recognition_cloud.jar"]
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
这样就可以了,注意,当打完jar包后并不是马上就可以调用远程的docker,而是要在右侧的导航中选则Plugins->docker->docker:build来完成部署,还有就是远程的docker必须打开远程打包的功能。
3、那么问题来了,我在未使用spring cloud的时候这样是没问题的,而spring cloud是服务注册制,也就是将服务注册到eureka中,如果是没有集群,没有负载均衡,如果每个服务只部署一个点就可以,那没问题,如果要集群,要负载均衡,就要部署多个点,而每个点的IP、端口都需要不同,那总不能打一次包改一次配置文件再打包吧,所以本文主要解决的还是这个问题。首先是eureka的集群,我在两台不同的机器的docker上部署,所有部署在docker上的服务在请求的时候都用的是docker的虚拟IP,而不是本机的IP,这样就导致一个问题,就是在其它服务访问的时候访问的不是主机的IP,而是docker为空器提供的虚拟IP,所以在spring boot微服务的配置文件上要配置写死的IP。
#用IP进行集群,必须在不同的服务器上,有不同的IP地址
#如果是集群,这个名称必须一样
spring.application.name=spring-cloud-eureka
eureka.instance.appname=spring-cloud-eureka
server.port=8000
#这句就是用IP进行集群
eureka.instance.prefer-ip-address=true
#注册服务时的真实IP,如果是docker部署必须写出来,不然会导致不同主机访问不到的情况
eureka.instance.ip-address=192.168.1.174
#eureka.instance.ip-address=192.168.2.121
#下面两句是不注册,也就是不群集,加上这两句后,第三句不起作用
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#关闭自我保护,一般关闭这个,不然相同的实例会有很多
eureka.server.enableSelfPreservation=false
#集群地址,多个用,号分隔
eureka.client.serviceUrl.defaultZone=http://192.168.1.174:8000/eureka/
那么这个端口与IP写死了,如果我要部署两个点,就需要再改一次,这样显然是不对的,所以这个配置文件再改一次,去掉
server.port及eureka.instance.ip-address,修改一个Dockerfile文件,然后在启动容器的时候传一些参数就可以了,看代码:Dockerfile
From java:8
ADD EurekaServer.jar EurekaServer.jar
#注意下方的环境变量
ENV PARAMS=""
#在启动命令中使用环境变量来控制服务的IP与端口
ENTRYPOINT ["sh","-c","java $PARAMS -jar EurekaServer.jar"]
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#用IP进行集群,必须在不同的服务器上,有不同的IP地址
#如果是集群,这个名称必须一样
spring.application.name=spring-cloud-eureka
eureka.instance.appname=spring-cloud-eureka
#server.port=8000
#这句就是用IP进行集群
eureka.instance.prefer-ip-address=true
#eureka.instance.ip-address=192.168.1.174
#eureka.instance.ip-address=192.168.2.121
#下面两句是不注册,也就是不群集,加上这两句后,第三句不起作用
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
#关闭自我保护,一般关闭这个,不然相同的实例会有很多
eureka.server.enableSelfPreservation=false
#集群地址,多个用,号分隔
eureka.client.serviceUrl.defaultZone=http://192.168.1.174:8000/eureka/
docker启动命令:docker run --name eureka-server -e PARAMS="-Dserver.port=8000 -Deureka.instance.ip-address=192.168.1.174" -p 8000:8000 -d eureka-server 这样就实现了动态的传入参数。
完活。
上一篇: Oracle regexp_like使用
下一篇: 使用EasyPoi导入导出
推荐阅读
-
spring cloud部署问题记录
-
spring cloud feign docker上无法连接的问题
-
spring cloud+docker 部署
-
Spring Boot 部署到docker
-
Spring Cloud 分布式服务架构(微服务架构)
-
spring cloud微服务分布式云架构 - Spring Cloud简介
-
Spring Cloud微服务架构:分布式配置中心
-
Java Spring cloud gateway nacos 配置
-
Spring Cloud构建微服务架构:分布式服务跟踪(跟踪原理)【Dalston版】
-
Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】