微服务应用-基于Spring Cloud和Docker构建电影推荐微服务

标签: 微服务 应用 spring | 发表时间:2016-07-28 02:46 | 作者:zeb_perfect
出处:http://blog.csdn.net

前言

最近为了扩展自己对云应用的理解,找了好多基于Spring Cloud的demo,下面推荐两个开源社区项目:spring-cloud-microservice-example(基于Spring Cloud和Docker构建电影推荐微服务)和spring-cloud-event-sourcing-example(基于Spring Cloud和Reactor实现Event Sourcing构建网上商店微服务),我会相继写出作者项目博客的翻译文档,考虑外网问题,我将原英文文档pdf上传到资源里了,如果你对原文感兴趣,可以下载看看。

使用Spring Cloud和Docker构建电影推荐微服务

如果你对云应用很了解,可以直接移步下载运行项目(https://github.com/kbastani/spring-cloud-microservice-example),或跳转到部署步骤,

English tutorial available here: Building Microservices with Spring Cloud and Docker.

本博客系列将向你介绍一些使用Spring Cloud和Docker构建微服务平台的基本概念。

什么是Spring Cloud?

Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集。Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接器(Service Connector)的概念。云平台连接器是一个接口,需要由云平台提供者进行实现,以便库中的其他模块可以与该云平台协同工作。

在Spring Cloud提供的解决方案中,你将会发现如下的内容:

Spring Boot

Spring Cloud最重要的一点是它可以和Spring Boot一起工作,Spring Boot可以帮助开发者更容易地创建基于Spring的应用程序和服务。

从Spring Boot项目名称中的Boot就可以看出来,Spring Boot的作用在于创建和启动新的基于Spring框架的项目。Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合。大部分Spring Boot应用只需要非常少的配置就可以快速运行起来。Spring Boot包含的特性如下:

  • 创建可以独立运行的Spring应用。
  • 直接嵌入Tomcat或Jetty服务器,不需要部署WAR文件。
  • 提供推荐的基础POM文件来简化Apache Maven配置。
  • 尽可能的根据项目依赖来自动配置Spring框架。
  • 提供可以直接在生产环境中使用的功能,如性能指标、应用信息和应用健康检查。
  • 没有代码生成,也没有XML配置文件。

服务发现和智能路由

每一个服务都含有一个特定意义的微服务架构。当你在Spring Cloud上构建微服务架构时,这里有几个基本概念需要首先澄清下。首先,你需要要先创建Configuration Service和Discovery Service两个基础服务。如下图所示:


上面的图片说明了四个微服务以及各个服务之间的依赖关系:

  • Configuration service处于最顶端,黄色标识,而且被其它微服务所依赖;
  • Discovery service处于最低端,蓝色标识,同时也被其它服务所依赖;
  • 绿色标识的两个微服务是我们本系列博文中用到的两个应用案例:电影和观影建议。

配置服务

Configuration Service(配置服务)在微服务架构中是一个非常重要的组件。如12要素理论所说, 微服务应用的配置应该存储在环境中,而不是本地项目中。Configuration service是一个必不可少的基础组件的原因是因为它可以对所有通过点对点和检索的基础服务进行服务管理。

假设我们有多个部署环境。比如我们有一个临时环境和一个生产环境,针对每个环境的配置将会是不同的。每一个configuration service 将会由一个独立的Git仓库来存放环境配置。没有其它环境能够访问到这个配置仓库,它只是提供该环境中运行的配置服务罢了。


当Configuration service启动后,它将会指向那些根据配置文件配置的路径并启动对应服务。每一个微服务通过读取自己配置文件中的具体环境来运行。在这一过程中,配置是通过版本管理来进行的内部和集中化管理,更改配置不需要重启服务。

通过Spring Cloud提供的服务终端,你可以更改环境配置,并向Discovery service(发现服务)发送一个刷新信号,所有的用户都会收到新的配置通知。

发现服务

Discovery Service(发现服务)是另一个重要的微服务架构的组件。Discovery Service管理运行在容器中的众多服务实例,而这些实例工作在集群环境下。在这些应用中,我们使用客户端的方式称之为从服务到服务。举个例子,我使用Spring Cloud Feign ,这是一个基于Restful风格的微服务提供的客户端开源项目,它是从Netflix OSS project项目中派生出来的。

@FeignClient("movie")
public interface MovieClient {
@RequestMapping(method = RequestMethod.GET, value = "/movies")
PagedResources findAll();

@RequestMapping(method = RequestMethod.GET, value = "/movies/{id}")
Movie findById(@RequestParam("id") String id);

@RequestMapping(method = RequestMethod.POST, value = "/movies",
  produces = MediaType.APPLICATION_JSON_VALUE)
void createMovie(@RequestBody Movie movie);
}
在上面的例子中,我创建了一个Feign 客户端,并映射了一个REST API方法来暴露电影服务。使用@FeignClient注解,可以声明我想要为movie微服务而创建的客户端API。接下来我声明了一个我想要实现的服务映射。通过在方法上声明一个URL规则来描述一个REST API的路由规则。

更令人兴奋的是,这一切在Spring Cloud中都很容易,我所要做的仅仅是知道service ID来创建我的Feign 客户端。服务的URL地址在运行时环境是自动配置的,因为每一个在集群中的微服务将会在启动时通过绑定serviceid的方式来进行注册。

微服务架构中的其它服务,也是通过上面提到的方式运行。我只需要知道进行通讯服务的serviceid,所有的操作都是通过Spring自动绑定的。

API 网关

API Gateway 服务是Spring Cloud的另一个重要组件。它可以用来管理集群服务中的领域实体。下图的绿色六边形是我们提供的数据驱动服务,主要用来管理自己的实体类和数据库。通过添加API Gateway服务,我们可以为通过下面绿颜色的服务为每一个API路由创建一个代理暴露接口。


假设推荐服务和电影服务都暴露他们自己的REST API在自己管理的域实体上。API gataway通过discovery service和从其它服务注入的基于代理路由的 API方法。通过这种方式,包括推荐服务和电影服务将拥有一个完整定义的路由,通过暴露的REST API获得本地的微服务。API Gateway将会重定义路由请求到服务实例,这些请求都是基于HTTP的。

示例项目

我已经在GitHub(https://github.com/kbastani/spring-cloud-microservice-example)上创建了一个实例项目,这个项目是一个端到端的原生云平台,使用Spring Cloud构建实际的微服务架构。

基本概念:

  • 使用Docker进行集成测试
  • 混合持久化
  • 微服务架构
  • 服务发现
  • API网关

Docker

使用Docker对每一个服务进行构建和部署。使用Docker Compose在一个开发机上进行端到端的集成测试。

混合持久化

混合持久化其实就是说使用多种数据库来存储。不同的微服务实例都会使用它们自己的数据库,并通过REST服务或者消息总线来通信,举个例子,你可以使用基于以下数据库来构建微服务:

Neo4j(图形化)

MongoDB(文档化)

MySQL(关联)

微服务架构

这个例子演示了如何使用微服务创建一个新的应用。由于在项目中的每一个微服务只有一个单一的父项目。开发者为此得到的收益是可以在本机上运行和开发每一个微服务。添加一个新的微服务非常简单,当发现微服务时将会自动发现运行时的集群环境上。

发现服务

项目中包含两个发现服务,一个是Netflix Eureka,另一个使用了Consul from Hashicorp。多种发现服务提供了多种选择,一个是使用(Consul)来做DNS服务集群,另一个是(Eureka)基于代理的API 网关。

API 网关

每一个微服务都关联Eureka,在整个集群中检索API路由。使用这个策略,每一个在集群上运行的微服务只需要通过一个共同的API网关进行负载均衡和暴 露接口,每一个服务也会自动发现并将路由请求转发到自己的路由服务中。这个代理技术有助于开发用户界面,作为平台完整的API通过自己的主机映射为代理服 务。

Docker 实例

下面的实例将会通过Maven来构建,使用Docker为每一个微服务构建容器镜像。我们可以很优雅的使用Docker Compose在我们自己的主机上搭建全部的微服务集群。

开始构建

在这之前,请先移步至项目的GitHub 仓库。

https://github.com/kbastani/spring-cloud-microservice-example
克隆或者fork这个项目并且把源码下载到自己的电脑上。下载完毕后,你需要使用Maven和Docker来编译和构建本地的容器镜像。

下载Docker

首先,如果你还没有Docker请先下载它。可以跟随这个指南(https://docs.docker.com/compose/install/)来获取Docker,然后在开发机上安装并运行。

当然你也需要安装Docker Compose,这个指南(https://docs.docker.com/compose/install/)将会帮到你。如果你使用的Mac OSX或者boot2docker,请确保在虚拟机上你给boot2docker提供的内存至少是5GB,下面这个命令能帮助你这么做:

$ boot2docker init --memory=5000

环境要求

能够运行实例程序,需要在你的开发机上安装下面的软件:

  • Maven 3
  • Java 8
  • Docker
  • Docker Compose

构建项目

通过命令行方式来构建当前项目,在项目的根目录中运行如下的命令:

$ mvn clean install
项目将会根据pom.xml中的每一个项目声明中下载相应的依赖jar包。每一个服务都将会被构建,同时Maven的Docker插件将会自动从本地Docker Registry中构建每一个容器镜像。Docker将会在构建成功后,根据命令行运行mvn clean install来清除相应的资源。

在项目成功构建后,你将会看到如下的输出:

[INFO] ------------------------------------------------------------------[INFO] Reactor Summary:
[INFO]
[INFO] spring-cloud-microservice-example-parent .......... SUCCESS [ 0.268s ]
[INFO] users-microservice ................................ SUCCESS [ 11.929s ]
[INFO] discovery-microservice ............................ SUCCESS [ 5.640s ]
[INFO] api-gateway-microservice .......................... SUCCESS [ 5.156s ]
[INFO] recommendation-microservice ....................... SUCCESS [ 7.732s ]
[INFO] config-microservice ............................... SUCCESS [ 4.711s ]
[INFO] hystrix-dashboard ................................. SUCCESS [ 4.251s ]
[INFO] consul-microservice ............................... SUCCESS [ 6.763s ]
[INFO] movie-microservice ................................ SUCCESS [ 8.359s ]
[INFO] movies-ui ......................................... SUCCESS [ 15.833s ]
[INFO] ------------------------------------------------------------------[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------

通过Docker compose 启动集群

现在每一个镜像都成功构建完毕,我们使用Docker Compose来加速启动我们的集群。我已经将Docker Compose的yaml文件包含进了项目中,大家可以从GitHub上获取。

现在我们通过下面的命令行启动微服务集群:

$ docker-compose up
如果一切配置都是正确的,每一个容器镜像将会通过在Docker上的虚拟容器和自动发现的网络服务来运行。当他们开始顺序启动时,你将会看到一系列的日志输出。这可能需要一段时间来完成,取决于运行你实例程序的机器性能。

一旦容器启动成功,你将会通过Eureka主机看到通过Discovery service注册上来的应用服务,通过命令行终端复制粘贴下面的命令到Docker中定义的$DOCKER_HOST环境变量中。

$ open $(echo \"$(echo $DOCKER_HOST)\"|
<span style="white-space:pre">	</span>\sed 's/tcp:\/\//http:\/\//g'|
<span style="white-space:pre">	</span>\sed 's/[0-9]\{4,\}/8761/g'|
<span style="white-space:pre">	</span>\sed 's/\"//g')
如果Eureka正确的启动,浏览器将会启动并打开Eureka服务的仪表盘,如下图所示:


我们将会看到每一个正在运行的服务实例和状态。通过下面的命令来获取数据驱动服务,例如 movie 服务。

$ open $(echo \"$(echo $DOCKER_HOST)/movie\"|
        \sed 's/tcp:\/\//http:\/\//g'|
        \sed 's/[0-9]\{4,\}/10000/g'|
        \sed 's/\"//g')

这个命令将会访问根据导航网关终端提供的代理方式访问movie服务的REST API终端。这些REST API使用HATEOAS 来配置,它是一个通过内嵌链接的方式支持自动发现服务的接口。

{
  "_links" : {
"self" : {
  "href" : "http://192.168.59.103:10000/movie"
},
"resume" : {
  "href" : "http://192.168.59.103:10000/movie/resume"
},
………… 

"autoconfig" : {
  "href" : "http://192.168.59.103:10000/movie/autoconfig"
}
  }
}

总结

这是使用Spring Cloud和Docker构建微服务架构的系列博文的第一部分。在本文中,我们接触到了如下的概念:

  • Service Discovery
  • Externalized Configuration
  • API Gateway
  • Service Orchestration with Docker Compose

在这之后的博文中,我们将会演示如何使用后台服务来构建前端应用程序,同时也会介绍一个混合性持久化的实例,使用MySQL和Neo4j。

特别感谢

省略。


作者:zeb_perfect 发表于2016/7/27 18:46:34 原文链接
阅读:0 评论:0 查看评论

相关 [微服务 应用 spring] 推荐:

微服务应用-基于Spring Cloud和Docker构建电影推荐微服务

- - CSDN博客推荐文章
使用Spring Cloud和Docker构建电影推荐微服务. 如果你对云应用很了解,可以直接移步下载运行项目(https://github.com/kbastani/spring-cloud-microservice-example),或跳转到部署步骤,. 本博客系列将向你介绍一些使用Spring Cloud和Docker构建微服务平台的基本概念.

微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务

- - skaka的博客
之前介绍过 微服务的概念与Finagle框架, 这个系列介绍Spring Cloud.. Spring Cloud还是一个相对较新的框架, 今年(2016)才推出1.0的release版本. 虽然Spring Cloud时间最短, 但是相比我之前用过的Dubbo和Finagle, Spring Cloud提供的功能最齐全..

Spring Cloud Netflix构建微服务入门实践

- - 简单之美
在使用Spring Cloud Netflix构建微服务之前,我们先了解一下Spring Cloud集成的Netflix OSS的基础组件Eureka,对于Netflix的其他微服务组件,像Hystrix、Zuul、Ribbon等等本文暂不涉及,感兴趣可以参考官网文档. 这里,我们用最基础的Eureka来构建一个最基础的微服务应用,来演示如何构建微服务,了解微服务的基本特点.

使用Spring Cloud和Docker构建微服务架构

- - Oopsguy
原文: https://dzone.com/articles/microservice-architecture-with-spring-cloud-and-do. 作者:Alexander Lukyanchikov. 如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构.

Spring Cloud 微服务的那点事 - CSDN博客

- -
微服务的概念源于2014年3月Martin Fowler所写的一篇文章“Microservices”. 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值. 每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API).

在微服务领域Spring Boot自动伸缩如何实现

- - IT瘾-tuicool
自动伸缩是每个人都想要的,尤其是在微服务领域. 让我们看看如何在基于Spring Boot的应用程序中实现. 我们决定使用 Kubernetes、 Pivotal Cloud Foundry或 HashiCorp's Nomad等工具的一个更重要的原因是为了让系统可以自动伸缩. 当然,这些工具也提供了许多其他有用的功能,在这里,我们只是用它们来实现系统的自动伸缩.

实用技巧:Spring Cloud中,如何优雅下线微服务?

- - 周立的博客 - 关注Spring Cloud、Docker
在生产环境中,服务的上下线是不可避免的,我们希望能够优雅地下线微服务. 本文基于Spring Boot 2.x + Spring Cloud Finchley讲解实际项目中优雅下线服务的四种方式,并探讨各方式的优缺点. 注:Spring Boot 1.x + Spring Cloud Edgware及之前的方式相同,但配置有区别,本文不做讨论.

Spring Boot在微服务中的最佳实践

- - DockOne.io
在本文中,我将列出构建Spring Boot应用程序的“金科玉律”,这些应用程序是微服务系统一部分. 这些“金科玉律”都来自我过往的经验,我曾经将运行在JEE服务器上的单体SOAP应用程序迁往基于REST的小型Spring Boot应用程序. 这些最佳实践假设你的产品上已经拥有许多微服务,且每天要应对海量的请求.

一个基于Spring Cloud的微服务电商平台系统

- - 程序猿DD
年之计在于春,新年就要有新的打算,TJ君身边不少小伙伴都有点想在新的一年里开个网店的冲动,但是如何入手、如何开店都是个学问,需要好好研究,不过这也说明了电商行业的前景还是不错滴. 所以当TJ君今天留意到这个开源项目的时候,第一反应就是,可用. 说到mall4cloud,不得不先说下Mall4j. Mall4j是一个商用的提供多元化电商服务,满足企业多场景业务需求,为垂直行业提供专业的电商解决方案网站,提供多种成熟的电商配套服务,而mall4cloud则正是它的 开源版本.

Dubbo将积极适配Spring Cloud生态,Spring Cloud体系或将成为微服务的不二选择!

- - 程序猿DD
2016年,我在博客中发表过一篇 《微服务架构的基础框架选择:Spring Cloud还是Dubbo. 在这篇文章中,我主要对比了Spring Cloud与Dubbo所具备的能力,并阐述了个人推崇Spring Cloud的原因. 但是,最近各大技术社区出现了不少类似的文章,观点比较激进,对于Spring Cloud的褒扬远胜于Dubbo,但是这些评价很多都忽略了Spring Cloud与Dubbo在设计视角上的不同.