本文学习前提:Java, Spring Boot, Docker, Spring Cloud

一、准备工作

1.1 安装Docker环境

  

  这一部分请参考我的另一篇文章《ASP.NET Core on Docker》,本文不再赘述。需要注意的是,如果你是Windows想要安装Docker,Docker for Windows需要64bit Windows 10 Pro,且需要开启Hyper-V。如果你不想开启Hyper-V,而又事先安装了VMware Workstation,可以参考晓晨的《Docker for Windows 使用VMware Station》。

1.2 准备Java镜像

  (1)拉取java镜像

  # docker pull java => 默认为最新版本的镜像

  # docker pull java:8 => 标签为8的java镜像版本

  (2)查看java镜像

  # docker images java

  

  PS:java镜像有点大啊,643MB

二、部署Spring Boot微服务到Docker

2.1 Spring Boot示例准备

  这里以一个spring boot应用程序:eureka-service来介绍,它是基于spring cloud eureka的一个服务注册与发现的微服务应用程序,你可以从这里获取其源码。

  

2.2 快速借助Dockerfile部署到Docker

  (1)使用Maven打包项目:执行下面的命令,将其构建成jar包

MVN> mvn clean package  

  (2)在jar包所在目录,创建Dockerfile文件,并添加以下内容

# 基于Java8镜像
FROM java:8 # 将本地文件夹挂在到当前容器
VOLUME /tmp # 复制文件到容器
ADD eureka-service-sn-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar' # 声明需要暴露的端口
EXPOSE 9000 # 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

  (3)通过FTP工具将jar包和Dockerfile文件一起传送到服务器端,然后通过Shell工具登录并跳转到这个目录下,执行以下命令打包镜像:

  # docker build -t edc/discovery-service-eureka:0.0.1 . => 不要忘记这里有个 .

  

  # docker images => 可以看到在Java8的镜像基础之上,针对eureka-service的镜像已准备好

  

  (4)启动镜像:

  # docker run --name eureka-service -d -p 8761:8761 edc/service-discovery-eureka:0.0.1

  

  (5)验证是否已成功启动:访问http://docker宿主机IP:8761/,可以正常显示Eureka Server首页。

三、使用Docker Compose编排微服务

3.1 Docker Compose简介

  在实际的微服务架构中,一般包含很多个微服务,而且每个微服务都会部署多个实例,如果每个微服务都需要手动启停,那么效率会很低下,维护量也会很大。

  Compose是一个用于定义和运行多容器的Docker应用程序的工具,非常适合在开发、测试、构建CI工作流等场景。

  Compose的安装请参考:https://docs.docker.com/compose/install/#install-compose

  

  安装后验证如下:# docker-compose --version

  

  PS:我这里使用的Compose版本是1.22.0

3.2 Docker Compose快速入门示例

  首先,我们来了解下使用Compose的3个基本步骤:

  • 使用Dockerfile(或其他方式)定义应用程序环境,以便于在任何地方重现该环境
  • 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
  • 运行docker-compose up命令,启动并运行整个应用程序

  其次,我们仍然以上面的eureka-service为例,来快速实践一下Compose的基本步骤:

  (1)打包eureka-service,同上,不再赘述

  (2)创建Dockerfile文件,同上,不再赘述

  (3)在Dockerfile同一路径下创建docker-compose.yml,并添加以下内容:

