链接地址:http://sail-y.github.io/2016/03/21/Spring-cloud项目实践/

什么是Spring Cloud?

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

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

  Configuration Service在微服务架构中是一个非常重要的组件。如12要素应用理论所说, 微服务应用的配置应该存储在环境中 ,而不是本地项目中。

  Configuration service(配置服务)是一个必不可少的基础组件的原因是因为它可以对所有通过点对点和检索的基础服务进行服务管理。

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

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

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

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

  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。

Spring cloud项目实践(一)的更多相关文章

  1. Asp.net MVC + EF + Spring.Net 项目实践3

    Asp.net MVC + EF + Spring.Net 项目实践 这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的 ...

  2. Asp.net MVC + EF + Spring.Net 项目实践(目录)

    用4篇博客来搭一个MVC的框架,可能对初学者会有一些帮助,大家共勉吧.我觉得对于中小型项目,这个框架可能还是有一定的用处的,希望能够帮助到一些人. Asp.net MVC + EF + Spring. ...

  3. 如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目

    如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目 #1:前提准备 1.1 首先请确认你的电脑是windows10专业版或企业版,只有这 ...

  4. Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题

    问题描述 最近在使用Spring Cloud改造现有服务的工作中,在内部服务的调用方式上选择了Feign组件,由于服务与服务之间有权限控制,发现通过Feign来进行调用时如果发生了401.407错误时 ...

  5. Nacos整合Spring Cloud Gateway实践

    Spring Cloud Gateway官网:http://spring.io/projects/spring-cloud-gateway Eureka1.0的问题和Nacos对比:https://w ...

  6. 【spring】在spring cloud项目中使用@ControllerAdvice做自定义异常拦截,无效 解决原因

    之前在spring boot服务中使用@ControllerAdvice做自定义异常拦截,完全没有问题!!! GitHub源码地址: 但是现在在spring cloud中使用@ControllerAd ...

  7. IntelliJ 启动不同端口的两个spring cloud项目

    IntelliJ 启动不同端口的两个spring cloud项目 1,使用maven进行clean package 2,在Terminal界面,输入java -jar xxx.jar --server ...

  8. Spring Cloud项目

    如何使用windows版Docker并在IntelliJ IDEA使用Docker运行Spring Cloud项目   如何使用windows版Docker并在IntelliJ IDEA使用Docke ...

  9. spring cloud 项目创建过程

    在使用spring cloud 项目创建微服务项目时,遇到过很多坑,现在我将整理如下: 条件:Idea 开发工具 maven 项目 1. 创建一个空的mvn项目. 2. 创建完了就添加Module,首 ...

随机推荐

  1. Java_字符类(Character、String、StringBuffer)_char是基本数据类型,Character是其包装类型。

         在java中有三个类负责对字符的操作:Character.String.StringBuffer.其中,Character类是对单个字符进行操作,String是对一个字符序列的操作,Stri ...

  2. C#集合之ArrayList

    C#中之所以有集合这个东东,是因为数组的长度是固定的,而实际需求是,不确定未来这个“数组”的个数,故出现集合这个概念,因为集合的容量会随元素的增加曾倍数增长.C#中有2类常用集合:ArrayList, ...

  3. JavaScript高级程序设计(七):JavaScript中的in关键字

    in 使用点一: 在js中,for--in用于遍历一个对象的属性,把对象的属性名和属性值都提出来. var obj = { "key1":"value1", & ...

  4. makefile文件制作入门

    一.首先,看一下最简单的C文件 //hello.c文件 #include <stdio.h> void main() { printf("hello world\n") ...

  5. 第七篇、hitTest UITabbar中间突出按钮额外增加可点击区域

    简介: 以前UITabbar使用中间有一个凸起按钮时,常常就需要用到hitTest来处理可点击的范围. 示例代码: - (UIView *)hitTest:(CGPoint)point withEve ...

  6. JS中null与undefined的区别

    1.typeof操作符 用来检测变量的数据类型 例:typeof 3.14 //返回number typeof [1,2,3]  //返回object 2.null 只有一个值的特殊类型,表示一个空对 ...

  7. html-----018----HTML Web Server/HTML URL 字符编码

    HTML Web Server 如果希望向世界发布您的网站,那么您必须把它存放在 web 服务器上. 托管自己的网站 在自己的服务器上托管网站始终是一个选项.有几点需要考虑: 硬件支出 如果要运行“真 ...

  8. bzoj1002:[FJOI2007]轮状病毒

    思路:一道很裸的生成树计数问题,然而要高精度,而且听说直接行列式求值会被卡精度,所以可以模拟行列式求值的过程得到递推公式:f[i]=3*f[i-1]-f[i-2]+2,证明详见vfk博客: http: ...

  9. Finding a needle in Haystack: Facebook’s photo storage

    http://www.importnew.com/3292.html 面向对象存储系统

  10. jquery图片无缝滚动代码左右 上下无缝滚动图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...