专栏首页wannshan(javaer,RPC)docker化包含两个实例的HA eureka服务
原创

docker化包含两个实例的HA eureka服务

环境资源

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可以看到

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • spring-mvc 视图模式之freemarker整合解析

    spring-mvc 版本4.04 今天翻项目中freemarker相关代码,疑惑springmvc是怎么发现freemarker的,于是单步进去。 Disp...

    wannshan
  • dubbo请求处理线程模型实现分析

    问题的由来: 如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识, 则直接在 IO 线程上处理更快,因为减少了线程池调度。 ...

    wannshan
  • dubbo序列化过程源码分析

    先看下dubbo在serialize层的类设计方案 序列化方案的入口,是接口Serialization的实现类。 /** * Serialization. ...

    wannshan
  • docker-compose下的java应用启动顺序两部曲之一:问题分析

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    程序员欣宸
  • 转 svn: E170001报错的原因以及解决方案

    Java学习123
  • 野草计划:一千种懒人刷洞 第一篇

    悬剑武器库-野草计划:工欲善其事必先利其器,意在帮助网络安全测试人员在使用工具渗透时,利用最骚的套路,最优解的方式,花最少的时间,合法合规的检测出授权测试的网站...

    Aran
  • 【NLP机器学习基础】从线性回归和Logistic回归开始

    古语常云:“大道至简”,万事万物纷繁复杂,最终却归至几个最简单的道理。我常常在想,如今很火的AI领域是否也是如此。将AI真正学懂学会的过程就像一场遥不可及的漫长...

    用户1508658
  • DeepMind 升级深度强化学习,仅10小时训练16个机器人灵活操纵物体

    【新智元导读】DeepMind 研究人员改进深度确定策略梯度算法,在虚拟环境中训练机械臂叠协同完成堆叠积木的任务,每架机械臂的结果都被用于改进核心算法,10个小...

    新智元
  • 人工智能AI(1)开篇:小白之学习计划

    最近小拾君准备正式开始人工智能相关领域的系统性学习了,看了一些资料及书籍,给自己列个学习计划,分享给大家,与君共勉。后续,将按照本计划(3.1开始)包括但不限于...

    企鹅号小编
  • 人生苦短,我用PyCharm

    本文假设读者熟悉 Python 开发,且计算机中已安装某个版本的 Python。该教程将使用 Python 3.6 版本,屏幕截图和 demo 均来自 macO...

    Python进击者

扫码关注云+社区

领取腾讯云代金券