环境资源
1,192.186.64.132 centos7 服务器一台,上面已安装docker18 ce版
2,本地ide是idea2017
目的
想在centos7上使用docker技术,用最新版本的spring-clould搭建一个(包含有两个Eureka实例)HA Eureka服务,以供个人学习用
本地的工作
根据官网上给出https://github.com/spring-cloud-samples/eureka例子,clone到本地后可以跑一个eureka服务
但它存在以下不令我满意的地方
1,是两年之前的版本做的。
2,是单实例的服务模式
3,服务注册上,再失效后,不能感知自动擦除注册信息
这里针对以上问题,做下改造。
用spring-boot2.0和Finchley.M9版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这里注意,由于spring-clould Finchley.M9版本把spring-cloud-starter-eureka-serve
作为spring-clou-netflix的一个子项目,所以原来的对
spring-cloud-starter-eureka-server的依赖
要改成spring-cloud-starter-netflix-eureka-server
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置成能相互发现注册的多实例模式,并能感知自动擦除无效的注册信息
改写application.yml相关配置
eureka:
# client:
# registerWithEureka: false 这部分注释掉,默认是true,能互相注册发现
# fetchRegistry: false
server:
waitTimeInMsWhenSyncEmpty: 0
enable-self-preservation: false # 关闭自保护模式
eviction-interval-timer-in-ms: 4000 #注册信息自擦除 4s
instance:
preferIpAddress: true
#服务监听端口
server:
port: 8760
spring:
application:
name: EUREKA-SERVER-DOCKER # 服务名称
#利用spring的profiles 来指定启动服务实例的不同的配置
---
spring:
profiles: peer1
eureka:
client:
serviceUrl:
defaultZone: http://192.168.64.132:8762/eureka/ #服务实例的1的备份服务地址指向服务2
instance:
hostname: eurekaserver1
instance-id: eurekaserver1 # 实例名称
---
spring:
profiles: peer2
eureka:
client:
serviceUrl:
defaultZone: http://192.168.64.132:8761/eureka/ #服务实例的2的备份服务地址指向服务1
instance:
hostname: eurekaserver2
instance-id: eurekaserver2
由于要在docker上运行,首先要构建镜像,所以还要改造pom文件的docker-maven-plugin配置
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<!--版本也换新的-->
<version>1.0.0</version>
<configuration>
<!--远程docker服务地址,这需要docker服务能接受远程连接,后面提到-->
<dockerHost>http://192.168.64.132:2375</dockerHost>
<!--构建镜像的基础镜像java 8-->
<baseImage>java:8</baseImage>
<!--指定镜像的名称和版本-->
<imageName>${docker.image.prefix}/${project.artifactId}:1.3</imageName>
<!--<exposes>8761</exposes>-->
<entryPoint>["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
以上本地的工作基本做完了,下面就是在centos上的工作了。
centos上的工作
启动docker服务
dockerd -H tcp://0.0.0.0:2375
这种方式以tcp协议在2375端口上对外提供服务,这样就可以接口远程请求了。
构建镜像
在项目目录下执行mvn命令
mvn clean package docker:build
直到提示sucessful
第一次构建可能会比较慢,应为要下载基础镜像
这个命令实际执行是在centos7上,mvn这里只是发送一个构建的命令和jar包的上传。
镜像构建完成后,centos7上通过 images命令可以看到我们打包好的镜像
docker -H 0.0.0.0:2375 images
REPOSITORY TAG IMAGE ID CREATED SIZE
wannshan/eureka-server 1.3 e770b2f50f7f About an hour ago 688MB
最后,编写编排文件docker-compose.yml,内容如下
version: "3"
services:
eurekaserver1:
image: wannshan/eureka-server:1.3
ports:
- "8761:8760"
environment:
- spring.profiles.active=peer1
eurekaserver2:
image: wannshan/eureka-server:1.3
ports:
- "8762:8760"
environment:
- spring.profiles.active=peer2
意思是用镜像wannshan/eureka-server:1.3部署两个服务实例,并制定映射端口。启动时用不同的spring.profiles.active值
现在镜像和编排文件都有了,只要用编排文件启动容器就可以了。
编排文件的执行,可以用docker-compose工具。
但需要单独安装docker-compose工具,https://github.com/docker/compose有相关的文档。
你可以在docker-compose.yml文件所在目录,执行命令
docker-compose up
我是用
docker -H 0.0.0.0:2375 stack deploy -c docker-compose.yml eureka
执行的。如果没有swarm配置stack 命令会出错。
因为之前在这个机器上搭建过swarm集群,所以这里用服务栈stack命令执行编排文件。更牛逼。
利用swarm,容器挂了自动帮你重启。
启动后,
docker -H 0.0.0.0:2375 container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dbdc97b6a26 wannshan/eureka-server:1.3 "java -Djava.securit…" 2 minutes ago Up 2 minutes eureka_eurekaserver1.1.xoca0zk7baofucqfpq1fawdud
9b313a6c217b wannshan/eureka-server:1.3 "java -Djava.securit…" 2 minutes ago Up 2 minutes eureka_eurekaserver2.1.t54cc1iardgrtb01oymobg4qx
我们把本地8080的服务hollo-wold注册到http://192.168.64.132:8761/eureka后
访问http://192.168.64.132:8761可以看到
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。