开源OSS.Social微信项目解析

    前言:OSS.Social是个开源的社交网站接口集成项目,当前也有很多其他不错的项目,不过始终没有我想要的那种简单清晰,只能撸起袖子,从头打造一个。当前正在进行的是对微信项目的开发,这里把对接口的整理,设计的思路,和项目的代码实现方式做一个概要分享。

代码下载地址:【github】  【开源中国


一. 模块划分

    微信对外开放的接口已经非常的多,再加上时间演进的原因,可以说甚至有点杂乱。不过在大模块上基本上还是很清晰的。

    这里针对已有的微信接口(排除支付,会在OSS.PayCenter中开源),根据接口的功能范围,我把当前接口主要分为以下:授权接口,功能接口,实时消息接口 三个主要模块,每个模块下又有子项,如下图(在线查看,可以看到各个子项):



1. 实时消息模块(Msg文件夹)

    主要处理实时消息的交互,在消息中又分为普通消息和事件消息。事件消息是非常重要的一个模块,在后续的诸多功能中起到了一个消息中枢的作用,很多重要通知都是通过这个功能推送过来的。如果接触过消息队列的同学,可能会发现这个事件消息就像是我们业务系统中的消息中心模块。


2. 公众号功能模块(Offcial文件夹)

    这个模块主要是公众号的一些功能接口,主要针对的对象是公众号账户,这类接口都有一个共同的地方,调用时需要全局AccessToken。在这个模块中,我又根据接口的功能对象,将功能进行相应的拆分,有了如上图的划分。


3. 社交接口模块

    这个模块是最常见的模块,主要针对的对象都是单一用户,在像微博,豆瓣,以及所有稍微有一定规模用户群体的社交网站都会有这些功能,各家性质不同,接口也不一,但都会有如 Oauth 授权接口,像新浪会有发送微博等功能,微信当前主要是授权和获取用户基本信息。


二. 消息模块的设计实现方式

   消息模块是微信接口中最重要的一块功能,除了普通的消息之外,它的事件消息可以说完全是一个我们消息队列中心,及时将各种事件push到业务方服务器上,方便我们快速处理。简单介绍下消息模块的实现方式。


a.  调用展示:

    下图是消息模块的调用展示,两种模式,一种是最基本的模式,实体和执行事件委托(event delegate)都是已经封装好的,处理逻辑就好。 另外一种是高级模式,实体和处理方法调用注册方法



b.  设计思路(见下方流程图)


     消息模块中主要处理的是实时的消息接收和回复。发起方是由微信调用,接收方处理消息执行并响应。在整个处理过程中,不管是普通消息还是事件消息,都会经历一个完整的生命周期,在这个周期里包含了:接收=》解析=》业务逻辑执行=》封装消息 =》回复


    针对当前生命周期,接收和回复都是通用的,主要是业务逻辑的不同, 在这个模块中我们采用Handler的处理方式,由主入口进入,针对不同的消息类型采用对应的解析,执行和封装。


    也就是说开发者需要关心的只是 接收实体,执行逻辑方法和返回实体。对于微信提供的基础消息类型来说,这里就非常清晰了,预先定义好对应的接收实体,和相应的处理方法委托,调用时给对应的委托添加具体执行方法即可。在OSS.Social的项目中,我的实现方式是,通过泛型获取接收实体,通过定义事件类型的委托,作为业务逻辑方法,开发者只需要在业务方法中返回想要需要的消息类型即可。(为何使用事件类型委托 ,在代码讲解章节将会讲解),具体方式见上图的基础调用方式。


    同时,除了微信自身提供的基本的消息类型之外,我们还需要考虑到后续的事件消息扩展,这里强调一下扩展的必要性,微信的事件消息会有很多 ,同时可能随时会有新的字段调整等,像卡券中渠道等字段。也就是说我们需要一个高级的消息处理模式,开发者能够自己定义接收实体,以及相应的自定义事件类型。


    消息生命周期执行时,我们需要知道的是: 对应的消息类型名称,对应的实体类型,和事件方法,才能完成整个生命周期,也就是说我们需要开发者在开发时传入以上信息,底层框架能提供保存的功能,事件执行时根据对应消息类型,实例化对应的消息实体,传入执行事件。在OSS.Social 项目中,我采用的方式是提供Register方法,底层使用ConcurrentDictionary字典保存对应的类型和方法,在解析过程中通过CreateInstance反射获取对应的消息实体,传入委托方法。


    这里没有把所有的事件消息全部封装,而是提供了一个高级消息处理模式。其一:我们要的是简单,清晰,扩展强,全部封装起来不仅代码臃肿,给调用者也造成一定的限制。其次:主要是一个个全写完,估计这双手要撸秃皮了。


    这个模块的主要思路就是把过程流程化,明确需要哪几个步骤,然后每个步骤可能的情况进行细化。这里只是提供了一个简单的概要思路,后续会有针对当前章节的详细讲解。


c. 流程图

感兴趣的同学可以去下载源码查看,欢迎贡献。后边其他部分,以及相关的代码讲解都会慢慢放出来,希望大家一块学习进步!

原文地址:http://www.cnblogs.com/sunhoy/p/6360850.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查询空值中的注意事项

在数据表创建之初,创建者可以指定某个字段是否为空值NULL。注意了,这个NULL既不代表0,也不代表空字符,而是代表一种未知的状态,比如不适用或者放着等将来有合适数据了再添加进去。 语法规则为: SELECT 字段…

Mysql字符串截取 mysql将字符串字段转为数字排序或比大小

