微服务详解(一):概述

微服务详解(二):解决方案

微服务详解(三):设置开发环境

微服务详解(四):领域驱动设计

微服务详解(五):实现微服务

微服务详解(六):部署与测试

微服务详解(七):微服务的安全性

微服务详解(八):最佳做法和一般原则

微服务详解(九):故障排除指南

独立部署和使用诸如Docker的容器来部署微服务,使用Docker将项目部署到AWS上。

可以利用Docker或者任何其他容器,可以简化部署;

1.使用Netflix OSS的微服务架构概述

Netflix是微服务架构中的先锋,通过他们的开放源码软件中心(Open Source Software Center,OOS)开源它们的大多数微服务工具,为推广微服务做出了巨大的贡献;

Spring借此机会,将许多Netflix开方源码软件项目,如Zuul、Ribbon、Hystrix、Eureka Server和Turbine,都集成到Spring Cloud中。这是Spring Cloud能够为开发可用于生产的微服务提供现成平台的原因之一;

  1. 边缘服务器:使用Netflix Zuul Server作为边缘服务器;
  2. 负载均衡:Netflix Ribbon作为负载均衡;
  3. 电路断路器:Netflix Hystrix用作电路断路器和帮助保持系统运行;
  4. 服务发现和注册:Netflix Eureka服务器用于服务发现和注册;
  5. 监控仪表板:Hystrix仪表板与Netflix Turbine结合用于微服务监控。它提供了一个仪表板来检查运行中的微服务的健康状况;

2.负载均衡

如果要以速度快、容量利用率最大化的方式为请求提供服务,就需要实现负载均衡,这样可以确保没有服务器的请求超负荷。如果一台服务器出现故障,负载均衡器会将请求定位到其余的主机服务器上。在微服务架构中,微服务可以为内部或者外部请求提供服务。在此基础上,我们可以有两种类型的负载均衡——客户端负载均衡和服务器端的负载均衡;

1.客户端的负载均衡

微服务需要在进程之间进行通信,以便服务可以互相交流。Spring  Cloud使用Netflix Ribbon承担负载均衡器这个至关重要的角色。并可以处理HTTP和TCP客户端负载。

在Spring Cloud中,Ribbon在默认情况下与Eureka服务器集成。这种集成提供以下功能:

Spring Cloud中有使用Ribbon的不同客户端,如RestTemplate或者FeignClient。这些客户端允许微服务间相互通信。使用Eureka服务器的时候,客户端使用实例ID代替主机名和端口用于HTTP向服务实例发出调用。客户端把服务ID传给Ribbon,Ribbon然后使用负载均衡器获取Eureka服务器实例;

如果存在多个Eureka的实例,则Ribbon基于负载均衡的算法,只为请求获取一个实例;

可以使用DiscoverClient来查找Eureka服务器中可用的服务的所有实例;

2.服务器端的负载均衡

Netflix Zuul Server作为边缘服务器,Zuul是一个基于JVM的路由器和服务器端的负载均衡器。Zuul支持用任何JVM语言来编写规则和过滤条件并具有内置的Java和Groovy的支持;

UI和其他客户端调用边缘服务器,它使用application.yml中定义的路由,调用内部服务并提供响应。它充当代理服务器、承担内部网络的网关,并为定义和配置的路由调用内部服务。

在Spring Cloud中配置和使用边缘服务器非常的简单。

步骤如下:

  1. 在pom.xml中定义zuul服务器依赖项:

spring-cloud-starter-zuul

  1. 在应用程序中使用@EnableZuulProxy注解。它还会在内部使用@EnableDiscoveryClient:因此它也会自动注册到Eureka服务器。
  2. 在application.yml中更新zuul的配置:

zuul:ignoredServices:这跳过服务的自动添加。

zuul:routes:这包含定义URI模式的path属性;

3.电路断路器与监控

在微服务中,使用这个概念,称为电路断路器的设计模式。它跟踪Eureka服务器等外部服务、餐馆服务等API服务的可用性,并防止服务使用者在任何不可用的服务上执行任何操作;

这是微服务架构的另一个方面,当服务不能响应服务者的时候的一项安全措施(故障安全机制)——电路断路器;

使用Netflix Hystrix作为电路断路器,在发生故障的时候(由于通信错误或者超时),它调用服务使用者的内部回退方法,它嵌入在其服务的使用者中执行。

1.使用Hystrix的回退方法

为了实现回退的方法,需要采取三个步骤:

  1. 启用断路器:使用其他服务的微服务的主类应该使用@EnableCircuitBreaker注解
  2. 配置回退的方法:使用@HystrixCommand注解来配置fallbackMethod
  3. 定义回退方法:处理故障和安全执行步骤的一个方法,此方法就是fallbackMethod指定的方法;

这些步骤就可以完成对服务调用的故障保护,并向服务使用者返回更为合适的响应;

2.监控

Hystrix提供web用户界面的仪表板,

Netflix Turbine是一个web应用程序,它连接到集群中Hystrix应用程序的实例并会实时聚合信息。Turbine使用一个称为Turbine流的流来提供信息。

Netflix Hystrix和Turbine使用RabbitMQ这个开源消息队列软件。RabbitMQ使用高级消息队列协议(Advance Messaging Queue Protocal,AMQP)工作。可以在这个软件中定义任何类型的信息。可以在RabbitMQ队列中存储消息,直到接收应用程序连接到它并接收此消息为止(将消息从队列中取走);

