SpringCloud生态强调微服务,微服务也就意味着将各个功能独立的业务抽象出来,做成一个单独的服务供外部调用。但每个人对服务究竟要有多“微”的理解差异很大,导致微服务的粒度很难掌控,划分规则也不统一。这导致的一个问题就是在实现一个业务场景的过程中,无法避免的需要对微服务进行整合。本文提出了一种对微服务进行组合的方案,来解决上述的问题。

  其实我觉得微服务的理想化调用方式应该是如图一所示的。在完成某一个具体的功能时,外部应用只需要单独调用对应的service就好了。但现实的情况往往是图二所示的调用方式。外部应用在完成某一项具体功能时,需要并发的调用Service1和Service2然后把二者数据进行汇总,之后再把汇总数据发送给Service3,Service3成功调用意味着此次业务功能完成。简单来说就是需要对微服务进行组装。

                     

    图一                                                                    图二

  微服务的组合其实就是一个DAG图,例如图三,这是一个服务组合,其基本功能是并发调用Service1和Service2,二者结果作为参数调用Service3,调用Service3的同时并发调用Service4,Service3和Service4的结果合并作为参数调用Service5,Service5的最终结果作为此次服务组合的最终结果。可以看出这个服务组合的功能还是非常复杂的。要实现这样一个服务组合,难点有两个:1、服务的DAG工作流控制;2、服务结果的合并,以及合并后如何映射给下一个服务的参数。

                  

        图三                              图四

  我们来逐步分析上面的两个难点,以及如何巧妙的解决他们。其实我们可以把图三的DAG图,优化成图四这样的DAG。也就是增加一个虚拟服务VirtualService3,VirtualService3用来汇总Service1/Service2的结果数据,并调起下一次的组合服务。其实就是把图三的DAG划分成了两个Step。图四由不同的Step组成,每个Step内的调用逻辑是非常一致的:并发的调用1个或多个服务,然后合并服务的结果,调用nextStep,并用nextStep的结果作为整个DAG的结果。如果nextStep为空,则直接将合并的结果作为整个DAG的结果。

  优化后的DAG就是用Step递归实现整个DAG的运行和结果汇总!

  下一个问题就是服务结果的合并。整个问题稍显复杂,我们要把它放到SpringCloud的情景中来看。在SpringCloud中,微服务是以restfulApi的形式暴露的,也就是http协议的调用。那么http调用的参数可以简单分为URL、URL参数、HEADER、BODY、METHOD这5中类型。其中BODY最为复杂,因为其形式是不固定的,可能是JSON、XML或者PLAIN TEXT;URL参数、HEADER基本都是K/V的形式,映射起来比较简单。

  映射的第一步就是对各种参数进行解析。下面是一个实际的HTTP请求,从结果来看,URL参数和HEADER解析起来比较简单,在SpringBoot中会自动应射成对应的Map。而BODY就比较复杂了,可能是有格式的PLAIN TEXT,如下图是冒号分隔的KV字符串,或者是有格式的JSON。不过幸运的是在使用SpringBoot构建的微服务,即使是无格式的PLAIN TEXT,也都不是直接给人看的,而是给程序用来解析、使用的。那就意味着也是可以解析的,只不过解析比较麻烦而已。

  但无论怎么解析,最终都可以被解析成有个K/V形式的MAP。一旦被解析成MAP对象,映射起来就比较方便了。

  首先我们需要对映射的定义进行限制,映射只是参数的重新组合、替换、舍弃,而不能含有业务含义或者复杂的组装逻辑(例如字段的加减乘除等操作)。一旦对映射的功能进行限定,我们会发现实现参数的组合将变得简单起来。freemarker完全就可以胜任这个工作!

  FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。其实简单来说就是它可以把输入的数据,按照指定的模板生成对应的输出文本。

  下面是一个FreeMarker的例子,非常简单但足够说明它的功能,代码把map对象中的数据,去替换模板中对应的变量,然后打印替换后的结果。怎么样,这是不是可以满足我们对restful调用参数的映射呢?

public class Test {public static void main(String[] args) throws Exception{//创建一个模版对象Template t = new Template(null, new StringReader("用户名:${user};URL:    ${url};姓名:  ${name}"), null);//创建插值的MapMap map = new HashMap();map.put("user", "lavasoft");map.put("url", "http://www.baidu.com/");map.put("name", "百度");//执行插值,并输出到指定的输出流中t.process(map, new OutputStreamWriter(System.out));}
}

输出:

用户名:lavasoft;URL:    http://www.baidu.com/;姓名:  百度

