这是系列博文中的第一篇,本文做者使用Spring Cloud和docker构建微服务平台,文章的例子浅显易懂,但愿了解微平台构建的同窗可以从这里会收获良多.
这篇系列博文主要向你们介绍如何使用Spring Cloud和Docker构建微服务平台。 html
Spring Cloud 是一个 pivotal提供的用于进行分布式系统构建时提供一些经常使用的解决方案的工具集。若是你对使用 Spring Framework构建应用程序很熟悉的话,Spring Cloud 提供了一些经常使用基础组件的构建服务。
在Spring Cloud 提供的解决方案中,你将会发现以下的问题: 前端
关于Spring Cloud 最重要的部分就是启动Spring Boot的概念模型上。
对于那些刚使用Spring Boot的人而言,他所要作的仅仅是起一个名副其实的项目名,你就会构建一个使用Spring Framework开发的微系统项目,能够直接转换成使用最小配置,万事俱备的完美的系统应用了。 git
每个服务都含有一个特定意义的微服务架构。当你在Spring Cloud上构建微服务架构时,这里有几个基本概念须要首先澄清下。首先,你要先建立Configuration Service和Discovery Service 两个基础服务。以下图所示: github
上面的图片说明了四个微服务以及各个服务之间的依赖关系。
configuration service 处于最顶端,黄色标识,并且被其余微服务所依赖。
discovery service 处于最低端,蓝色标识,同时也被其余服务所依赖。
绿色标识的两个微服务只是一个本地实例应用的一部分,下面我将会使用他们建立博客,分别是:电影和观影建议。
Configuration Service
Configuration Service 在微服务架构中是一个很是重要的组件。基于在 twelve-factor app上构建的应用,配置你的微服务应用在环境中而不是在本地项目中。
configuration service 是一个必不可少的基础组件的缘由是由于它能够对全部经过点对点和检索的基础服务进行服务管理。他的优点在于多用途。
假设咱们有多个部署环境。好比咱们有一个临时环境和一个生产环境,针对每一个环境的配置将会是不一样的。每个 configuration service 将会由一个独立的Git仓库来存放环境配置。没有其余环境可以访问到这个配置仓库,它只是提供该环境中运行的配置服务罢了。 spring
当configuration service 启动后,它将会指向那些根据配置文件配置的路径并启动对应服务。每个微服务经过读取本身配置文件中的具体环境来运行。在这一过程当中,配置是经过版本管理来进行的内部和集中化管理,更改配置不须要重启服务。
经过Spring Cloud提供的服务终端,你能够更改环境配置同时向discovery service 发送一个刷新信号,全部的用户都会收到新的配置通知。
Discovery Service
Discovery Service 是另外一个重要的微服务架构的组件.Discovery Service管理运行在容器中的众多服务实例,而这些实例工做在集群环境下.在这些应用中,咱们使用客户端的方式称之为从服务到服务.举个例子,我使用 Spring Cloud Feign ,这是一个基于RESTFUL风格的微服务提供的客户端开源项目,它是从 Netflix OSS project项目中派生出来的。 docker
1 @FeignClient("movie") 2 public interface MovieClient { 3 @RequestMapping(method = RequestMethod.GET, value = "/movies") 4 PagedResources findAll(); 5 6 @RequestMapping(method = RequestMethod.GET, value = "/movies/{id}") 7 Movie findById(@RequestParam("id") String id); 8 9 @RequestMapping(method = RequestMethod.POST, value = "/movies", 10 produces = MediaType.APPLICATION_JSON_VALUE) 11 void createMovie(@RequestBody Movie movie); 12 }
在上面的例子中,我建立了一个Feign客户端 映射了一个REST API方法来暴露个人电影服务.使用@FeignClient注解,我声明了我想要为movie微服务而建立的客户端API.接下来我声明了一个我想要实 现的服务映射.经过在方法上声明一个URL规则来描述一个REST API的路由规则。
使人兴奋的是,这一切在Spring Cloud都很容易,我所要作的仅仅是知道service ID 来建立个人Feign 客户端.服务的URL地址在运行时环境是自动配置的,由于每个在集群中的微服务将会在启动时经过绑定serviceid的方式来进行注册。
我微服务架构中的其余服务,也是经过上面提到的方式运行。我只须要知道进行通信服务的serviceid,全部的操做都是经过Spring自动绑定的。
API Gateway
API Gateway 服务是Spring Cloud的另外一个重要组件.它主要用来建立服务集群并管理本身域名下的应用实例.下图的绿色六边形是咱们提供的数据驱动服务,主要用来管理本身域名下的 实体类和数据库.经过添加 API Gateway 服务,咱们能够为经过下面绿颜色的服务为每个API路由建立一个代理暴露接口。 shell
让咱们假设推荐服务和电影服务都暴露他们本身的REST API在本身管理的域实体上.API gataway经过discovery service和从其余服务注入的基于代理路由的 API方法.经过这种方式,包括推荐服务和电影服务将拥有一个完整定义的路由,经过暴露的REST API得到本地的微服务.API Gateway 将会重定义路由请求到服务实例,这些请求是经过HTTP请求的方式拥有。 数据库
我已经在github上建立了一个实例项目,这个项目是一个端到端的原生云平台,使用Spring Cloud 构建实际的微服务架构。
基本概念: api
使用Docker对每个服务进行构建和部署。使用Docker compose在一个开发机上进行端到端的集成测试。 浏览器
实例程序中的一个核心概念是如何将混合持久化转化为实际.项目中的微服务使用本身的数据库同时集成经过REST或者消息总线方式从其余的服务提供的数据接入。举个例子,你能够拥有从如下数据库中提供的微服务:
这个例子演示了如何使用微服务建立一个新的应用,而不是单体应用优先策略。因为在项目中的每个微服务只有一个单一的父项目。开发者为此获得的收益是能够在本机上运行和开发每个微服务。添加一个新的微服务很是简单,当发现微服务时将会自动发现运行时的集群环境上。
项目中包含两个发现服务,一个在 Netflix Eureka,另外一个使用了
Consul from Hashicorp。多种发现服务提供了多种选择,一个是使用(Consul)来作DNS服务集群,另外一个是(Consul)基于代理的API 网关。
每个微服务都关联Eureka,在整个集群中检索API路由。使用这个策略,每个在集群上运行的微服务只须要经过一个 共同的API网关进行负载均衡和暴露接口,每个服务也会自动发现并将路由请求转发到本身的路由服务中。这个代理技术有助于开发用户界面,做为平台完整的 API经过本身的主机映射为代理服务。
下面的实例将会经过Maven来构建,使用Docker为每个微服务构建容器镜像.咱们能够很优雅的使用Docker compose在咱们本身的主机上搭建所有的微服务集群.
在这以前,请先移步至项目的GitHub 仓库。
https://github.com/kbastani/spring-cloud-microservice-example
clone或者fork这个项目而且把源码下载到您本身的电脑上。下载完毕后,你须要使用Maven和Docker 来编译和构建本地的容器镜像.
下载Docker
首先,若是你尚未Docker请先下载它。能够跟随这个 指南来获取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.268 s] [INFO] users-microservice ................................ SUCCESS [ 11.929 s] [INFO] discovery-microservice ............................ SUCCESS [ 5.640 s] [INFO] api-gateway-microservice .......................... SUCCESS [ 5.156 s] [INFO] recommendation-microservice ....................... SUCCESS [ 7.732 s] [INFO] config-microservice ............................... SUCCESS [ 4.711 s] [INFO] hystrix-dashboard ................................. SUCCESS [ 4.251 s] [INFO] consul-microservice ............................... SUCCESS [ 6.763 s] [INFO] movie-microservice ................................ SUCCESS [ 8.359 s] [INFO] movies-ui ......................................... SUCCESS [ 15.833 s] [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)\"| \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 APIs使用 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构建微服务架构的系列博文的第一部分。在已经介绍完的博客中,咱们接触到了以下的概念:
在这以后的博文中,咱们将会演示如何使用后台服务来构建前端应用程序.同时也会介绍一个混合性持久化的实例,使用MySQL和Neo4j.