在应用平台的设计中,使用中台架构设计,可以将应用分为后台应用、中台应用和前台应用三个部分。其中,后台应用部分主要与数据库打交道,实现数据存取方面的功能;前台应用部分主要实现业务处理方面的功能;中台应用部分主要通过整合后台应用的资源,为前台应用提供接口服务方面的功能。这样,通过中台应用轻量级的设计,不但可以提高平台处理数据的并发能力,而且能适应前台多样的需求变化,在总体上提升应用平台的系统性能。
01、中台应用开发案例
如图1所示,假如一个电商平台使用中台架构设计,已经在数据管理设计方面,按照业务领域划分了库存管理、订单管理、用户管理等后台应用项目。现在,为了给前台应用提供一个轻量级的接口服务,就需要创建一个中台应用。例如,可以通过中台应用(业务管理中台服务)为前台应用(PC端业务管理)提供接口服务,或者通过中台应用(商城应用中台服务)为前台应用(App商城应用)提供接口服务。
■ 图1 电商平台中台应用设计实例
那么在中台应用中应如何为前台应用提供接口服务?下面通过中台应用(业务管理中台服务)连接后台应用(库存管理)为例,说明中台应用连接后台服务资源为前台应用提供接口服务的步骤。
1●定义OpenFeign客户端
这里主要使用Spring Cloud工具套件进行开发。假设在库存管理应用中已经完成了对商品数据进行增删改查方面的开发,并且提供相应的访问接口,库存应用在微服务注册中心注册的服务名称为goods-service。这样,在库存管理应用项目中可以增加一个客户端模块,名称可以设定为goods-client。在这一模块中,将使用Spring Cloud的OpenFeign组件,通过Restful协议,调用库存管理应用的接口方法。为此,创建一个接口GoodsClient,代码如下所示。
@FeignClient(value = "goods-service")
public interface GoodsClient {
@RequestMapping(value = "/goods/add")
@ResponseBody
String add(@RequestBody GoodsForm goodsForm);
@RequestMapping(value = "/goods/update")
@ResponseBody
String update(@RequestBody GoodsVo goodsVo);
@RequestMapping(value = "/goods/delById")
@ResponseBody
String del(@RequestParam(name = "id") Long id);
@RequestMapping(value = "/goods/findById")
@ResponseBody
GoodsVo findById(@RequestParam(value = "id") Long id);
}
上面代码中,通过注解@FeignClient指定调用的微服务为goods-service。其中,“/goods/add”“/goods/update”“/goods/delById”“/goods/findById”等为库存管理应用中提供的数据接口调用URL,分别用来执行商品的添加、修改、删除和查询操作。数据对象GoodsForm 为插入商品数据的一个表单对象,GoodsVo为相对于商品实体Goods定义的一个数据查询对象。
这样,对于中台应用来说,通过引用上面的接口程序GoodsClient,即可实现对商品数据的管理。所以在开发完成这个模块后,必须发布在代码仓库(例如Nexus)中,以方便其他应用进行引用。如果使用Maven工具管理项目,也可以使用install指令将完成开发的模块发布在本地机器的代码引用仓库中。
2●在中台应用中创建服务接口
当完成客户端模块开发之后,在业务管理中台服务这个应用中,即可使用Maven项目管理工具,在项目对象模型pom.xml中增加对库存客户端的依赖引用,类似代码如下所示。
<dependency>
<groupId>com.demo</groupId>
<artifactId>goods-client</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>复制
注意,上面依赖引用的各个参数与实际开发的模块及其发布时的设置应保持一致。引用了库存管理的客户端之后,就可以在中台应用中创建其相关的服务接口,代码如下所示。
@RequestMapping("/goods/api")
@RestController
public class GoodsClientWebController {
@Autowired
private GoodsClient goodsClient;
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String add(@RequestBody GoodsForm goodsForm) {
try {
return goodsClient.add(goodsForm);
} catch (Exception e) {
return "增加商品失败:"+e.getMessage();
}
}
@RequestMapping(value = "/delById", method = RequestMethod.GET)
public String delById(@RequestParam(value = "id") Long id) {
try {
return goodsClient.delById(id);
} catch (Exception e) {
return "删除商品失败:"+e.getMessage();
}
}
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(@RequestBody GoodsVo goodsVo) {
try {
return goodsClient.update(goodsVo);
} catch (Exception e) {
return "更新商品失败:"+e.getMessage();
}
}
@RequestMapping(value = "/findById", method = RequestMethod.GET)
public Object findById(@RequestParam(value = "id") Long id) {
return goodsClient.findById(id);
}
}复制
上面代码中,通过引用GoodsClient,并调用商品管理的相关方法,即可对商品执行增删改查的操作。
这样,当相关的应用和服务发布之后,就可以为前台应用提供库存管理中商品数据管理的接口服务。如果服务只在本地机器上发布,有关库存商品增删改查的接口方法,将可使用类似如下所示的链接。在前台应用中,根据方法类型,使用合适的参数进行访问。
http://localhost/goods/api/add
http://localhost/goods/api/update
http://localhost/goods/api/delById
http://localhost/goods/api/findById
......
使用同样的方式,可以在中台应用中,增加用户管理、订单管理等应用的数据管理的接口服务。这样,在业务管理中台服务这一中台应用中,就可以为前台应用(PC端业务管理)提供一个轻量级的全方位的数据管理服务。
同理,在App商城应用中台服务这个中台应用中,通过引用各个后台应用的客户端,并根据需要创建相关的数据接口服务,也能为App商城应用提供相应的数据服务。