使用Spring Cloud和Docker构建微服务

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 本文讲的是使用Spring Cloud和Docker构建微服务,【编者的话】这是系列博文中的第一篇,本文作者使用Spring Cloud和Docker构建微服务平台,文章的例子浅显易懂。
本文讲的是使用Spring Cloud和Docker构建微服务 【编者的话】这是系列博文中的第一篇,本文作者使用Spring Cloud和Docker构建微服务平台,文章的例子浅显易懂。

本系列博文主要向大家介绍如何使用Spring Cloud和Docker构建微服务平台。

什么是Spring Cloud?

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

在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两个基础服务。如下图所示:
spring_cloud_and_dockerDc6xjwd.png

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

Configuration service处于最顶端,黄色标识,而且被其它微服务所依赖。

Discovery service处于最低端,蓝色标识,同时也被其它服务所依赖。

绿色标识的两个微服务是我们本系列博文中用到的两个应用案例:电影和观影建议。

Configuration Service

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

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

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

当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路由创建一个代理暴露接口。
spring_cloud_and_dockerJVSGMfY.png

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

示例项目

我已经在GitHub上创建了一个实例项目 ,这个项目是一个端到端的原生云平台,使用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,然后在开发机上安装并运行。

当然你也需要安装 Docker Compose ,这个 指南 将会帮到你。

环境要求

能够运行实例程序,需要在你的开发机上安装下面的软件:
  • 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.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服务的仪表盘,如下图所示:
spring_cloud_and_dockerbuABI3h.png

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

原文链接:Building Microservices with Spring Cloud and Docker(翻译:隋鑫)

原文发布时间为:2015-07-19
本文作者:jeffsui 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用Spring Cloud和Docker构建微服务
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
221 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
3月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
311 76
|
2月前
|
存储 NoSQL Java
使用Java和Spring Data构建数据访问层
本文介绍了如何使用 Java 和 Spring Data 构建数据访问层的完整过程。通过创建实体类、存储库接口、服务类和控制器类,实现了对数据库的基本操作。这种方法不仅简化了数据访问层的开发,还提高了代码的可维护性和可读性。通过合理使用 Spring Data 提供的功能,可以大幅提升开发效率。
80 21
|
2月前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
132 17
|
1月前
|
传感器 监控 安全
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
|
2月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
115 7
|
3月前
|
Java 关系型数据库 Nacos
微服务SpringCloud链路追踪之Micrometer+Zipkin
SpringCloud+Openfeign远程调用,并用Mircrometer+Zipkin进行链路追踪
430 20
|
2月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
139 1
|
3月前
|
运维 监控 Java
为何内存不够用?微服务改造启动多个Spring Boot的陷阱与解决方案
本文记录并复盘了生产环境中Spring Boot应用内存占用过高的问题及解决过程。系统上线初期运行正常,但随着业务量上升,多个Spring Boot应用共占用了64G内存中的大部分,导致应用假死。通过jps和jmap工具排查发现,原因是运维人员未设置JVM参数,导致默认配置下每个应用占用近12G内存。最终通过调整JVM参数、优化堆内存大小等措施解决了问题。建议在生产环境中合理设置JVM参数,避免资源浪费和性能问题。
164 3
|
Java Docker Spring
spring 代码中,解决docker环境变量传递问题
1,docker变量 在docker中定义变量,使用echo $Value 能直接在命令行中显示, 这个使用spring可以直接注入到代码当中。 php中有方便的代码直接获得环境变量,但是java用起来就麻烦点。 直接使用spring的value就行了。 2,代码 比如一个spring的用户登录action。 里面用docker配置了一个默认的admin登录
1805 0