• 故事背景

最近因为产线使用的服务与发现服务,使用的是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. 内存不够用还要速度快,终于找到可以基于 File 的 Cache 了

    一:背景 1. 讲故事 18年的时候在做纯内存项目的过程中遇到了这么一个问题,因为一些核心数据都是飘在内存中,所以内存空间对我们来说额外宝贵,但偏偏项目中有些数据需要缓存,比如说需要下钻的报表上的点, ...

  2. 在服务器上使用python-gym出现的显示问题

    参考链接: http://www.luyixian.cn/news_show_392045.aspx https://www.cnblogs.com/cenariusxz/p/12666938.htm ...

  3. Windows Server 2012 两台服务器文件同步

    下载cwRsyncServer软件安装(这是Windows下的文件同步软件) 一.(1)在文件客户端服务器安装该软件,找到安装位置下的rsyncd.conf,修改配置文件(注意在Windows下输入位 ...

  4. 关于Chrome浏览器自动同步的问题

    Chrome浏览器是开发者最喜欢的浏览器,没有之一,那么公司办公和在家办公的话数据需要有一致性,这个时候就用到了浏览器的自动同步的功能 因为网络的问题,谷歌账户很难登录,基本需要VPN翻墙处理之后才能 ...

  5. 发生错误 1069 sqlserver

    ---------------------------SQL Server 服务管理器---------------------------发生错误 1069 - (由于登录失败而无法启动服务.),此 ...

  6. 基于PHP实现CMS识别

    最近正在开发一款基于PHP实现的Web安全检测平台,写到了CMS识别这一功能,便写一篇文章总结一下. 首先需要梳理的是CMS识别的几种方法: 1.网页源代码特征:例如源代码中包含CMS的名称或是某种特 ...

  7. 消息队列之-RocketMQ入门

    简介 RocketMQ是阿里开源的消息中间件,目前已经捐献个Apache基金会,它是由Java语言开发的,具备高吞吐量.高可用性.适合大规模分布式系统应用等特点,经历过双11的洗礼,实力不容小觑. 官 ...

  8. 跟着兄弟连系统学习Linux-【day04】

    day04-20200601 p15.链接文件 [ln -s 原文件   连接文件]软连接,所有人都可以操作软连接文件(实际上是取决于原文件的权限),类似于Windows的快捷方式,方便进行管理.软连 ...

  9. mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

    之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...

  10. 读网文《将20M文件从30秒压缩到1秒,我是如何做到的?》做实验

    先在微信公众号上看到网文<将20M文件从30秒压缩到1秒,我是如何做到的?>,然后在网上搜索了一下,看到了原文:https://www.jianshu.com/p/2e46ccb125ef ...