Spring Eureka 本地Docker集群部署

  • 故事背景

最近由于产线使用的服务与发现服务,使用的是Spring Cloud Eureka集群部署,为了之后调试产线的问题,想在本地搭建和产线同样的环境。产线的全部服务都是基于K8s和Docker部署,因此本地也想将Eureka部署到本地的Docker环境。java

  • Eureka介绍

Eureka 属于 Spring Netflix的一个子项目,主要是为了实现服务的注册与发现,若是咱们作微服务开发,这个功能是必不可少的。具备相似功能的 Spring 子项目还有 Spring Consul、Zookeeper 和 阿里的 Nacos,后面若是使用到再作介绍。linux

  • Spring配置

首先,咱们要建立一个Spring boot项目,建议使用Idea去建立,比较方便,以下图:spring

 

 

 直接Next,而后设置本身项目信息,而后选择pom的依赖项,以下图:docker

 

 

直接Next,而后finished, 这里推荐使用父子module的项目管理方式。项目建立完成之后,进行服务的配置,首先,须要在Application启动类上加注解 @EnableEurekaServer,以下图:windows

 

 而后,进行yml文件的配置,由于咱们要部署集群,因此咱们建立3个yml文件,而后文件中设置不一样的端口来启动,以下图:网络

 

 yml文件内容以下:app

application-eureka01.yml
------------------------------------------------------------
spring:
  application:
    name: eureka

server:
  port: 7001

eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka01
  client:
    # false表示不向注册中心注册本身
    register-with-eureka: true
    # false表示本身端就是注册中心,个人职责就是维护服务实例,并不须要去检索服务
    fetch-registry: true
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都须要依赖这个地址(单机)。
      defaultZone:  http://eureka02:7002/eureka/,http://eureka03:7003/eureka/


application-eureka02.yml
------------------------------------------------------------
spring:
  application:
    name: eureka

server:
  port: 7002

eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka02
  client:
    # false表示不向注册中心注册本身
    register-with-eureka: true
    # false表示本身端就是注册中心,个人职责就是维护服务实例,并不须要去检索服务
    fetch-registry: true
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都须要依赖这个地址(单机)。
      defaultZone: http://eureka01:7001/eureka/,http://eureka03:7003/eureka/


application-eureka03.yml
------------------------------------------------------------
spring:
  application:
    name: eureka

server:
  port: 7003

eureka:
  instance:
    #eureka服务端的实例名称
    hostname: eureka03
  client:
    # false表示不向注册中心注册本身
    register-with-eureka: true
    # false表示本身端就是注册中心,个人职责就是维护服务实例,并不须要去检索服务
    fetch-registry: true
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都须要依赖这个地址(单机)。
      defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/

而后,在Serives View里面建立3个启动配置,而且分别设置 Active profiles,以下图:spring-boot

 

 最后,也是比较容易忘记的一步,记得修改本地的hosts文件,添加一行 :微服务

127.0.0.1 eureka01 eureka02 eureka03

启动3个Eureka 服务,而后访问:http://localhost:7001/,你会看到以下页面,说明你已经配置成功:工具

 

 

  • Docker配置

 我本地是安装的windows版本docker,主要是为了节省内存,若是在linux下安装还须要装一个虚拟机工具。并且windows版本的docker用起来也蛮方便的,不少操做能够在Dashboard里面操做,省去了不少不断重复的命令,特别是看日志和进入容器。具体安装过程很简单,这里就不做说明。在这里首先咱们要制做Dockerfile,制做好放到和pom文件的同目录下,内容以下图:

# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8u212-jdk-stretch as builder
# 执行工做目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建获得的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 经过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract

# 正式构建镜像
FROM openjdk:8u212-jdk-stretch
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

而后,编译打包项目:

mvn clean package -U -DskipTests

这时会在target目录下看到 eureka-0.0.1-SNAPSHOT.jar 。接下来咱们须要构建docker image,咱们默认在Dockerfile的目录下,命令以下:

docker build -t eureka:0.0.8 .

此时咱们能够用 Windows PowerShell 执行以下命令,去看一下咱们构建的image,而且依次启动3个eureka服务:

 #查看全部镜像
 docker images

 #启动3个eureka服务
 docker run --name eureka01 -d -p 7001:7001 eureka:0.0.1 --spring.profiles.active=eureka01
 docker run --name eureka02 -d -p 7002:7002 eureka:0.0.1 --spring.profiles.active=eureka02
 docker run --name eureka03 -d -p 7003:7003 eureka:0.0.1 --spring.profiles.active=eureka03

此时咱们能够在Docker Dashboard看到,咱们启动的容器,可是此时容器之间是没法经过服务名相互访问的,因此在容器console中咱们能够看到拒绝链接的报错:

接下来有重要一步骤就是,须要建立本身的一个bridge network,而后将eureka服务链接这个network中,由于默认docker的containers相互是能够经过IP相互访问,可是不可以经过hostname相互访问,docker的containers常常会动态改变,因此在这里咱们就须要用到一个自定义bridge网路,它在容器之间提供了自动DNS解析的功能,具体缘由能够参考这篇文章:https://juejin.im/post/6844903847383547911 。

# 建立一个自定义的 bridge network,指定网段的时候注意,别和其它网卡的网段冲突
docker network create --subnet=172.19.0.0/16 mynetwork

#查看建立的network信息
docker network inspect mynetwork

#删除网卡命令
#docker network rm mynetwork

# 将eureka服务加入mynetwork网络中
docker network connect mynetwork eureka01
docker network connect mynetwork eureka02
docker network connect mynetwork eureka03

#再次查看network的信息,你会看到每一个eureka服务在 mynetwork 中分配的IP信息
docker network inspect mynetwork

此时,咱们再次查看容器的控制台,错误就会消失,咱们再次访问 http://localhost:7001/ 能够看到eureka cluster已经正常运行起来。

 

 

在开发中有一样需求的同窗,若是遇到什么问题能够留言交流!

相关文章
相关标签/搜索