• 故事背景

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

  • Eureka介绍

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

  • Spring配置

首先,我们要创建一个Spring boot项目,建议使用Idea去创建,比较方便,如下图:

直接Next,然后设置自己项目信息,然后选择pom的依赖项,如下图:

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

然后,进行yml文件的配置,因为我们要部署集群,所以我们创建3个yml文件,然后文件中设置不同的端口来启动,如下图:

yml文件内容如下:

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,如下图:

最后,也是比较容易忘记的一步,记得修改本地的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已经正常运行起来。

在开发中有同样需求的同学,如果遇到什么问题可以留言交流!

Spring Eureka 本地Docker集群部署的更多相关文章

  1. RocketMQ(2)---Docker集群部署RocketMQ

    RocketMQ(2)-Docker集群部署RocketMQ =前言= 1.因为自己只买了一台阿里云服务器,所以RocketMQ集群都部署在单台服务器上只是端口不同,如果实际开发,可以分别部署在多台服 ...

  2. 27.Docker集群部署

    对于scrapy的部署方式 1.Scrapyd 安装扩展组件,远程控制scrapy任务,包括部署源代码,启动任务,监听任务.scrapy-client .scrapyd api 协助完成部署和监听操作 ...

  3. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  4. Docker集群部署SpringCloud应用

    整体架构 docker环境准备 # linux下的安装,自行百度 # windows docker toolbox下载地址 https://download.docker.com/win/stable ...

  5. Clickhouse Docker集群部署

    写在前面 抽空来更新一下大数据的玩意儿了,起初架构选型的时候有考虑Hadoop那一套做数仓,但是Hadoop要求的服务器数量有点高,集群至少6台或以上,所以选择了Clickhouse(后面简称CH). ...

  6. Kubernetes&Docker集群部署

    集群环境搭建 搭建kubernetes的集群环境 环境规划 集群类型 kubernetes集群大体上分为两类:一主多从和多主多从. 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单 ...

  7. docker集群部署

    一.使用自定义网桥连接跨主机容器 要是Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令:# yum install bridge-utils 查看桥连状态:# brct ...

  8. Nacos Docker集群部署

    参考文档:https://nacos.io/zh-cn/docs/quick-start-docker.html 1.从git上下载nacos-docker项目,本地目录为/docksoft/naco ...

  9. 使用Docker构建持续集成与自动部署的Docker集群

    为什么使用Docker " 从我个人使用的角度讲的话  部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...

随机推荐

  1. JMH-大厂是如何使用JMH进行Java代码性能测试的?必须掌握!

    Java 性能测试难题 现在的 JVM 已经越来越为智能,它可以在编译阶段.加载阶段.运行阶段对代码进行优化.比如你写了一段不怎么聪明的代码,到了 JVM 这里,它发现几处可以优化的地方,就顺手帮你优 ...

  2. Windows servers 2008 环境下,CA证书服务器搭建。

    CA证书这个东西好像是很久之前的东西了,现在已经不大用了,不过还是作为一种服务,搭建一下. 环境:Windows servers 2008 (虚拟机环境) 1.配置IP地址. 2.添加角色. 选择Ac ...

  3. windows server 2008 r2 环境下,实现域名和IP同时都能访问一个网站

    有时候,用域名访问能得到一个页面,用IP地址访问也可以得到一个页面,比如 www.baidu.com 和 61.135.169.125 都可以打开百度页面.一开始要实现这种功能,还真有点不知所措,想了 ...

  4. Java面试题 200+

    面试题包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Cl ...

  5. 焦大:逛网seo案例浅析

    http://www.wocaoseo.com/thread-93-1-1.html 逛,发现喜欢.这或许是很多人上网的喜欢方式,我隐约记得白鸦在一次采访上说到现在人的购物方式,在淘宝上人们决定买一件 ...

  6. js区别对象和数组的三种方法

    var arr = {}||[];            区分arr是数组还是对象            1.arr.constructor                              ...

  7. 单表千万行数据库 LIKE 搜索优化手记

    我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式. 如果需要查找客户表中所有姓氏是“张”的数据,可以使用下面的 SQL 语句 ...

  8. Asp.Net WebAPI的简介及创建

    一.WebAPI简介 ASP.NET Web API 是一种框架,用于轻松构建可以由多种客户端(包括浏览器和移动设备)访问的 HTTP 服务.ASP.NET Web API 是一种用于在 .NET F ...

  9. 开源流数据公司 StreamNative 推出 Pulsar 云服务,推进企业“流优先”进程

    Apache 顶级项目 Pulsar 背后的开源流数据公司 StreamNative 宣布,推出基于 Apache Pulsar 的云端服务产品--StreamNative Cloud.该产品的发布, ...

  10. 最小发射功率下WSN的连通性和覆盖率

    简述: 实验要求我们将传感器节点随机均匀分布在1x1的方格中,然后计算节点的最小共同发射功率(COMPOW),保证网络刚好连通,并计算出这些节点的覆盖率.为了解决这个问题,我们的做法是随机均匀部署10 ...