使用Docker Compose编排Spring Cloud微服务
| 微服务项目名称 | 项目微服务中的角色 |
|---|---|
| microservice-discovery-eureka | 服务发现组件 |
| microservice-provider-user | 服务提供者 |
| microservice-consumer-movie-ribbon-hystrix | 服务消费者 |
| microservice-gateway-zuul | API Gateway |
| microservice-hystrix-turbine | Hystrix聚合监控工具 |
| microservice-hystrix-dashboard | Hystrix监控界面 |
微服务构建实例
1:使用Maven插件构建镜像,在各个项目的pom.xml中添加以下内容。
<!-- 添加docker-maven插件 -->
<plugin>
<groupId>com.sptify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/${project.artifactId}:${project.version}</imageName>
<forceTages>true</forceTages>
<baseImage>java</baseImage>
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<resoureces>
<resourece>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
由配置可知,构建出来的镜像名称是itmuch/各个微服务的artifactId:各个微服务的版本,例如:microservice-discovery-eureka:0.0.1-SNAPSHOT。
2:为Eureka Server所在容器配置一个主机名(如discover),并让各个微服务使用主机名访问Eureka Server。
将所有微服务eureka.client.serviceUrl.defaultZone修改为如下内容:
eureka:
client:
serviceUrl:
defaultZone:http://discovery:8761/eureka/
3:在每个项目的根目录执行以下命令,构建Docker镜像。
mvn clean package docker:build
4:编写docker-compose.yml
version: '3'
#Version 2 file format的固定写法,为project定义服务
services:
#指定服务名称
microservice-discovery-eureka:
#指定服务所使用的镜像
image: itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
#暴露端口信息
ports:
- "8761:8761"
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
#连接到microservice-discovery-eureka,这边使用的是SERVICE:ALIAS的形式
links:
- microservice-disvoery-eureka:discovery
-
microservice-consumer-movie-ribbon-hystrix:
image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
links:
- microservice-disvoery-eureka:discovery
microservice-gateway-zuul:
image: itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT
links:
- microservice-disvoery-eureka:discovery
microservice-hystrix-dashboard:
image: itmuch/microservice-hystrix-dashboard:0.0.1-SNAPSHOT
links:
- microservice-disvoery-eureka:discovery
microservice-hystrix-turbine:
image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
links:
- microservice-disvoery-eureka:discovery
测试,执行docker-compose up启动项目,即可看到Eureka Server上的微服务列表服务发布成功。
简化Compose的编写
同一个Compose工程中的所有服务共享一个隔离网络,可使用服务名称作为主机名来发现其他服务。
因此,将docker-compose.yml简化:
version: '2'
services:
discovery:
image: itmuch/discovery-eureka:0.0.1-SNAPSHOT
ports:
- "8761:8761"
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
microservice-consumer-movie-ribbon-hystrix:
image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
microservice-gateway-zuul:
image: itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT
microservice-hystrix-dashboard:
image: itmuch/microservice-hystrix-dashboard:0.0.1-SNAPSHOT
microservice-hystrix-turbine:
image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
编排高可用的Eureka Server
使用Compose编排Eureka Server集群。
1.执行以下命令构建Dokcer镜像。
mvn clean package docker:build
2.编写docker-compose.yml
version: '3'
services:
microservice-discovery-eureka-ha1:
hostname: peer1 #指定hostname
image: itmuch/discovery=eureka-ha:0.0.1:SNAPSHOT
links:
- discovery-eureka-ha2
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
microservice-discovery-eureka-ha2:
hostname: peer2 #指定hostname
image: itmuch/discovery=eureka-ha:0.0.1:SNAPSHOT
links:
- discovery-eureka-ha1
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
3.执行以下命令启动项目。
docker-compose up
但是,这样并不会成功,终端会输出异常。
因为存在循环依赖,links无法实现双向连接。
如何解决呢? 例如使用 ambassador pattern,使用外部DNS容器等。
编排高可用Spring Cloud微服务集群及动态伸缩
| 微服务项目名称 | 项目微服务中的角色 |
|---|---|
| microservice-discovery-eureka-ha | 服务发现组件 |
| microservice-provider-user | 服务提供者 |
| microservice-consumer-movie-ribbon-hystrix | 服务消费者 |
| microservice-gateway-zuul | API Gateway |
| microservice-hystrix-turbine | Hystrix聚合监控工具 |
| microservice-hystrix-dashboard | Hystrix监控界面 |
1.由于使用了microservice-discovery-eureka-ha,需要将所有的微服务eureka.client.serviceUrl.defaultZone属性修改为如下内容:
eureka:
client:
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
2.在每个项目的根目录,执行以下命令创建Docker镜像。
mvn clean package docker:build
3.编写docker-compose.yml
version: "2"
services:
peer1:
image: itemuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports:
- "8761:8761"
enviroment:
- spring.profiles.active=peer1
peer2:
image: itemuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
hostname: peer2
ports:
- "8761:8761"
enviroment:
- spring.profiles.active=peer2
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
microservice-consumer-movie-ribbon-hystrix:
image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
microservice-gateway-zuul:
image: itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT
microservice-hystrix-dashboard:
image: itmuch/microservice-hystrix-dashboard:0.0.1-SNAPSHOT
microservice-hystrix-turbine:
image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
测试,执行docker-compose up启动项目。
然后可以在Eureka Server看到微服务列表。
执行以下命令,为各个微服务动态扩容,让除Eureka Server以外的所有微服务都启动3个实例。
docker-compose scale microservice-provider-user=3 microservice-consumer-movie-ribbon-hystrix=3 microservice-gateway-zuul=3
microservice-hystrix-turbine=3
使用Docker Compose编排Spring Cloud微服务的更多相关文章
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...
- 【原创】Docker容器及Spring Boot微服务应用
Docker容器及Spring Boot微服务应用 1 什么是Docker 1.1 Docker的出现 问题一:项目实施环境复杂问题 传统项目实施过程中经常会出现“程序在我这跑得好好的,在你那怎么就不 ...
- Spring Cloud 微服务六:调用链跟踪Spring cloud sleuth +zipkin
前言:随着微服务系统的增加,服务之间的调用关系变得会非常复杂,这给运维以及排查问题带来了很大的麻烦,这时服务调用监控就显得非常重要了.spring cloud sleuth实现了对分布式服务的监控解决 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- spring cloud微服务实践五
本篇我们来看看怎么实现spring cloud的配置中心. 在分布式系统中,特别是微服务架构下,可能会存在许多的服务,每个服务都会存在一个或多个的配置文件.那怎么多的配置文件的管理就会成为一个大问题. ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- Spring Cloud 微服务
https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247486301&idx=2&sn=f6d45860269b61 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
随机推荐
- hive集群模式安装
hadoop3.2.0 完全分布式安装 hive-3.1.1 #解压缩tar -zxvf /usr/local/soft/apache-hive-3.1.1-bin.tar.gz -C /usr/lo ...
- Vue2+Koa2+Typescript前后端框架教程--05Sequelize的使用(ORM)
本篇开始分享Node.js后端服务开发中对于数据结构ORM的实现,主要使用的技术栈是:Sequelize. 上一篇文章中讲到班级管理的数据结构:ID,班级名称,班级编码,班主任ID,使用的数据库是My ...
- vue中的一些用法,持续更新中......
1.跳转用法 @1.在template模板中通常使用router-link to='url' @2.在js中 1.this.$router.push({path: ''/order/index''}) ...
- mac强制关闭应用
原文链接http://zhhll.icu/2020/08/13/Mac/%E5%BC%BA%E5%88%B6%E7%BB%88%E6%AD%A2%E5%BA%94%E7%94%A8/ 有时候使用Mac ...
- Spring中的@Valid 和 @Validated注解你用对了吗
1.概述 本文我们将重点介绍Spring中 @Valid和@Validated注解的区别 . 验证用户输入是否正确是我们应用程序中的常见功能.Spring提供了@Valid和@Validated两个注 ...
- 【C++】《Effective C++》第七章
第七章 模板与泛型编程 条款41:了解隐式接口和编译期多态 面向对象设计中的类(class)考虑的是显式接口(explict interface)和运行时多态,而模板编程中的模板(template)考 ...
- 2021新年 Vue3.0 + Element UI 尝鲜小记
2021年,又是新的一年,Vue 已经发布 3.0 版本,最好用的 UI 组件库 Element UI 也发布了适配 Vue3.0 的新版本,是时候开始学习一下这两个新技术. 本文主要记录了使用 Vu ...
- scp传文件夹
scp -r /root/backupdb/2014-08-15(文件夹) root@192.168.1.98:/root(目录)
- leetcode刷题录-1395
目录 题目 思考过程 查看别人分享的思路 总结 题目 题目地址:https://leetcode-cn.com/problems/count-number-of-teams/ n 名士兵站成一排.每个 ...
- 主题模型值LDA
主题模型(topic model)是以非监督学习的方式对文集的隐含语义结构(latent semantic structure)进行聚类(clustering)的统计模型. 主题模型主要被用于自然语言 ...