SELECT * FROM Student WHERE 1 1 ORDER BY -ID DESC ; SELECT * FROM Student WHERE 1 1 ORDER BY (ID 1); mysql将字符串字段转为数字排序或比大小 2017年09月17日 01:36:31 阅读数:6566 版权声明:本文为博主原创文章,未经博主允许不得…

Apdex(Application Performance Index)量化应用性能

“道琼斯指数帮助人们衡量股市行情变化,Apdex 指数帮助您衡量用户心情变化。“ 一.为什么需要 Apdex 性能指数,Apdex(Application Performance Index)是一个国际通用标准,Apdex 是用户对应用性能满意度的量化值。它提供了一个统一的测量和报告…

使用ueditor实现多图片上传案例——截取字符串层Util(SubString_text)

/** * Title: ConfigManager.java * Package org.util * Description: TODO该方法的主要作用: * author A18ccms A18ccms_gmail_com * date 2017-9-29 上午8:01:39 * version V1.0 */ package org.util;import org.entity.Shopping;/** * * 项目名称&…

关于Java类加载双亲委派机制的思考(附面试题)

转载自 关于Java类加载双亲委派机制的思考&#xff08;附面试题&#xff09; 预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器&#xff1a; 启动&#xff08;Bootstrap&#xff09;类加载器&#xff1a;是用本地代码实现的类装入器&#xff0c;它负责将 <Java_R…

线性结构VS非线性结构

线性结构 线性结构作为最常用的数据结构&#xff0c;其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构&#xff0c;即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表&#xff0c;顺序表中的存储元素是连续的 链式存储的线性表称为链表&#…

ES报错:Connection reset by peer 解决经历

http://nicethemes.cn/news/txtlist_i28391v.html 这次来分享一下ES报错&#xff1a;java.io.IOException: Connection reset by peer 的解决经历 问题描述 本人最近负责了定时获取Prometheus Metrics并发送到ES做持久化存储的任务。然而在Metrics采集粒度从3分钟变为1小时后…

云计算设计模式(一)缓存预留模式

云带来的改变是显而易见的&#xff0c;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c;服务&am…

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

转载自 Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别 查了一些资料也不是太明白两个的区别&#xff0c;但是前者是最安全的用法 打个简单的比方&#xff0c;你一个WEB程序&#xff0c;发布到Tomcat里面运行。 首先是执行Tomcat org.apache.c…

批量删除文件

git bash 运行 rm -rf *.class 删除当前文件夹下所有的.class文件

稀疏数组与二维数组相互转化

图示 二维数组转稀疏数组的思路 遍历 原始的二维数组&#xff0c;得到有效数据的个数 sum根据sum 就可以创建 稀疏数组 sparseArr int[sum 1] [3]将二维数组的有效数据数据存入到 稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行&#xff0c;根据第一行的…

云计算设计模式(二)——断路器模式

云带来的改变是显而易见的&#xff0c;云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c; 进入可配置的计算资源共享池&#xff08;资源包括网络&#xff0c;服务器&#xff0c;存储&#xff0c;应用软件&#xff0c;服务&am…

Class.forName()和ClassLoader.getSystemClassLoader().loadClass()区别

转载自 Class.forName&#xff08;&#xff09;和ClassLoader.getSystemClassLoader().loadClass&#xff08;&#xff09;区别 class A {static {System.out.println("Class A is Loading now");}public A(){System.out.println("A new Class A instance is cr…

excel打开csv 出现乱码怎么解决 逗号分隔

excel打开csv 出现乱码怎么解决 https://jingyan.baidu.com/article/ac6a9a5e4c681b2b653eacf1.html CSV是逗号分隔值的英文缩写&#xff0c;通常都是纯文本文件。CSV格式是分隔的数据格式&#xff0c;有字段/列分隔的逗号字符和记录/行分隔换行符。通常CSV文件可以用EXCEL正常…

mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain

在做mybatis案例的时候发现了一个问题&#xff0c;报错如下&#xff1a; org.apache.ibatis.exceptions.PersistenceException:### Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for org.dao.…

在ASP.NET Core下使用SignalR技术

一、前言 上次我们讲到过如何在ASP.NET Core中使用WebSocket,没有阅读过的朋友请参考 WebSocket in ASP.NET Core 文章 。这次的主角是SignalR它为我们提供了简化操作WebSocket的框架。 ASP .NET SignalR 是一个ASP.NET 下的类库&#xff0c;可以在ASP.NET 的Web项目中实现实时…

ClassLoader 详解及用途

转载自 ClassLoader 详解及用途 ClassLoader主要对类的请求提供服务&#xff0c;当JVM需要某类时&#xff0c;它根据名称向ClassLoader要求这个类&#xff0c;然后由ClassLoader返回这个类的class对象。 1.1 几个相关概念ClassLoader负责载入系统的所有Resources&#xff08;…

mybatis简单案例源码详细【注释全面】——前期准备

mybatis 是个什么东西&#xff0c;这里就不必说了&#xff0c;大家去网上搜搜看就行了&#xff0c;在这里我主要是分享一下最基本的增删改查案例以及配置信息&#xff0c;测试信息。 首先我们创建个数据库&#xff1a; /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : …

用数组模拟队列的实现

package com.atguigu.queue;import jdk.nashorn.internal.ir.ReturnNode;import java.util.Scanner;/*** 创建人 wdl* 创建时间 2021/3/17* 描述*/ public class ArrayQueueDemo {public static void main(String[] args) {//测试一把//创建一个队列ArrayQueue queue new Arra…