共计 6561 个字符,预计需要花费 17 分钟才能阅读完成。
本篇内容介绍了“如何使用 Spring Cloud 和 Docker 构建微服务平台”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
什么是 Spring Cloud?
Spring Cloud 是 Pivotal 提供的用于简化分布式系统构建的工具集。Spring Cloud 引入了云平台连接器 (Cloud Connector) 和服务连接器 (Service Connector) 的概念。云平台连接器是一个接口,需要由云平台提供者进行实现,以便库中的其他模块可以与该云平台协同工作。
在 Spring Cloud 提供的解决方案中,你将会发现如下的内容:
Configuration Service
Discovery Service
Circuit breakers
Distributed sessions
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 项目中派生出来的。
[java] view plain copy 在 CODE 上查看代码片派生到我的代码片
@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/sp … ample)上创建了一个实例项目,这个项目是一个端到端的原生云平台,使用 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 仓库。
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
https://github.com/kbastani/sp … mpleX24X 克隆或者 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,下面这个命令能帮助你这么做:
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
$ boot2docker init –memory=5000
环境要求
能够运行实例程序,需要在你的开发机上安装下面的软件:
Maven 3
Java 8
Docker
Docker Compose
构建项目
通过命令行方式来构建当前项目,在项目的根目录中运行如下的命令:
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
$ mvn clean install
项目将会根据 pom.xml 中的每一个项目声明中下载相应的依赖 jar 包。每一个服务都将会被构建,同时 Maven 的 Docker 插件将会自动从本地 Docker Registry 中构建每一个容器镜像。Docker 将会在构建成功后,根据命令行运行 mvn clean install 来清除相应的资源。
在项目成功构建后,你将会看到如下的输出:
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
[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 上获取。
现在我们通过下面的命令行启动微服务集群:
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
$ docker-compose up
如果一切配置都是正确的,每一个容器镜像将会通过在 Docker 上的虚拟容器和自动发现的网络服务来运行。当他们开始顺序启动时,你将会看到一系列的日志输出。这可能需要一段时间来完成,取决于运行你实例程序的机器性能。
一旦容器启动成功,你将会通过 Eureka 主机看到通过 Discovery service 注册上来的应用服务,通过命令行终端复制粘贴下面的命令到 Docker 中定义的 $DOCKER_HOST 环境变量中。
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
$ open $(echo \ $(echo $DOCKER_HOST)\ |
\sed s/tcp:\/\//http:\/\//g |
\sed s/[0-9]{4,}/8761/g |
\sed s/\ //g )
如果 Eureka 正确的启动,浏览器将会启动并打开 Eureka 服务的仪表盘,如下图所示:
我们将会看到每一个正在运行的服务实例和状态。通过下面的命令来获取数据驱动服务,例如 movie 服务。
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
$ 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 来配置,它是一个通过内嵌链接的方式支持自动发现服务的接口。
[html] view plain copy 在 CODE 上查看代码片派生到我的代码片
{
_links : {
self : {
href : http://192.168.59.103:10000/movie X63X},
resume : {
href : http://192.168.59.103:10000/movie/resume X66X},
…………
autoconfig : {
href : http://192.168.59.103:10000/mo … t;X70X}
}
}
“如何使用 Spring Cloud 和 Docker 构建微服务平台”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!