--- url: /index.md --- # --- --- url: /about_me.md --- # 关于我们 ## 关于我们 我们是一支充满活力与激情的年轻团队,成员均来自国内顶尖互联网公司(如百度、阿里巴巴、腾讯等),拥有扎实的技术功底和丰富的实战经验。无论是前端交互、后端架构,还是人工智能、大数据处理,我们的成员都在各自领域中积累了深厚的专业能力。 我们始终秉持“以用户为中心,合作共赢”的理念,致力于打造一个个既实用又强大的工具平台,帮助个人与企业提升效率、优化体验。在快速迭代的技术浪潮中,我们不断探索创新,追求卓越,力求将复杂变得简单,让技术真正服务于每一个人,我们将继续携手并进,用技术创造价值,用热情点燃梦想。 ## 愿景 用技术创造价值,以合作推动创新,打造人人可用、人人受益的科技平台,实现共赢发展。 ## 准则 * **一流的代码质量** 一个由一流技术团队打造的工具平台,代码质量必须是一流的,采用领域驱动设计(DDD),代码逻辑和职责清晰明了。 * **强大的可拓展性** 为了满足最大程度的可拓展性,前端流程设计器和后端流程引擎均没用采用现有的框架,全部采用完全自研的结构模型,后续拓展极其方便。 * **极致的性能** 一流的代码质量下,性能也不甘落后,对于流程引擎的核心部分,我们逐行代码优化,精益求精,最终做到了流程本身的耗时普遍低于10毫秒。 --- --- url: /changelog/1.x/juggle-1.0.0.md --- # 1.0.0版本 - 2024/03/22 ## Juggle 1.0.0 发布了 ​ 经过将近7个月的探讨和小伙伴多少个夜晚的奋斗,Juggle 1.0.0版本终于2024年3月22日完成了第一个release版本,该版本基本包括了微服务编排最基础的能力,包括但不限于以下能力: 1. 使用Juggle进行微服务的接口编排,将底层基础能力快速聚合成新的能力。 2. 使用Juggle打通公司内多个系统,打破系统之间的壁垒。 3. 使用Juggle代替传统BFF层的能力,通过零码+低码的形式实现BFF层。 4. 使用Juggle进行系统定制开发,避免系统腐化和污染标准代码。 ​ Juggle作为国内首个开源的微服务编排框架,除了灵活的零码编排能力,提高生产效率,我们还会融入低码编排能力,数据提取能力,逻辑处理能力等,进一步提高Juggle的灵活性,致力于打造一款国内乃至全球优秀的工具! ## Juggle部分能力展示 流程设计图 ![流程设计页面](images/flow_example.png) 流程调试图 ![流程调试](images/flow_example_2.png) ## 优点与不足 #### 优点 1. 使用起来足够的简单,单机版本只依赖jdk,不依赖任何中间件,一键启动,上手非常简单。 2. 内置示例API接口,无需寻找外部API接口,启动Juggle后,即可通过示例接口进行流程编排,快速体验Juggle。 3. 零码编排+低码拓展,使Juggle的拓展性和灵活性都达到了极致。 4. 支持多种部署形态,支持横向扩展。 #### 不足 虽然现在的Juggle还不够强大,我们的设想也远比现在要强大,但是参与开发的小伙伴们也都非常忙,我们都是用自己的时间来开发,因此界面不是那么美观,可能还会有一些小的bug,希望大家多多体谅,如果遇到问题,大家可以反馈到GitHub上 https://github.com/somta/Juggle/issues ,我们第一时间解决修复。 ## 未来展望 ​ 我们还规划了非常非常多的功能等待实现,在后面的迭代过程中都会被一一实现,同时也希望大家能多提意见,也可以通过PR将您优秀的代码贡献出来,如果有兴趣做开源的小伙伴也可以加入Juggle的开发中来,我们一起打造一个优秀的产品。 ​ **最后,特别感谢为Juggle牺牲个人时间,熬夜撸码的小伙伴们!** 最后,如果大家决定Juggle还是一个可以的项目,请动动您的手,帮我们点一个star,这是我们持续更新的动力,感谢! --- --- url: /changelog/1.x/juggle-1.1.0.md --- # 1.1.0版本 - 2024/04/06 该版本主要进一步完善了Juggle的核心能力,提供了业务系统对Juggle的集成,新增了自定义代码节点等。 变更详情: ### Feature 新增令牌管理 \[[#I9CHIZ](https://gitee.com/Somta/Juggle/issues/I9CHIZ)]提供juggle-spring-boot-starter,三方业务系统可以通过集成该starter调用Juggle的openApi接口 \[[#3](https://github.com/somta/Juggle/issues/3)]流程设计新增自定义代码节点,支持Groovy脚本 \[[#I9CHK3](https://gitee.com/Somta/Juggle/issues/I9CHK3)]完善通过Docker,K8S等多种方式部署Juggle \[[#I9CHHV](https://gitee.com/Somta/Juggle/issues/I9CHHV)]新增接口调试能力 ### Enhancement\&Refactor ● 增强流程参数填充变量逻辑 ### BugFix ● 修复小数类型传输过程中类型错误问题 ● 修复部分参数导致的数据丢失问题 ### Dependency ● 将element-plus 升级到2.6.3 --- --- url: /changelog/1.x/juggle-1.1.1.md --- # 1.1.1版本 - 2024/04/24 该版本主要废弃了领域的产品概念,修复了一些新测试发现的问题。 变更详情: ### Feature ● 废弃领域的概念,领域的概念太过技术化,也会限制后续产品能力的发展,因此将领域改成套件 ### Enhancement\&Refactor ● 完善Juggle的OpenApi文档,允许开发者基于OpenApi将Juggle集成到自己的业务系统 ### BugFix ● 修复OpenApi不传token时导致的系统异常 ● 修复调试流程时,异步流程不生效的问题 ### Dependency --- --- url: /changelog/1.x/juggle-1.2.0.md --- # 1.2.0版本 - 2024/05/30 该版本主要新增了数据源,MySql数据节点,允许在流程中添加操作数据库,允许在Groovy脚本中引入json库等 变更详情: ### Feature ● 新增数据源管理模块,支持用户管理数据源,目前支持MySql数据源 ● 流程设计新增MySql节点,允许用户基于MySql节点,实现数据源的查询、更新、删除等操作 ● Groovy脚本支持引入json库,进行序列化与反序列化操作 ● 提供juggle-client依赖包,使普通Java项目也能集成Juggle流程 ### Enhancement\&Refactor ● 新增完善的方法节点,判断节点,代码节点的使用说明和示例 ### BugFix ● 修复api接口/流程调试参数为复杂类型错误的问题 ● 修复流程执行引擎请求头常量填充丢失 ● 修复代码节点后无法添加新节点的问题 ### Dependency --- --- url: /changelog/1.x/juggle-1.2.1.md --- # 1.2.1版本 - 2024/07/30 ### Feature ● 代码节点,mysql节点新增自定义描述 ● 文档完善方法节点,判断节点,代码节点,MySql节点的具体使用介绍 ● 套件新增套件图像,方便套件识别度 ● 优化流程设计画布节点显示,显示节点类型,增加节点的辨识度 ● 接口参数支持添加path参数,query参数,body参数 ### Enhancement\&Refactor ● 优化流程运行性能,单流程运行需要内存减少30% ● 优化流程引擎核心代码,提升合理性 ### BugFix ● 修复流程定义分页列表失效 ● 修复MySql节点查询sql与接收对象属性不完全一致时发生异常的问题 ● 修复“查询用户订单列表”内置接口由于预置数据导致的异常问题 ● 修复接口调试面板偶现出错导致奔溃的问题 ● 修复方法节点出入参参数据类型为对象类型时不显示的问题 --- --- url: /changelog/1.x/juggle-1.2.2.md --- # 1.2.2版本 - 2024/09/27 该版本主要新增了日期数据类型,赋值节点,套件市场等核心能力,让Juggle更加灵活,不用进行任何开发就能快速集成主流的平台系统。 变更详情: ### Feature ● 代码节点,新增大屏代码编写能力 ● 新增赋值节点,解决多分支条件下多个变量的赋值能力 ● 为参数节点添加描述字段 ● 新增“日期”数据类型 ● 新增"QQ邮箱",”163邮箱“,”通义千问“,”彩云天气“,”阿里云短信“等五个官方套件 ### BugFix ● 修复流程过程中由于接口404导致的流程异常问题 ● 修复流程中使用接口中有path参数的接口时,出现参数没有没有被替换的问题 ● 修复空赋值节点保存后,二次修改赋值规则时出现无法赋值的问题 ● \[[#24](https://github.com/somta/Juggle/issues/24)]修复docker镜像中缺少H2数据库文件导致启动失败 ● \[[#IAG0EP](https://gitee.com/Somta/Juggle/issues/IAG0EP)]修复window下通过压缩包启动Juggle中文乱码问题 ### Dependency ● 升级element-plus到2.8.2版本 ● 升级vite到5.2.6版本,解决安全漏洞问题 --- --- url: /changelog/1.x/juggle-1.2.3.md --- # 1.2.3版本 - 2024/11/27 该版本主要新增模板市场,对象属性下探等核心能力,优化了流程的执行性能和用户体验,新增五个套件等。 变更详情: ### Feature ● 判断节点,方法节点,赋值节点参数赋值时支持对象属性下探选择 ● 新增模板市场能力 ● 代码节点,支持书写JavaScript脚本代码 ● 新增普通Juggle项目快速集成Juggle的sdk,帮助用户快速集成Juggle流程 ● 抽离市场配置域名,支持套件市场和模板市场私有化能力 ● 新增数据源重要信息加密存储,防止数据泄露 ● 新增螺丝帽短信,钉钉群机器人,微信群机器人,随机值生成,值处理等套件 ● 流程定义,流程节点等节点支持可调整抽屉,更好的用户体验,感谢@Abluee ### Enhancement\&Refactor ● 将流程设计画布抽离成单独的页面,提升体验度 ● 变量选择时,同时展示变量键和变量名称,增加识别度 ● 补充了Juggle的部署和配置文档 ● 发布juggle-client 1.1.0,juggle-spring-boot 1.1.3版本,增强流程集成能力 ### BugFix ● [流程设计页面删除节点问题](https://github.com/somta/Juggle/pull/26),感谢@fun90 ● [解决高并发下变量引擎反复创建类导致GC的问题](https://github.com/somta/Juggle/pull/28),感谢@fun90 ● [修复Groovy脚本执行过程中占用内存过大的问题](https://github.com/somta/Juggle/pull/28),感谢@fun90 ### Dependency ● 升级SpringBoot,caffeine等版本解决已知安全漏洞 --- --- url: /changelog/1.x/juggle-1.3.0.md --- # 1.3.0版本 - 2025/01/27 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,同时提供了加解密等套件,丰富套件市场。 变更详情: ### Feature ● 对象列表支持根据创建时间排序 ● 新增加解密套件,十几种加解密方法,满足不同的加解密需求 ● 流程列表支持根据创建时间排序 ● 右上角菜单添加关于说明,方便查看当前使用juggle的版本信息 ● 接口调试支持打开新窗口,简化操作路径 ### Enhancement\&Refactor ● 发布juggle-client 1.1.1版本,juggle-spring-boot-starter 1.1.4版本 ● 完善值处理套件,添加多个数据转换方法 ### BugFix ● 修复多实例部署情况下,无法登录的问题 ● \[[#41](https://github.com/somta/Juggle/issues/41)]修复无法连续添加赋值节点问题 ● \[[#40](https://github.com/somta/Juggle/issues/40)]流程刷新后无法修改变量类型 ● 修复部分套件无法购买的问题 --- --- url: /changelog/1.x/juggle-1.3.1.md --- # 1.3.1版本 - 2025/04/27 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,新增了多个套件,满足更多的业务场景需求。 变更详情: ### Feature ● 添加值提取套件,解决复杂JSON场景下,通过JsonPath快速提取指定值 ● 添加火山方舟套件,通过改套件能快速对接火山方舟下的各种大模型,包括豆包,DeepSeek等热门大模型 ● 值处理套件新增字符串拼接方法 ● 添加高德地图套件,提供地图定位、逆地理编码、地理编码,天气查询等功能 ### Enhancement\&Refactor ● 套件编码新增后不允许修改,避免修改后影响流程 ● 添加/修改对象时,实时校验对象编码是否存在,提高用户体验 ● 补充代码节点,JavaScript语言相关的使用说明文档 ● 补充赋值节点使用说明文档 ### BugFix ● 修复没有流程入参时,无法触发流程的问题 ● 接口调试和流程调试时,首次打开调试页面,布尔类型数据类型值丢失 ● 修复当流程一个出参都没有时异常的问题 ● 低版本Juggle没有新套件图片时,出现裂图的问题 ● \[[#IC1MJ1](https://gitee.com/Somta/Juggle/issues/IC1MJ1)]部署后的流程地址错误 ● \[[#IC1MJ1](https://gitee.com/Somta/Juggle/issues/IC1MJ1)]流程列表分页无法切换的问题 ● \[[#2](https://gitcode.com/coderboot/Juggle/issues/2)]部分禁用流程还能调用的问题 ● \[[#1](https://gitcode.com/coderboot/Juggle/issues/1)]流程定义,中间变量修改不生效 ● \[[#IC4KG3](https://gitee.com/Somta/Juggle/issues/IC4KG3)]修复数据源占用过多连接数的问题 --- --- url: /changelog/1.x/juggle-1.3.2.md --- # 1.3.2版本 - 2025/07/19 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,新增了多个套件,满足更多的业务场景需求。 变更详情: ### Feature ● 完成系统的新一轮流程压测,输出相关的压测报告并完善到官网 ● 添加硅基流动套件,支持调用硅基流动的各类大模型接口能力,包括聊天,文生图,文生视频等模型 ● 添加腾讯翻译套件,支持调用腾讯翻译的接口能力,进行全场景的翻译 ● 添加百度翻译套件,支持调用百度翻译的接口能力,进行识别文本语种,通用文本翻译,领域文本翻译 ### Enhancement\&Refactor ● 暴露出更多配置供使用者配置,如连接池的最大连接数,最小连接数,连接最大空闲时间等通过这些配置进一步提高Juggle的运行性能。 ● 新增暴露镜像环境变量,支持通过环境变量设置JVM参数,如JVM堆内存大小,元空间大小,gc日志记录等。 ● 优化接口管理体验,将接口列表放到套件下面,优化操作体验。 ● 优化中间变量选择体验,尤其是对象嵌套的选择体验。 ### BugFix ● \[[#64](https://github.com/somta/Juggle/issues/64)]JavaScript脚本提供沙箱安全机制,只允许调用限定范围内的Java方法,避免脚本注入攻击。 ● \[[#3](https://gitcode.com/coderboot/Juggle/issues/3)]列表类型的中间变量无法修改不生效的问题。 ### Dependency ● 升级vite, axios, @vitejs/plugin-vue版本,解决安全漏洞问题 --- --- url: /changelog/1.x/juggle-1.4.0.md --- # 1.4.0版本 - 2025/07/19 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,新增了多个套件,满足更多的业务场景需求。 变更详情: ### Feature ● 代码节点添加默认代码,降低用户上手难度 ● 添加蓝耘套件,支持调用蓝耘提供的AI能力,实现AI文本生成、AI文生视频等功能 ### Enhancement\&Refactor ● 扩展数据库表参数描述字段,数据源连接地址字段等字段长度,适配更多业务场景 ● 所有布尔类型的默认值,统一改为false,统一平台的操作 ● 修改代码节点和mysql节点代码编辑器不跟随变宽的问题 ● 修改套件市场和模板市场的访问地址 ### BugFix ● 修复部分官方套件无法正常安装的问题 ● 限制整数和小数的输入范围,避免输入过大的值导致的错误 ● 套件市场切换tab时,页面抖动的问题 ● \[[#73](https://github.com/somta/Juggle/issues/73)]修复令牌再流程中不生效的问题。 ● 修复方法节点添加后不填任何数据,保存流程后再次打开无法显示输入项的问题 ● 修复接口调试和流程调试参数首尾空格,导致参数异常的问题 --- --- url: /changelog/1.x/juggle-1.5.0.md --- # 1.5.0版本 - 2026/01/19 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,新增了多个套件,满足更多的业务场景需求。 变更详情: ### Feature ● 发布nodejs版本sdk,方便在nodejs项目中快速调用juggle的流程 ### Enhancement\&Refactor ● MySql节点添加最大化SQL编辑器,优化用户体验 ● 规范数据源最大连接数,最小连接数,超时时间等配置,解决数据源配置问题 ● 套件添加套件类型筛选,方便快速筛选出官方套件 ### BugFix ● 对象属性添加强制校验逻辑,避免用户输入错误数据导致报错 ### Dependency ● 升级axios到1.12.0版本 ● 升级element-plus到2.11.3版本,解决安全漏洞问题 ● 升级vite到7.1.11版本 --- --- url: /changelog/1.x/juggle-1.6.0.md --- # 1.6.0版本 - 2026/01/19 该版本主要修复了一些新的bug,优化交互逻辑,提升用户体验,新增了多个套件,满足更多的业务场景需求。 变更详情: ### Feature ● 后端服务全面升级,框架升级到springboot 3.x,jdk升级到21 ### Enhancement\&Refactor ● ● ● ### BugFix ● 调整流程试运行的超时时间,解决大模型返回较慢时的超时问题 ● 非必填参数为空时,反序列化为空字符串的问题 ● mysql节点输入大数字时,会默认加上逗号的问题 ### Dependency ● ● ● --- --- url: /changelog/introduce.md --- # Juggle更新说明 本文档为 **Juggle 微服务编排引擎** 版本更新说明,按版本号完整梳理各迭代周期内**新增功能**、**体验优化**、**问题修复**与**安全升级**,清晰展示平台能力演进路径。方便开发者、运维与产品同学快速查阅对应版本特性,了解平台最新能力,高效对接业务场景,降低使用与升级成本。 --- --- url: /changelog/start.md --- # Juggle更新说明 本文档为 **Juggle 微服务编排引擎** 版本更新说明,按版本号完整梳理各迭代周期内**新增功能**、**体验优化**、**问题修复**与**安全升级**,清晰展示平台能力演进路径。方便开发者、运维与产品同学快速查阅对应版本特性,了解平台最新能力,高效对接业务场景,降低使用与升级成本。 --- --- url: /docs/guide/community/community-get-help.md description: Juggle社区信息 --- # 获取帮助 如果您需要有关`Juggle`的帮助,我们将在这里为您提供帮助,以下是获取帮助的一些方法: * 仔细阅读官方文档: * 在报告错误或者增强需求及建议. * 在搜索相关问题,也许别人早已经碰到了你的问题 * 关注微信公众号获取加群二维码 ![微信公众号二维码](images/gzh_qrcode.jpg) --- --- url: /docs/guide/community/donate.md description: Juggle赞助信息 --- # 赞助我们 如果您有产品需要在Juggle的官网上进行推广,可以申请成为Juggle的赞助商,Juggle将对您的产品在Banner位进行展示,Juggle官网通过CPM(曝光度)的方式收取费用,详情可以加微信细聊:`Somta_Gavin` ,添加时请备注来意。 或者可以通过发送邮件的方式与我们取得联系,邮箱地址:`305123882@qq.com` 当然如果您觉得`Juggle`不错,也可以通过扫码的方式请Juggle的作者喝一杯咖啡!!! | :\[bi:alipay]: AliPay | :\[fa:wechat]: WeChat | |----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------| | ![Alipay](images/pay_zfb.jpg){width="300" height="300" style="width:150px"} | ![WeChat](images/pay_wechat.jpg){width="300" height="300" style="width:150px"} | 当然也欢迎Star、PR、ISSUE等任何方式的支持,非常感谢~~! 前往点个Star吧~~ :) --- --- url: /docs/guide/faq/suite-faq.md description: juggle套件和接口中常见的问题汇总 --- # 套件常见问题 ## 1.接口不支持单独一个数组作为入参 在套件中的接口目前是不支持单独传入一个数组作为入参的情况,因为此类接口不具备向下兼容性,后续接口的变动都可能导致之前的流程中该接口的不可用,对于流程来说是毁灭性的,为了整个流程的稳定性和兼容性,在没有优雅方案之前,juggle不会支持此类入参。 建议将数组包装到一个对象中,这样既能保证接口的拓展性,又能保证流程的稳定性。 --- --- url: /docs/guide/integration/integration.md description: 业务系统如何快速集成Juggle,完成业务系统与流程的对接。 --- # 业务系统集成Juggle Juggle提供了非常强大的流程设计能力,通过Juggle的流程编排能力,我们通过界面的编排就能完成现在大部分后端服务的开发工作,那如何将Juggle的流程快速接入现有的业务系统,为业务系统赋能呢? ### 为什么要集成Juggle * 每个业务系统的协议模型对象都可能不一样,Juggle定义的协议模型对象无法适配所有业务系统,通过业务系统集成Juggle,可以屏蔽协议模型差异, 将Juggle变成您的业务系统的一部分。 * 设计的流程并不一定是给前端调用,有可能是业务系统某个核心功能的一部分,还需要融合其他的业务逻辑,此时可以通过集成Juggle,将流程的能力融入到功能的某部分逻辑中。 ### 集成Juggle有哪些方式 为了简化集成流程,Juggle提供了对应语言的sdk,业务系统引入相关的sdk,就能直接调用设计好的流程,具体不同语言的sdk的使用方式如下: * [普通Java项目集成Juggle](https://www.juggle.plus/docs/guide/integration/java-juggle) * [SpringBoot集成Juggle](https://www.juggle.plus/docs/guide/integration/spring-boot-juggle) 更多语言的sdk,持续更新中...... --- --- url: /docs/guide/integration/java.md description: 普通Java项目快速集成Juggle,完成Juggle能力的融入,增强业务系统能力。 --- # 普通Java项目集成Juggle 普通的Java项目也能快速接入Juggle的流程,我们也提供了对应的client,通过该client就能快速接入和触发流程,具体接入步骤如下: ### 1.添加依赖 ```xml net.somta juggle-client 1.1.1 ``` ### 2.登录Juggle,申请一个令牌 ![申请令牌](images/gen_token.png) ### 3.通过juggleClient调用流程接口 ```java public static void main(String[] args) throws IOException { //1.实例化Juggle客户端 JuggleConfig juggleConfig = new JuggleConfig(); juggleConfig.setServerAddr("https://demo.juggle.plus"); juggleConfig.setAccessToken("eyJ1c2VySWQiOjEsInRpbWVzdGFtcCI6MTcyOTAwODYzOTc5MH0="); JuggleClient juggleClient = JuggleFactory.getClientInstance(juggleConfig); //2.组装流程参数 FlowTriggerDataParam flowTriggerDataParam = new FlowTriggerDataParam(); Map data = new HashMap<>(); data.put("userName","juggle"); data.put("password","123456"); data.put("deposit","1000"); flowTriggerDataParam.setFlowData(data); //3.触发流程 ResponseDataResult result = juggleClient.triggerFlow("v1","sync_example",flowTriggerDataParam); FlowResultModel flowResultModel = result.getResult(); System.out.println(flowResultModel.getStatus()); System.out.println(flowResultModel.getData()); } ``` :::tip 上诉代码中Juggle服务器的访问地址(serverAddr)和访问凭证(accessToken),这里并没有采用从配置文件读取的方式,因为在普通的java项目中,并没有统一的配置读取方案,因此交于用户根据实际情况自行实现 ::: ### 4.juggleClient提供方法介绍 #### a.触发流程方法 - triggerFlow **入参** | 名称 | 类型 | 是否必填 | 描述 | | ----------- | ------ | -------- | ------------------------------------------------ | | flowVersion | String | 必填 | 流程版本 | | flowKey | String | 必填 | 流程Key | | triggerData | Object | 非必填 | 流程定义中的入参数据,如果流程没有入参,可以不填 | | - flowData | Map | 非必填 | 触发流程需要的参数数据 | **出参** | 名称 | 类型 | 描述 | | ---------------- | ------- | ------------------------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程定义中设置的出参结果 | | - flowInstanceId | String | 流程触发后的实例ID | | - status | String | 流程的执行状态 | | - data | Map | 流程返回的实际数据,即流程定义中定义的出参 | #### b.获取异步流程方法 - getAsyncFlowResult **入参** | 名称 | 类型 | 是否必填 | 描述 | | -------------- | ------ | -------- | -------------- | | flowInstanceId | String | 必填 | 异步流程实例ID | **出参** | 名称 | 类型 | 描述 | | --------- | ------- | ------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Map | 流程定义中设置的出参结果 | --- --- url: /docs/guide/integration/nodejs.md description: Nodejs项目快速集成Juggle,完成Juggle能力的融入,增强业务系统能力。 --- # 普通Java项目集成Juggle Nodejs项目也能快速接入Juggle的流程,我们也提供了对应的client,通过该client就能快速接入和触发流程,具体接入步骤如下: ### 1.安装依赖 ```sh # npm npm install juggle-client # or yarn yarn add juggle-client # or pnpm pnpm i juggle-client ``` ### 2.登录Juggle,申请一个令牌 ![申请令牌](images/gen_token.png) ### 3.通过juggleClient调用流程接口 ```js // 引入 pkg const JuggleClient = require('juggle-client'); // 配置信息 const serverAddr = 'https://demo.juggle.plus'; const accessToken = 'eyJ1c2VySWQiOjEsInRpbWVzdGFtcCI6MTcyOTAwODYzOTc5MH0='; // 实例初始化 const juggleClient = new JuggleClient({ accessToken, serverAddr, }); async function triggerJuggleFlow() { const res1 = await juggleClient.triggerFlow('v1', 'sync_example', { userName: 'juggle', password: '123456', deposit: 1000, }); console.log(res1); const res2 = await juggleClient.getAsyncFlowResult('222'); console.log(res2); } triggerJuggleFlow(); ``` ### 4.juggleClient提供方法介绍 #### a.触发流程方法 - triggerFlow **入参** | 名称 | 类型 | 是否必填 | 描述 | | ----------- | ------ | -------- | ------------------------------------------------ | | flowVersion | String | 必填 | 流程版本 | | flowKey | String | 必填 | 流程Key | | triggerData | Object | 非必填 | 流程定义中的入参数据,如果流程没有入参,可以不填 | | - flowData | Map | 非必填 | 触发流程需要的参数数据 | **出参** | 名称 | 类型 | 描述 | | ---------------- | ------- | ------------------------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程定义中设置的出参结果 | | - flowInstanceId | String | 流程触发后的实例ID | | - status | String | 流程的执行状态 | | - data | Map | 流程返回的实际数据,即流程定义中定义的出参 | #### b.获取异步流程方法 - getAsyncFlowResult **入参** | 名称 | 类型 | 是否必填 | 描述 | | -------------- | ------ | -------- | -------------- | | flowInstanceId | String | 必填 | 异步流程实例ID | **出参** | 名称 | 类型 | 描述 | | --------- | ------- | ------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Map | 流程定义中设置的出参结果 | --- --- url: /docs/guide/integration/open-api.md description: 业务系统如何快速集成Juggle,完成业务系统与流程的对接。 --- # OpenApi列表 Juggle提供了OpenApi,让业务系统能快速接入Juggle的能力,同时为了简化业务服务集成的过程,还提供了不同语言的sdk,具体接入步骤请参考:[业务系统集成Juggle](https://www.juggle.plus/docs/guide/integration/) ## 一.api规范 #### 1.统一响应格式 OpenApi所有接口响应均为json类型的返回体,具体json格式如下 ```json { "success": true, "errorCode":1234566, "errorMsg": "", "result": {} } ``` 响应各字段的含义如下表所示 | 名称 | 类型 | 描述 | | --------- | ------- | -------- | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 响应结果 | #### 2.错误码汇总 | 错误码 | 错误描述 | | ---------- | -------------------- | | 2000011005 | 令牌错误 | | 2000061001 | 流程不存在 | | 2000061003 | 流程未启用,无法调用 | | 1 | 系统错误 | ## 二.授权机制 Juggle的OpenApi提供了两种令牌传递的方式,方便不同的业务场景使用 #### 1.通过请求头(Juggle-Token)传递 Juggle提供的各个语言的SDK都是通过传递,通过请求头传递的好处是业务系统无感,无侵入 #### 2.通过参数(juggleToken)传递 通过参数传递主要是通过Juggle设计的流程,能非常方便的作为其他系统webhook使用 ## 三.api列表 #### 1.触发流程 ##### a.通过GET请求触发流程 **接口** | Path | /open/v1/flow/trigger/{flowVersion}/{flowKey} | | ------------ |------------------------------------------------| | Method | GET | | Content-Type | application/json | **入参** | 名称 | 类型 | 是否必填 | 描述 | | ----------- | ------ | -------- | ------------------------------------------------------------ | | flowVersion | String | 必填 | 流程版本 | | flowKey | String | 必填 | 流程Key | | juggleToken | String | 必填 | OpenApi的令牌值,通过参数传递 | | flowData | Object | 非必填 | 流程定义的入参Key与value的键值对,如果流程没有入参,可以不填 | **出参** | 名称 | 类型 | 描述 | | ---------------- | ------- | ------------------------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程定义中设置的出参结果 | | - flowInstanceId | String | 流程触发后的实例ID | | - status | String | 流程的执行状态 | | - data | Map | 流程返回的实际数据,即流程定义中定义的出参 | **示例** 下面以系统内置示例流程为例,展示使用get的方式调用流程 ``` http://localhost:9127/open/v1/flow/trigger/v1/sync_example?juggleToken=eyJ1c2VySWQiOjEsInRpbWVzdGFtcCI6MTcxMjE2MTIxNDAzOH0=&userName=juggle&password=123456&deposit=1000.00 ``` ![触发流程](images/openapi_trigger_flow_get.png) ##### b.通过POST请求触发流程 **接口** | Path | /open/v1/flow/trigger/{flowVersion}/{flowKey} | | ------------ |------------------------------------------------| | Method | POST | | Content-Type | application/json | **请求头** | 名称 | 类型 | 是否必填 | 描述 | | ------------ | ------ | -------- | ------------------------------- | | Juggle-Token | String | 非必填 | OpenApi的令牌值,通过请求头传递 | **入参** | 名称 | 类型 | 是否必填 | 描述 | | ----------- | ------ | -------- | ------------------------------------------------------------ | | flowVersion | String | 必填 | 流程版本 | | flowKey | String | 必填 | 流程Key | | flowData | Object | 非必填 | 流程定义的入参Key与value的键值对,如果流程没有入参,可以不填 | **出参** | 名称 | 类型 | 描述 | | ---------------- | ------- | ------------------------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程定义中设置的出参结果 | | - flowInstanceId | String | 流程触发后的实例ID | | - status | String | 流程的执行状态 | | - data | Map | 流程返回的实际数据,即流程定义中定义的出参 | **示例** 下面以系统内置示例流程为例,展示通过post的方式调用流程 ![触发流程](images/openapi_trigger_flow_post.png) #### 2.获取异步流程结果 **接口** | Path | /v1/open/flow/getAsyncFlowResult/{flowInstanceId} | | ------------ | ------------------------------------------------- | | Method | GET | | Content-Type | application/json | **入参** | 名称 | 类型 | 是否必填 | 描述 | | -------------- | ------ | -------- | -------------- | | flowInstanceId | String | 必填 | 异步流程实例ID | **出参** | 名称 | 类型 | 描述 | | --------- | ------- | ------------------------ | | success | Boolean | 是否成功 | | errorCode | Long | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程定义中设置的出参结果 | **示例** ``` http://localhost:9127/v1/open/flow/getAsyncFlowResult/async_PdCPkVCdgpyAB2e0?juggleToken=eyJ1c2VySWQiOjEsInRpbWVzdGFtcCI6MTcxMjE2MTIxNDAzOH0= ``` ![异步获取流程结果](images/openapi_get_flow_result.png) --- --- url: /docs/guide/integration/skill.md description: 将现在juggle的能力转成技能,让用户可以在各种依赖技能的claw都能快速使用juggle的流程。 --- # Openclaw集成Juggle技能 openclaw作为超级智能体,受到了越来越多的人的喜爱,国内也出了非常多的类似产品,这些智能体都得益于skill的能力,通过渐进式披露的方式,让大模型通过少量的上下文大模型就能准确的执行相关的任务,相对老一代的智能体确实强大了非常多,但是目前openclaw等类似产品仍然存在一些痛点。 * **非常烧token** 虽然随着大模型的不断发展,token调用的费用在不断降低,openclaw由于内置工具和本身机制的原因,在实际使用的过程中,会向上下文中添加大量的内容,token的消耗是非常大的,对于很多个人用户来说成本还是有点高的。 * **缺乏稳定性** openclaw类似的产品本身没有突破性的创新,本质还是将已经成熟的一下技术(如:skill,mcp等)整合到一起后的产品,由于大模型的参与,导致还是会存在无法触发或者触发不正确的情况,因此对于稳定性要求非常高的场景就并不适合直接使用。 juggle skill这个技能主要是为了解决openclaw上述的两个痛点,用户将自己的业务场景在juggle上设计成一个流程,并将流程元数据配置到juggle skill上,然后就能在openclaw中触发对于的业务场景了,有了juggle skill后,我们就不用装那么多的其他skill了,token的使用自然就会大大降低,同时流程是绝对稳定的,对于需要高确定性的场景就非常适合。 下面详细介绍一下juggle技能的安装流程,让我们在享受openclaw带来便捷性的同时,同时满足严谨业务流程的场景需求。 ### 1.安装juggle skill 通过下面的命令安装juggle技能 ```xml npx clawhub@latest install juggle ``` 或者直接下载juggle的技能zip包进行安装,[juggle技能下载地址](https://clawhub.ai/somta/juggle) ### 2.配置域名和认证令牌 juggle skill在运行的时候会依赖两个两个环境变量,分别是juggle服务部署的域名和流程访问的认证令牌,认证令牌的创建方式如下图所示 ![申请令牌](images/gen_token.png) 完成令牌的创建后,需要在openclaw.json配置文件中设置相关的环境变量,代码如下所示 ```json "skills": { "entries": { "juggle": { "env": { "MC_JUGGLE_BASE_URL": "你的juggle部署域名", "MC_JUGGLE_TOKEN": "你的juggle认证令牌" }, } } ``` 修改完成后运行下面的命令重启openclaw ``` openclaw gateway restart ``` ### 3.调用示例流程 完成上面的配置后,就可以在openclaw中试调用官方skill内置的示例流程了,在openclaw中输入\*\*“调用示例流程 用户名称juggle,密码123456,我的收入为1000000”\*\*,成功触发了示例流程,并输出了正确的调用结果,如下图所示 ![openclaw聊天触发juggle流程](images/openclaw_chat.png) ### 4.配置自己的工作流程 通过上面的步骤,已经完成了示例流程调用,juggle skill官方skill中内置了官方示例流程的元数据,如果你希望自己的设计好的流程也能在juggle skill上被识别到,并被调用,可以在flow\_spec.md将自己流程的元数据信息(包括流程版本,流程key,触发地址,流程的出入参)添加进行即可,具体格式和内容可以参考如下 ### 1. 同步示例工作流 #### 基本信息 * **流程版本**: v1 * **流程 Key**: sync\_example * **流程类型**: sync(同步流程) * **触发地址**: `{BASE_URL}/open/v1/flow/trigger/v1/sync_example` #### 入参说明 | 参数名 | 类型 | 是否必填 | 描述 | |--------|------|----------|------| | userName | String | 必填 | 用户名 | | password | String | 必填 | 密码 | | deposit | Integer | 必填 | 存款金额 | **入参示例**: ```json { "flowData": { "userName": "juggle", "password": "123456", "deposit": 666 } } ``` #### 出参说明 | 参数名 | 类型 | 描述 | |--------|------|------| | success | Boolean | 是否成功 | | errorCode | String | 错误码 | | errorMsg | String | 错误信息 | | result | Object | 流程执行结果 | | - flowType | String | 流程类型(sync/async) | | - flowInstanceId | String | 流程实例 ID | | - status | String | 流程状态(FINISH/ABORT/RUNNING) | | - data | Object | 流程返回数据 | | -- userName | String | 用户名 | | -- age | String | 年龄 | | -- orderName | String | 订单名称 | **出参示例**: ```json { "success": true, "errorCode": "0", "errorMsg": null, "result": { "flowType": "sync", "flowInstanceId": "sync_fYCVeFNzrvwe4k8Z", "status": "FINISH", "data": { "userName": "juggle", "age": "18", "orderName": "送10元话费" } } } ``` #### 调用示例 **命令行调用**: ```bash python /workspace/projects/juggle/scripts/flow.py trigger \ --flow-version "v1" \ --flow-key "sync_example" \ --flow-data '{"userName": "juggle", "password": "123456", "deposit": 666}' ``` **预期输出**: ``` [触发流程] 正在触发流程... [触发结果] { "success": true, "errorCode": "0", "errorMsg": null, "result": { "flowType": "sync", "flowInstanceId": "sync_fYCVeFNzrvwe4k8Z", "status": "FINISH", "data": { "userName": "juggle", "age": "18", "orderName": "送10元话费" } } } [同步流程] 执行完成 ``` --- --- url: /docs/guide/integration/spring-boot-juggle.md description: SpringBoot快速集成Juggle,完成Juggle能力的融入,增强业务系统能力。 --- # SpringBoot集成Juggle SpringBoot作为Java开发最常见的框架,我们提供了对应的Starter的,通过Starter我们能快速接入Juggle,具体接入步骤如下: ### 1.添加依赖 ```xml net.somta juggle-spring-boot-starter 1.1.4 ``` ### 2.登录Juggle,申请一个令牌 ![申请令牌](images/gen_token.png) ### 3.在项目的的配置文件中添加如下配置 ```properties #Juggle服务部署的地址 juggle.server-addr=http://127.0.0.1:9127 #Juggle后台申请的令牌 juggle.access-token=eyJ1c2VySWQiOjEsInRpbWVzdGFtcCI6MTcxMjE2MzgyNzE2OH0= ``` ### 4.通过IJuggleTemplate调用流程接口 ```java @Tag(name = "业务服务集成Juggle接口") @RestController @RequestMapping("/flow") public class FlowIntegrationController { @Autowired private IJuggleTemplate juggleTemplate; @Operation(summary = "集成触发流程") @PostMapping("/triggerFlow") public BaseResponse triggerFlow(@RequestBody TriggerFlowParam triggerFlowParam){ try { ResponseDataResult flowResult = juggleTemplate.triggerFlow(triggerFlowParam.getFlowVersion(), triggerFlowParam.getFlowKey(),triggerFlowParam.getTriggerData()); if(flowResult.isSuccess()){ return BaseResponse.setSuccessResponse(flowResult.getResult()); }else { return BaseResponse.setErrorResponse(flowResult.getErrorMsg()); } } catch (IOException e) { e.printStackTrace(); return BaseResponse.setErrorResponse("调用流程异常了"); } } @Operation(summary = "集成获取异步流程结果") @PostMapping("/getAsyncFlowResult") public BaseResponse> getAsyncFlowResult(String flowInstanceId){ try { ResponseDataResult> asyncFlowResult = juggleTemplate.getAsyncFlowResult(flowInstanceId); if(asyncFlowResult.isSuccess()){ return BaseResponse.setSuccessResponse(asyncFlowResult.getResult()); }else { return BaseResponse.setErrorResponse(asyncFlowResult.getErrorMsg()); } } catch (IOException e) { e.printStackTrace(); return BaseResponse.setErrorResponse("调用异步流程流程异常了"); } } } ``` --- --- url: /docs/guide/introduce/concept.md description: Juggle提供了哪些概念,这些概念都是什么意思? --- # 概念 ### 套件 套件主要是一系列的接口集合,避免接口过多在流程编排的过程中选接口会变的非常麻烦,同时提供了套件和接口的使用说明 ### 接口 接口是不同微服务对外提供的rest接口,接口是编排过程中的最小单位,开发者可以通过在页面上新建接口或通过starter自动上传的方式来新增接口。 ### 流程定义 流程定义是流程部署前的前置步骤,先通过流程定义出一个满足需求的流程,测试通过后,将流程部署,最终得到一个用于生产环境的流程,流程定义将开发过程和正式运行完全隔离开,避免了对正式环境的干扰。 ### 流程 流程是由流程定义部署得到的产物,流程下会包含多个流程版本。 ### 流程版本 流程版本是由流程部署得到的产物,一个流程对应多个流程版本,每个流程版本都有一个唯一的触发地址,每个流程被启用后才能被正式使用,通过多版本流程可以轻松实现流程的灰度切换和升级。 ### 变量 变量是指流程中的变量,跟程序中的变量类似,都是用于承接和流转数据,通过变量,接口,判断可以通过编排的形式实现业务逻辑。 ### 对象 对象是用于入参和出参中承载复杂信息的,在实际的系统对接和编排过程中,只靠简单的数据类型往往无法满足业务场景的需求,此时可以通过基础类型+对象的组合,进行复杂类型的封装,然后用于流程编排。 --- --- url: /docs/guide/introduce/introduce.md description: 关于Juggle的详细介绍 --- # Juggle简介 ### 概览 Juggle中文有“积木,魔法”的意思,寓意Juggle像积木一样灵活,像魔法一样强大,满足灵活多变的业务需求,定制化开发等业务场景,助力业务快速落地! ### Juggle能做什么? Juggle是一个图形化的微服务编排工具,通过简单的流程编排,快速完成接口开发,大大提高开发效率,Juggle致力于完成以下几个使命: * 微服务的接口编排,根据已有的基础接口快速开发新接口 * 第三方系统平台对接集成,快速打通系统之间的壁垒 * 面向前端提供聚合适配聚合层(即业界的BFF层) * 私有化标准功能的定制开发,通过Juggle实现定制部分,避免污染标准代码 --- --- url: /docs/guide/open/contributing-flow.md description: 如何给Juggle贡献代码,Juggle有哪些贡献源码的方式? --- # 如何贡献 我们非常欢迎您的贡献和加入,无论是微不足道的清理或大的新功能。我们希望为每个编程语言提供高质量、有良好文档的代码。 这也不是代码是唯一有贡献项目的方式。我们非常重视文档、与其他项目的集成,并欣然接受这些方面的改进。 ## 社区贡献 * 点亮Star,照亮Juggle开源之路!! * * 完善[Juggle文档](https://github.com/somta/Juggle/tree/develop/docs) * 在你自己的博客、微博、微信公众号、vlog 等自媒体分享有关Juggle的一切。也非常欢迎将实战内容通过PR进行贡献合并在Juggle的官方文档进行展示。 * 把Juggle分享给更多的人 ## 源码贡献 ### 1.fork somta/Juggle项目到您的github库 ### 2.克隆您fork的Juggle代码仓库到您本地 ``` git clone ${your fork Juggle repo address} cd Juggle ``` ### 3.添加somta/Juggle仓库为upstream仓库 ``` git remote add upstream https://github.com/somta/Juggle.git git remote -v origin ${your fork nacos repo address} (fetch) origin ${your fork nacos repo address} (push) upstream https://github.com/somta/Juggle.git (fetch) upstream https://github.com/somta/Juggle.git (push) git fetch origin git fetch upstream ``` #### 4.选择一个开发的基础分支,通常是develop,并基于此创建一个新的分支 ``` (在本地基于develop分支创建开发修复分支, 通常以该PR对应的issue号作为开发分支名) git checkout -b develop-issue#${issue-number} develop ``` #### 5.在本地新建的开发分支上修复对应的问题 修改时请保证该分支上的修改**仅和issue相关**,并尽量细化,做到**一个分支只修改一件事,一个PR只修改一件事** 提交修改记录请尽量使用英文描述,遵守标准的提交规范,如果有具体的issue号,可以在提交信息标明,如: Fix: #10023 修复流程表达式执行异常 #### 6.Rebase基础分支和开发分支 您修改的时候,可能别人的修改已经提交并被合并,此时可能会有冲突,这里请使用rebase命令进行合并解决,主要有2个好处: 1. 您的提交记录将会非常优雅,不会出现`Merge xxxx branch` 等字样 2. rebase后您分支的提交日志也是一条单链,基本不会出现各种分支交错的情况,回查时更轻松 ``` git fetch upstream git rebase -i upstream/develop ``` #### 7.将您开发完成rebase后的分支,上传到您fork的仓库 ``` git push origin develop-issue#${issue-number} ``` #### 8.按照拉取请求模板中的清单创建Pull Request 我们为您提供了[Pull Request模板](/docs/guide/open/pull-request),填写模板中的信息即可,模板的信息是为了让我们更快验证您提交的PR,以便合并到基础分支,让更多人收益,请您认真填写。 #### 9.如果代码没有问题,我们会把您的修改合并到基础分支中,恭喜您成为Juggle的官方贡献者 --- --- url: /docs/guide/open/pull-request.md description: 开源项目的Pull Request模板。 --- # Pull Request模板 ### 相关 Issue 请列出与此 Pull Request 相关的 Issue 编号(如果有的话)。 ### 修改内容 请描述你所做的修改及其目的。 ### 测试步骤 请提供测试此 Pull Request 的步骤和说明。 ### 预期的行为 请描述你期望这个 Pull Request 完成的目标。 --- --- url: /docs/guide/open/reporting-bug.md description: 如何给Juggle提问题,提交问题的格式。 --- # 如何提交问题报告 如果Juggle项目的任何代码或文档存在问题,请通过[opening an issue](https://github.com/somta/Juggle/issues/new)告诉我们。我们会认真对待 每一个错误,在产品面前没有不重要的问题。不过在创建错误报告之前,请检查是否存在报告相同问题的issues。 为了使错误报告准确且易于理解,请尽可能多的提供细节如:那个版本,什么环境,什么配置,错误日志,具体复现步骤等,具体可参考一下模板。 ``` ### 基础信息 操作系统:Ubuntu Juggle版本:1.0.0 部署方式:Docker ### 问题描述 ### 复现步骤 1. 2. 3. ### 错误日志或截图 ``` --- --- url: /docs/guide/operation/deployment-cluster.md description: 通过集群模式部署一个高可用的Juggle,可用于生产环境 --- # 集群模式部署 集群模式主要用于生产环境,要确保Juggle服务的高可用、高扩展、高并发等要求,确保在单节点故障发生时不影响业务的运行。故提出以下几点要求 1. Juggle要多实例部署 2. 中间件切换为MySql数据库,Redis缓存这种具有更高可用性的中间件 3. 使用域名访问Juggle,不要直连IP,避免单机器宕机后,ip变动导致的问题 集群模式下,架构图如下所示 ![集群部署架构图](images/cluster_deploy_framework.png) 具体切换MySql数据库和Redis缓存的方法可以参考Juggle单机部署的方法 [单机模式部署](https://juggle.plus/docs/guide/operation/deployment-standalone) :::warning 集群模式下存在多个Juggle实例,不能使用内置H2数据库存储数据,要切换成Mysql等高可用的数据库;也不能使用内置缓存,要切换为Redis缓存, 因为多实例下使用各自的内存缓存,会导致缓存中的流程结果混乱。 ::: --- --- url: /docs/guide/operation/deployment-overview.md description: 如何快速介绍微服务编排框架Juggle? --- # 部署手册概览 ### 1.Juggle支持的两种部署模式 单机模式 - 又称单例模式,主要用于测试和单机试用。 集群模式 - 主要用于生产环境,确保高可用。 #### a.单机模式 单机模式又称单例模式,拥有所有Juggle的功能及特性,具有极易部署,快速启动等优点。但是无法与其他Juggle实例组成集群,无法在节点或网络故障时提供高可用能力。单机模式同样可以使用内置H2数据库(默认)和外置数据库进行存储。 单机模式主要适合于工程师于本地搭建或于测试环境中搭建Juggle环境,主要用于开发调试及测试使用;也能够兼顾部分对稳定性和可用性要求不高的业务场景。 单机模式的部署参考文档: [单机模式部署](https://juggle.plus/docs/guide/operation/deployment-standalone) #### b.集群模式 集群模式又称多例模式,通过将多个Juggle实例节点组成一个集群,集群模式具有高可用、高扩展、高并发等优点,确保在故障发生时不影响业务的运行。集群模式**必须采用**外置数据库和外置缓存进行存储。 该模式主要适合于生产环境,也是我们推荐的部署模式。 单机模式的部署参考文档: [集群模式部署](https://juggle.plus/docs/guide/operation/deployment-cluster) --- --- url: /docs/guide/operation/deployment-standalone.md description: 通过单机模式快速部署Juggle环境,方便测试和试用 --- 在快速开始章节,我们使用内置的H2数据库,通过多种方式快速部署了Juggle的单机模式,可以参考使用H2数据库的Juggle单机模式部署:[宿主机单机模式部署](https://juggle.plus/docs/guide/start/quick-start) ,[Docker单机模式部署](https://juggle.plus/docs/guide/start/start-with-docker)。 ### 1.使用内置H2数据库 单机模式使用内置数据库和内存缓存,这是Juggle最简的部署方式,这种部署方式不依赖任何中间件,部署起来非常简单,具体部署方式可以参考:[宿主机单机模式部署](https://juggle.plus/docs/guide/start/quick-start) ,[Docker单机模式部署](https://juggle.plus/docs/guide/start/start-with-docker)。 ### 2.使用外置MySql数据库和Redis缓存 对于测试环境或者稳定性要求不高的场景,又需要更好的保存数据时,就可以将内置H2数据库换成MySql等数据库,将内存缓存缓存Redis缓存。 #### a.切换Mysql数据库 1)执行建表语句和初始数据 建表语句地址:[MySql建表语句](https://github.com/somta/Juggle/blob/master/console/src/main/resources/db/schema.sql) 初始数据地址:[MySql初始化语句](https://github.com/somta/Juggle/blob/master/console/src/main/resources/db/data.sql) 2)修改application.properties配置文件配置,启用Mysql的连接信息 ```properties ##H2## #spring.datasource.driver-class-name=org.h2.Driver #spring.datasource.url=jdbc:h2:file:./console/src/main/resources/data/db_juggle;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;AUTO_SERVER=TRUE;OLD_INFORMATION_SCHEMA=TRUE #spring.datasource.username=sa #spring.datasource.password=juggle #spring.h2.console.enabled=true #spring.h2.console.settings.web-allow-others=true #spring.h2.console.path=/h2-console ##注释上面内置H2数据库配置,放开MySql配置## spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/juggle?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false spring.datasource.username=root spring.datasource.password=123456 ``` #### b.切换Redis缓存 修改application.properties配置文件配置,启用Redis的配置信息 ```properties ##启用Redis的配置## juggle.cache.cache-type="redis" juggle.cache.redis.model="single" juggle.cache.redis.address=127.0.0.1:6379 juggle.cache.redis.password= ``` ### 3.使用修改后的配置文件 #### a.宿主机单机部署 window或linux上宿主机的单机部署,直接修改config目录下的application.properties中的配置即可,如下图所示位置的配置文件 ![juggle配置](images/application_config.png) #### b.Docker单机部署 docker部署的时候,直接使用挂载的方式覆盖容器内部的配置文件即可,具体命令如下 ```yaml version: '3' services: juggle: image: somta/juggle:latest container_name: juggle ports: - "9127:9127" volumes: - ./conf/application.properties:/home/juggle/conf/application.properties ``` --- --- url: /docs/guide/operation/system-configurations.md description: 如何快速介绍微服务编排框架Juggle? --- # 系统参数 Juggle提供了丰富的配置适配不同的场景,可以通过修改application.properties里面的配置项,下面会详细介绍每个配置的作用和配置方法 ## 一.服务配置 ### 1.基础配置 | 参数名 | 含义 | 可选值 | 默认值 | | ------------------------ | -------------------- | ------ | ------------- | | server.port | Juggle Server 的端口 | 正整数 | 9127 | | spring.application.name | Juggle Server 的名称 | 字符串 | juggle | | spring.jackson.time-zone | Juggle服务时区 | 字符串 | Asia/Shanghai | ### 2.数据库配置 | 参数名 | 含义 | 可选值 | 默认值 | | ----------------------------------- | -------------------------------- | -------------------- | ---------------- | | spring.datasource.driver-class-name | 数据库的驱动名称 | 所用数据库的驱动名称 | org.h2.Driver | | spring.datasource.url | 数据库连接地址 | 所用数据库的连接地址 | ./data/db\_juggle | | spring.datasource.username | 数据库账号 | 所用数据库的账号 | sa | | spring.datasource.password | 数据库密码 | 所用数据库的密码 | juggle | | spring.datasource.maximum-pool-size | 数据库连接池的最大连接数 | 正整数 | 100 | | spring.datasource.minimum-idle | 数据库连接池的最小空闲连接数 | 正整数 | 10 | | spring.datasource.idle-timeout | 允许连接在连接池中闲置的最长时间 | 正整数 | 60000毫秒 | ### 3.缓存配置 | 参数名 | 含义 | 可选值 | 默认值 | | ---------------------------------- | ---------------------------------------- | --------------------------------------------------------- | ------------------------ | | juggle.open-server-addr | 市场域名,用于私有化市场时配置自己的域名 | 根据用户环境的域名进行配置 | https://open.juggle.plus | | juggle.cache.cache-type | 缓存类型 | memory/redis | memory | | juggle.cache.redis.model | 当使用redis作为缓存时,redis的模式 | single: 单机模式 sentinel: 哨兵模式 cluster: 集群模式 | single | | juggle.cache.redis.address | Redis的连接地址,多个地址用逗号隔开 | 字符串 | null | | juggle.cache.redis.password | Redis的密码 | 字符串 | null | | juggle.cache.redis.sentinel-master | Redis采用哨兵模式时,主服务器名称 | 字符串 | null | ## 二.镜像环境变量配置 | 环境变量名称 | 含义 | 可选值 | 默认值 | | ------------ | ------------------- | ------ | ------------- | | JVM\_XMS | JVM堆的初始内存 | 字符串 | 1g | | JVM\_XMX | JVM堆的最大内存 | 字符串 | 1g | | JVM\_MS | JVM元空间的初始内存 | 字符串 | 128m | | JVM\_MMS | JVM元空间的最大内存 | 字符串 | 320m | | JVM\_GC\_LOG | 是否开启gc日志记录 | 字符串 | false | | TIME\_ZONE | 应用程序时区 | 字符串 | Asia/Shanghai | ## --- --- url: /docs/guide/start/quick-start.md description: 一篇文章帮你开始使用Juggle微服务编排框架。 --- # Juggle快速开始 这个快速开始手册是帮忙您快速在您的电脑上,下载、安装并使用 Juggle。 ### 1.环境准备 Juggle依赖Java环境来运行,因此您先要在设备上安装jdk,请保证是在以下版本环境中安装使用: a. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 b. 64 bit JDK 21;[jdk-21下载地址](https://www.oracle.com/java/technologies/downloads/#java21) & [配置](https://docs.oracle.com/cd/E19182-01/820-7851/inst_cli_jdk_javahome_t/)。 ### 2.下载安装包 您可以从 [最新稳定版本](https://github.com/somta/Juggle/releases) 下载 `juggle-server-$version.zip` 包,window下直接通过解压工具解压`juggle-server-$version.zip`,Linux/Unix/Mac通过如下命令解压 ``` tar -xvf juggle-server-$version.tar.gz ``` ### 3.启动服务器 启动脚本在juggle/bin目录 **a.window启动** 双击startup.cmd运行文件 **b.Linux/Unix/Mac启动** ``` sh startup.sh ``` **c.ubuntu启动** ``` bash startup.sh ``` ### 4.访问Juggle 启动成功后,浏览器输入http://127.0.0.1:9127访问Juggle,默认登录信息 账号:juggle 密码:juggle ### 5.关闭服务器 **a.window关闭** 双击shutdown.cmd运行文件 **b.Linux/Unix/Mac关闭** ``` sh shutdown.sh ``` **c.ubuntu关闭** ``` bash shutdown.sh ``` --- --- url: /docs/guide/start/start-with-docker.md --- # Juggle Docker 快速开始 ## 一.直接docker命令运行 直接在支持docker的环境运行如下命令就可以启动Juggle ```shell docker run --name juggle -d -p 9127:9127 somta/juggle:latest ``` ## 二.使用docker-compose运行 ### 1.创建一个docker-compose.yml文件,文件内容如下 ```yaml version: '3' services: juggle: image: somta/juggle:latest container_name: juggle ports: - "9127:9127" volumes: - ./conf/application.properties:/home/juggle/conf/application.properties ``` > 建议将配置文件外挂,启动的时候通过volumes挂载,这样更方便后续维护 ### 2.在docker-compose.yml的目录下新建一个conf目录,下面新建一个application.properties配置文件 ```properties server.port=9127 spring.application.name=juggle spring.threads.virtual.enabled=true spring.jackson.time-zone=Asia/Shanghai ##H2## spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:file:/data/db_juggle;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;AUTO_SERVER=TRUE;OLD_INFORMATION_SCHEMA=TRUE spring.datasource.username=sa spring.datasource.password=juggle spring.h2.console.enabled=true spring.h2.console.settings.web-allow-others=true spring.h2.console.path=/h2-console ##MySql## #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.datasource.url=jdbc:mysql://127.0.0.1:3306/juggle?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false #spring.datasource.username=root #spring.datasource.password=123456 ##Redis Cache## #juggle.cache.cache-type="redis" #juggle.cache.redis.model="single" #juggle.cache.redis.address=127.0.0.1:6379 #juggle.cache.redis.password= ``` ### 3.启动Juggle ``` docker-compose up -d ``` --- --- url: /docs/guide/start/start-with-kubernetes.md --- # Juggle Kubernetes 快速开始 ### 1.新建ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: name: juggle-configmap data: application.properties: |- server.port=9127 spring.application.name=juggle spring.threads.virtual.enabled=true spring.jackson.time-zone=Asia/Shanghai ##H2## spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:file:/data/db_juggle;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false;IGNORECASE=TRUE;AUTO_SERVER=TRUE;OLD_INFORMATION_SCHEMA=TRUE spring.datasource.username=sa spring.datasource.password=juggle spring.h2.console.enabled=true spring.h2.console.settings.web-allow-others=true spring.h2.console.path=/h2-console ##MySql## #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #spring.datasource.url=jdbc:mysql://127.0.0.1:3306/juggle?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false #spring.datasource.username=root #spring.datasource.password=123456 ##Redis Cache## #juggle.cache.cache-type="redis" #juggle.cache.redis.model="single" #juggle.cache.redis.address=127.0.0.1:6379 #juggle.cache.redis.password= ``` 将上述的ConfigMap的内容保存为juggle-configmap.yaml文件,并通过下面的命令创建ConfigMap ```shell kubectl apply -f juggle-configmap.yaml ``` ### 2.新建Service ```yaml apiVersion: v1 kind: Service metadata: name: juggle-service spec: selector: app: juggle ports: - protocol: TCP port: 9127 targetPort: 9127 ``` 将上述的Service的内容保存为juggle-service.yaml文件,并通过下面的命令创建Service ```shell kubectl apply -f juggle-service.yaml ``` ### 3.新建Deployment ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: juggle-deployment spec: replicas: 1 selector: matchLabels: app: juggle template: metadata: labels: app: juggle spec: containers: - name: juggle image: somta/juggle:latest ports: - containerPort: 9127 volumeMounts: - name: config-volume mountPath: /data/application.properties subPath: application.properties volumes: - name: config-volume configMap: name: juggle-configmap ``` 将上述的Deployment的内容保存为juggle-deployment.yaml文件,并通过下面的命令创建Deployment ```shell kubectl apply -f juggle-deployment.yaml ``` --- --- url: /docs/guide/test/performance-test.md description: 微服务编排框架juggle的性能怎么样?这篇文章讲清楚了 --- # 性能测试 ### 1.性能测试背景 Juggle作为一个底层的编排框架,在性能方面我们有这极致的追求,对于引擎的核心代码,我们进行过逐行的性能优化,精益求精,在流程执行的过程中对系统几乎没有额外的性能消耗,最终做到了流程本身的耗时普遍在10-20毫秒。 Juggle在实际场景中的执行效率也非常高,在落地的公司核心场景中,单节点的性能也能达到1600的TPS,集群下能达到1W以上的TPS,经过多家大型公司的流量验证。 虽然Juggle框架本身性能很好,但是整体的执行效率却依赖套件中实际接口的快慢,如果业务接口本身就比较慢,通过Juggle进行编排后,流程的TPS也不会高,这是业务接口本身的性能问题,不是Juggle框架的性能问题,因此需要提高整体流程的性能,还需要框架和接口共同努力提高性能,才能达到一个最好的效果。 ### 2.性能工具与配置 | 环境 | 参数 | | | -------- | ----------------------------------------------------- | ---- | | 压测工具 | JMeter 5.6 | | | 镜像 | Juggle官方Docker镜像 | | | 配置 | 镜像分配4核4G的内存,SpringBoot默认采用Tomcat作为容器 | | ### 3.性能压测案例 性能压测采用大家最熟悉的官方[示例流程](https://juggle.plus/docs/guide/user/example-flow/)进行压测,示例流程包含8个节点,其中包含3个方法节点,2个判断节点,基本符合一个常见的业务流程需求,其中示例流程中的接口不调用真实接口,走接口的数据mock,但是流程日志,流程节点日志都会正常记录,采用官方的Docker镜像进行性能测试,并给镜像分配4核4G的配置进行压测实验(**如果采用更高配置或多副本集群部署性能更好**),具体的压测结果如下 #### a.300线程,并发循环500次 ![300线程循环500次结果](images/300_500.png) #### b.600并发,循环500次 ![600线程循环500次结果](images/600_500.png) #### c.900并发,循环500次 ![900线程循环500次结果](images/900_500.png) --- --- url: /docs/guide/user/api.md description: 接口是微服务编排的最小单元,通过编排接口可以实现复杂且强大的功能。 --- # 接口 接口是流程设计时使用的最小单元之一,主要用来承载各种不同的api接口,接口可以通过手动创建,业务服务推送自动创建,Juggle主动拉起自动创建等创建来源。 ### 创建接口 1.在"**套件**" > "**套件列表**" 页面,点击“**接口列表**”菜单,进入“**接口列表**”页面 2.在右侧弹出的抽屉中,完成**套件**,**接口名称**,**接口地址**,**请求类型**,**请求内容类型**,**接口描述**(非必填),**接口入参**(非必填),**接口出参**(非必填) 3.点击**确定**按钮,创建接口 ![创建接口](images/add_api.png) 请求类型支持:**GET**, **POST**, **PUT**, **DELETE** 请求体类型支持: **application/json**, **application/x-www-form-urlencoded** 数据类型支持:[Juggle支持的数据类型](/docs/guide/user/data-type-info/) ### 修改接口 1.在"**接口**" > "**接口列表**" 页面,点击“**新建**”按钮 2.在右侧弹出的抽屉中,完成**套件**,**接口名称**,**接口地址**,**请求类型**,**请求内容类型**,**接口描述**(非必填),**接口入参**(非必填),**接口出参**(非必填) 3.点击**确定**按钮,修改接口 ![编辑接口](images/edit_api.png) ### 删除接口 1.在"**接口**" > "**接口列表**" 页面,点击“**删除**”按钮 2.在二次确认弹框中,再次点击“**确定**”按钮 :::info 删除接口并不会影响已经在流程设计中和已经上线的流程对该接口的使用,只是删除后,后续在进行流程设计的时候就选不到该接口了。 ::: --- --- url: /docs/guide/user/data-type-info.md description: Juggle支持丰富的数据类型,为不同字段定义合适的数据类型,能更加方便的编排数据和接口。 --- # 支持的数据类型 ### 数据类型 数据类型用于指定接口的出入参类型,变量类型,目前数据类型分为三大类:基础类型,集合类型,对象类型,每种大类下的具体类型如下表所示: | 数据类型分类 | 数据类型 | | ------------ |-----------| | 基础类型 | 字符串 | | | 整数 | | | 小数 | | | 布尔 | | | 日期 | | | 时间 | | 集合类型 | 集合 | | 对象类型 | 订单(用户自定义) | | | 商品(用户自定义) | ### 数据类型支持的表达式 每一种数据类型支持的表达式是不一样的,这个是由数据类型的格式和形态决定的,下面的表格列出了Juggle每种数据类型支持的表达式。 | 数据类型分类 | 数据类型 | 表达式 | 示例 | 示例说明 | | ------------ | ------------------ | -------- | ------------------------------------------ | ------------------------------------------- | | 基础类型 | 字符串 | 等于 | env\_name=="zhansan" | 变量env\_name等于zhansan | | | | 不等于 | env\_name!="zhansan" | 变量env\_name不等于zhansan | | | | 为空 | string.empty(env\_name) | 变量env\_name为空 | | | | 不为空 | !string.empty(env\_name) | 变量env\_name不为空 | | | | 包含 | string.contains(s1,s2) | 字符串s1包含字符串s2 | | | | 不包含 | !string.contains(s1,s2) | 字符串s1不包含字符串s2 | | | | | | | | | 整数 | 等于 | env\_age==18 | 变量env\_age等于18 | | | | 不等于 | env\_age!=18 | 变量env\_age不等于18 | | | | 大于 | env\_age>18 | 变量env\_age大于于18 | | | | 大于等于 | env\_age>=18 | 变量env\_age大于等于18 | | | | 小于 | env\_age<18 | 变量env\_age小于18 | | | | 小于等于 | env\_age<=18 | 变量env\_age小于等于18 | | | | | | | | | 小数 | 等于 | env\_money==100.23 | 变量env\_money等于100.23 | | | | 不等于 | env\_money!=100.23 | 变量env\_money不等于100.23 | | | | 大于 | env\_money>100.23 | 变量env\_money大于100.23 | | | | 大于等于 | env\_money>=100.23 | 变量env\_money大于等于100.23 | | | | 小于 | env\_money<100.23 | 变量env\_money小于100.23 | | | | 小于等于 | env\_money<=100.23 | 变量env\_money小于等于100.23 | | | | | | | | | 布尔 | 等于 | env\_is\_login==true | 变量env\_is\_login为true | | | | 不等于 | env\_is\_login!=true | 变量env\_is\_login不为true | | | | | | | | | 时间 | 等于 | date.eq(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday等于2023-12-13 18:14:34 | | | | 不等于 | !date.eq(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday不等于2023-12-13 18:14:34 | | | | 大于 | date.gt(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday大于2023-12-13 18:14:34 | | | | 大于等于 | date.ge(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday大于等于2023-12-13 18:14:34 | | | | 小于 | date.lt(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday小于2023-12-13 18:14:34 | | | | 小于等于 | date.le(env\_birthday,'2023-12-13 18:14:34') | 变量env\_birthday小于等于2023-12-13 18:14:34 | | | 枚举 | | | | | | | | | | | | | | | | | 集合类型 | 集合 | 为空 | list.empty(env\_userList) | 用户列表为空 | | | | 不为空 | !list.empty(env\_userList) | 用户列表不为空 | | | | | | | | 对象类型 | 订单(用户自定义) | 为空 | | | | | | 不为空 | | | --- --- url: /docs/guide/user/design/nodes.md description: 节点是流程的核心,通过不同节点的串联和连接,能配置出非常复杂的流程,满足不同的业务常见需求。 --- # 节点 ### 1.开始节点 开始节点为系统默认节点,表示流程的开始,没有任何业务含义。 ### 2.结束节点 结束节点为系统默认节点,表示流程的结束,没有任何业务含义。 ### 3.方法节点 方法节点是用来承载接口的,通过方法节点,用户在方法节点上定义不同系统的接口,然后通过流程编排打通各个系统之间的屏障,达到各个系统互通互联的目的。 ### 4.判断节点 判断节点是用来承载判断条件的,一个判断节点会有多个分支,默认会有一个else分支,每个分支之间是互斥的,从左往右依次执行,第一个命中的分支将会被触发,如果都没命中就会进入默认的else分支。 判断节点的判断条件只能由一个或多个变量组成,每种数据类型的变量支持的[表达式](/docs/guide/user/data-type-info/#数据类型支持的表达式)是不一样,变量可以是入参变量,出参变量,中间变量,具体变量的赋值来源可以参考[变量](/docs/guide/user/design/variable/)章节。 ### 5.代码节点 自定义代码节点是用来承载代码的,即可以在流程设计过程中添加一个自定义的代码节点,可以在这个节点内直接编写Groovy的脚本代码,脚本代码可以完成变量的组装转换,业务逻辑增强,数据清洗等工作,代码节点将极大的提升Juggle编排的灵活性 --- --- url: /docs/guide/user/design/variable.md description: 变量是流程设计中数据流转的纽带,变量支持全流程跨节点的流转,支持变量表达式。 --- # 变量 变量是整个流程设计中数据流转的纽带,不同变量或变量与参数的相互赋值是根据数据类型来决定的,同一种数据类型的变量和参数之间才能相互赋值传递,变量的[数据类型](/docs/guide/user/data-type-info/)跟方法的出入参类型是一致的,变量主要分为三类,入参变量,出参变量,中间变量,详细介绍如下: ### 1.入参变量 入参变量是根据流程的入参系统自动创建的变量,该变量不能在变量管理中修改,只能通过修改流程的入参来间接修改变量。入参变量能作为流程中任何方法节点的入参赋值,也可以作为判断节点的判断条件。 ### 2.出参变量 出参变量是根据流程的出参系统自动创建的变量,该变量不能在变量管理中修改,只能通过修改流程的出参来间接修改变量。出参变量能作为流程中任何方法节点的出参赋值,但是出参变量不能作为判断节点的判断条件使用。 ### 3.中间变量 中间变量是有用户自己定义的,主要用于流程设计中流程数据使用,可用于方法节点的出入参赋值,也可以用户判断节点的判断条件使用。 --- --- url: /docs/guide/user/example-api.md description: Juggle提供了一些示例接口,这让用户能更快更简单的上手Juggle,解决用户上手困难的问题。 --- # 示例接口 为了让您更快的上手和使用Juggle的编排能力,Juggle为您提供了一些内置的示例接口,通过这些接口可以快速使用Juggle搭建一些具体的使用场景 ### 一.用户示例接口 #### 1.用户登录 url:/example/user/login Method: POST Content-Type: application/json **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | -------- | ------ | -------- | ------ | --------------------------- | | userName | String | 是 | | 用户名称 mock正确值:juggle | | password | String | 是 | | 密码 mock正确值:123456 | **请求参数示例** ```json { "userName": "juggle", "password": "123456" } ``` **响应结果** | 名称 | 类型 | 默认值 | 描述 | | --------- | ------- | ------ | ------------------------------ | | userId | Integer | | 用户ID | | userName | String | | 用户名称 | | loginFlag | Boolean | | true:登录成功 false:登录失败 | **响应结果示例** ```json { "userId": 1, "userName": "juggle", "loginFlag": true } ``` #### 2.获取用户信息 url:/example/user/getUserById Method: GET Content-Type: application/x-www-form-urlencoded **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | -------- | ------- | -------- | ------ | ------ | | userId | Integer | 是 | | 用户ID | **响应结果** | 名称 | 类型 | 默认值 | 描述 | | -------- | ------- | ------ | -------- | | id | Integer | | 用户ID | | name | String | | 用户名称 | | age | Integer | | 用户年龄 | | birthday | Date | | 用户生日 | **响应结果示例** ```json { "id": 1, "name": "张三", "age": 18, "birthday": "2023-11-19" } ``` ### 二.商品示例接口 #### 1.发布商品 url:/example/goods/releaseGoods Method: GET Content-Type: application/json **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | -------------- | ------- | -------- | ------ | -------- | | goodsName | String | 是 | | 商品名称 | | goodsInventory | Integer | 否 | | 商品库存 | **请求参数示例** ```json { "goodsName": "鞋", "goodsInventory": 20 } ``` **响应结果** | 名称 | 类型 | 默认值 | 描述 | | -------------- | ------- | ------ | -------- | | goodsId | Integer | | 商品ID | | goodsName | String | | 商品名称 | | goodsInventory | Integer | | 商品库存 | **响应结果示例** ```json { "goodsId": 999, "goodsName": "鞋", "goodsInventory": 20 } ``` #### 2.获取商品详情 url:/example/goods/getGoodsInfo Method: GET Content-Type: application/json **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | -------------- | ------- | -------- | ------ | -------- | | goodsName | String | 是 | | 商品名称 | | goodsInventory | Integer | 否 | | 商品库存 | **请求参数示例** ```json { "goodsName": "鞋", "goodsInventory": 20 } ``` **响应结果** | 名称 | 类型 | 默认值 | 描述 | | -------------- | ------- | ------ | -------- | | goodsId | Integer | | 商品ID | | goodsName | String | | 商品名称 | | goodsPrice | Double | | 商品单价 | | goodsInventory | Integer | | 商品库存 | **响应结果示例** ```json { "goodsId": 999, "goodsName": "鞋", "goodsPrice": 189.59, "goodsInventory": 20 } ``` ### 三.订单示例接口 #### 1.下单 url:/example/order/placeOrder Method: POST Content-Type: application/x-www-form-urlencoded **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | --------- | ------- | -------- | ------ | -------- | | orderName | String | 否 | | 订单名称 | | userId | Integer | 是 | | 用户ID | **请求参数示例** ```json { "orderName": "测试订单", "userId": 1 } ``` **响应结果** | 名称 | 类型 | 默认值 | 描述 | | --------- | ------- | ------ | -------- | | orderNo | String | | 订单号 | | orderName | String | | 订单名称 | | userId | Integer | | 用户ID | **响应结果示例** ```json { "orderNo": "NO123", "orderName": "这是一个测试订单", "userId": 1 } ``` #### 2.获取订单详情 url:/example/order/getOrderByNo Method: GET Content-Type: application/x-www-form-urlencoded **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | -------- | ------ | -------- | ------ | ------ | | orderNo | String | 是 | | 订单号 | **响应结果** | 名称 | 类型 | 默认值 | 描述 | | --------- | ------- | ------ | -------- | | orderNo | String | | 订单号 | | orderName | String | | 订单名称 | | userId | Integer | | 用户ID | **响应结果示例** ```json { "orderNo": "NO123", "orderName": "测试订单", "userId": 1 } ``` #### 3.获取订单列表 url:/example/order/getUserOrderList Method: GET Content-Type: application/x-www-form-urlencoded **请求参数** | 参数名称 | 类型 | 是否必填 | 默认值 | 描述 | | --------- | ------- | -------- | ------ | -------- | | orderName | String | 否 | | 订单名称 | | userId | Integer | 是 | | 用户ID | **响应结果** | 名称 | 类型 | 默认值 | 描述 | | ----------- | ------- | ------ | -------- | | userId | Integer | | 用户ID | | orderList | List | | 订单列表 | | - orderNo | String | | 订单号 | | - orderName | String | | 订单名称 | | - userId | Integer | | 用户ID | **响应结果示例** ```json { "userId": 1, "orderList": [ { "orderNo": "NO123", "orderName": "测试订单", "userId": 1 }, { "orderNo": "NO456", "orderName": "测试订单", "userId": 1 } ] } ``` --- --- url: /docs/guide/user/example-flow.md description: Juggle提供了一些示例流程,这让用户能更快更简单的上手Juggle,解决用户上手困难的问题。 --- # 示例流程 为了让您更快的上手和使用Juggle的编排能力,Juggle为您提供了一些内置的示例接口,并通过这些示例接口,搭建了“**用户登录,根据用户信息自动送商品**”的示例流程 ### 流程出入参 #### 1.流程入参 | 参数名称 | 类型 | 是否必填 | 描述 | | -------- | ------ | -------- | --------------------------- | | userName | String | 是 | 用户名称 mock正确值:juggle | | password | String | 是 | 密码 mock正确值:123456 | | deposit | Double | 否 | 存款余额 | #### 2.流程出参 | 参数名称 | 类型 | 描述 | | --------- | ------- | -------- | | userName | String | 用户名称 | | age | Integer | 用户年龄 | | orderName | String | 订单名称 | ### 流程图 ![](images/flow_example.png) ### 核心逻辑 1.用户输入账号和密码登录,如果账号密码错误,直接结束流程返回 2.如果存款余额小于10万,就给用户送50元话费 3.如果存款余额大于10万,就给用户送一双耐克鞋 4.流程返回用户姓名,用户年龄,订单名称 ### 测试过程 1.输出错误的登录密码,不会送任何东西,直接返回 ![错误信息](images/flow_example_1.png) 2.用户名和密码正确,存款金额为1000.00,返回的订单是送10元话费 ![小于10万](images/flow_example_2.png) 3.用户名和密码正确,存款金额为300000.00,返回的订单是送一双耐克的鞋 ![大于10万](images/flow_example_3.png) --- --- url: /docs/guide/user/flow-definition.md description: Juggle的流程定义是流程定义是流程设计阶段的产物,支持同步流程和异步流程,支持通过变量进行跨节点流转。 --- # 流程定义 流程定义是流程设计阶段的产物, ### 新建流程定义 1.在**流程定义**页面,点击"**新建**"按钮 2.在右侧弹出的抽屉中,完成**流程名称**,**流程类型**,**流程描述**(非必填) 3.如果流程需要定义入参和出参,可以按需设置流程的出入参 4.点击“**确定**”按钮,创建流程定义 :::tip 同步流程和异步流程的区别 同步流程:在流程被触发的时候直接返回流程的结果,结果返回是实时的。 异步流程:流程被调用的时候只是返回一个流程的实例ID,如果需要流程结果,需要启动一个定时任务轮询去查询流程结果 ::: ### 流程设计 1.在**流程定义**页面,点击"**流程**"按钮 2.在**流程设计**页面,根据需求添加**变量**,**方法节点**,**判断节点**等实体,设计出符合预期流程 ![流程设计](images/flow_example.png) ### 调试流程 流程调试主要是为了保证设计出来的流程是符合预期的,通过调试能力也能让设计者不断调整和优化流程逻辑。 1.在**流程定义**页面,点击"**调试**"按钮 2.在**流程调试**页面,输入流程需要的请求参数 3.点击”**发送**“按钮,发起流程调用,请求成功后,流程结果数据会显示在**响应内容**的区域 ![流程调用](images/flow_example_2.png) ### 部署流程 经过流程设计和流程调试阶段后,这个流程已经设计达到我们的预期的效果,如果需要交付正式使用之前就先要将流程定义部署,部署后的流程与正在设计的流程定义将完全隔离,且每次部署都会产生一个新版本,每个流程版本之间也是相互隔离的,可以达到多个流程版本同时运行和平滑切换的效果,具体可以参考流程版本介绍 1.在**流程定义**页面,点击"**部署**"按钮 2.在二次确认弹框中,再次点击“**部署**”按钮 ![流程部署](images/deploy_flow.png) --- --- url: /docs/guide/user/flow-version.md description: Juggle的流程版本是为了解决用户流程回滚和灰度发布等问题,帮助用户减轻流程切换的成本,提供流程的使用效率。 --- # 流程版本 流程版本是流程运行的最终实体,流程设计完成后部署就会产生一个流程版本,每个流程版本无需用户手动输入,系统会自动增加版本号。 ### 启用流程版本 1.在"**流程**" > "**流程列表**" > "**版本列表**"页面,点击“**启用**”按钮 2.在二次确认弹框中,再次点击“**确定**”按钮 :::info 启用后的流程版本才能被触发调用。 ::: ### 禁用流程版本 1.在"**流程**" > "**流程列表**" > "**版本列表**"页面,点击“\**禁用用*”按钮 2.在二次确认弹框中,再次点击“**确定**”按钮 :::info 禁用后的流程就无法调用了,调用的时候抛出“**请启用流程后在调用流程**”的提示。 ::: ### 删除流程版本 1.在"**流程**" > "**流程列表**" > "**版本列表**"页面,点击“**删除**”按钮 2.在二次确认弹框中,再次点击“**确定**”按钮 :::info 启用中的流程版本是无法删除的,如果要删除需要确认没有系统调用后,先禁用流程版本,然后在删除该流程版本 ::: --- --- url: /docs/guide/user/flow.md description: Juggle的流程是流程定义部署后的产物,流程支持多版本,可以实现流程的灰度和快速回滚等能力。 --- # 流程 流程是由流程定义部署后的产物,具体部署过程可以参考[流程定义部署](/docs/guide/user/flow-definition/#部署流程),但是Juggle并没有让流程作为最终的运行实体,因为实际应用场景下如果将流程作为最终的运行实体就会面临以下问题: 1.我刚才部署的问题真实运行的时候发现有问题,怎么快速回滚。 2.旧流程不能下线,但是新流程我要先正式验证一下,然后慢慢切换,类似灰度的过程。 因此Juggle引入了[流程版本](/docs/guide/user/flow-version/)的概念,让[流程版本](/docs/guide/user/flow-version/)做最终运行的实体,以此解决上面的问题。一个流程下会存在多个流程版本。 :::info 同一个流程下的多个流程版本的流程类型一定是相同的。 ::: --- --- url: /docs/guide/user/nodes/assign-node.md description: 通过赋值节点能完成不同分支情况下给同一个变量进行不同的赋值操作,实现不同场景下变量不同的需求。 --- # 赋值节点 赋值节点主要是来用户根据业务场景的需求,在不同的分支条件下对同一变量赋予不同的值,以满足不同的业务场景的赋值的需要。 ### 节点介绍 1.点击“+”,选择赋值节点 2.在代码节点页面,输入**节点名称**,**自定义代码**,点击\*\*“确定”\*\*按钮 ![新增节点](images/add_assign_node.png) ### 功能介绍 赋值节点主要是给中间变量,出参变量进行变量赋值,赋值来源主要包括常量,其他中间变量,其他接口出参等三种情况,最终达到不同分支条件下给同一个变量赋值不同值的目的。 --- --- url: /docs/guide/user/nodes/batch-method-node.md description: 通过并行节点,用户在方法节点上定义不同系统的接口,然后通过流程编排打通各个系统之间的屏障,系统互通互联。 --- # 并行节点 并行节点主要是允许用户在一个节点上同时添加多个接口,同时允许指定多个接口的执行策略,当使用并行执行策略时,会启用多个虚拟线程来调用接口,在同时需要调用多个接口的场景,并且需要较高性能的情况下非常有用。 --- --- url: /docs/guide/user/nodes/code-node.md description: '通过自定义代码节点,用户可以通过Groovy,JavaScript,Python等多种语言,自定义增强流程能力。' --- # 代码节点 代码节点主要是来用户自定义的代码,即可以在流程设计过程中添加一个代码节点,可以通过这些代码完成变量的组装转换,业务逻辑增强,数据清洗等工作,代码节点将极大的提升Juggle编排的灵活性 ### 节点介绍 1.点击“+”,选择代码节点 2.在代码节点页面,输入**节点名称**,**自定义代码**,点击\*\*“确定”\*\*按钮 ![新增节点](images/add_code_node.png) ### 功能介绍 #### a.支持脚本代码 Juggle的代码节点支持Groovy,JavaScript,Python,Java等多种语言代码。 #### 1.Groovy示例 ##### a.在Groovy代码中获取和设置流程变量 在代码节点中可以通过$var.getVariableValue('变量键')来获取变量;通过$var.setVariableValue('变量键',数据)来给指定的变量赋值 ```groovy //获取入参变量input_name def userName = $var.getVariableValue('input_name') //将出参变量的值设置成6666 $var.setVariableValue('output_userName',6666) ``` ##### b.在Groovy代码中使用Json库 Juggle的Groovy引擎也引入了JsonSlurper库,方便在代码中进行字符串和对象的相关操作,关于JsonSlurper的使用介绍可以参考[JsonSlurper使用详解](https://cloud.tencent.com/developer/section/1491433)。 ```groovy import groovy.json.JsonSlurper //获取流程变量字符串 def userStr = $var.getVariableValue('input_user') //实例化一个json对象 def jsonSlurper = new JsonSlurper() // 将字符串反序列化成对象 def user = jsonSlurper.parseText(userStr) //打印user对象的name属性 println(user.name); ``` \*\*Groovy新手教程:\*\*https://cloud.tencent.com/developer/chapter/18236 #### 2.JavaScript示例 在代码节点也允许通过JavaScript脚本来增强流程的能力,下面将详细介绍如何使用JavaScript脚本 ##### a.在JavaScript代码中获取和设置流程变量 在JavaScript脚本中通过$var.getVariableValue('变量key')来获取具体的变量,通过$var.setVariableValue('变量key',值);来对变量进行赋值。 ```javascript // 获取变量 // var env_name = $var.getVariableValue('变量key'); // 设置变量 // $var.setVariableValue('变量key',值); //例子如下: //获取入参变量input_name var userName = $var.getVariableValue('input_name') //将出参变量的值设置成6666 $var.setVariableValue('output_userName',6666) ``` --- --- url: /docs/guide/user/nodes/condition-node.md description: 通过判断节点,用户可以根据流程的变量自由组合出不同的分支流程,通过这些分支流程处理不同的业务逻辑,使流程非常灵活 --- # 判断节点 判断节点是用来承载判断条件的,一个判断节点会有多个分支,默认会有一个else分支,每个分支之间是互斥的,从左往右依次执行,第一个命中的分支将会被触发,如果都没命中就会进入默认的else分支。 ### 节点介绍 1.点击“+”,选择判断节点 2.在代码节点页面,输入**节点名称**,**节点描述**等信息 ![新增判断节点](images/add_condition_node.png) 3.点击**新增分支**按钮,输入**分支名称**,**分支条件**,点击\*\*“确定”\*\*按钮 ![判断节点分支条件](images/add_condition_item.png) ### 功能介绍 #### a.条件执行逻辑 多个判断条件是排它的,从左到右依次匹配,匹配到对应的条件后就会进入命中的分支逻辑,多个分支条件的循序可以在判断节点的面板调整,来调整条件匹配的优先级。 判断节点的判断条件只能由一个或多个变量组成,多个变量和条件之间可以自由的进行且或组合,每种数据类型的变量支持的[表达式](/docs/guide/user/data-type-info/#数据类型支持的表达式)是不一样,可以用于条件判断的变量有入参变量,出参变量,中间变量,具体变量的赋值来源可以参考[变量](/docs/guide/user/design/variable/)章节。 --- --- url: /docs/guide/user/nodes/loop-node.md description: 通过循环节点,可以将接口数据进行循环处理,完成需要大量循环处理的场景。 --- # 循环节点 循环节点主要是解决流程中需要循环执行的场景,如循环查询数据,上一个节点的一个集合数据,需要进行一些处理后,插入到数据库的不同表中的场景,在循环节点内部也能添加不同的节点,通过这些节点来完成循环的能力。 --- --- url: /docs/guide/user/nodes/method-node.md description: 通过方法节点,用户在方法节点上定义不同系统的接口,然后通过流程编排打通各个系统之间的屏障,系统互通互联。 --- # 方法节点 方法节点是用来承载接口的,在该节点中可以选择套件下定义好的接口,然后通过变量给接口请求头或入参赋值,并根据需要将接口出参赋值给变量,供流程编排使用,通过多个系统接口的编排可以打通系统之间的屏障。 ### 节点介绍 1.点击“+”,选择方法节点 2.在方法节点页面,输入**节点名称**,**节点描述**,**选择套件和接口**,**接口请求头/请求参数/出参的赋值**,点击\*\*“确定”\*\*按钮 ![新增方法节点](images/add_method_node.png) ### 功能介绍 #### a.入参赋值 入参赋值支持两种赋值方式: 常量赋值:即根据字段的数据类型,在后面的赋值框中输入对应的常量。 变量赋值:即根据字段的数据类型,在后面的赋值框中选择对应的变量。 #### b.出参赋值 出参赋值只能将接口的参数赋值给字段类型相同的变量(这里包括流程的出参变量和中间变量) :::info 节点编码:由系统自动生成,method\_8位随机. 节点名称:用户输入,最终会显示在流程设计的节点卡片上 节点描述:详细描述这个节点的作用 ::: --- --- url: /docs/guide/user/nodes/mysql-node.md description: 通过数据库节点,用户可以在MySql节点中输入不同的SQL,这些SQL会通过数据源直接在对应的数据源中执行,MySql节点让编排变得更加灵活。 --- # 数据库节点 通过数据库节点,用户可以在流程中直接添加数据库节点,选择不同数据库的数据源后,在节点中添加对表的增删查改的sql语句,实现不用开发接口就能完成对数据的操作。目前已经支持MySQL,PostgreSQL,Oracle,SQLServer,达梦,OceanBase,Doris等十几个常用的数据库。 ### 节点介绍 1.点击“+”,选择判断节点 2.在代码节点页面,输入**节点名称**,**节点描述**,**数据源**,**操作类型**,**SQL语句**等信息,点击\*\*“确定”\*\*按钮 ![新增数据库节点](images/add_mysql_node.png) ### 功能介绍 #### a.数据源 数据源是为SQL执行提供环境,数据源内部还提供了链接池,连接数, 查询超时等多项设置。 可以在"**设置**" > "**数据源**",新增数据源,目前暂时只支持MySql的数据源,后续还会支持ES,Redis等更多的数据源。 #### b.操作类型 执行一个SQL语句主要分为两大类,一类为不太关心执行结果的更改类型的sql语句,如:insert,update,delete;一类为关心结果的查询类型的sql语句,如:query;在流程设计过程中不同类型的操作逻辑会有较大差别,因此我们单独设置了一个选型来区分不同类型 #### c.SQL语句 理论上所有mysql支持的sql语句,都能用在mysql节点,通过这些sql语句能完成普通业务服务所有SQL相关的能力,sql语句中支持插入入参变量,中间变量等,使用时语法参考freemarker即可 1)查询数据 ``` select api_name as apiName, api_url as apiUrl from t_api ``` :::warning 在查询数据的时候需要保证查询的列名称与接受数据的对象的属性参数编码相同,如上面sql对应的接口列表中,接口对象的定义如下图所示 ![接口对象](images/sql_object.png) ::: 2)新增/修改/删除数据 ```sql INSERT INTO t_user (age, name) VALUES (${input_age}, '${input_name}'); ``` :::warning 如果引入的变量是一个字符串时,sql中在使用变量的时候需要在变量外面加上单引号,如下面的例子中name是一个字符串,使用入参变量input\_name时在括号外面加上了单引号 ```sql INSERT INTO t_user (age, name) VALUES (${input_age}, '${input_name}'); ``` ::: #### d.结果输出 查询场景时,支持将查询的结果输出给一个变量,输出的变量给后续流程使用,配置人员需自行保证其查询结果数据类型与所定义变量的数据类型匹配 --- --- url: /docs/guide/user/object.md description: 对象主要是为了解决入参和出参中复杂的数据结构,同时对象的定义让流程编排更加灵活。 --- # 对象 对象主要是为了解决入参和出参中复杂的数据结构,通过基础类型+对象类型的组合,来满足系统对接过程中的复杂结构,同时对象在流程编排中也支持**下探取值**,**取值判断**,**对象判断**等能力,这让流程编排更加灵活。 ### 创建对象 1.在"\*\*对象"\*\*页面,点击“**新建**”按钮 2.在“**新增对象**”面板,完成**对象编码**,**对象名称**,**对象描述**(非必填)设置后,点击“**确认**”按钮 ![新增对象](images/add_suite.png) ### 编辑对象 1.在 "**对象**"页面,点击“**编辑**” 2.在“**编辑对象**”面板,完成**对象编码**,**对象名称**,**对象描述**(非必填)设置后,点击“**确认**”按钮 ![编辑对象](images/edit_suite.png) ### 删除对象 1.在"**对象**"列表页面,点击“**删除**” 2.在二次确认对话框中,点击“**确认**”按钮 :::info 流程中使用的对象,是流程使用那刻的快照,因此从对象列表把对象删除后,并不会影响流程的使用和运行。 ::: --- --- url: /docs/guide/user/suite.md description: 套件包含套件说明,API接口集合,套件帮助文档等多个实体组成,方便用户通过套件快速搭建流程。 --- # 套件 套件包含套件说明,API接口集合,套件帮助文档等多个实体组成。套件的设计能帮忙用户通过自建套件+系统自带套件,快速搭建流程,节省流程搭建的时间。 ### 创建套件 1.在"**接口**" > "**套件**"页面,点击“**新建**”按钮 2.在“**新增套件**”面板,完成**套件编码**,**套件名称**,**套件描述**(非必填)设置后,点击“**确认**”按钮 ![新增套件](images/add_suite.png) ### 编辑套件 1.在"**套件**" > "**套件**"页面,点击“**编辑**” 2.在“**编辑套件**”面板,完成**套件编码**,**套件名称**,**套件描述**(非必填)设置后,点击“**确认**”按钮 ![修改套件](images/edit_suite.png) ### 删除套件 1.在"**套件**" > "**套件**"页面,点击“**删除**” 2.在二次确认对话框中,点击“**确认**”按钮 :::info 套件下如果已经绑定了接口,则不能删除该套件 ::: --- --- url: /price.md --- # 价格 --- --- url: /suite/551ccqsv/index.md description: QQ邮箱如何授权? --- # 企业微信群机器人 https://developer.work.weixin.qq.com/document/path/91770 --- --- url: /suite/8xyu2x0t/index.md --- # dingtalk-robot todo 待补充 https://open.dingtalk.com/document/orgapp/custom-robots-send-group-messages https://open.dingtalk.com/document/orgapp/custom-bot-send-message-type# --- --- url: /suite/bv3xbysc/index.md --- # tongyi-qianwen todo 待补充 --- --- url: /suite/bytedance/robot.md description: >- 飞书自定义机器人可以给特定群组自动推送消息的,例如,推送监控报警、销售线索、运营内容等。自定义机器人默认提供 webhook,通过服务端调用 webhook 地址,即可将外部系统的消息通知即时推送到群组中。自定义机器人也包含了 自定义关键词、IP 白名单 和 签名 三种维度的安全配置,便于控制 webhook 的调用范围。 --- 飞书自定义机器人套件是官方推出的一个套件,飞书自定义机器人是一个非常方便的应用,它能将外部的业务数据、监控报警、 群通知等通过组装推送到特定群,达到自动通知的目的。在Juggle中可以通过飞书自定义机器人的通知能力,将飞书和我们自身的系统应用结合,从而更好地保障我们系统的稳定运行或提高我们的工作效率。通知能力包含: 文本通知、富文本通知、图片通知、群分享。为了更方便使用自定义机器人, 调用推送的一些相关信息如token, user\_id或open\_id,image\_key的获取接口我们也整合好了,只需要拿到相关的appId和appSecret就可以进行自定义机器人的调用了. # 使用指南 ## 自定义机器人调用前置条件: * 需要在群聊中添加自定义机器人, 获取到webhookUrl ![添加自定义机器人](images/add_custom_robot.png) * 按需 前往[飞书开放平台](https://open.feishu.cn/)创建一个自建应用, 获取到appId和appSecret(用于获取用户id或imageKey) ## 套件接口: | 接口 | 请求方法 | 请求路径 | header | query | body | response | |-------------------------|------|-----------------------------------------------------|--------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| | 获取tenant\_access\_token接口 | POST | /suite/v1/fei-shu/info/tenant\_access\_token/internal | | | {appId: string, appSecret: string | {"feishuToken": "t-g1049rlrTX67RIT5XJ2R2F3FXVW5JZWS3LBN6DTH"} | | 获取image\_key | POST | /suite/v1/fei-shu/info/image\_key | feishuToken: string | form-data: file | | {"image\_key": "xxxxxxx"} |\ | 获取用户ID或openId | POST | /suite/v1/fei-shu/info/getUserOrOpenId | feishuToken: string | | {"emails":\["restfulToolkitX"],"mobiles":\["restfulToolkitX"],"includeResigned":true,"userType":"restfulToolkitX"} | {"code":0,"data":{"user\_list":\[{"mobile":"15000000000","user\_id":"ou\_3f32c7e641bvvxxxxxx31350c"}]},"msg":"success"} | | | 发送文本 | POST | /suite/v1/fei-shu/robot/sendText | | | {"webhookUrl":"http://1222","signSecret":"aaa" ,"text":"addd"} | | | 发送图片 | POST | /suite/v1/fei-shu/robot/sendImage | | | {"webhookUrl":"http://1222","signSecret":"aaa" ,"imageKey":"addd"} | | | 发送群分享 | POST | /suite/v1/fei-shu/robot/shareChatId | | | {"webhookUrl":"http://1222","signSecret":"aaa" ,"shareChatId":"addd"} | | | 发送富文本 | POST | /suite/v1/fei-shu/robot/shareChatId | | | {"webhookUrl":"https://o1111","lang":"zh\_cn","title":"wo shi title","tagListList":\[\[{"tag":"text","text":"wo shi text"},{"tag":"a","text":"wo shi href","href":"https://feishu.cn"}]]} | | 上述接口的参数说明如下: | 参数 | 说明 | |--------------|--------------------------------| | appId | 自建应用的appId | | appSecret | 自建应用的appSecret | | feishuToken | 通过appId和appSecret获取到的T,ken,2小时有效期 | | emails | 用户邮箱集合 | | mobiles | 用户手机号集合 | | includeResigned | 是否获取离职用户 |\ | user\_type | 取值user\_id,open\_id, 默认open\_id | | webhookUrl | 在指定群聊中添加群自定义机器人后获取到的webhookUrl | | signSecret | 消息安全策略如果需要签名验证,要传递的密钥 | | text | 文本消息 | | imageKey | 飞书的内网图片的key | | shareChatId | 飞书的群id | | lang | 富文本的语言,zh\_cn, en\_us,默认zh\_cn | | title | 富文本的标题 | | tagListList | 富文本的内容标签集合 | 文本的@用户做法: ```text // @ 单个用户 ,名字X是当查不到用户是@显示的名字 名字X // @ 所有人 所有人 ``` 富文本的标签集合 ```json [ [ { "tag": "text", "text": "项目有更新: " }, { "tag": "a", "text": "请查看", "href": "http://www.example.com/" }, { "tag": "at", "userId": "ou_18eac8********17ad4f02e8bbbb" }, { "tag": "image", "imageKey": "ovvvvv" } ] ] ``` ## 如何创建自建应用 1.创建一个应用 ![创建应用](images/feishu_app.png) 2.为应用配置相关的权限 3.发布应用 # 尾语: 了解更多自定义机器人操作,参考[自定义机器人使用指南](https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot)。 --- --- url: /suite/bytedance/table.md description: 飞书多维表格是一款强大的在线数据协作与管理工具,它将传统表格的易用性与数据库的强大功能相结合,让团队无需编写代码即可快速搭建灵活、智能的业务管理系统 --- # 飞书多维表格 飞书多维表格套件是官方推出的一个套件,飞书多维表格是一款强大的在线数据协作与管理工具,它将传统表格的易用性与数据库的强大功能相结合,让团队无需编写代码即可快速搭建灵活、智能的业务管理系统,在Juggle中可以通过飞书多维表格的存储能力,将流程中的数据自动写入到多维表格中,达到轻量存储的目的。 ## 如何获取多维表格的appId和appSecret 如果想通过API来操作飞书多维表格的能力,就需要前往[飞书开放平台](https://open.feishu.cn/),创建应用并授权后才能获取可以使用的appId和appSecret来操作多维表格,具体步骤如下 #### 1.创建一个应用 ![创建应用](images/feishu_app.png) 2.为应用配置相关的权限 3.发布应用 4.在飞书多维表格中添加应用 ## 如何获取飞书多维表格的appToken * 如果多维表格的 URL 以 **feishu.cn/base** 开头,该多维表格的 appToken 是下图高亮部分:![app\_token.png](https://sf3-cn.feishucdn.com/obj/open-platform-opendoc/6916f8cfac4045ba6585b90e3afdfb0a_GxbfkJHZBa.png?height=766\&lazyload=true\&width=3004) * 如果多维表格的 URL 以 **feishu.cn/wiki** 开头,你需调用知识库相关[获取知识空间节点信息](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/wiki-v2/space/get_node)接口获取多维表格的 appToken。当 `obj_type` 的值为 `bitable` 时,`obj_token` 字段的值才是多维表格的 `app_token`。 了解更多关于获取appToken的方式,参考[多维表格 app\_token 获取方式](https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/bitable-overview#-752212c)。 **示例值**:"bascng7vrxcxpig7geggXiCtadY" ## 如何获取飞书多维表格的tableId --- --- url: /suite/internal/collect.md description: 如何使用值提取套件,并详细介绍值提取套件的方法 --- # 值提取 值提取套件是官方推出的一个套件,主要解决各种从各种复杂的json字符串中提取指定的值,这在接口调用后处理响应数据时非常有用,主要是通过JsonPath的能力 ## 提取字符串值 通过JsonPath表达式从一个字符串中提取一个指定的字符串 ## 提取整数值 通过JsonPath表达式从一个字符串中提取一个指定的整数值 ## 提取小值 通过JsonPath表达式从一个字符串中提取一个指定的小数值 ## 提取布尔值 通过JsonPath表达式从一个字符串中提取一个指定的布尔值 ## 提取日期值 通过JsonPath表达式从一个字符串中提取一个指定的日期值 ## 提取时间值 通过JsonPath表达式从一个字符串中提取一个指定的时间值 ## 提取字符串列表值 通过JsonPath表达式从一个字符串中提取一个指定的字符串列表值 --- --- url: /suite/internal/cryptography.md description: 如何使用加解密套件,并详细介绍加解密套件的方法 --- # 加解密 加解密套件是官方推出的一个套件,主要解决各种业务场景下的加密,解密操作,比如用户密码加密、用户信息加密、订单信息加密、用户信息解密、订单信息解密等。 --- --- url: /suite/internal/random.md description: 如何使用随机值套件,并详细介绍随机值套件的方法 --- # 随机值 随机值套件是官方推出的一个套件,主要解决各种随机值生成的问题,比如生成随机整数、生成随机小数、生成随机字符串、生成随机时间、生成密码、生成唯一值等随机值。 ## 生成随机整数 方法提供了两个入参,最大整数和最小整数,输入一个最大的整数和一个最小的整数,生成一个范围内的随机整数 ## 生成随机小数 方法提供了三个入参,最大小数,最小小数,精度(默认为2位小数),生成一个范围内的指定精度的随机小数 ## 生成随机唯一值(UUID) 方法不需要提供出入参,直接生成一个UUID值 ## 生成随机密码 方法提供了一个入参,密码长度(默认为6位),生成一个指定长度的随机字符串 ## 生成随机日期 方法提供了两个入参,开始日期和结束日期,生成一个范围内的随机日期 --- --- url: /suite/internal/value-handle.md description: 如何使用值处理套件,并详细介绍值处理套件的方法 --- # 值处理 值处理套件是官方提供的一个内置套件,主要解决各种数据类型的转换需求,支持juggle支持的各种数据类型(如:字符串,整数,小数,布尔,日期,时间,对象)之间的相互转换。 ## 字符串值转成整数值 传入一个数字类型的字符串值,将这个值转换成一个整数类型的值返回出来。 ## 字符串值转成小数值 传入一个数字类型的字符串值,将这个值转换成一个小数类型的值返回出来。 ## 字符串值转成日期值 传入一个日期类型的字符串值(如:2024-01-01),将这个值转换成一个日期类型的值返回出来。 ## 字符串值转成时间值 传入一个时间类型的字符串值(如:2024-01-01 10:00:00),将这个值转换成一个时间类型的值返回出来。 ## 整数值转成字符串值 传入一个整数值,将这个值转换成一个字符串类型的值返回出来。 ## 小数值转成字符串值 传入一个小数值,将这个值转换成一个字符串类型的值返回出来。 ## 日期值转成字符串值 传入一个日期值,将这个值转换成一个字符串类型的值返回出来。 ## 时间值转成字符串值 传入一个时间值,将这个值转换成一个字符串类型的值返回出来。 ## 多个字符串进行拼接 传入多个字符串值,将这多个值拼接起来,并以字符串类型的值返回出来,如输入"hello","world","!",将返回"helloworld!"。 --- --- url: /suite/third/163-email.md description: QQ邮箱如何授权? --- # 163邮箱套件 QQ邮箱是腾讯公司2002年推出,向用户提供安全、稳定、快速、便捷电子邮件服务的邮箱产品,已为超过1亿的邮箱用户提供免费和增值邮箱服务。 官网:https://mail.qq.com/ ## 如何获取163邮箱授权码 1.登录邮箱https://mail.qq.com, 进入设置-帐户 2.开启【POP3/SMTP】、【IMAP/SMTP】服务 输入验证码完成验证 3.生成QQ邮箱授权码 --- --- url: /suite/third/caiyun-weather.md description: 彩云天气如何创建并获取token? --- # 彩云天气 彩云天气是一款由北京彩彻区明科技有限公司开发的高精度天气预报应用,利用雷达数据和AI技术提供分钟级的降水预报。用户可以查看未来两小时内逐分钟的降雨预测,帮助合理安排出行计划。除了基本的天气信息外,彩云天气还提供空气质量、生活指数等功能,致力于为用户提供精准、便捷的气象服务。 ## 一.彩云天气如何获取token 1.前往彩云科技开发平台https://platform.caiyunapp.com/login,注册账号 2.登录后,在“应用管理”中点击“创建应用” ![彩云上创建应用](images/caiyun_weather_1.png) 3.创建成功后,就可以在应用列表页面查看Token ![查看彩云token](images/caiyun_weather_2.png) --- --- url: /suite/third/lanyun.md description: 蓝耘是一家专注于智能计算领域的国家高新技术企业,致力于为人工智能、大数据、深度学习等前沿科技提供高性能计算解决方案 --- # 蓝耘 蓝耘是一家专注于智能计算领域的国家高新技术企业,致力于为人工智能、大数据、深度学习等前沿科技提供高性能计算解决方案。公司核心产品涵盖AI服务器、大模型平台、算力集群及私有云平台,具备强大的硬件研发与系统集成能力。 ## 蓝耘如何获取ApiKey 1.前往蓝耘官方网站 , 注册账号 2.登录后,在“API KEY管理”中点击“创建API KEY”,就可以在应用列表页面查看APIKEY ![查看apikey](images/lanyun_apikey.png) ## 在Juggle中使用蓝耘套件 #### 1.安装蓝耘套件 进入 Juggle 套件市场,在套件市场中搜索**蓝耘**,安装蓝耘套件,后续就能在流程中使用蓝耘提供的接口了。 ![蓝耘套件](images/lanyun_suite.png) #### 2. 使用蓝耘接口 在流程中新建一个**方法节点**,在方法节点的设置中选择**蓝耘套件**,就可以选择蓝耘提供的文本模型,生成视频等各种接口了,基于这些接口能力,用户可以编排出各种场景的流程,来满足用户的不同场景的需求。 ![蓝耘套件接口](images/lanyun_api.png) --- --- url: /suite/third/qq-email.md description: QQ邮箱如何授权? --- # QQ邮箱套件 QQ邮箱是腾讯公司2002年推出,向用户提供安全、稳定、快速、便捷电子邮件服务的邮箱产品,已为超过1亿的邮箱用户提供免费和增值邮箱服务。 官网:https://mail.qq.com/ :::warning 注意: 如果需要大批量发送邮件,建议使用阿里云邮箱,因为QQ邮箱不支持批量邮件发送 ::: ## QQ邮箱如何授权? 1.登录邮箱https://mail.qq.com, 进入设置-帐户 ![登录QQ邮箱](images/qqEmail_1.png) 2.开启【POP3/SMTP】、【IMAP/SMTP】服务 ![开启邮箱服务](images/qqEmail_2.png) 输入验证码完成验证 ![验证](images/qqEmail_3.png) 3.生成QQ邮箱授权码 ![生成授权码](images/qqEmail_4.png) ![查看授权码](images/qqEmail_5.png) --- --- url: /suite/third/silicon.md description: 硅基流动(SiliconFlow)专注于打造高效能AI基础设施平台。其核心产品SiliconCloud提供大模型云服务 --- # 硅基流动 硅基流动(SiliconFlow)专注于打造高效能AI基础设施平台。其核心产品SiliconCloud提供大模型云服务,通过自研推理引擎加速AI应用部署,帮助企业及开发者降低算力成本,促进创新。 ## 如何获取硅基流动的ApiKey ### 1.注册硅基流动账号 打开硅基流动官网 并注册账号(如果注册过,直接登录即可),完成注册后,打开[API密钥](https://cloud.siliconflow.cn/account/ak) ,创建新的 API Key,点击密钥进行复制,以备后续使用。 ### 2.创建ApiKey ![硅基流动apikey](images/siliconflow_apikey.png) ## 在Juggle中使用硅基流动 ### 1.安装硅基流动套件 进入Juggle套件市场,在套件市场中搜索**硅基流动**,安装硅基流动套件,后续就能在流程中使用硅基流动提供的接口了。 ![硅基流动套件](images/siliconflow_suite.png) ### 2.使用硅基流动接口 在流程中新建一个**方法节点**,在方法节点的设置中选择**硅基流动套件**,就可以选择硅基流动提供的文本对话,生成图片,生成视频等各种接口了,基于这些接口能力,用户可以编排出各种场景的流程,来满足用户的不同场景的需求。 ![硅基流动套件接口](images/siliconflow_api.png)