结合Docker运行Spring Cloud微服务的多种方式

如何通过以下方式在Docker中运行Spring-Cloud MicroService拓扑:

Docker端口映射到外部主机网络
Docker Links
Docker Bridge网络

  1. 从Docker机器的外部访问Docker容器中微服务

Eureka和MicroServices可通过docker机器的静态IP地址访问。客户端只需获取eureka注册表并通过docker-machine的IP调用特定的MicroService,并将容器的端口映射到客户端的网络端口。

如果设置eureka.instance.prefer-ip-address = true,则使用Eureka的MicroService注册将使用eureka.instance.ip-address指定的IP地址(解析后默认为主机的IP)。

因此MicroService Spring Boot属性文件将是:

eureka.client.serviceUrl.defaultZone=http:<font><i>//${DOCKER_HOST_IP}:9761/eureka</i></font><font>
.
eureka.instance.preferIpAddress=<b>true</b>
eureka.instance.ip-address=${DOCKER_HOST_IP}
.
</font>
设置说明:

在Eureka上注册此MicroService,运行时间为: http://${DOCKER_HOST_IP}:9761 / eureka
MicroService将通过$ {DOCKER_HOST_IP}系统属性指定的IP暴露给docker的外部世界。我们将在这里注入docker机器的当前IP地址。
同样在 eureka server端配置:

eureka.instance.prefer-ip-address=<b>true</b>
eureka.instance.ip-address=${DOCKER_HOST_IP}
Eureka服务器实例将在$ {DOCKER_HOST_IP}上运行并可访问。

Docker maven集成

作为Docker Maven插件,我选择了 Spotify的Docker-Maven-Plugin 。功能齐全。

Eureka Dockerfile:

FROM java:8-jre
MAINTAINER Tomas Kloucek <[email protected]>

ADD ./demo-0.0.1-SNAPSHOT.war /app/

CMD [<font>"java"</font><font>, </font><font>"-Xmx512m"</font><font>, </font><font>"-jar"</font><font>, </font><font>"/app/demo-0.0.1-SNAPSHOT.war"</font><font>]
</font>
Eureka pom.xml (plugin configuration):

<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
</configuration>
</plugin>
构建Docker镜像并在容器中运行它们:

(in the spring-microservice-registry folder)
mvn clean install docker:build
docker images (verify your image was built)
docker run --env DOCKER_HOST_IP=$(boot2docker ip) -it --name eureka -p 9761:9761 registry/demo
访问 http://DOCKER_HOST_IP:9761/ 确认eureka服务器正在运行

微服务客户端启动:

(in the spring-microservice-service folder)
mvn clean install -DskipTests docker:build
docker images (verify your image was built)
docker run --env DOCKER_HOST_IP=$(boot2docker ip) -it --name service -p 8080:8080 service/demo
docker ps (verify that service container is running)
从外部调用MicroService

外部客户只需要知道eureka服务器的地址

application.properties:

eureka.client.serviceUrl.defaultZone=http:<font><i>//${DOCKER_HOST_IP}:9761/eureka</i></font><font>
</font>
测试在Docker中启动的微服务:

(in the spring-microservice-client folder) mvn clean install java -jar -DDOCKER_HOST_IP=$(boot2docker ip) target/demo-0.0.1-SNAPSHOT.war
2.Docker Links

eureka服务器application.properties:

eureka.instance.prefer-ip-address = false
eureka.instance.hostname = eureka
通过此设置,Eureka服务器注册表将可以在地址 http://eureka:<port>/eureka 下载给客户端,

在Docker中启动Eureka注册表:

(in the spring-microservice-registry folder)
mvn clean install docker:build
docker images (verify your image was built)
docker run -it -p 9761:9761 --name eureka registry/demo
我只使用端口映射,因为我想使用eureka网页。重要的是使用容器名。

让我们将先前配置的Eureka设置为MicroService的注册表源,在微服务项目中配置:

spring.application.name=personsService
eureka.client.serviceUrl.defaultZone=http:<font><i>//eureka:9761/eureka</i></font><font>
eureka.client.healthcheck.enabled=<b>true</b>

eureka.instance.preferIpAddress=false
eureka.instance.hostname=service

ribbon.eureka.enabled=<b>true</b>
</font>
启动Docker中微服务:

(in the spring-microservice-service folder)
mvn clean install -DskipTests docker:build
docker images (verify your image was built)
docker run -it --link eureka:eureka --name service service/demo
docker ps (verify that service container is running)
使用“docker run”在service/demo容器将在别名eureka下看到Eureka服务器,让我们验证(运行以下命令):

docker exec -it service bash (<b>this</b> will connect you to the MicroService cont.)
ping eureka
输出:

