实战SpringCloud响应式微服务系列教程(第八章)

作者:瑾年 微信公众号: Java知音

本文为实战SpringCloud响应式微服务系列教程第八章,讲解构建响应式RESTful服务。
建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末。

​1.使用springboot2.1.4构建RESTful风格服务

Springboot的设计是用来简化Spring应用程序的初始搭建和开发过程,为了实现这种简化效果,Springboot继承了众多第三方库,并大量使用约定优于配置的设计理念,通过特定的方式使得开发人员不再需要定义繁杂而且多余的配置内容。
1.1基于Springboot的第一个RESTful服务
微服务架构推崇采用RESTful风格实现服务之间的交互。关于RESTful,很多开发人员在知识体系上的一些误解和不足。我们先对RESTful风格做一个简单的介绍,然后详细阐述使用SpringBoot构建单个RESTful服务的过程。

(1)RESTful风格简介

REST提出了一组建构约束条件和原则,满足这些约束条件和原则的设计风格就是RESTful。
现实世界中的事物都可以被认为一种资源,我们可以根据这些约束条件和原则设计以资源为中心的服务。REST中最重要的一条原则就是客户端和服务器之间的交互无状态性。

从客户端到服务器的每个请求都必须包含理解该请求所必需的信息,无状态请求可以由任何可用服务实现响应,十分适合微服务架构的运行环境。所以RESTful代表的实际上是一种风格,而不是一种设计和架构模式,更不是一种具体的技术体系。

关于RESTful另一个比较容易忽视的核心概念是HATEOAS(Hypermedia as the Engine of Application State,基于超媒体的应用状态引擎)。要解释HATEOAS的概念,先要解释什么是超媒体。

我们已经知道什么是超链接以及什么是超文本,其中超文本的特有优势是拥有超链接。如果把超链接映入到多媒体中,就得到了超媒体。因此关键要素还是超链接。使用过超媒体作为应用引擎状态,意思就是应用引擎的状态变更由客户端访问不同的超媒体资源来驱动。
使用HATEOAS表现服务请求响应的风格如下,可以看到这里多了_links属性,其中有一个self.href链接指向当前user资源。

GET http://api.example.com/users/tianyalan
Content-type:application/json
{
   _links:{
      self:{
         href:"/users/tianyalan"
       }
   }
  "id":"tianyalan",
   "name":"tianyalan",
   "email":"tianyalan@email.com"
}

HATEOAS在spring boot和spring cloud中应用也非常广泛,例如springboot提供了应用监控组件Actuator,通过Actuator可以获取springboot应用程序当前的运行状态,我们将在后续章节中详细介绍Actuator组件。
Actuator组件对外暴露的也是一些http端点,访问这些端点返回的数据跟常见的RESTful风格有所不同,这就是HATEOAS风格,所以可以参考相关资料进一步了解。

(2)引入spring-boot-starter-web工程

spring boot提供了一系列starter工程来简化各组件之间的依赖关系。
例如在springboot中开发基于RESTful风格的端点时,通常会引入spring-boot-starter-web这个工程,而打开这个工程会发现里面实际上只定义了如下所示的一些pom依赖,其中包括所有我们能够预见到的组件,例如非常经典的spring-web,spring-webmvc组件,可以看到spring-boot-starter-web还是基于这两个组件构建web请求响应流程的。
另外还包含了基于JSON序列化和反序列化的jackson-databind组件,以及启动内置tomcat服务器的spring-boot-starter-tomcat组件。

  • org.springframework.boot:spring-boot-starter
  • org.springframework.boot:spring-boot-starter-tomcat
  • org.springframework.boot:spring-boot-starter-validation
  • org.springframework.boot:spring-web
  • org.springframework.boot:spring-webmvc
  • org.fasterxml.jackson.core:jackson-databind

引入spring-boot-starter-web就像引入一个普通的maven依赖一样,代码如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

一旦spring-boot-starter-web组件引入完毕,我们就可以充分利用springboot的自动装配机制开发单个服务。

(3)Application类

使用springboot的首要条件是构建一个Application启动类。代码如下:

@SpringBootApplication
public class SoulApplication {
    public static void main(String[] args) {
        SpringApplication.run(SoulApplication.class, args);
    }
}

结构比较固化。
显然以上代码关键的是@SpringBootApplication注解。springboot使用@SpringBootApplication注解来告诉spring容器具备该注解的类是整个spring容器中所有javaBean对象的入口,而具备该注解的类在springboot中就是Application类。
在上面代码中,SoulApplication类就是整个容器的Application类。
@SpringBootApplication注解在指定Application类的同时,还会自动扫描与当前类同级以及子包下的@Component、@Service、@Repository、@Controller、@Entity等注解,并把这些注解对应的类转换为Bean对象全部加载到Spring容器中管理起来。
@SpringBootApplication注解的定义如下,我们可以看到该注解实际上由三个注解组合而成,分别是@Configuration、@EnableAutoConfigguration@ComponentScan

@Target(ElementType.TYPE)
@Retenation(RetentionPolicy.PUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfigguration
@ComponentScan
public @interface SpringBootApplication

在Spring 中@Configuration比较常见,提供javaConfig配置类实现。而@ComponentScan则扫描@Component等注解,帮相关的javaBean定义批量加载到IOC容器中。@EnableAutoConfigguration最终会使用JDK提供的SPI机制来实现类的动态加载。
关于@EnableAutoConfigguration注解更多的可以参考相关的资料。
我们还注意到在上面的代码示例中包含一个main函数并执行了ApplicationContext对象,我们可以根据需求对该ApplicationContext对象做响应处理。

(4)Controller类

Application类提供了Springboot程序的入口,相当于应用程序拥有了最基本的骨架。接下来我们就可以添加各种业务相关的访问入口,表现在RESTful风格上也就是一系列的Controller类所代表的的HTTP端点。
这里的Controller和springMvc的Controller在概念上是一致的。最简单的Controller如下:

@RestController
public class HelloController{
     @GetMapping("/")
     public String index(){
          return "Hello Spring Boot";
     }
}

以上代码包含了@RestController和@GetMapping("/")两个注解。我们知道在springMvc中包含了@Controller注解用来表示当前类是一个servlet。
@RestController继承了@Controller,它告诉Springboot这是一个基于RESTful风格的HTTP端点,并会自动使用JSON实现HTTP请求和响应的序列化和反序列化操作。至于@GetMapper类似@RequestMapping,指定请求方式为GET。这里不做多余介绍。
以下代码展示了一个典型的Controller,在Controller中通过静态的业务代码完成了根据商品编号,获取商品信息的业务流程。
这里用到了两层Mapping注解,在服务层级定义了服务的版本和路径,分别为v1和products;而在操作级别有定义了HTTP请求方法的具体路径及参数信息。

@RestController
@RequestMapping("/v1/products")
public class Productontroller{
     @GetMapping("/{productCode}")
     public Product getProduct(@PathVariable String productCode){
          Product product = new Product();
          product .setId(1L);
   product .setPrice(100F);
   product .setProductCode("product001");
   product .setProductName("product");
   return product;
     }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容