连接地址:http://sail-y.github.io/2016/03/21/Spring-cloud%E9%A1%B9%E7%9B%AE%E5%AE%9E%E8%B7%B5/前端
Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集。Spring Cloud引入了云平台链接器(Cloud Connector) 和 服务链接器(Service Connector) 的概念。云平台链接器是一个接口,须要由云平台提供者进行实现,以便库中的其余模块能够与该云平台协同工做。git
Spring Cloud最重要的一点是它能够和Spring Boot一块儿工做,Spring Boot能够帮助开发者更容易地建立基于Spring的应用程序和服务。github
从Spring Boot项目名称中的Boot就能够看出来,Spring Boot的做用在于建立和启动新的基于Spring框架的项目。Spring Boot会选择最适合的Spring子项目和第三方开源库进行整合。大部分Spring Boot应用只须要很是少的配置就能够快速运行起来。Spring Boot包含的特性以下:spring
建立能够独立运行的Spring应用。docker
直接嵌入Tomcat或Jetty服务器,不须要部署WAR文件。数据库
提供推荐的基础POM文件来简化Apache Maven配置。api
尽量的根据项目依赖来自动配置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 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(关联)
微服务架构
这个例子演示了如何使用微服务建立一个新的应用。因为在项目中的每个微服务只有一个单一的父项目。开发者为此获得的收益是能够在本机上运行和开发每个微服务。添加一个新的微服务很是简单,当发现微服务时将会自动发现运行时的集群环境上。
Service Discovery
项目中包含两个发现服务,一个在Netflix Eureka,另外一个使用了Consul from Hashicorp。多种发现服务提供了多种选择,一个是使用(Consul)来作DNS服务集群,另外一个是(Consul)基于代理的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请先下载它。能够跟随这个指南来获取Docker:https://docs.docker.com/installation/ ,而后在开发机上安装并运行。
固然你也须要安装Docker Compose(https//docs.docker.com/compose/),这个指南将会帮到你:https://docs.docker.com/compose/install/ 。
可以运行实例程序,须要在你的开发机上安装下面的软件:
Maven 3
Java 8
Docker
Docker Compose
经过命令行方式来构建当前项目,在项目的根目录中运行以下的命令:
$ mvn clean install
项目将会根据pom.xml中的每个项目声明中下载相应的依赖jar包。每个服务都将会被构建,同时Maven的Docker插件将会自动从本地Docker Registry中构建每个容器镜像。Docker将会在构建成功后,根据命令行运行mvn clean install来清除相应的资源。
在项目成功构建后,你将会看到以下的输出:
经过Docker compose 启动集群
如今每个镜像都成功构建完毕,咱们使用Docker Compose来加速启动咱们的集群。我已经将Docker Compose的yaml文件包含进了项目中,你们能够从GitHub上获取。
如今咱们经过下面的命令行启动微服务集群:
$ docker-compose up
若是一切配置都是正确的,每个容器镜像将会经过在Docker上的虚拟容器和自动发现的网络服务来运行。当他们开始顺序启动时,你将会看到一系列的日志输出。这可能须要一段时间来完成,取决于运行你实例程序的机器性能。
一旦容器启动成功,你将会经过Eureka主机看到经过Discovery service注册上来的应用服务。
经过命令行终端复制粘贴下面的命令到Docker中定义的 $DOCKER_HOST 环境变量中。
$ open \((echo \"\)(echo $DOCKER_HOST)"| \sed 's/tcp:///http:///g'| \sed 's/[0-9]{4,}/8761/g'| \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" }, "pause" : { "href" : "http://192.168.59.103:10000/movie/pause" }, "restart" : { "href" : "http://192.168.59.103:10000/movie/restart" }, "metrics" : { "href" : "http://192.168.59.103:10000/movie/metrics" }, "env" : [ { "href" : "http://192.168.59.103:10000/movie/env" }, { "href" : "http://192.168.59.103:10000/movie/env" } ], "archaius" : { "href" : "http://192.168.59.103:10000/movie/archaius" }, "beans" : { "href" : "http://192.168.59.103:10000/movie/beans" }, "configprops" : { "href" : "http://192.168.59.103:10000/movie/configprops" }, "trace" : { "href" : "http://192.168.59.103:10000/movie/trace" }, "info" : { "href" : "http://192.168.59.103:10000/movie/info" }, "health" : { "href" : "http://192.168.59.103:10000/movie/health" }, "hystrix.stream" : { "href" : "http://192.168.59.103:10000/movie/hystrix.stream" }, "routes" : { "href" : "http://192.168.59.103:10000/movie/routes" }, "dump" : { "href" : "http://192.168.59.103:10000/movie/dump" }, "refresh" : { "href" : "http://192.168.59.103:10000/movie/refresh" }, "mappings" : { "href" : "http://192.168.59.103:10000/movie/mappings" }, "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。