ping eureka
PING eureka (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.269 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.084 ms
网关容器

网关容器也需要链接到eureka和服务容器,因为eureka将以 http://service:8080 的形式提供ribbon负载平衡的MicroService地址。因此网关需要了解“服务”的含义。

application.properties:

server.port=8888

hystrix.command.invokePersonsMicroService.fallback.enabled=<b>true</b>
hystrix.command.invokePersonsMicroService.metrics.rollingStats.timeInMilliseconds=35000
hystrix.command.invokePersonsMicroService.circuitBreaker.sleepWindowInMilliseconds=5000
hystrix.command.invokePersonsMicroService.circuitBreaker.requestVolumeThreshold=6
hystrix.command.invokePersonsMicroService.circuitBreaker.errorThresholdPercentage=100
hystrix.command.invokePersonsMicroService.execution.isolation.strategy=THREAD

eureka.client.serviceUrl.defaultZone=http:<font><i>//eureka:9761/eureka</i></font><font>

eureka.client.healthcheck.enabled=<b>true</b>
eureka.client.registryFetchIntervalSeconds=5
eureka.client.fetch-registry=<b>true</b>
</font>
运行Docker中网关:

(in the spring-microservice-client folder)
mvn clean install -DskipTests docker:build
docker images (verify that image was built)
docker run -it --link eureka:eureka --link service:service --name client client/demo
运行镜像后,您应该再次看到重复输出:

Simple MicroService Feign invocation result :{<font>"persons"</font><font>:[{</font><font>"name"</font><font>:</font><font>"Tomas"</font><font>,</font><font>"surname"</font><font>:</font><font>"Kloucek"</font><font>,</font><font>"department"</font><font>:</font><font>"Programmer"</font><font>}]}
</font>

  1. Docker桥接网络

展示如何在所有节点之间创建基本的“桥梁”,这样他们就能看到对方!那么不需要手动Docker链接。

运行以下命令:

docker network create spring-cloud-network
既然我们现在有了一个网络,让我们把所有的节点放在其中

Maven编译和镜像构建与前面部分相同。

要启动eureka容器,请使用:

docker run -i -t --name eureka --net spring-cloud-network -p 9761:971 registry/demo
要启动MicroService容器,请使用:

docker run -it --name service --net spring-cloud-network service/demo
网格客户端,启动:

docker run -it --name client --net spring-cloud-network client/demo
让我们测试是否看到彼此:

docker exec -it service bash
60623256:/# ping eureka
PING eureka (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: icmp_seq=0 ttl=64 time=0.085 ms
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.110 ms

ping client
PING client (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: icmp_seq=0 ttl=64 time=0.110 ms
64 bytes from 172.19.0.4: icmp_seq=1 ttl=64 time=0.106 ms
64 bytes from 172.19.0.4: icmp_seq=2 ttl=64 time=0.089 ms
如果您对每个容器彼此看到的拓扑结构都很好,那么基本的docker bridge网络就可以实现了,但请记住它只能在一个主机上运行。对于多个主机,您需要使用Overlay网络或服务网格

原文地址:http://blog.51cto.com/14028890/2342121

时间: 2024-10-08 17:15:18

结合Docker运行Spring Cloud微服务的多种方式的相关文章

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

Spring Cloud微服务Sentinel+Apollo限流、熔断实战

在Spring Cloud微服务体系中,由于限流熔断组件Hystrix开源版本不在维护,因此国内不少有类似需求的公司已经将眼光转向阿里开源的Sentinel框架.而以下要介绍的正是作者最近两个月的真实项目实践过程,这中间被不少网络Demo示例级别水文误导过,为了以正视听特将实践过程加以总结,希望能够帮到有类似需要的朋友! 一.Sentinel概述 在基于Spring Cloud构建的微服务体系中,服务之间的调用链路会随着系统的演进变得越来越长,这无疑会增加了整个系统的不可靠因素.在并发流量比较高

Spring Cloud微服务运维神器之Consul Template?

Spring Cloud微服务架构浅析 这篇文章中要和大家分享下的就是在Spring Cloud微服务架构模式中被运维小哥用的很爽的一个工具Consul Template? 在具体介绍Consul Template是个什么东西之前,我们先来整体看一张微服务模式下的系统架构图,如下图所示: 在上图中,我们看到在基于Spring Cloud的微服务体系中,所有的微服务都会被注册到统一服务注册中心进行服务管理,这里使用的服务注册中心是Consul.假设在正常情况下,我们面向C端用户设计了一套微服务逻辑

Spring Cloud微服务架构在互联网中应用

夜行侠老师录制的:Spring Cloud微服务架构在互联网中应用 由大象分享网出版:http://www.itjoin.org/course/detail/5934a58c0cf2159b39641f80夜行侠课程集合:http://www.xuetuwuyou.com/user/29 第1节.Springcloud介绍第2节.Eureka的使用第3节.Eureka集群第4节.restful请求第5节.restful请求负载均衡第6节.配置中心第7节.获取配置中心数据第8节.配置中心高可用第9

关于Spring Cloud微服务架构

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud

spring cloud微服务分布式云架构集成项目

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的.在学习Spring Cloud之前大家必须了解一下相关项目,希望可以帮助到大家. Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. Spring Cloud Bus 事件.消息总线,用于在集群(例如,配置变化事件)中传

Spring Cloud微服务分布式云架构技术点

spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下技术总结,希望可以帮助到大家: View: H5.Vue.js.Spring Tag.React.angularJs Spring Boot/Spring Cloud:Zuul.Ribbon.Feign.Turbine.Hystrix.Oauthor2.Sleuth.API Gateway.Spri

spring cloud微服务分布式云架构 - 整合架构的技术点

spring cloud本身提供的组件就很多,但我们需要按照企业的业务模式来定制企业所需要的通用架构,那我们现在需要考虑使用哪些技术呢? 下面我针对于spring cloud微服务分布式云架构做了以下技术总结,希望可以帮助到大家: View: H5.Vue.js.Spring Tag.React.angularJs Spring Boot/Spring Cloud:Zuul.Ribbon.Feign.Turbine.Hystrix.Oauthor2.Sleuth.API Gateway.Spri

Spring Cloud微服务分布式云架构-集成项目简介

Spring Cloud集成项目有很多,下面我们列举一下和Spring Cloud相关的优秀项目,我们的企业架构中用到了很多的优秀项目,说白了,也是站在巨人的肩膀上去整合的.在学习Spring Cloud之前大家必须了解一下相关项目,希望可以帮助到大家. Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. Spring Cloud Bus ?事件.消息总线,用于在集群(例如,配置变化事件)中