| 后一修订版 | 前一修订版 | ||
|
springcloud:使用spring_cloud和docker构建微服务架构 [2018/06/05 23:28] admin 创建 |
springcloud:使用spring_cloud和docker构建微服务架构 [2018/09/10 18:02] (当前版本) |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| <p>【编者的话】如何使用Spring Boot、Spring | <p>【编者的话】如何使用Spring Boot、Spring | ||
| Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用Spring Boot、Spring | Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用Spring Boot、Spring | ||
| - | Cloud和Docker构建的概念型应用示例,提供了了解常见的微服务架构模式的起点。<br/><br/>该代码可以在<a href="https://github.com/sqshq/PiggyMetrics">GitHub</a>上获得,并且在Docker Hub上提供了镜像。您只需要一个命令即可启动整个系统。<br/><br/>我选择了一个老项目作为这个系统的基础,它的后端以前是单一应用。此应用提供了处理个人财务、整理收入开销、管理储蓄、分析统计和创建简单预测等功能。<br/></p><h3>功能服务</h3><p>整个应用分解为三个核心微服务。它们都是可以独立部署的应用,围绕着某些业务功能进行组织。<br/></p><p> | + | Cloud和Docker构建的概念型应用示例,提供了了解常见的微服务架构模式的起点。<br/><br/>该代码可以在<a href="https://github.com/sqshq/PiggyMetrics">GitHub</a>上获得,并且在Docker Hub上提供了镜像。您只需要一个命令即可启动整个系统。<br/><br/>我选择了一个老项目作为这个系统的基础,它的后端以前是单一应用。此应用提供了处理个人财务、整理收入开销、管理储蓄、分析统计和创建简单预测等功能。<br/></p><h3>功能服务</h3><p>整个应用分解为三个核心微服务。它们都是可以独立部署的应用,围绕着某些业务功能进行组织。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/d6db2e5f50a88fa75911e1a078e2dce6.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496777941.png" class="img-polaroid" title="1.png" alt="1.png"/></a></p><p><br/><br/><strong>账户服务</strong><br/><br/>包含一般用户输入逻辑和验证:收入/开销记录、储蓄和账户设置。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/cbfb8a08787af4073723be5d87cda517.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496916852.png" class="img-polaroid" title="biao1.png" alt="biao1.png"/></a></p><p><br/><br/><strong>统计服务</strong><br/><br/>计算主要的统计参数,并捕获每一个账户的时间序列。数据点包含基于货币和时间段正常化后的值。该数据可用于跟踪账户生命周期中的现金流量动态。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/65245e0b07a31d009583c416f40359d0.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496319128.png" class="img-polaroid" title="biao2.png" alt="biao2.png"/></a></p><p><br/><br/><strong>通知服务</strong><br/><br/>存储用户的联系信息和通知设置(如提醒和备份频率)。安排工作人员从其它服务收集所需的信息并向订阅的客户发送电子邮件。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/3b610b126f71ffbd6b9c1b34a7110b5d.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496904127.png" class="img-polaroid" title="biao3.png" alt="biao3.png"/></a></p><p><br/><br/><strong>注意</strong><br/></p><ul class=" list-paddingleft-2"><li><p>每一个微服务拥有自己的数据库,因此没有办法绕过API直接访问持久数据。</p></li><li><p>在这个项目中,我使用MongoDB作为每一个服务的主数据库。拥有一个多种类持久化架构(polyglot persistence architecture)也是很有意义的。</p></li><li><p>服务间(Service-to-service)通信是非常简单的:微服务仅使用同步的REST |
| - | <a href="http://dockone.io/uploads/article/20171007/d6db2e5f50a88fa75911e1a078e2dce6.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496777941.png" class="img-polaroid" title="1.png" alt="1.png"/></a></p><p><br/><br/><strong>账户服务</strong><br/><br/>包含一般用户输入逻辑和验证:收入/开销记录、储蓄和账户设置。<br/></p><p> | + | |
| - | <a href="http://dockone.io/uploads/article/20171007/cbfb8a08787af4073723be5d87cda517.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496916852.png" class="img-polaroid" title="biao1.png" alt="biao1.png"/></a></p><p><br/><br/><strong>统计服务</strong><br/><br/>计算主要的统计参数,并捕获每一个账户的时间序列。数据点包含基于货币和时间段正常化后的值。该数据可用于跟踪账户生命周期中的现金流量动态。<br/></p><p> | + | |
| - | <a href="http://dockone.io/uploads/article/20171007/65245e0b07a31d009583c416f40359d0.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496319128.png" class="img-polaroid" title="biao2.png" alt="biao2.png"/></a></p><p><br/><br/><strong>通知服务</strong><br/><br/>存储用户的联系信息和通知设置(如提醒和备份频率)。安排工作人员从其它服务收集所需的信息并向订阅的客户发送电子邮件。<br/></p><p> | + | |
| - | <a href="http://dockone.io/uploads/article/20171007/3b610b126f71ffbd6b9c1b34a7110b5d.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496904127.png" class="img-polaroid" title="biao3.png" alt="biao3.png"/></a></p><p><br/><br/><strong>注意</strong><br/></p><ul class=" list-paddingleft-2"><li><p>每一个微服务拥有自己的数据库,因此没有办法绕过API直接访问持久数据。</p></li><li><p>在这个项目中,我使用MongoDB作为每一个服务的主数据库。拥有一个多种类持久化架构(polyglot persistence architecture)也是很有意义的。</p></li><li><p>服务间(Service-to-service)通信是非常简单的:微服务仅使用同步的REST | + | |
| - | API进行通信。现实中的系统的常见做法是使用互动风格的组合。例如,执行同步的GET请求检索数据,并通过消息代理(broker)使用异步方法执行创建/更新操作,以便解除服务和缓冲消息之间的耦合。然而,这带给我们是<a href="http://martinfowler.com/articles/microservice-trade-offs.html#consistency">最终的一致性</a>。</p></li></ul><p><br/></p><h3>基础设施服务</h3><p>分布式系统中常见的模式,可以帮助我们描述核心服务是怎样工作的。<a href="http://projects.spring.io/spring-cloud/">Spring Cloud</a>提供了强大的工具,可以增强Spring Boot应用的行为来实现这些模式。我会简要介绍一下:<br/></p><p> | + | API进行通信。现实中的系统的常见做法是使用互动风格的组合。例如,执行同步的GET请求检索数据,并通过消息代理(broker)使用异步方法执行创建/更新操作,以便解除服务和缓冲消息之间的耦合。然而,这带给我们是<a href="http://martinfowler.com/articles/microservice-trade-offs.html#consistency">最终的一致性</a>。</p></li></ul><p><br/></p><h3>基础设施服务</h3><p>分布式系统中常见的模式,可以帮助我们描述核心服务是怎样工作的。<a href="http://projects.spring.io/spring-cloud/">Spring Cloud</a>提供了强大的工具,可以增强Spring Boot应用的行为来实现这些模式。我会简要介绍一下:<br/></p><p><a href="http://dockone.io/uploads/article/20171007/eb23046d0859325930d8eeb3f552dd36.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496222424.png" class="img-polaroid" title="2.png" alt="2.png"/></a></p><p><br/></p><h4>配置服务</h4><p><a href="http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html">Spring Cloud Config</a>是分布式系统的水平扩展集中式配置服务。它使用了当前支持的本地存储、Git和Subversion等可拔插存储库层(repository layer)。<br/><br/>在此项目中,我使用了native profile,它简单地从本地classpath下加载配置文件。您可以在<a href="https://github.com/sqshq/PiggyMetrics/tree/master/config/src/main/resources">配置服务资源</a>中查看shared目录。现在,当通知服务请求它的配置时,配置服务将响应回shared/notification-service.yml和shared/application.yml(所有客户端应用之间共享)。<br/><br/><strong>客户端使用</strong><br/><br/>只需要使用sprng-cloud-starter-config依赖构建Spring Boot应用,自动配置将会完成其它工作。<br/><br/>现在您的应用中不需要任何嵌入的properties,只需要提供有应用名称和配置服务url的bootstrap.yml即可:<br/></p><pre class="prettyprint">spring: |
| - | <a href="http://dockone.io/uploads/article/20171007/eb23046d0859325930d8eeb3f552dd36.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212496222424.png" class="img-polaroid" title="2.png" alt="2.png"/></a></p><p><br/></p><h4>配置服务</h4><p><a href="http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html">Spring Cloud Config</a>是分布式系统的水平扩展集中式配置服务。它使用了当前支持的本地存储、Git和Subversion等可拔插存储库层(repository layer)。<br/><br/>在此项目中,我使用了native profile,它简单地从本地classpath下加载配置文件。您可以在<a href="https://github.com/sqshq/PiggyMetrics/tree/master/config/src/main/resources">配置服务资源</a>中查看shared目录。现在,当通知服务请求它的配置时,配置服务将响应回shared/notification-service.yml和shared/application.yml(所有客户端应用之间共享)。<br/><br/><strong>客户端使用</strong><br/><br/>只需要使用sprng-cloud-starter-config依赖构建Spring Boot应用,自动配置将会完成其它工作。<br/><br/>现在您的应用中不需要任何嵌入的properties,只需要提供有应用名称和配置服务url的bootstrap.yml即可:<br/></p><pre class="prettyprint">spring: | + | |
| application: | application: | ||
| name: notification-service | name: notification-service | ||
| 行 25: | 行 20: | ||
|     stripPrefix: false</pre><p><br/>这意味着所有以/notification开头的请求将被路由到通知服务。您可以看到,里面没有硬编码的地址。Zuul使用<a href="https://github.com/sqshq/PiggyMetrics/blob/master/README.md#service-discovery">服务发现</a>机制来定位通知服务实例以及<a href="https://github.com/sqshq/PiggyMetrics/blob/master/README.md#http-client-load-balancer-and-circuit-breaker">断路器和负载均衡器</a>,如下所述。<br/></p><h4>服务发现</h4><p>另一种常见的架构模式是服务发现。它允许自动检测服务实例的网络位置,由于自动扩展、故障和升级,它可能会动态分配地址。<br/><br/>服务发现的关键部分是注册。我使用Netflix Eureka进行这个项目,当客户端需要负责确定可以用的服务实例(使用注册服务器)的位置和跨平台的负载均衡请求时,Eureka就是客户端发现模式的一个很好的例子。<br/><br/>使用Spring Boot,您可以使用spring-cloud-starter-eureka-server依赖、@EnabledEurekaServer注解和简单的配置属性轻松构建Eureka注册中心(Eureka Registry)。<br/><br/>使用@EnabledDiscoveryClient注解和带有应用名称的bootstrap.yml来启用客户端支持:<br/></p><pre class="prettyprint">spring: |     stripPrefix: false</pre><p><br/>这意味着所有以/notification开头的请求将被路由到通知服务。您可以看到,里面没有硬编码的地址。Zuul使用<a href="https://github.com/sqshq/PiggyMetrics/blob/master/README.md#service-discovery">服务发现</a>机制来定位通知服务实例以及<a href="https://github.com/sqshq/PiggyMetrics/blob/master/README.md#http-client-load-balancer-and-circuit-breaker">断路器和负载均衡器</a>,如下所述。<br/></p><h4>服务发现</h4><p>另一种常见的架构模式是服务发现。它允许自动检测服务实例的网络位置,由于自动扩展、故障和升级,它可能会动态分配地址。<br/><br/>服务发现的关键部分是注册。我使用Netflix Eureka进行这个项目,当客户端需要负责确定可以用的服务实例(使用注册服务器)的位置和跨平台的负载均衡请求时,Eureka就是客户端发现模式的一个很好的例子。<br/><br/>使用Spring Boot,您可以使用spring-cloud-starter-eureka-server依赖、@EnabledEurekaServer注解和简单的配置属性轻松构建Eureka注册中心(Eureka Registry)。<br/><br/>使用@EnabledDiscoveryClient注解和带有应用名称的bootstrap.yml来启用客户端支持:<br/></p><pre class="prettyprint">spring: | ||
| application: | application: | ||
| - | name: notification-service</pre><p><br/>现在,在应用启动时,它将向Eureka服务器注册并提供元数据,如主机和端口、健康指示器URL、主页等。Eureka接收来自从属于某服务的每个实例的心跳消息。如果心跳失败超过配置的时间表,该实例将从注册表中删除。<br/><br/>此外,Eureka还提供了一个简单的界面,您可以通过它来跟踪运行中的服务和可用实例的数量:<a href="http://localhost:8761" target="_blank">http://localhost:8761</a><br/></p><p> | + | name: notification-service</pre><p><br/>现在,在应用启动时,它将向Eureka服务器注册并提供元数据,如主机和端口、健康指示器URL、主页等。Eureka接收来自从属于某服务的每个实例的心跳消息。如果心跳失败超过配置的时间表,该实例将从注册表中删除。<br/><br/>此外,Eureka还提供了一个简单的界面,您可以通过它来跟踪运行中的服务和可用实例的数量:<a href="http://localhost:8761" target="_blank">http://localhost:8761</a><br/></p><p><a href="http://dockone.io/uploads/article/20171007/38c4fe054ca5b155fad2d25367f204a7.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212497595375.png" class="img-polaroid" title="3.png" alt="3.png"/></a></p><p><br/></p><h4>负载均衡器、断路器和Http客户端</h4><p>Netflix OSS提供了另一套很棒的工具。<br/><br/><strong>Ribbon</strong><br/><br/>Ribbon是一个客户端负载均衡器,可以很好地控制HTTP和TCP客户端的行为。与传统的负载均衡器相比,每次线上调用都不需要额外的跳跃——您可以直接联系所需的服务。<br/><br/>它与Spring Cloud和服务发现是集成在一起的,可开箱即用。<a href="https://github.com/sqshq/PiggyMetrics#service-discovery">Eureka客户端</a>提供了可用服务器的动态列表,因此Ribbon可以在它们之间进行平衡。<br/><br/><strong>Hystrix</strong><br/><br/>Hystrix是<a href="https://github.com/sqshq/PiggyMetrics#service-discovery">断路器模式</a>的一种实现,它可以通过网络访问依赖来控制延迟和故障。中心思想是在具有大量微服务的分布式环境中停止级联故障。这有助于快速失败并尽快恢复——自我修复在容错系统中是非常重要的。<br/><br/>除了断路器控制,在使用Hystrix,您可以添加一个备用方法,在主命令失败的情况下,该方法将被调用以获取默认值。<br/><br/>此外,Hystrix生成每个命令的执行结果和延迟的度量,我们可以用它来<a href="https://github.com/sqshq/PiggyMetrics#monitor-dashboard">监视系统的行为</a>。<br/><br/><strong>Feign</strong><br/><br/>Feign是一个声明式HTTP客户端,能与Ribbon和Hystrix无缝集成。实际上,通过一个spring-cloud-starter-feign依赖和@EnabledFeignClients注解,您可以使用一整套负载均衡器、断路器和HTTP客户端,并附带一个合理的的默认配置。<br/><br/>以下是账户服务的示例:<br/></p><pre class="prettyprint">@FeignClient(name = "statistics-service") |
| - | <a href="http://dockone.io/uploads/article/20171007/38c4fe054ca5b155fad2d25367f204a7.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212497595375.png" class="img-polaroid" title="3.png" alt="3.png"/></a></p><p><br/></p><h4>负载均衡器、断路器和Http客户端</h4><p>Netflix OSS提供了另一套很棒的工具。<br/><br/><strong>Ribbon</strong><br/><br/>Ribbon是一个客户端负载均衡器,可以很好地控制HTTP和TCP客户端的行为。与传统的负载均衡器相比,每次线上调用都不需要额外的跳跃——您可以直接联系所需的服务。<br/><br/>它与Spring Cloud和服务发现是集成在一起的,可开箱即用。<a href="https://github.com/sqshq/PiggyMetrics#service-discovery">Eureka客户端</a>提供了可用服务器的动态列表,因此Ribbon可以在它们之间进行平衡。<br/><br/><strong>Hystrix</strong><br/><br/>Hystrix是<a href="https://github.com/sqshq/PiggyMetrics#service-discovery">断路器模式</a>的一种实现,它可以通过网络访问依赖来控制延迟和故障。中心思想是在具有大量微服务的分布式环境中停止级联故障。这有助于快速失败并尽快恢复——自我修复在容错系统中是非常重要的。<br/><br/>除了断路器控制,在使用Hystrix,您可以添加一个备用方法,在主命令失败的情况下,该方法将被调用以获取默认值。<br/><br/>此外,Hystrix生成每个命令的执行结果和延迟的度量,我们可以用它来<a href="https://github.com/sqshq/PiggyMetrics#monitor-dashboard">监视系统的行为</a>。<br/><br/><strong>Feign</strong><br/><br/>Feign是一个声明式HTTP客户端,能与Ribbon和Hystrix无缝集成。实际上,通过一个spring-cloud-starter-feign依赖和@EnabledFeignClients注解,您可以使用一整套负载均衡器、断路器和HTTP客户端,并附带一个合理的的默认配置。<br/><br/>以下是账户服务的示例:<br/></p><pre class="prettyprint">@FeignClient(name = "statistics-service") | + | |
| public interface StatisticsServiceClient { | public interface StatisticsServiceClient { | ||
| @RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) | @RequestMapping(method = RequestMethod.PUT, value = "/statistics/{accountName}", consumes = MediaType.APPLICATION_JSON_UTF8_VALUE) | ||
| void updateStatistics(@PathVariable("accountName") String accountName, Account account); | void updateStatistics(@PathVariable("accountName") String accountName, Account account); | ||
| - | }</pre><p><br/></p><ul class=" list-paddingleft-2"><li><p>您需要的只是一个接口</p></li><li><p>您可以在Spring MVC控制器和Feign方法之间共享@RequestMapping部分</p></li><li><p>以上示例仅指定所需要的服务ID——statistics-service,这得益于Eureka的自动发现(但显然您可以使用特定的URL访问任何资源)。</p></li></ul><p><br/></p><h4>监控仪表盘</h4><p>在这个项目配置中,Hystrix的每一个微服务都通过Spring Cloud Bus(通过AMQP broker)将指标推送到Turbine。监控项目只是一个使用了<a href="https://github.com/Netflix/Turbine">Turbine</a>和<a href="https://github.com/Netflix/Hystrix/tree/master/hystrix-dashboard">Hystrix仪表盘</a>的小型Spring Boot应用。<br/><br/>让我们看看系统行为在负载下:账户服务调用统计服务和它在一个变化的模拟延迟下的响应。响应超时阈值设置为1秒。<br/></p><p> | + | }</pre><p><br/></p><ul class=" list-paddingleft-2"><li><p>您需要的只是一个接口</p></li><li><p>您可以在Spring MVC控制器和Feign方法之间共享@RequestMapping部分</p></li><li><p>以上示例仅指定所需要的服务ID——statistics-service,这得益于Eureka的自动发现(但显然您可以使用特定的URL访问任何资源)。</p></li></ul><p><br/></p><h4>监控仪表盘</h4><p>在这个项目配置中,Hystrix的每一个微服务都通过Spring Cloud Bus(通过AMQP broker)将指标推送到Turbine。监控项目只是一个使用了<a href="https://github.com/Netflix/Turbine">Turbine</a>和<a href="https://github.com/Netflix/Hystrix/tree/master/hystrix-dashboard">Hystrix仪表盘</a>的小型Spring Boot应用。<br/><br/>让我们看看系统行为在负载下:账户服务调用统计服务和它在一个变化的模拟延迟下的响应。响应超时阈值设置为1秒。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/7333a6f825e320a86364499ce0b9035c.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212497104303.png" class="img-polaroid" title="4.png" alt="4.png"/></a></p><p><br/></p><h4>日志分析</h4><p>集中式日志记录在尝试查找分布式环境中的问题时非常有用。Elasticsearch、Logstash和Kibana技术栈可让您轻松搜索和分析您的日志、利用率和网络活动数据。在我的<a href="http://github.com/sqshq/ELK-docker">另一个项目</a>中已经有现成的Docker配置。<br/></p><h4>安全</h4><p>高级安全配置已经超过了此概念性项目的范围。为了更真实地模拟真实系统,请考虑使用https和JCE密钥库来加密微服务密码和配置服务器的properties内容(有关详细信息,请参阅<a href="http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_security">文档</a>)。<br/></p><h3>基础设施自动化</h3><p>部署微服务比部署单一的应用的流程要复杂得多,因为它们相互依赖。拥有完全基础设置自动化是非常重要的。我们可以通过持续交付的方式获得以下好处:<br/></p><ul class=" list-paddingleft-2"><li><p>随时发布软件的能力。</p></li><li><p>任何构建都可能最终成为一个发行版本。</p></li><li><p>构建工件(artifact)一次,根据需要进行部署。</p></li></ul><p><br/>这是一个简单的持续交付工作流程,在这个项目的实现:<br/><br/>在此<a href="https://github.com/sqshq/PiggyMetrics/blob/master/.travis.yml">配置</a>中,Travis CI为每一个成功的Git推送创建了标记镜像。因此,每一个微服务在Docker Hub上的都会有一个latest镜像,而较旧的镜像则使用Git提交的哈希进行标记。如果有需要,可以轻松部署任何一个,并快速回滚。<br/></p><p><a href="http://dockone.io/uploads/article/20171007/5177e519e9705885f02acdbc86954cc6.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212498449871.png" class="img-polaroid" title="5.png" alt="5.png"/></a></p><p><br/></p><h3>如何运行全部?</h3><p>这真的很简单,我建议您尝试一下。请记住,您将要启动8个Spring Boot应用、4个MongoDB实例和RabbitMq。确保您的机器上有4GB的内存。您可以随时通过网关、注册中心、配置、认证服务和账户中心运行重要的服务。<br/><br/><strong>运行之前</strong><br/></p><ul class=" list-paddingleft-2"><li><p>安装Docker和Docker Compose。</p></li><li><p>配置环境变量:CONFIG_SERVICE_PASSWORD, |
| - | <a href="http://dockone.io/uploads/article/20171007/7333a6f825e320a86364499ce0b9035c.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212497104303.png" class="img-polaroid" title="4.png" alt="4.png"/></a></p><p><br/></p><h4>日志分析</h4><p>集中式日志记录在尝试查找分布式环境中的问题时非常有用。Elasticsearch、Logstash和Kibana技术栈可让您轻松搜索和分析您的日志、利用率和网络活动数据。在我的<a href="http://github.com/sqshq/ELK-docker">另一个项目</a>中已经有现成的Docker配置。<br/></p><h4>安全</h4><p>高级安全配置已经超过了此概念性项目的范围。为了更真实地模拟真实系统,请考虑使用https和JCE密钥库来加密微服务密码和配置服务器的properties内容(有关详细信息,请参阅<a href="http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_security">文档</a>)。<br/></p><h3>基础设施自动化</h3><p>部署微服务比部署单一的应用的流程要复杂得多,因为它们相互依赖。拥有完全基础设置自动化是非常重要的。我们可以通过持续交付的方式获得以下好处:<br/></p><ul class=" list-paddingleft-2"><li><p>随时发布软件的能力。</p></li><li><p>任何构建都可能最终成为一个发行版本。</p></li><li><p>构建工件(artifact)一次,根据需要进行部署。</p></li></ul><p><br/>这是一个简单的持续交付工作流程,在这个项目的实现:<br/><br/>在此<a href="https://github.com/sqshq/PiggyMetrics/blob/master/.travis.yml">配置</a>中,Travis CI为每一个成功的Git推送创建了标记镜像。因此,每一个微服务在Docker Hub上的都会有一个latest镜像,而较旧的镜像则使用Git提交的哈希进行标记。如果有需要,可以轻松部署任何一个,并快速回滚。<br/></p><p> | + | |
| - | <a href="http://dockone.io/uploads/article/20171007/5177e519e9705885f02acdbc86954cc6.png" target="_blank"><img src="/dokuwiki/ueditor/php/upload/image/20180605/1528212498449871.png" class="img-polaroid" title="5.png" alt="5.png"/></a></p><p><br/></p><h3>如何运行全部?</h3><p>这真的很简单,我建议您尝试一下。请记住,您将要启动8个Spring Boot应用、4个MongoDB实例和RabbitMq。确保您的机器上有4GB的内存。您可以随时通过网关、注册中心、配置、认证服务和账户中心运行重要的服务。<br/><br/><strong>运行之前</strong><br/></p><ul class=" list-paddingleft-2"><li><p>安装Docker和Docker Compose。</p></li><li><p>配置环境变量:CONFIG_SERVICE_PASSWORD, | + | |
| NOTIFICATION_SERVICE_PASSWORD, STATISTICS_SERVICE_PASSWORD, | NOTIFICATION_SERVICE_PASSWORD, STATISTICS_SERVICE_PASSWORD, | ||
| ACCOUNT_SERVICE_PASSWORD, MONGODB_PASSWORD</p></li></ul><p><br/><strong>生产模式</strong><br/><br/>在这种模式下,所有最新的镜像都将从Docker Hub上拉取。只需要复制docker-compose.yml并执行docker-compose up -d即可。<br/><br/><strong>开发模式</strong><br/><br/>如果您想自己构建镜像(例如,在代码中进行一些修改),您需要克隆所有仓库(repository)并使用Mavne构建工件(artifact)。然后,运行docker-compose | ACCOUNT_SERVICE_PASSWORD, MONGODB_PASSWORD</p></li></ul><p><br/><strong>生产模式</strong><br/><br/>在这种模式下,所有最新的镜像都将从Docker Hub上拉取。只需要复制docker-compose.yml并执行docker-compose up -d即可。<br/><br/><strong>开发模式</strong><br/><br/>如果您想自己构建镜像(例如,在代码中进行一些修改),您需要克隆所有仓库(repository)并使用Mavne构建工件(artifact)。然后,运行docker-compose | ||
| - | -f docker-compose.yml -f docker-compose.dev.yml up -d<br/><br/>docker-compose.dev.yml继承了docker-compose.yml,附带额外配置,可在本地构建镜像,并暴露所有容器端口以方便开发。<br/><br/><strong>重要的端点(Endpoint)</strong><br/></p><ul class=" list-paddingleft-2"><li><p>localhost:80 —— 网关</p></li><li><p>localhost:8761 —— Eureka仪表盘</p></li><li><p>localhost:9000 —— Hystrix仪表盘</p></li><li><p>localhost:8989 —— Turbine stream(Hystrix仪表盘来源)</p></li><li><p>localhost:15672 —— RabbitMq管理</p></li></ul><p><br/><strong>注意</strong><br/><br/>所有Spring Boot应用都需要运行<a href="https://github.com/sqshq/PiggyMetrics#config-service">配置服务器</a>才能启动。得益于Spring Boot的fail-fast属性和docker-compsoe的restart:always选项,我们可以同时启动所有容器。这意味着所有依赖的容器将尝试重新启动,直到配置服务器启动运行为止。<br/><br/>此外,服务发现机制在所有应用启动后需要一段时间。在实例、Eureka服务器和客户端在其本地缓存中都具有相同的元数据之前,任何服务都不可用于客户端发现,因此可能需要3次心跳。默认的心跳周期为30秒。<br/><br/><strong>原文链接:<a href="http://oopsguy.com/2017/08/05/microservice-architectures-with-spring-cloud-and-docker/">Microservice Architectures With Spring Cloud and Docker</a>(翻译:<a href="http://oopsguy.com/">Oopsguy</a>)</strong></p><p><br/></p> | + | -f docker-compose.yml -f docker-compose.dev.yml up -d<br/><br/>docker-compose.dev.yml继承了docker-compose.yml,附带额外配置,可在本地构建镜像,并暴露所有容器端口以方便开发。<br/><br/><strong>重要的端点(Endpoint)</strong><br/></p><ul class=" list-paddingleft-2"><li><p>localhost:80 —— 网关</p></li><li><p>localhost:8761 —— Eureka仪表盘</p></li><li><p>localhost:9000 —— Hystrix仪表盘</p></li><li><p>localhost:8989 —— Turbine stream(Hystrix仪表盘来源)</p></li><li><p>localhost:15672 —— RabbitMq管理</p></li></ul><p><br/><strong>注意</strong><br/><br/>所有Spring Boot应用都需要运行<a href="https://github.com/sqshq/PiggyMetrics#config-service">配置服务器</a>才能启动。得益于Spring Boot的fail-fast属性和docker-compsoe的restart:always选项,我们可以同时启动所有容器。这意味着所有依赖的容器将尝试重新启动,直到配置服务器启动运行为止。<br/><br/>此外,服务发现机制在所有应用启动后需要一段时间。在实例、Eureka服务器和客户端在其本地缓存中都具有相同的元数据之前,任何服务都不可用于客户端发现,因此可能需要3次心跳。默认的心跳周期为30秒。<br/><br/><strong>原文链接:<a href="http://oopsguy.com/2017/08/05/microservice-architectures-with-spring-cloud-and-docker/">Microservice Architectures With Spring Cloud and Docker</a>(翻译:<a href="http://oopsguy.com/">Oopsguy</a>)</strong></p><p>http://dockone.io/article/2759</p> |