  到这里我们就把服务结果的组合也将清楚了。那我们就看一下我设计的相关表结构和demo吧。

  上面是表结构,下面是调用结果,其中result其实是两次hello调用结果的合并。

  

   SpringCloud服务组合的实现方案基本就讲解清楚了,不过限于篇幅没有放代码,如果有需要的可以联系我微信: HelloGrape。

SpringCloud服务组合相关推荐

  1. SpringCloud服务消费者第一次调用出现超时问题的解决方案

    SpringCloud服务消费者第一次调用出现超时问题的解决方案 参考文章: (1)SpringCloud服务消费者第一次调用出现超时问题的解决方案 (2)https://www.cnblogs.co ...

  2. [论文泛读]Web服务组合综述相关论文1(3篇)

    邓水光,吴朝晖. Web服务组合方法综述. 中国科技论文在线,2008,3(2):79-84. Time:2 hours Web服务组合领域的研究内容包括:Web 服务组合建模语言.服务组合方法.服务 ...

  3. SpringCloud服务安全连接

    转载自 SpringCloud服务安全连接 Spring Cloud可以增加HTTP Basic认证来增加服务连接的安全性. 1.加入security启动器 在maven配置文件中加入Spring B ...

  4. springcloud服务发现

    下面我们接着上一篇eureka的自我保护继续讲springcloud服务发现 controller层代码: package com.atguigu.springcloud.controller;imp ...

  5. Springcloud服务如何在Eureka安全优雅的下线

    Springcloud服务如何在Eureka安全优雅的下线 如果直接kill -9 Springcloud的服务,因为Eureka采用心跳的机制来上下线服务,会导致服务消费者调用此已经kill的服务提 ...

  6. CMfg-SC(云制造服务组合)、DRL、DQN的定义

    cloud manufacturing Information Technology (IT) is continuously growing so that it is the origin of ...

  7. 贵州大学计算机学院杨静,基于遗传算法Web服务组合的一般过程

    在以服务为主体的互联网下,单一的服务已经远远不能满足人们的需求.将多个服务组合来满足需求成为研究的重点.文章在研究现有方法的基础上,总结出此类问题的一般思路,并介绍每个环节中的各个方法,而后对各种方法 ...

  8. springcloud服务网关-gateway

    文档 Spring Cloud Gateway官方文档地址 特性 Java 8 Spring Framework 5 Spring Boot 2 动态路由 内置到Spring Handler映射中的路 ...

  9. 基于(Mixed)Integer Programming方法的服务组合相关论文实验介绍 (1)

    Zeng04, "QoS-aware middleware for web services composition" Experiment settings     硬件和基础软 ...

最新文章

  1. 二元学习法3.0:三把学习大剑,打通学习的底层密码_学习方法
  2. 立创eda封装转cadence_立创EDA05、检查封装、生成PCB
  3. 分包组包 北斗通信_蓝牙mesh底层传输层(分包和组包)
  4. linux备份还原系统程序
  5. forEach与for循环的差别
  6. c# forbidden.html,c# - google+ api error forbidden 403 - Stack Overflow
  7. utf—8在苹果手机上乱码_Xcode下的中文乱码问题
  8. 重做《机房收费系统》——概要设计(UI)
  9. 【填坑】Ubuntu安装vsftpd
  10. 3dmax渲染器下载VRay4.1渲染器下载安装教程(支持3dmax2013-2019)
  11. PHP网页监控系统,实现网页变化监控
  12. 松散四叉树+网格法实现
  13. win10右键没有新建选项,无法新建文件夹
  14. 使用pkg编译打包nodejs程序成执行文件
  15. 高防服务器与高防IP的区别和联系
  16. OpenCV对TBB的支持
  17. 宝塔Linux面板问题QA汇总
  18. 【面试】面试之哒哒英语
  19. 别人的18岁,恐怕会碾压你的38岁
  20. 树袋熊无线网络打印服务器,树袋熊

热门文章

  1. Ctrl+C提示是否终止shell脚本
  2. android ExpandableListView
  3. Nginx+Tomcat动静分离搭建
  4. fusionchart图表遮挡Ext下拉控件或日期控件解决办法(IE下有问题firefox与chrome正常)...
  5. python非贪婪、多行匹配正则表达式例子[转载]
  6. ORACLE联机日志文件丢失或损坏的处理方法(转)
  7. div如何添加滚动条?
  8. 如何在 Linux 上使用 kill 和 killall 来管理进程
  9. 详解 ARM64 内核中对 52 位虚拟地址的支持
  10. 【Java】 链表的回文结构