毕设之-Hlang后端架构-双系统交互

文章目录

  • 前言
  • 交互流程
    • 基本流程
    • 约定公钥
    • 人人中台携带公钥获取私钥
    • 私钥生成
    • 人人中台携带私钥访问
    • 私钥验证(博客系统)
  • 调试演示
  • 总结

前言

前天我们完成了基本的整合,但是还没有整合到我们的业务系统,也就是博客系统。本来昨天要搞一手的,但是在练车,所以就没有完成。那么今天补上,差不多20号去上班实习,这点时间赶紧搞完。

首先的话,我们这里建好了业务表:
在这里插入图片描述
并且我们创建好了新的服务:
在这里插入图片描述

并且,我们通过人人开源生成好了对应的后端的一个CURD和基本接口。

然后,我们把对应的controller,和feign接口做好对接。

如图:(整合好的feign组件)
在这里插入图片描述

然后在我们的人人开源中台系统做好调用
在这里插入图片描述
这里的话,我们可以发现是这样的流程
在这里插入图片描述

之后的话,在我们的博客系统当中我们有这个:
在这里插入图片描述

交互流程

那么这里,我们今天要实现的就是在人人开源中台系统过来调用到我们的具体服务的api的时候要做到的一个权限验证

因为我们这是两个系统,没有共同使用一个用户表,这也就是意味着,我们一个权限不方便公用一个。所以对应的一些服务得像第三方api一样提供。只不过这个api接口,可以通过注册中心知道,然后可以由open-feign调用而已。

基本流程

okey,那么在这里的话,我们先简单梳理一下,我们的基本流程:
在这里插入图片描述
那么在这里,我们可以解读到这几个信息:

  1. 需要一个公钥接口,拿到公钥
  2. 需要一个申请临时密钥的接口,通过这个密钥去访问服务

那么在人人中台要做:

  1. 先拿到公钥
  2. 通过公钥拿到私钥
  3. 携带私钥去访问

对于博客系统:

  1. 开发公钥接口
  2. 开发私钥接口
  3. 对受保护接口进行私钥验证

同时,由于公钥接口是公开的,得到的公钥在一定时间是一致的,因此我们可以直接做个约定,公钥是啥,也就是可以学一下rouyi,这个写死省下一个接口

所以这里的话,我们在编码阶段,我可以这样干。

约定公钥

我们先约定公钥。
我们可以看到,在我们的博客系统当中的话,有个获取私钥的接口:
在这里插入图片描述
这里的话,我们写死了,就是直接指定公钥是HUTEROX。

人人中台携带公钥获取私钥

然后就是人人中台携带公钥获取私钥
在这里插入图片描述
这里的话,我们在feign的拦截器当中实现了这个功能。我们先拿到私钥。

私钥生成

那么这个时候,我们自然就要生成私钥了,这个私钥由我们的博客系统生成。
在这里插入图片描述

package com.huterox.hlangserver.controller.innocontroller.auto;import com.huterox.common.utils.R;/*** 负责实现对内部服务调用的一个API授权签发* */
public interface AutoInnoApiService {/*** 签发临时授权码* */R SignApiAutoCode();/*** 验证签发的授权码是否通过* */boolean AcceptApiAutoCode(String signKey,String signal);
}

之后的话就是我们具体的实现类了。

