docker-compose搭建eureka集群


参考了一些文章:
https://www.liangzl.com/get-article-detail-150836.html
还有几篇忘了,此篇仅当个人记录


在win10家庭版上装了docker很长时间了,但是一直都没怎么用,最近一次是为了帮朋友做个C++的作业题,为了验证一下作业题对不对,不想安装组件就用docker拉了一个centos7(平时不会用到C++而且我也不会),vitrualbox默认分配的是1C2G的资源,那个作业题好像是个递归把容器跑挂了。


扯远了,书归正传。

首先是eureka工程打包,idea建的一个maven-module工程,最开始打的jar包没有指明程序入口(MANIFEST.MF),也是度娘后解决的,感觉过于面向度娘编程:
docker-compose搭建eureka集群_第1张图片

解决方案就是删除父级pom文件中的打包插件配置,在具体的module中添加打包插件:


        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                    com.eureka.server.App
                    ZIP
                
                
                    
                        
                            repackage
                        
                    
                
            
        
    

eureka的工程也非常简单:
docker-compose搭建eureka集群_第2张图片
打算创建三个eureka实例,application.yml如下:


---
server:
  port: 9000
spring:
  application:
    name: eureka-server
  profiles: eureka-server-1
eureka:
  instance:
    hostname: eureka-server-1
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka-server-2:9000/eureka/,http://eureka-server-3:9000/eureka/
    fetch-registry: true

---
server:
  port: 9000
spring:
  application:
    name: eureka-server
  profiles: eureka-server-2
eureka:
  instance:
    hostname: eureka-server-2
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka-server-1:9000/eureka/,http://eureka-server-3:9000/eureka/
    fetch-registry: true

---
server:
  port: 9000
spring:
  application:
    name: eureka-server
  profiles: eureka-server-3
eureka:
  instance:
    hostname: eureka-server-3
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka-server-1:9000/eureka/,http://eureka-server-2:9000/eureka/
    fetch-registry: true


接着就是编辑Dockerfile:

#eureka-server-test

FROM java:8

VOLUME /tmp
ADD com.eureka.server-1.0-SNAPSHOT.jar eureka-server.jar
EXPOSE 9000

RUN bash -c 'touch eureka-server.java'

ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/eureka-server.jar"]

dockerfile还算好理解,也收藏过一篇Dockerfile相关的文章,连接如下:
link

编辑好Dockerfile后就是编辑docke-compose.xml文件:

version: '3.3'
services:
  eureka-server-1:
    image: eureka-server
    container_name: eureka-server-1
    hostname: eureka-server-1
    ports:
      - 9001:9000
    environment:
      - spring.profiles.active=eureka-server-1
  eureka-server-2:
    image: eureka-server
    container_name: eureka-server-2
    hostname: eureka-server-2
    ports:
      - 9002:9000
    environment:
      - spring.profiles.active=eureka-server-2
  eureka-server-3:
    image: eureka-server
    container_name: eureka-server-3
    hostname: eureka-server-3
    ports:
      - 9003:9000
    environment:
      - spring.profiles.active=eureka-server-3

docker-compose.xml文件的version可以不配置,如果配置的话需要注意一下版本,有部分文章给的版本号是2或者3,但是我执行docker-compose时报错,提示版本号要2.2或者3.3或者不配置。关于network的配置一开始做了network的配置但是都报错了,索性就用它默认,暂时还没有研究清楚,有心情了再看下。
dokcer版本

jar包/Dockerfile/docker-compose.xml三个文件算是基本原料,放到同一目录下,开始操作(idea应该是支持将jar包按照Dockerfile直接生成镜像的,没去具体了解,先学会基础的操作吧):
第一步是根据Dockerfile制作镜像了,镜像的名称需要注意一下,因为docker-compose.xml文件中image指定的是’eureka-server’,所以生成的镜像就需要是这个名称:

docker build -t eureka-server .

应为当前路径是在三个”原石“所在路径,这个当前路径的点’.’,比较容易被漏掉,有些文章也提醒了这个,一开始我觉得不会,后面还是有漏掉几次,如果怕漏掉写个全路径也行。
等镜像生成完之后,就可以执行:

docker-compose up -d

同样是在三原石所在路径,执行完会启动三个eureka服务的实例。
可以查看一下对应实例(containerid)的日志

docker logs [containerid]

当然,win10也可用Kitematic (Alpha)来监测容器,还是挺直观好用的。

没啥问题的话,查看一下virtualbox提供docker运行环境的ip:

docker-machine ip

将获得的ip配置到需要注册到eureka集群的微服务的配置文件中即可,一般这个ip应该是:192.168.99.100
docker-compose搭建eureka集群_第3张图片
至此,后续想做springcloud的学习练习就可以不用过多关注eureka了,直接连接到docker的eureka集群即可。


总算,写完了,自己动手时会遇到各种各样的问题,其中因为eureka打的jar包中application.yml配置的端口不匹配,导致eureka实例无法互相发现注册,花了不少时间在度娘身上,后来自己再冷静分析了一下,解压jar包才发现,也是让我唏嘘不已。总归还是遇事不要慌张,冷静分析,程序不会骗你。

之所以兴起要自己搭一个eureka集群,另外一个目的就是想看看eureka的自我保护机制。这个网上说法有很多,让我困惑的就是“失败率小于85%”的这个表述。在我看来失败率就是失败数占总数的比率,失败1,总数100,失败率就是1%,那难道一个有问题就开始自我保护了?着实让我迷惑,看了一些资料,觉着这还比较靠谱:
理解eureka的自我保护机制
心跳频率 , 触发自我保护的阈值,重置自我保护阈值计算周期 这三个才是自我保护机制的算法。大概的算法是,10个实例,30秒发送一次心跳检测,触发自我保护的阈值是0.85,自我保护计算周期为1分钟(据说默认是15分钟,此处便于计算设为1分钟),那么在1分钟的周期内,正常应该有10 * 60 / 30次心跳检测,阈值则为20*0.85的17次,如果小于17则会触发自动保护机制。
比较有意思的时,如果实例小于5,那么随便挂一个实例就会触发自我保护,是不是意味着服务列表一直保留这个挂掉的实例,rabbin轮询调用服务的时候每4次就有一次调到挂掉的那台机器上呢?当然有相应的配置会解决这个问题,不过是不是侧面反映,服务没有达到一定数量时没有必要做微服务呢?
这是个人的一些小疑问,希望看到的小伙伴能一起交流探讨一下。

你可能感兴趣的:(java,docker,其他)