SOP到底是什么玩意儿?该如何玩转

118 阅读9分钟

SOP:基于 Dubbo 的开放平台解决方案,让开放平台搭建更高效

在数字化时代,企业对开放平台的需求日益增长,无论是将现有项目改造为开放平台供他人调用,还是搭建全新的开放平台以整合微服务,都需要一套高效、可靠的解决方案。而 SOP(Simple Open Platform)作为一款基于 Dubbo 实现的开放平台解决方案项目,恰好能满足这些需求,助力用户快速搭建属于自己的开放平台。

一、SOP 项目核心概况

SOP 当前版本为 5.0,遵循 Apache-2.0 开源协议,其核心目标是让用户通过简单配置,就能使项目具备类似支付宝开放平台的接口提供能力。它封装了开放平台的诸多关键功能,为开发者省去大量重复开发工作,具体包括签名验证、统一异常处理、统一返回内容、业务参数验证(JSR-303)以及秘钥管理等,并且未来还将持续拓展更多实用功能。

从技术构成来看,SOP 项目包含多个重要模块,每个模块都承担着独特的功能,共同保障开放平台的稳定运行。各模块及最新更新如下:

  • sop-admin:支持 admin 后台关联商户,同时将 fastmybatis 升级到 3.1.7 版本,优化后台管理的数据库操作性能。
  • sop-example:完成 smart-doc 到 3.1.1 版本的升级,为开发者提供更完善的接口文档示例参考。
  • sop-gateway:与 sop-admin 同步,实现 admin 后台关联商户和 fastmybatis 升级,确保网关与后台管理的数据交互顺畅。
  • sop-registry:在拦截器中新增 init 方法,增强注册中心对请求拦截的初始化处理能力。
  • sop-sdk:添加了文件下载示例,方便开发者更好地理解和使用 SDK 进行相关操作。
  • sop-support:同样将 smart-doc 升级到 3.1.1 版本,为项目整体的文档生成提供支持。
  • sop-test:新增 restful 模式,便于开发者对开放接口进行更全面的测试。
  • sop-website:实现 admin 后台关联商户和 fastmybatis 升级,优化开放平台官网相关功能。

此外,项目还包含.gitignore、Dockerfile、LICENSE、README.md 等基础文件,以及 build-admin.shbuild-gateway.sh 等构建脚本,还有 changelog.md 用于记录版本更新日志,为项目的管理和维护提供便利。

二、SOP 项目突出特点

(一)接入方式简单,兼容性强

对于已有老项目的开发者而言,无需对原有项目进行大规模改造,只需将老项目注册到注册中心,然后在需要开放的方法上添加相应注解,即可完成开放接口的配置,整个过程与老项目无冲突,极大降低了接入成本。

(二)架构松耦合,业务独立

SOP 基于 Dubbo 微服务体系构建,业务代码能够实现在各自的微服务中,SOP 本身不参与业务逻辑的实现。这种松耦合的架构设计,使得各微服务可以独立开发、测试、部署和升级,不会因为某一个业务模块的调整而影响到整个开放平台的运行,提高了系统的灵活性和可维护性。

(三)扩展能力强,满足个性化需求

开放平台对应的各项功能在 SOP 中各自独立,开发者可以根据自身业务需求,自定义实现特定功能。例如,根据实际业务场景更改接口参数、调整签名规则等,无需受限于固定的实现方式,充分满足不同企业的个性化需求。

三、SOP 适用人群与场景

SOP 的适用范围广泛,无论是有特定改造需求的企业开发者,还是对开放平台感兴趣的技术爱好者,都能在其中找到合适的应用场景:

  • 拥有现成项目,希望将其改造成开放平台,供其他企业或开发者调用接口,实现业务拓展。
  • 现有项目中存在部分核心接口,计划将这些接口暴露出来,通过开放平台的形式提供给外部使用,同时保障核心业务的安全性。
  • 打算搭建一个全新的开放平台,并且希望采用微服务的方式进行后续的维护和扩展,以适应业务的快速发展。
  • 对开放平台的技术架构、实现原理等感兴趣,希望通过实际项目学习和研究开放平台相关技术。

四、SOP 开放接口开发与调用示例

(一)开放接口定义

以支付接口为例,通过@Api注解标注接口类别,使用@Open注解指定接口名称,明确接口的功能和使用方式,代码如下:

/**
 * 支付接口
 *
 * @author 六如
 */
@Api("支付接口")
public interface OpenPayment {
    /**
     * 手机网站支付接口
     *
     * @apiNote 该接口是页面跳转接口,用于生成用户访问跳转链接。
     * 请在服务端执行SDK中pageExecute方法,读取响应中的body()结果。
     * 该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。
     * 具体使用方法请参考 <a href="https://torna.cn" target="_blank">接入指南</a>
     */
    @Open("pay.trade.wap.pay")
    PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request);
}

(二)接口实现

采用@DubboService注解标注实现类,并开启参数验证功能,在实现方法中编写具体的业务逻辑,生成相应的响应数据,示例代码如下:

/**
 * 开放接口实现
 *
 * @author 六如
 */
@DubboService(validation = "true")
public class OpenPaymentImpl implements OpenPayment {
    @Override
    public PayTradeWapPayResponse tradeWapPay(PayTradeWapPayRequest request) {
        PayTradeWapPayResponse payTradeWapPayResponse = new PayTradeWapPayResponse();
        payTradeWapPayResponse.setPageRedirectionData(UUID.randomUUID().toString());
        return payTradeWapPayResponse;
    }
}