version: '3'
services:
eureka: # 指定服务的名称
build: . # 指定Dockerfile所在路径,注意这里是个 .
ports:
- "8761:8761" # 指定端口映射,类似docker run的-p选项,注意使用字符串形式

  (4)通过FTP工具将jar包、dockerfile以及docker-compose.yml一同拷贝到docker宿主机指定文件夹中

  (5)在这个目录下执行以下命令,启动容器。

  # docker-compose up

  

  PS:也可以使用docker-compose up -d 来通过后台运行的方式启动并运行这些容器

  (6)验证容器是否成功启动:访问http://docker宿主机IP:8761/,可以正常显示Eureka Server首页。

 

  最后,说说Docker Compose将所管理的容器分为三层,分别是工程(Project)、服务(Service)以及容器(Container)。Docker Compose运行目录下的所有文件(docker-compose.yml、extends文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可以包含多个服务,每个服务定义了容器运行的镜像、参数和依赖,一个服务可以包括多个容器实例。

  

  对应上图中的名称,工程名称是eureka-service(对应docker宿主机上的目录名称),该工程包含了1个服务,服务名称是eureka。当执行docker-compose up命令时,启动了eureka服务的1个容器实例eureka_1。

3.3 Docker Compose编排Spring Cloud微服务

  这里仍然会采用在2.1节提到的部分示例来(详情请参见github的part5部分)演示,将要编排的微服务列表如下表所示:

微服务项目名称 项目微服务中的角色
eureka-service   服务发现&注册组件
zuul-service   API网关
user-service   服务提供者
movie-service   服务提供者

  (1)分别通过maven打成jar包,不再赘述。

  PS:可以通过使用maven插件来构建docker镜像,需要在pom.xml添加一些内容,这里不阐述,有兴趣的可以百度一下。此外,由于Docker默认网络模式是bridge,各个容器的IP都不相同,因此如果在服务提供者的配置文件中设置了http://localhost:8761/eureka/会无法满足要求。这时,我们可以为Eureka Server所在容器配置一个主机名(例如discover),并让各个微服务使用主机名来访问Eureka Server。所以,这里讲所有微服务关于Eureka地址的配置改为如下内容:

eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/

  (2)编写docker-compose.yml文件

version: '3'
services:
# 指定服务名称
eureka-service:
build:
context: eureka-service/
# 指定服务所使用的的镜像,后续不再赘述
image: edc/eureka-service:0.0.1
# 暴露端口信息
ports:
- "8761:8761"
zuul-service:
build:
context: zuul-service/
image: edc/zuul-service:0.0.1
# 连接到 eureka-service,这里使用的是SERVICE:ALIAS的形式
links:
- eureka-service:discovery
user-service:
build:
context: user-service/
image: edc/user-service:0.0.1
links:
- eureka-service:discovery
movie-service:
build:
context: movie-service/
image: edc/movie-service:0.0.1
links:
- eureka-service:discovery

  PS:这里我将各个服务都放在了分别的目录下,可以参考下图这个目录结构:

  

  (3)通过以下命令在docker-comopose.yml所在的目录下进行build,统一打包镜像

  # docker-compose build

  

  打包后查看已经build好的镜像列表

  

  (4)执行以下命令启动项目

  # docker-compose up -d

  PS:这里加上了-d,表示后台运行,否则你的整个屏幕都是日志输出...

  

  最终效果如下图所示:

3.4 Docker Compose编排高可用的Eureka Server

  针对Eureka Server,实现高可用的话,也可以通过Compose来编排Eureka Server集群(比如一个2个节点的高可用最小规模集群)。

  首先,需要针对Eureka Service的配置文件进行改造,以便通过同样的配置属性就可以实现两个节点的配置,这里仍然使用2.1节中的github中的示例(参见part1部分)。下面是eureka-service-ha-1的配置项,eureka-service-ha-2同理,不再赘述。

spring:
application:
name: eureka-service-ha-1
---
spring:
# profile=peer1
profiles: peer1
server:
port: 8761
eureka:
instance:
# when profile=peer1, hostname=peer1
hostname: peer1
client:
service-url:
# register self to peer2
defaultZone: http://peer2:8762/eureka
---
spring:
# profile=peer2
profiles: peer2
server:
port: 8762
eureka:
instance:
# when profile=peer2, hostname=peer2
hostname: peer2
client:
service-url:
# register self to peer1
defaultZone: http://peer1:8761/eureka

  从上面的配置文件中,两个节点是通过spring.profiles.active来区分配置属性的。

  然后,再来编写一个针对高可用eureka server的docker-compose.yml文件:

version: '3'
services:
# 指定服务名称
eureka-service-ha-1:
hostname: peer1 # 指定hostname
image: edc/eureka-service-ha:0.0.1-SNAPSHOT
links:
- eureka-service-ha-2 # 注册到另一个eureka-service中
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
# 指定服务名称
eureka-service-ha-2:
hostname: peer2 # 指定hostname
image: edc/eureka-service-ha:0.0.1-SNAPSHOT
links:
- eureka-service-ha-1 # 注册到另一个eureka-service中
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2

  其他步骤如3.3所述,这里不再进行演示。

3.5 Docker Compose编排可伸缩的微服务

  这里仍然以3.3中的movie-service为例,执行以下命令来达到微服务节点的扩展(这里从1个节点变为2个节点):

  # docker-compose scale movie-service=2

  从上图可以看出,movie-service实例已从1个变为了2个。

  同理,要伸缩为1个节点,只需要将2改为1即可,不再赘述。

四、小结

  本文极简地介绍了如何通过借助dockerfile的方式部署一个spring boot应用程序到docker,docker compose的快速入门示例以及如何通过docker compose编排spring cloud微服务应用程序,还介绍了实现编排高可用eureka server以及可伸缩的微服务的实现思路。关于docker与docker compose,还有许许多多的内容,其官方文档已经写得非常详细,并对常见的问题也已经有了很多详细的总结,大家可以参见:https://doc.docker.com/compose/faq/ 浏览。此外,十分感谢本文参考资料周立老师著的《Spring Cloud与Docker微服务架构实战(第二版)》,带我快速入门Spring Cloud的世界,谢谢!

参考资料

  

周立,《Spring Cloud与Docker微服务架构实战(第2版)

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Java微服务之Spring Boot on Docker的更多相关文章

  1. 小马哥-Java 微服务实践 - Spring Boot 系列-01Java 微服务实践 - Spring Boot 系列(一)初体验

    课程github地址 https://github.com/mercyblitz/segmentfault-lessons 传统的web应用架构.微服务是一种架构.不限定什么语言 单体应用和微服务的对 ...

  2. Java 微服务实践 - Spring Boot 系列

    https://segmentfault.com/l/1500000009515571

  3. 构建微服务:Spring boot

    构建微服务:Spring boot 在上篇文章构建微服务:Spring boot 提高篇中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jp ...

  4. Spring boot学习1 构建微服务:Spring boot 入门篇

    Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...

  5. 微服务下 Spring Boot Maven 工程依赖关系管理

    单体 Spring Boot Maven 工程 最基本的 pom.xml 包含工程信息.Spring Boot 父工程.属性配置.依赖包.构建插件 <?xml version="1.0 ...

  6. SpringCloud(8)微服务监控Spring Boot Admin

    1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring ...

  7. 构建微服务:Spring boot 入门篇

    什么是Spring Boot Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而 ...

  8. spring boot 2.0.3+spring cloud (Finchley)8、微服务监控Spring Boot Admin

    参考:Spring Boot Admin 2.0 上手 Spring Boot Admin 用于管理和监控一个或多个Spring Boot程序,在 Spring Boot Actuator 的基础上提 ...

  9. 微服务实施Spring Boot/Spring Cloud中踩过的坑(转)

    http://tietang.wang/2016/09/08/%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%AE%9E%E6%9 ...

随机推荐

  1. python3 os模块的常用功能及方法总结

    1.os.getcwd()     #显示当前工作路径 2.os.listdir('dirname')    #返回指定目录下的所有文件和目录名 3.os.remove('filename')     ...

  2. 测试网页时需要添加等待的情形 (Selenium)

    测试网页时需要添加等待的情形: 1. 网页跳转 2. DOM结构发生改变.

  3. Redis分布式锁的try-with-resources实现

    Redis分布式锁的try-with-resources实现 一.简介 在当今这个时代,单体应用(standalone)已经很少了,java提供的synchronized已经不能满足需求,大家自然 而 ...

  4. 集成支付宝SDK流程

    5.2 SDK集成流程 5.2.1 iOS 解压接口压缩文件(文件名是 WS_MOBILE_PAY_SDK_BASE.zip),找到iOS的压缩文件(文件名是支付宝移动支付SDK 标准版(iOS).z ...

  5. spring 上传文件文件的一个例子,

    /** * 类名称:UploadTest 类描述:创建人:zhang 创建时间:2015年3月13日 下午4:20:57 修改人:zhang * 修改时间:2015年3月13日 下午4:20:57 修 ...

  6. safari 浏览器 input textarea select 等不能响应用户输入

    解决办法 -webkit-user-select:auto; /*webkit浏览器*/ user-select:auto; -o-user-select:auto; -ms-user-select: ...

  7. 描述性统计指标 - 众数 Mode

    定义- 数值型数据 - 出现频数最多的变量值- 品质型数据.单项式分组数据 - 频数最多的组为众数组,该组的变量值(类型)就是众数- 组距式分组数据 - 频数最多的组为众数组,通过公式求得众数 - 公 ...

  8. 了解Scala反射

    本篇文章主要让大家理解什么是Scala的反射, 以及反射的分类, 反射的一些术语概念和一些简单的反射例子. 什么是反射 我们知道, Scala是基于JVM的语言, Scala编译器会将Scala代码编 ...

  9. BootStrap:轮播插件

    前述 利用 BootStrap 实现图片轮播,包括 基本轮播.带标题的轮播.设置轮播速度的轮播.控制前后的轮播 实例 基本轮播 代码 1.引入bootstrap和jQuery文件 <!-- jQ ...

  10. python——对图像进行卷积操作,使用多个滤波器

    线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果.做法很简单.首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像.然后,对于图像的 ...