Spring Data Rest构建超媒体驱动的微服务

1,198 阅读2分钟

Part 1: Hateoas-Waiter-Service

HAL

  • HyperText Application Language
  • 基于json的扩展,是一种简单的格式
  • 为API的资源提供简单一致的链接

HAL模型

  • 链接资源
  • 内嵌资源,靠self的link代替id,标识coffee对象
  • 状态

spring data rest

  • spring-boot-starter-data-rest
  • @Repository,spring自动会把它转化为一个RESTful接口,一个资源
  • @RepositoryRestResource
  • Resource
  • PagedResource
  • 根据超媒体的目录进行访问和搜索,search调用的是repository

实例

  1. dependency
    spring-boot-starter-data-jpa
    spring-boot-starter-data-rest
    hibernate对joda-money的支持 usertype.core
    jackson对hibernate类型的支持 jackson-datatype-hibernate5
    jackson对xml的支持 jackson-dataformat-xml

  2. repository extends JpaRepository<>,可以对应于超媒体的search

  1. 主程序注册hibernate5支持,对jacksonBuilder进行定制,输出的json是有缩进的,时区设为Asia/Shanghai

  2. localhost:8080相当于目录,根据超媒体目录进行访问和搜索

  • spring-data-rest帮我们实现了Controller,当访问/coffee,出现了embedded中的内嵌资源,显示所有coffee信息,通过self的href来代替id,标识coffee的
  • 分页信息查询,第0页,每页三个资源,按id的降序排序
    /coffee?page=0&size=3&sort=id,desc
  • /coffee/search对应repository的方法
    /coffee/search/findByName{?name}
    /coffee/search/findByNameInOrderById{?list}
  • 调用/coffee/search/findByName?name=mocha
  • 调用/coffee/search/findByNameInOrderById?list=mocha,espresso

Part 2: Hateos-Customer-Service

编程的方式,用客户端访问HATEOAS服务

  • 配置Jackson Json——HAL支持,在main中注册Jackson2HalModule这个bean
  • 操作超链接——找到需要的link,restTemplate-httpClient-requestFactory/webClient访问超链接

实战

  1. 从ROOT_URI获得coffee_link,通过coffee_link获得所有的coffee信息,再添加一杯咖啡

  1. 从ROOT_URI获取coffeeOrders这个link,对这个订单link添加咖啡,最后查询修改过后的订单

  1. getLink()

  1. readCoffeeMenu()

  1. addCoffee()

  1. addOrder()

  1. queryOrders()

测试

创建订单:顾客lilei初始化创建订单,购买的是3号coffee,添加的是link

此时可以Get /coffeeOrders/1/items得到内嵌的coffee信息

向1号订单添加新的2号coffee Post /coffeeOrders/1/items