(三)接口调用方式

1. 常规调用

手动构建公共请求参数和业务参数,对参数进行签名处理后发送请求,并获取返回结果,具体步骤如下:

@Test
public void testGet() throws Exception {
    // 公共请求参数
    Map<String, String> params = new HashMap<String, String>();
    params.put("app_id", appId);
    params.put("method", "pay.trade.wap.pay");
    params.put("format", "json");
    params.put("charset", "utf-8");
    params.put("sign_type", "RSA2");
    params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    params.put("version", "1.0");
    
    // 业务参数
    Map<String, Object> bizContent = new HashMap<>();
    bizContent.put("outTradeNo", "70501111111S001111119");
    bizContent.put("totalAmount", "9.00");
    bizContent.put("subject", "衣服");
    bizContent.put("productCode", "QUICK_WAP_WAY");
    
    params.put("biz_content", JSON.toJSONString(bizContent));
    String content = AlipaySignature.getSignContent(params);
    String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
    params.put("sign", sign);
    
    System.out.println("----------- 请求信息 -----------");
    System.out.println("请求参数:" + buildParamQuery(params));
    System.out.println("商户秘钥:" + privateKey);
    System.out.println("待签名内容:" + content);
    System.out.println("签名(sign):" + sign);
    System.out.println("URL参数:" + buildUrlQuery(params));
    
    System.out.println("----------- 返回结果 -----------");
    String responseData = postJson(url, params);// 发送请求
    System.out.println(responseData);
}
2. SDK 调用

借助 SOP 提供的 SDK,可简化调用流程,直接构建请求对象和业务模型,调用 SDK 中的方法即可完成请求发送和结果处理,代码如下:

@Test
public void test() {
    PayTradeWapPayRequest request = new PayTradeWapPayRequest();
    
    PayTradeWapPayModel model = new PayTradeWapPayModel();
    model.setOutTradeNo("70501111111S001111119");
    model.setTotalAmount(new BigDecimal("1000"));
    model.setSubject("衣服");
    model.setProductCode("QUICK_WAP_WAY");
    
    request.setBizModel(model);
    Result<PayTradeWapPayResponse> result = client.execute(request);
    if (result.isSuccess()) {
        PayTradeWapPayResponse response = result.getData();
        System.out.println(response);
    } else {
        System.out.println(result);
    }
}

五、SOP 整体架构与页面预览

(一)整体架构

SOP 的整体架构清晰,主要由 SOP 组件、业务组件、注册中心、微服务集群以及数据存储等部分组成。用户请求首先进入 sop-gateway(网关),网关通过注册中心(如 zookeeper/Nacos)获取微服务集群中各服务(ServiceA、ServiceB、ServiceC 等)的信息,然后将请求路由转发到相应的业务服务进行处理。同时,sop-admin(管理后台)负责对整个开放平台进行管理和配置,Redis 用于缓存数据以提高系统性能,MySQL 则用于持久化存储各类业务数据和配置信息,各组件协同工作,确保开放平台的高效、稳定运行。

(二)页面预览

1. 文档页面

文档页面清晰展示开放平台的各类接口信息,以手机网站支付接口(pay.trade.wap.pay)为例,不仅包含接口说明,还明确了接口名称、版本号(1.0)以及不同环境(生产环境:open.xxx.com/api;沙箱环境:open-sandbox.xxx.com/api)的请求地址。此外,详细列出了公共请求参数的名称、类型、是否必须、最大长度、描述及示例值,方便开发者了解和使用接口。

2. 后台管理页面
  • 文档管理:在文档管理页面,可进行接口文档的管理操作,支持按接口标题、接口名称进行过滤查询,还能对接口文档执行同步全部接口、发布、下线等操作。页面以表格形式展示文档标题、接口名、版本号、描述、发布状态、添加人、修改人、添加时间、修改时间等信息,让管理员能清晰掌握接口文档的整体情况。
  • 秘钥管理:秘钥管理页面主要用于管理 ISV(独立软件开发商)的秘钥信息,支持对 ISV 进行修改、禁用、设置秘钥、设置分组等操作,同时展示 ISV 的修改时间。此外,还会显示平台的公私钥以及 ISV 的公私钥信息,并且可选择秘钥格式(PKCS8 适用于 Java,PKCS1 适用于非 Java),保障接口调用的安全性。
  • 用户管理:用户管理页面用于管理系统用户,可按部门名称、用户名称、手机号码、状态进行搜索和筛选,支持新增用户操作。页面以表格形式展示用户编号、用户名称、用户昵称、性别、部门、手机号码、状态、创建时间等信息,同时提供修改、分配角色、重置密码等操作功能,方便管理员对系统用户进行全面管理。

六、SOP 沟通交流渠道

为了方便开发者之间交流经验、解决问题,SOP 提供了专门的沟通交流群,群号为 328419269。开发者可以通过 QQ 扫描相应二维码加入群聊,与其他使用 SOP 的开发者共同探讨技术问题、分享使用心得,同时也能及时获取项目的最新动态和技术支持。

总之,SOP 作为一款基于 Dubbo 的开放平台解决方案,凭借其简单的接入方式、松耦合的架构、强大的扩展能力以及完善的功能模块,为用户快速搭建开放平台提供了有力支持。无论是企业开发者还是技术爱好者,都可以借助 SOP 轻松实现开放平台的搭建与管理,推动业务的数字化发展。