Hystrix使用RabbitMQ来发送馈送给Turbine的度量数据。

在配置Hystrix和Turbine前,请在你的平台上安装RabbitMQ应用程序。Hystrix和Turbine使用RabbitMQ在两者之间进行通信;

3.设置Hystrix仪表板

在Spring Cloud中配置Hystrix仪表板只需要以下几步:

  1. 在pom.xml中定义Hystrix仪表板的依赖:

spring-cloud-starter-hystrix-dashboard

  1. 使用主Java类中的@EnableHystrixDashboard注解完成了全部的工作。也是用@Controller注解把来自根的请求转发到Hystrix;
  2. 在application.yml中更新Dashboard应用程序配置;

4.设置Turbine

步骤如下:

  1. 为Turbine再创建一个Maven依赖项。spring-cloud-starter-turbine-amqp
  2. 在应用程序类中使用@EnableTurbineAmqp注解;定义一个返回RabbitMQ的工厂bean
  3. 在application.yml中更新Turbine配置;

server:port:HTTP使用的主端口

management:port:Turbine执行器端点的端口

4.使用容器部署微服务

Docker容器提供轻量级的运行时环境,它由虚拟机的核心功能和一个称为Docker映像的隔离的操作系统组成。Docker使得包装和执行微服务更加容器、顺畅。每个操作系统可以有多个Docker,并且每个Docker都可以运行多个应用程序;

1.安装和配置

如果不是Linux操作系统,那么Docker需要一台虚拟化的服务器。可以安装VirtualBox或者类似的工具。

首先在平台上安装Docker

1.具有4GB内存的Docker机器

默认情况下创建的机器都具有2G的内存,可以设置具有4G的内存的Docker;

2.使用Maven构建Docker映像

有各种Docker maven插件可以用来构建映像:

  1. https://github.com/rhuss/docker-maven-plugin
  2. https://github.com/alexec/docker-maven-plugin
  3. https://github.com/spotify.docker-maven-plugin

推荐使用第一种,它提供了很多额外的功能;

在讨论docker-maven-plugin的配置之前,我们首先需要介绍application.yml中的Docker Spring配置文件。在为各种平台构建服务的时候,它将使我们的工作变得更加容易。

需要配置如下四个属性:在application.yml中

  1. 使用确定为Docker的Spring配置文件;
  2. 嵌入式Tomcat的端口之间不会有任何冲突,因为服务将在自己各自的容器内执行。
  3. 在Eureka中使用服务的IP地址,因此Eureka实例属性preferIpAddress将被设置为true;
  4. 在serviceUrl:defaultZone中使用Eureka服务器主机名;

在生成Docker容器JAR的时候,还将在pom.xml中添加以下代码来激活Spring配置文件Docker

构建服务的时候只需要使用Maven Docker配置文件:

mvn -P docker clean package

配置docker-maven-plugin生成微服务的映像。

这个插件必须首先创建一个Dockerfile。Dockerfile是在两个地方配置的,一个是pom.xml和docker-assembly.xml中。

在pom.xml中可以创建一个基于某一个Java版本的映像的Dockerfile

配置docker-assembly.xml,它告诉插件应将哪些文件放入到容器中。

【生成Docker映像】

mvn docker:build

【使用命令验证本地存储库中的映像】

docker run -it -p 8080:8080 sourabhh/

使用-it代替-d在前台执行此命令;

3.使用Maven运行Docker

如果要使用Maven来执行Docker映像,需要在pom.xml中添加以下的配置项。把<run>块放在pom.xml文件docker-maven-plugin部分的image块下标记To Do的地方

Docker Maven插件通过轮询管理的ping URL,直到它接收到一个回复可以检测容器是否已经完成启动;

注意:如果是在Windows或者Mac OS上使用DockerToolBox,Docker主机不是localhost,可以通过docker-mechine ip default检查Docker映像的IP,它也在启动的时候显示;

Docker容器准备就绪,使用Maven来启动:

mvn docker:start

4.使用Docker执行集成测试

启动和停止Docker容器可以通过将以下执行块绑定到早pom.xml中的docker-maven-plugin生命周期阶段来完成;

一个简单的集成测试代码:

@Category(DockerIntegrationTest.class)

5.把映像推送到注册表

在docker-maven-plugin下添加下列标记把Docker映像发布到Docker Hub:

<execution>
       <id>push-to-docker-registry</id>
       <phase>deploy</phase>
       <goals>
              <goal>push</goal>
</goals>
</execution>

可以配置maven-deploy-plugin跳过JAR发布

在Docker Hub发布一个Docker映像需要一个用户民和密码

也可以将一个Docker映像推送到自己的Docker寄存处中。需要添加docker.registry.name标记。

6.管理Docker容器

每个微服务都将有自己的Docker容器。因此,我们将使用Docker Compose这个Docker容器管理器来管理我们的容器;

Docker Compose将帮助我们指定容器的数量和如何执行这些容器。

我们可以指定Docker映像、端口和每个容器到其他Docker容器的链接;

如果你还没有设置docker本地寄存处,请先做这个工作,以便问题较少或者更顺畅的运行;

构建docker的本地寄存:

然后对本地映像执行push和pull命令

最后执行docker-compose

一旦所有的微服务容器都被配置完成,我们就可以使用单个命令启动所有的Docker容器;