\

本文要点

\\

  • 微服务可以使你的代码解耦\\t
  • 微服务可以使不同的团队专注于更小范围的工作职责、使用独立的技术、更安全更频繁地部署\\t
  • SpringBoot支持各种REST API的实现方式\\t
  • 服务发现和服务调用是独立于服务平台的\\t
  • Swagger生成稳健的API文档和调用接口\

\\

如果还没有准备好使用微服务,那你肯定落后于学习曲线中的早期接受者阶段了,而且是时候开启微服务之旅了。本文中,我们将演示创建REST风格微服务所必需的各种组件,使用Consul服务注册中心和Spring Boot搭建各种脚手架、进行依赖注入和依赖管理,使用Maven进行构建,使用Spring REST和Jersey/JaxRS创建Java REST风格API。

\\

在过去的二十年里,企业使用SDLC流程变得非常敏捷,但是应用程序仍然相当庞大而且耦合在一起,包含大量支持各种版本的各种各样API的jar包。但是,如今有一种趋势朝着更精简的DevOps范的流程推进,功能也变得“无服务器化”。进行微服务重构可以解耦代码和资源,让构建流程更小,让发布更安全,让API更稳定。

\\

本文中,我们将构建一个简易的股票市场投资组合管理应用程序。在这个应用中,客户可以通过服务调用,为他们的股票投资组合(股票代码和数量)进行定价。投资组合微服务将检索用户的投资组合,将它发送给定价微服务来应用最新的定价,然后返回完全定价和分类汇总过的投资组合,通过一个REST调用将所有这些信息展示给客户。

\\

\\

在我们开始创建微服务之前,需要安装Consul来准备我们的环境。

\\

下载Consul服务注册中心

\\

我们将使用Hashicorp Consul来实现服务发现,所以请前往https://www.consul.io/downloads.html下载Consul,有Windows版、Linux版和Mac版等。这个链接将会提供一个可执行程序,你需要将这个程序添加到你的path环境变量中。

\\

启动Consul

\\

从一个脚本弹出框以dev模式启动Consul:

\\

\consul agent -dev

\\

为了验证它确实已经在运行,可以打开浏览器,访问consul UI http://localhost:8500。如果一切正常,consul应该会报告它的运行状态良好。点击(在左边的)consul服务,会(在右边)提供更多信息。

\\

\\

如果这个地方有什么问题,请确保你已经将consul添加到执行路径中而且8500和8600端口是可用的。

\\

创建SpringBoot应用程序

\\

我们将使用集成在主流IDE中的Spring Initializr,来创建我们的SpringBoot应用程序的脚手架。下面的截屏使用的是IntelliJ IDEA。

\\

选择File/New Project,来打开新建项目模板弹出框,然后选择Spring Initializr。

\\

\\

事实上,你可以无需IDE就安装脚手架。通过SpringBoot Initializr网站https://start.spring.io完成一个在线web表格,会产出一个可以下载的包含你的空项目的zip文件。

\\

点击“Next”按钮,填写所有的项目元数据。使用下面的配置:

\\

\\

点击“Next”按钮来选择依赖,然后在依赖搜索栏输入Jersey和Consul Discovery。添加那些依赖:

\\

\\

点击“Next“按钮来指定你的项目名字和存放位置。使用在web表单中配置的默认名字“portfolio”,指定你希望存放项目的地址,然后点击“Finish”来生成并打开项目:

\\


(点击图片放大)

\\

你可以使用生成的application.properties文件,但是SpringBoot也接受YAML文件格式,YAML格式看起来更直观,因此可以将这个文件重命名为application.yml。

\\

我们将这个微服务命名为“portfolio-service”。我们可以指定一个端口或者使用端口0来让应用程序使用一个可用的端口。在我们的例子中,我们使用端口57116。如果你将这个服务作为一个Docker container部署,你可以将它映射到任何你选中的端口。让我们通过添加如下配置到applicatin.yml文件,来为应用程序命名并指定端口:

\\

\spring:\ application:\   name: portfolio-service\server:\ port: 57116\

\\

为了让我们的服务可以被发现,需要为SpringBoot的application类添加注解。打开PortfolioApplication,在这个类声明的上方添加@EnableDiscoveryClient。

\\

接受imports。这个class看起来会是这样:

\\

\package com.restms.demo.portfolio;\import org.springframework.cloud.client.discovery.EnableDiscoveryClient;\. . .\@SpringBootApplication\@EnableDiscoveryClient\public class PortfolioApplication {\\  public static void main(String[] args) {\     SpringApplication.run(PortfolioApplication.class, args);\  }\}\

\\

(为了演示如何由各种独立的平台组合微服务,我们将为这个服务使用Jersey,然后为下一服务使用Spring REST)。

\\

为了安装Jersey REST风格Web Service,我们需要指定一个ResourceConfig Configuration类。增加JerseyConfig类(本例中,我们会把它放在相同的package下作为我们的application类。)它应该看起来像这样,加上适当的package和imports:

\\

\@Configuration\@ApplicationPath(\"portfolios\")\public class JerseyConfig extends ResourceConfig {\   public JerseyConfig()\   {\       register(PortfolioImpl.class);\   }\}

\\

需要注意的是,它继承了ResourceConfig来表明它是一个Jersey的配置类。@ApplicationPath(\"portfolios\")属性指定了调用的上下文,意味着调用路径应该以“portfolios”开头。(如果你没有指定,上下文默认为“/”。)

\\

PortfolioImpl类将服务两种请求,其中portfolios/customer/{customer-id}返回所有的portfolios,而portfolios/customer/{customer-id}/portfolio/{portfolio-id}返回一个portfolio。一个portfolio包括一组股票代码和相应的持有份额。

\\

(本例中,有3个客户,id分别为0、1、2,而且每一个客户都有3个portfolio,id分别为0、1、2)。

\\

你的IDE会让你创建PortfolioImpl,照着做就行了。本例中,将它添加在相同的package。输入如下代码并接受所有imports:

\\

\@Component\@Path(\"/portfolios\")\public class PortfolioImpl implements InitializingBean {\   private Object[][][][] clientPortfolios;\   @GET\   @Path(\"customer/{customer-id}\")\   @Produces(MediaType.APPLICATION_JSON)\   // a portfolio consists of an array of arrays, each containing an array of \   // stock ticker and associated shares\   public Object[][][] getPortfolios(@PathParam(\"customer-id\") int customerId)\   {\       return clientPortfolios[customerId];\   }\\   @GET\   @Path(\"customer/{customer-id}/portfolio/{portfolio-id}\")\   @Produces(MediaType.APPLICATION_JSON)\   public Object[][] getPortfolio(@PathParam(\"customer-id\") int customerId, \                           @PathParam(\"portfolio-id\") int portfolioId) {\       return getPortfolios(customerId)[portfolioId];\   }\\   @Override\   public void afterPropertiesSet() throws Exception {\       Object[][][][] clientPortfolios =\       {\         {\\t\t// 3 customers, 3 portfolios each\           {new Object[]{\"JPM\

使用SpringBoot开启微服务之旅相关推荐

  1. 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践

    目录导读 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践 1. 开源代码整体架构设计 2. 微服务逻辑架构设计 3. 微服务熔断降级与限流规划 3.1 微服务熔断 ...

  2. 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析

    摘要: 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 (二):Kubernetes如何助力Spark大数据分析 概述 本文为大家介绍一种容器化的数据服务Spark ...

  3. 容器开启数据服务之旅系列(四):Kubernetes QoS 助力在线运用与大数据离线运用的带宽控制和磁盘控制...

    容器开启数据服务之旅系列(四) Kubernetes QoS 助力在线运用与大数据离线运用的带宽控制和磁盘控制 概述 本文是2018年大数据峰会上的一些分享,关于在线业务,离线业务在ACK(阿里云容器 ...

  4. 容器开启数据服务之旅系列(一):Kubernetes如何解自建PostgreSQL运维之痛

    摘要: 通过阿里云Kubernetes容器服务,开启你的数据服务之旅 (一)云上运维自建数据库之痛,使用容器服务自动恢复数据库postgresql实例 概述 本文为大家介绍一种容器化的数据服务 pos ...

  5. spring的发展||springboot和微服务的介绍

    spring的发展 1,Spring1.x时代 在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置 ...

  6. 阿里云微服务引擎MSE网关功能,开启微服务“大门”云化时代

    简介:微服务网关被作为微服务面向客户端的单一入口,用来处理横向的关注点,包括访问控制.速率限制.负载均衡等等.真正用起来时,我们还需要关注更多的纵向因素,例如服务发现能力.更全面的监控可观测能力.更高 ...

  7. 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 1

    摘要: 容器开启数据服务之旅系列(二):Kubernetes如何助力Spark大数据分析 (二):Kubernetes如何助力Spark大数据分析 概述 本文为大家介绍一种容器化的数据服务Spark ...

  8. 微服务之旅的经验分享

    多年来,我们一直努力展示众多微服务实践者在采用微服务的过程中获得的经验和教训.Piotr Gankiewicz是一名软件工程师.他踏上了微服务之旅,现在决定分享一些过程当中的经验和教训.当然,就像所有 ...

  9. 基于springboot+dubbo微服务开发的商城系统

    基于springboot+dubbo微服务开发的商城系统 模仿天猫商城 更多资源,访问搬砖联盟-每天搬一点,收货多一点.

最新文章

  1. Event 系列: jquery event 源码
  2. JDBC连接SQL Server 2005问题
  3. 集合拆成固定长度的小集合_《集合啦动物森友会》钓鱼怎么玩?钓鱼小技巧攻略分享...
  4. set DataGrid1.DataSource = rs DataGrid1为什么时空的?
  5. Remote Desktop Connection for mac 报错:证书或相关链无效
  6. java 开关按钮_SwitchButton开关按钮的多种实现方式
  7. 计算机vb代码电阻,利用VB程序编写色环电阻阻值计算器
  8. 运动世界校园显示服务器异常,运动世界校园跑完是异常成绩,计入有效成绩里吗?...
  9. 一见钟情只在瞬息之间,而对爱大彻大悟却需要很多年
  10. matlab中如何调用子函数
  11. 开放式激光振镜运动控制器:C++振镜矫正方法与实现
  12. 本周内外盘行情回顾2022.3.6
  13. centos 命令行模式切换桌面化
  14. 台达C2000系列变频器如何实现多段速控制及相关参数设置?
  15. C++内码转换的三种方法
  16. 让代码看起来更舒服,选择适合的字体。 (转)--我推荐的是:Bitstream Vera Sans Mono
  17. cad 打开硬件加速卡_谁说没有核显就不能开启硬件加速?手把手教你开启加速
  18. 私有云大展拳脚 云计算发展趋势已明朗
  19. 发行版中的i386/i686/x86-64的区别: i386用来处理32位系统,i686是i386的下集;x86-64用来处理64位系统。 linux发行版中的i386/i686/x86-64各自含
  20. Monash call:通过生成对抗网络创造现实-GAN的过去,现在和未来

热门文章

  1. Mac安装MySql 5.7.11
  2. 普通内部类里面为什么不能有static字段
  3. Java从零开始学四十六(Junit)
  4. INDEX FULL SCAN和INDEX FAST FULL SCAN的区别
  5. UVa10000_Longest Paths(最短路SPFA)
  6. Javascript s02
  7. SQL注入漏洞的检测与防范技术
  8. javascript入门·简单运算和数据类型转换
  9. MariaDB CEO 痛斥云厂商对开源的无尽掠夺,从不回馈社区
  10. lnmp集成开发环境安装pdo_dblib扩展