package com.huterox.hlangserver.controller.innocontroller.auto.impl;
import com.alibaba.fastjson.JSON;
import com.huterox.common.sysEntity.SignApiCode;
import com.huterox.common.utils.CodeUtils;
import com.huterox.common.utils.R;
import com.huterox.hlangserver.controller.innocontroller.auto.AutoInnoApiService;
import com.huterox.hlangserver.utils.RedisTransKey;
import com.huterox.hlangserver.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;@Service
public class BaseAutoInnoApiServiceImpl implements AutoInnoApiService {private RedisUtils redisUtils;public BaseAutoInnoApiServiceImpl(RedisUtils redisUtils) {this.redisUtils = redisUtils;}@Autowiredpublic void setRedisUtils(RedisUtils redisUtils) {this.redisUtils = redisUtils;}@Overridepublic R SignApiAutoCode() {//生成验证SignString signKey = CodeUtils.creatCode(10);String signal = CodeUtils.creatCode(20);SignApiCode signApiCode = new SignApiCode();signApiCode.setSignal(signal);signApiCode.setSignKey(signKey);//设置30秒过期redisUtils.set(RedisTransKey.setServerSysKey(signKey),signApiCode,30, TimeUnit.SECONDS);return R.ok().put("sign",signApiCode);}@Overridepublic boolean AcceptApiAutoCode(String signKey,String signal) {//验证传回来的签发对不对,然后把这个进行删除Object o = redisUtils.get(RedisTransKey.getServerSysKey(signKey));SignApiCode signApiCode = JSON.parseObject(o.toString(), SignApiCode.class);redisUtils.del(RedisTransKey.getServerSysKey(signKey));return signApiCode.getSignal().equals(signal)&&signApiCode.getSignKey().equals(signKey);}
}

在这里的话,我用了几个工具类。当然这个在先前的whitehole都提到过。这里的话就不复述了,百度都能搞定。当然重要的是,这个项目后期也是开源的,这里只是记录一下具体的做法而已。后期可能会对代码进行优化,但是基本流程是不会发生太大改变的。

人人中台携带私钥访问

之后的话,就是我们的人人中台去携带我们的私钥去访问

package io.renren.config;
import com.huterox.common.sysEntity.SignApiCode;
import com.huterox.common.utils.FastJsonUtils;
import com.huterox.common.utils.R;
import com.huterox.feign.server.FeignAutoInnoApiSeverService;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class FeignRequestInterceptor implements RequestInterceptor {private FeignAutoInnoApiSeverService feignAutoInnoApiSeverService;public FeignRequestInterceptor(FeignAutoInnoApiSeverService feignAutoInnoApiSeverService) {this.feignAutoInnoApiSeverService = feignAutoInnoApiSeverService;}@Autowiredpublic void setFeignAutoInnoApiSeverService(FeignAutoInnoApiSeverService feignAutoInnoApiSeverService) {this.feignAutoInnoApiSeverService = feignAutoInnoApiSeverService;}@Overridepublic void apply(RequestTemplate template) {//先那到临时签证Map<String, String> map = new HashMap<>();map.put("innoHeader","HUTEROX");R sign = feignAutoInnoApiSeverService.getSign(map);//拿到签证去正式访问保护接口String signKey = "";String signal = "";int code = (int) sign.get("code");if(code==0){String sign1 = FastJsonUtils.toJson(sign.get("sign"));SignApiCode signApiCode = FastJsonUtils.fromJson(sign1, SignApiCode.class);signKey = signApiCode.getSignKey();signal = signApiCode.getSignal();}//发送远程调用请求,填写signApiCodetemplate.header("signKey",signKey);template.header("signal",signal);}}

私钥验证(博客系统)

之后的话,我们的博客系统就要去验证我们的密钥对不对。(其实你发现,这玩意不就是服务之间的验证码嘛)

这里的话,我们受保护的接口是这些:
在这里插入图片描述
所以的话,我们来创建一个切面来进行处理:

package com.huterox.hlangserver.aspect;
import com.huterox.common.utils.R;
import com.huterox.hlangserver.controller.innocontroller.auto.AutoInnoApiService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;@Aspect
@Component
public class InnoAutoAspect {@Pointcut("within(com.huterox.hlangserver.controller.innocontroller.api..*) && @annotation(org.springframework.web.bind.annotation.RequestMapping)")public void verification() {}private AutoInnoApiService autoInnoApiService;public InnoAutoAspect(AutoInnoApiService autoInnoApiService) {this.autoInnoApiService = autoInnoApiService;}@Autowiredpublic void setAutoInnoApiService(AutoInnoApiService autoInnoApiService) {this.autoInnoApiService = autoInnoApiService;}@Around("verification()")public R verification(ProceedingJoinPoint joinPoint) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();String signKey = request.getHeader("signKey");String signal = request.getHeader("signal");if(!autoInnoApiService.AcceptApiAutoCode(signKey, signal)){return R.error();}return (R) joinPoint.proceed();}
}

调试演示

okey,那么之后的话,我们来演示具体流程
(完整的前端怎么整合的我就不演示了,以前的博客都有,或者百度都可以)

我们来看到这个:
在这里插入图片描述

拿到私钥,然后扩充访问
在这里插入图片描述

之后的话再我们那个博客系统可以看到方行。

总结

okey,以上的就是我们今天的内容,当然这部分还有优化的点,首先就是我们的人人中台,在访问的时候,我们用的是apply,重写了里面的拦截。但是问题在于,这个是全局通用的,如果我们后面有另一个子系统,那么这个时候的话,就建议使用切面了。当然这里这样处理是因为,这里我就只设计两个子系统,上次的whitehole有9个微服务,服务器顶不住。所以这次不乱搞了,省点资源,后面再研究研究这个网站智能助手玩玩。

(ps: 有没有广州的大哥春招再联系联系(狗头))

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

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

相关文章

使用 PHP 中的 Invoke 方法实现灵活而强大的调用

在 PHP 中&#xff0c;__invoke 方法是一种特殊的魔术方法&#xff0c;允许对象像函数一样被调用。通过实现 __invoke 方法&#xff0c;你可以使对象变得可调用&#xff0c;这在某些情境下可以提供更灵活和强大的代码结构。本文将介绍如何在 PHP 中使用 __invoke 方法&#xff…

利用闭包与高阶函数实现缓存函数的创建

缓存函数是一种用于存储和重复利用计算结果的机制。其基本思想是&#xff0c;当一个函数被调用并计算出结果时&#xff0c;将该结果存储在某种数据结构中 (通常是一个缓存对象)以备将来使用。当相同的输入参数再次传递给函数时&#xff0c;不再执行实际的计算&#xff0c;而是直…

C# OpenVINO 直接读取百度模型实现印章检测

目录 效果 模型信息 项目 代码 下载 其他 C# OpenVINO 直接读取百度模型实现印章检测 效果 模型信息 Inputs ------------------------- name&#xff1a;scale_factor tensor&#xff1a;F32[?, 2] name&#xff1a;image tensor&#xff1a;F32[?, 3, 608, 608] …

浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Vue3 逻辑复用 - 组合式函数

“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 一个实现实现鼠标跟踪功能 <script setup> import { ref, onMounted, onUnmounted } from vueconst x ref(0) const y ref(0)function update(event) {x.value event.page…

简单的教务系统

#include <stdio.h> #include <string.h> #define N 20 int i,j,n,m,lll0,renshu6; double zcj[N]{0};struct stu{ char num[10]; //学号char name[10]; //姓名char sex; //姓别double score[3]; //3 门课的成绩double sum; //3 门课的总分double aver; //3 门课的…

【docker】docker基本命令

启动类命令 启动docker&#xff1a; systemctl start docker停止Docker&#xff1a; systemctl stop docker重启Docker&#xff1a; systemctl restart docker查看状态&#xff1a; systemctl status docker设置开机自启&#xff1a; systemctl enable docker帮助类命令 …

【XR806开发板试用】+2.鸿蒙内核

非常感谢基于安谋科技STAR-MC1的全志XR806 Wi-FiBLE开源鸿蒙开发板试用活动&#xff01;非常感谢极术社区&#xff01;非常感谢极术小姐姐&#xff01;非常感谢全志在线开发者社区&#xff01;非常感谢通过试用申请&#xff01;非常感谢安谋科技&#xff01; 接上一篇&#xff…

pytorch文本分类(二):引入pytorch处理文本数据

pytorch文本数据处理 目录 pytorch文本数据处理1. Pytorch背景2. 数据分割3. 数据加载Dataset代码分析字典的用途代码修改的目的 Dataloader 4. 练习 原学习任务链接 相关数据链接&#xff1a;https://pan.baidu.com/s/1iwE3LdRv3uAkGGI2fF9BjA?pwdro0v 提取码&#xff1a;ro…

Django和ECharts异步请求示例

前提条件 创建django项目&#xff0c;安装配置过程这里就不讲述了。 后端url http://127.0.0.1:8000/echarts/demo/ view视图函数 from django.http import HttpResponse import jsondef EchartsDemo(request):data {}categories ["衬衫","羊毛衫",&…

Java架构师系统架构高性能维度分析

目录 1 导语2 性能维度概述和定义3 高性能流程4 高性能实现方案-缓存为王5 高性能实现方案-异步为帅、分布式为将6 高性能高并发架构案例分析7 总结想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导语 Java架构师在构建高性能系统架构时,需要关注以下几个关键维度:…

Monkey工具之fastbot-iOS实践

背景 目前移动端App上线后 crash 率比较高&#xff0c; 尤其在iOS端。我们需要一款Monkey工具测试App的稳定性&#xff0c;更早的发现crash问题并修复。 去年移动开发者大会上有参加 fastbot 的分享&#xff0c;所以很自然的就想到Fastbot工具。 Fastbot-iOS安装配置 准备工…

低代码与自动化:加速软件开发的新趋势

低代码与自动化技术正在逐渐改变软件开发的面貌。随着科技的不断发展&#xff0c;传统的编程方式已经不再是唯一的选择。低代码和自动化技术正在为开发者提供更高效、更灵活的开发环境&#xff0c;使得软件开发变得更加简单、快速和高效。 低代码和自动化技术正在逐渐改变软件开…

Linux-----4、关机|重启

# 关机、重启 关机和重启操作只有管理员可以执行&#xff01; # 1、关机命令 shutdown -h now 立刻马上关机 shutdown -h 60 60分钟&#xff08;1个小时&#xff09;后关闭 说明&#xff1a;如果取消在另一终端使用shutdown -c 或者直接ctrlc # 2、重启命令 reboot 重启…

如何控制Elasticsearch搜索的相关性?

控制相关性 纯粹处理结构化数据(例如日期、数字和 字符串枚举)很简单:他们只需要检查一个文档(或 行,在关系数据库中)与查询匹配。 虽然布尔值是/否匹配是全文搜索的重要组成部分,但它们 光靠自己是不够的。相反,我们还需要知道每个的相关性 document 是查询。全文搜索…

杨辉三角形-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第17讲。 杨辉三角形&#…

模型放置到3D场景中后模型位置与鼠标选中的位置不一致怎么办?

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 1、问题 从事3D建模相关工作的朋友们在工作中经常会遇到以下几种问题&#…

RS485转WiFi工业路由器在冷链物流温度监控中的应用

随着物联网技术的不断发展和应用&#xff0c;冷链物流行业也迎来了新的机遇和挑战。在冷链物流中&#xff0c;对温度监控的要求尤为重要&#xff0c;因为温度是保证货物质量和安全的关键因素之一。而RS485转WiFi工业路由器则成为了实现高效、可靠的温度监控系统的重要组成部分。…

做博客网站需要什么配置的服务器?

​  利用搭建博客网站&#xff0c;来分享生活、知识和经验&#xff0c;是很多个人站长乐意做的事情。但&#xff0c;对于互联网行业的新人来说&#xff0c;或许不知道搭建个人博客网站的配置如何选择&#xff0c;本文针对这一点&#xff0c;从地域、服务器类型、配置参数等方…

SpringBoot整合Lucene实现全文检索【详细步骤】【附源码】

笑小枫的专属目录 1. 项目背景2. 什么是Lucene3. 引入依赖&#xff0c;配置索引3.1 引入Lucene依赖和分词器依赖3.2 表结构和数据准备3.3 创建索引3.4 修改索引3.5删除索引 4. 数据检索4.1 基础搜索4.2 一个关键词&#xff0c;在多个字段里面搜索4.3 搜索结果高亮显示4.4 分页检…