使用SpringBoot开启微服务之旅

\

本文要点

\\
  • 微服务可以使你的代码解耦\\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调用将所有这些信息展示给客户。

\\

使用SpringBoot开启微服务之旅_第1张图片

\\

在我们开始创建微服务之前,需要安装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服务,会(在右边)提供更多信息。

\\

使用SpringBoot开启微服务之旅_第2张图片

\\

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

\\

创建SpringBoot应用程序

\\

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

\\

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

\\

使用SpringBoot开启微服务之旅_第3张图片

\\

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

\\

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

\\

使用SpringBoot开启微服务之旅_第4张图片

\\

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

\\

使用SpringBoot开启微服务之旅_第5张图片

\\

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

\\

使用SpringBoot开启微服务之旅_第6张图片
(点击图片放大)

\\

你可以使用生成的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开启微服务之旅)