• 寻 友 软 件


    技术

    技术

    前端:

    • flutter+android+环信SDK+redux+shared_preferences+connectivity

    后端:

    • SpringBoot + SpringMVC + MybatisPlus

    • 采用Apache Dubbo作为微服务架构技术

    • Redis集群实现缓存的高可用

    • MongoDB实现海量数据的存储

    • 采用RocketMQ作为消息服务中间件

    • ElasticSearch geo实现地理位置查询,实现附近的人的功能

    • CDN加速静态文件的加载

    • 使用分布式文件系统存储小视频数据

    • Spark+MLib实现智能推荐

    • Token校验用户登录(token:user)

    • 第三方:环信即时通讯

    • 第三方:阿里云OSS存储用户头像及封面图片

    • 第三方:使用虹软开放平台进行人脸识别

    • 第三方:使用云之讯发送手机验证码

    技术架构
    请添加图片描述

    功能

    注册、登录(手机号验证码)
    交友(测灵魂、桃花传音、搜附近)
    圈子(朋友圈,发动态,我的动态、关注数、粉丝数、点赞、评论)
    消息(通知消息(点赞评论)、即时通信消息)
    视频分享(发小视频、评论)

    部署Redis与RocketMQ

    部署redis集群
    docker create --name redis-node01 --net host -v redis-node01:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-01.conf --port 6379 1
    docker create --name redis-node02 --net host -v redis-node01:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-02.conf --port 6380 2
    docker create --name redis-node03 --net host -v redis-node01:/data redis:5.0.2 --cluster-enabled yes --cluster-config-file nodes-node-03.conf --port 6381 3

    docker start redis-node01 redis-node02 redis-node03 启动容器
    docker exec -it redis-node01 /bin/bash 进入容器操作
    redis-cli --cluster create xxxx:6379 xxxx:6380 xxxx:6381 --cluster-replicas 0 组件集群

    redis-cli后 cluster nodes 查看集群信息
    redis-cli -c 重定向后才可get \ set

    部署RocketMQ
    docker pull foxiswho/rocketmq:server-4.3.2
    docker pull foxiswho/rocketmq:broker-4.3.2

    创建nameserver容器

    docker create -p 9876:9876 --name rmqserver \
    -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
    -e "JAVA_OPTS=-Duser.home=/opt" \
    -v /data/rmqserver-logs:/opt/logs \
    -v /data/rmqserver-store:/opt/store \
    foxiswho/rocketmq:server-4.3.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建broker.conf文件

    vim /data/rmqbroker/conf/broker.conf
    brokerIP1=xxx.xxx.xxx
    namesrvAddr=xxx.xxx.xxx:9876
    brokerName=broker_friends
    
    • 1
    • 2
    • 3
    • 4

    创建broker容器

    docker create -p 10911:10911 -p 10909:10909 --name rmqbroker \
    -e "JAVA_OPT_EXT=-server -Xms128m -Xmx128m -Xmn128m" \
    -e "JAVA_OPTS=-Duser.home=/opt" \
    -v /data/rmqbroker/conf:/etc/rocketmq \
    -v /data/rmqbroker-logs:/opt/logs \
    -v /data/rmqbroker-store:/opt/store \
    foxiswho/rocketmq:broker-4.3.2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    docker start rmqserver rmqbroker 启动容器

    docker pull styletang/rocketmq-console-ng:1.0.0 RocketMQ的管理工具
    docker run -e "JAVA_OPTS=-Drocketmq.namesrv.addr=xx.xxx.xxx:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" -p 8082:8080 -t styletang/rocketmq-console-ng:1.0.0 安装并启动

    JWT(Json Web Token)

    JWT是一个字符串,经过加密处理与校验处理的字符串,形式:A.B.C
    A由JWT头部信息header加密得到(Header)
    B由JWT用到的身份验证信息json数据加密得到(Payload)
    C由A和B加密得到,是校验部分(Signature)

    <dependency>
        <groupId>io.jsonwebtokengroupId>
        <artifactId>jjwtartifactId>
        <version>0.9.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    String secret = "dong";
    
    Map<String, Object> claims = new HashMap<>();
    claims.put("mobile", "123456789");
    claims.put("id","2");
    //加密(生成Token) HS256:加密方法 secret:盐噪声
    String jwt = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, secret).compact();
    //解密 需要盐噪声
    Map<String,Object> body = Jwts.parser().setSigningKey(secret).parseClaimsJws(jwt).getBody();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    短信发送验证码

    虹软人脸识别

    1. 官网下载SDK
    2. libs目录下mvn install:install-file -D groupId=com.arcsoft.face -D artifactId=arcsoft-sdk-face -D version=2.2.0.1 -D packaging=jar -D file=arcsoft-sdk-face-2.2.0.1.jar 将jar包安装至maven仓库
    3. 导入
    <dependency>
        <groupId>com.arcsoft.facegroupId>
        <artifactId>arcsoft-sdk-faceartifactId>
        <version>2.2.0.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 首次需联网激活,激活后可离线使用
    2. 查看sdk中的test案例

    部署MongoDB(不用docker部署

    安装
    docker pull mongo:4.0.3
    docker create --name mongodb --restart=always -p 27017:27017 -v mongodb:/data/db mongo:4.0.3
    docker start mongodb
    docker exec -it mongodb /bin/bash
    mongo

    命令
    创建索引 db.recommend_user.createIndex({'toUserId':1,'score':-1}) 1:正序 -1:倒序

    MongoDB启动Bug
    @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})

    过滤器及拦截器加缓存

    Nginx、Dubbo、Zookeeper、FastDFS

    小视频

    • 存储:存储量大—分布式FastDFS
    • 推荐:多种权重计算方式
    • 速度:CDN

    即时通讯

    自主实现:
    Netty + WebSocket + RocketMQ + MongDB + Redis + Zookeeper + MySQL
    在这里插入图片描述
    第三方服务:环信

    编码流程

    注册登录
    实体类、mapper、响应类
    发送手机验证码
    验证手机验证码:注册/登录
    腾讯云对象存储
    虹软人脸识别
    完善个人信息及头像设置
    首页:今日佳人、推荐列表
    Rest调用SSO
    实体类映射MongoDB -> 接口 -> Dubbo服务提供者实现接口 -> Dubbo远程调用服务
    动态(朋友圈):发布动态、查询好友动态、查询推荐动态
    实体类映射MongoDB -> 接口 -> Dubbo服务提供者实现接口 -> Dubbo远程调用服务
    使用ThreadLocal 来 set 和 get 用户信息(Authorization获取)
    自定义注解(实现不需要权限认证)
    动态(朋友圈):评论动态、点赞动态、喜欢动态、评论
    接口 -> Dubbo服务提供者实现接口 -> Dubbo远程调用服务 -> 实现相关业务(MongoDB+Redis)
    小视频
    server调用Dubbo服务使用mongo操作数据


    DOC接口文档

    SSO:18080
    Server:18081
    登录/注册
    req:post /user/login json{手机号}
    resp:json{} json{失败原因}
    验证验证码
    req: post /user/loginVerification json{手机号,验证码}
    resp:json{isNew, token} json{失败原因}
    根据token查用户
    req:get /user/{token}
    resp:json{用户信息}
    完善用户信息
    req:post /user/loginReginfo json{用户信息参数}{token}
    resp:json{} json{失败原因}
    上传头像
    req:post /user/loginReginfo/head json{图片}{token}
    resp:json{} json{失败原因}
    今日佳人
    req:get /seekfriends/today/best {token}
    resp:json{id,头像,昵称,性别,年龄,标签,缘分值}
    推荐列表
    req:post /seekfriends/recommendation json{分页参数,条件参数(可null)} {token}
    resp:json{查询结果(用TodayBest列表)}
    朋友圈:发布
    req:post /movements/save form-data{动态的一些参数,以表格形式}
    resp:json{} json{失败原因}
    朋友圈:查看
    req: get /movements/query {page, pageSize}
    resp:json{查询结果} json{失败原因}
    朋友圈:查看推荐
    req:get /movements/recommend {page, pageSize}
    resp:json{查询结果} json{失败原因}
    朋友圈:点赞/取消点赞(喜欢/取消喜欢:like->love)
    req:GET /movements/{id}/like
    resp:int{点赞数}
    req:GET /movements/{id}/dislike
    resp:int{点赞数}
    朋友圈:查看单条动态信息
    req:GET /movements/{id}
    resp:json{查询结果}
    朋友圈:查询评论信息
    req:GET /movements/query {movementId, page, pageSize}
    resp:json{查询结果}
    朋友圈:发布评论
    req:POST /movements/save json{}
    resp:json{查询结果}
    小视频
    req:POST /smallVideo/save json{视频封面,小视频}
    resp:json{查询结果}


    Bug

    如果导入不了interface 清缓存File->Invalidate Caches,百度yyds
    dubbo消费超时:在application中dubbo.consumer.timeout=6000

  • 相关阅读:
    nginx平滑升级
    step into and step over and step out
    Ruby on Rails 实践:课程导读
    圆锥药型罩采用2D、3D单层和3D三种方法侵彻结果对比(基于LS-DYNA软件平台)
    Java静态代理模式
    树莓派4B_OpenCv学习笔记5:读取窗口鼠标状态坐标_TrackBar滑动条控件的使用
    Jenkins构建 Maven项目(微服务)并自动发布
    我的 Kafka 旅程 - Producer
    定时任务(一)
    React:数据流
  • 原文地址:https://blog.csdn.net/weixin_47371588/article/details/124616641