- 博客(42)
- 资源 (6)
- 收藏
- 关注
原创 CAS单点登录原理及改造
假设此时另一个业务系统bussiness.test.com也进入了CAS,在浏览器首次打开bussiness.test.com时,由于当前域名下没有存储token,则也会跳转到CAS中,url为cas.test.com/login?3) CAS校验用户名密码,校验成功,则根据用户信息生成TGT、TGC,并将TGC写入到浏览 器的cookie中,同时根据TGT生成ST,再重定向到mail.test.com?1) TGT: 票据,或称大令牌,在登录成功之后生成,其中包含了用户信息。
2023-03-16 17:29:10
1646
原创 spring 三级缓存源码分析
spring中对于循环依赖的解决采用了三级缓存机制,即:Map<String, Object> singletonObjects //第一级缓存,存放初始化完成的beanMap<String, Object> earlySingletonObjects //第二级缓存,存放半成品beanMap<String, ObjectFactory<?>> singletonFactories //第三级缓存,存放be
2022-02-20 21:45:47
3386
1
原创 SpringBoot OAuth2.0认证管理流程详解
OAuth2.0是一个开放的授权协议,可以用来实现第三方应用对我们API的访问控制,OAuth2.0中定义的角色包括: 1) Resource Owner(资源拥有者) 2) Client (第三方接入平台,请求者) 3) Resource Server (服务器资源: 数据中心) 4) Authorization Server (认证服务器) 授权认证的基本流程包括: 首先Client需要向Resource Ow......
2021-12-12 11:39:29
17766
4
原创 springboot解决跨域问题
跨域问题是指浏览器从一个域名访问另一个域名的资源时,协议、地址、端口任何一个不同,则认为是跨域,此时无法向跨域地址发送ajax请求(浏览器会拒绝该请求)。 首先基于springboot演示下跨域问题,本段应用的端口为8101, 在前端页面访问另一个项目端口为8401的地址:<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://...
2021-11-30 16:35:29
1355
原创 notify导致死锁的示例
在多线程之间的同步中,一般采用Object.wait()、Object.notify()、Object.notifyAll()来实现,而notify可能会导致多线程之间出现死锁,下面通过生产者消费者的示例来说明: 生产者代码:while(true) { synchronized (queue) { while (queue.size() == maxSize) { #ref_p1 try { System.out.println...
2021-11-28 16:55:39
3176
1
原创 基于spring cloud实现订单服务框架demo(三)
上一篇文章中阐述了用户下单的逻辑以及具体的技术点,本篇阐述另外一个重要的业务逻辑,即订单消息的异步通知机制基于rocketmq实现订单消息的异步通知订单创建完成之后,用户需要在指定的时间内支付该订单,支付成功之后,则需要安排订单的发货,这里需要调用第三方物流接口完成物流订单的创建,然而第三方物流接口是不稳定的,可能存在不可用的情况,因此如果直接在支付模块中调用第三方物流接口,如果遇到调用失败的情形,则整个订单被视为支付失败,这样对于用户的体验很不好。因此这里需要进行业务的解耦,即将物流服务和支付服务解
2021-10-05 21:22:37
386
原创 基于spring cloud实现订单服务框架demo(二)
在上一篇中阐述了基于zuul实现网关进行权限校验的技术点,本篇主要阐述下单服务的相关逻辑:下单服务的业务逻辑包括两个部分: 扣减库存、生成订单,其中扣减库存调用库存服务的接口,生成订单调用订单服务的接口,这2个接口的调用需要保证原子性,即库存扣减了订单必须要生成;如果订单生成失败则扣减的库存需要重新加上。另外订单生成之后有一个待付款的时间,一般为30分钟,如果超时未支付,则关闭该订单且将库存重新加上,整体的业务时序图如下:...
2021-10-04 09:49:17
329
原创 基于spring cloud实现订单服务框架demo(一)
springcloud是目前比较热门的微服务管理框架, 最近基于springcloud完成了订单服务框架的demo,在此记录一下框架的整体设计点和一些关键的技术点。
2021-10-04 09:31:56
629
原创 分布式事物框架seata使用示例
随着微服务使用越来越广泛,微服务的管理也成为了热点的技术话题,微服务化后带来最主要的技术问题就是分布式事物,Seata 作为一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,我们通过demo来演示seata的使用 一、seata基本原理 Seata中的相关概念包括: 1)Transaction Coordinator (TC): 事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。...
2021-05-03 23:48:25
1025
原创 livy在交互式查询中的深度定制
随着SparkSql在大规模数据分析中的运用越来越广,在大数据分析平台中集成SparkSql提供用户交互式sql查询的功能已经成为了很多开发者的选择,而将SparkSql作为rest服务有两种方式: jobserver和livy;其中livy作为Apache的孵化项目,其良好的框架设计已经成为了spark rest服务的标准接口。 客户端与livy server交互的基本流程如下图所示: 我们在企业级的大数据平台中选择了livy作为我们的sql查...
2021-04-28 20:05:06
1484
2
原创 基于动态规划实现正则表达式匹配
题目描述给定一个字符串s和一个字符规律p,实现一个支持 '.'和'*'的正则表达式匹配。 1. '.' 匹配任意单个字符 2. '*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。 1) 0 <= s.length<= 20 2) 0 <= p.length<= 30 3) s可能为空,且只包含从a-z的小写字母。 4) p可能为空,且只包含从a-z的小写字母,以及字符.和...
2021-03-26 23:27:46
381
原创 最长有效括号题解
给定一个只包含 '('和 ')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例 1:输入:s = "(()"输出:2解释:最长有效括号子串是 "()"示例 2:输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"这里采用动态规划加递归解决该问题1) 有效括号字符串中至少包含一对"()",因此首先遍历字符串,找到"()",如果找不到,则说明字符串中没有有效括号2) 当找到"()"后,则找到了第一个有效括号,假设s[i][j]表示字符串..
2021-01-24 11:45:22
254
原创 HashMap的线程不安全性与FailFast机制
1. HashMap底层存储的原理 HashMap底层的原理如下图: 其内部采用数组+链表的结构,每个数组对应一个bucket,一个bucket就是一个链表。当添加数据时,首先根据key计算得到hashcode,根据hashcode找到entry数组的位置,从该顶端位置往下遍历链表,如果发现某个其中某个node的key与待添加的key相同,则将该node的value替换,否则在链表的尾端新增一个node,存入待添加的key和value。2. HashMap的线程不安全性 ...
2020-08-23 17:29:54
463
原创 基于springboot和redis实现的抢红包demo
本文基于springboot和redis实现了抢红包的基本功能,代码请见:https://github.com/futao1991/redPacket_demo一、基本实现步骤 redis中维护3中类型的键,分别为redPacket_num,类型为Hash,记录每个红包的数量;redPacket_record类型为Hash,记录每个用户的抢红包记录,以防止一个用户对一个红包进行重复抢;用户发红包之后,在redis中生成一个红包uuid的键,其值为红包金额,其它用户抢红包时,对该红包uu...
2020-08-15 23:25:37
3163
原创 VXLAN基本原理与配置示例
一 VXLAN的原理 VXLAN(Virtual eXtensible LAN 可扩展虚拟局域网络)是一种网络虚拟化技术,底层基于IP网络,采用"Mac In UDP"封装形式的二层VPN技术。相当于VLAN,VXLAN具有以下优势: 1)应用灵活部署: 通过VXLAN封装后的2层以太网帧可以跨3层网络边界,让组网以及应用部署变得更加灵活,同时解决多租户网络环境中IP地...
2020-03-16 16:44:19
13030
原创 BGP基本概念与配置示例
BGP(边界网关协议)是互联网上一个核心的去中心化自治路由协议,它的目的是去中心化,以达到各个网络自治。 BGP里面的核心概念包括: 1)AS(Autonomous system):自治系统,指在一个(有时是多个)组织管辖下的所有IP网络和路由器的全体,它们对互联网执行共同的路由策略。也就是说,对于互联网来说,一个AS是一个独立的整体网络。而BGP实现的...
2020-03-08 21:58:03
1646
原创 OSPF基本概念与配置示例
一、OSPF的概念 大家都知道,一个大型网络系统中包含了很多路由器,负责进行报文的筛选与转发,而路由器中最核心的概念就是路由表,它充当了报文的导向图作用,告知报文下一步应该怎么走;当网络系统较小时,可以手动配置路由器的静态路由表,但是当路由器数据增多时,特别是涉及到网络中有路由器增加或者删除的情况,每次都需要重新配置路由表,工作量太繁琐,因此引入了OSPF协议,也就是路由器可以动态...
2020-02-29 22:43:42
1198
原创 单臂路由实现不同vlan之间互相通信的配置
1. vlan的基本概念 vlan(virtual lan)即虚拟局域网,我们知道交换机作为二层交换设备,连接在一台交换机上所有设备组成了一个局域网,该局域网内所有的设备可以自由通信,但是这里存在一个问题,即某个设备如果向交换机发送了一个广播报文,则该交换机下所有的设备都将收到该报文,因此连接在同一个交换机下的所有设备构成了一个广播域。然而广播报文的危害是比较大的,会消耗大量带宽,降...
2019-12-29 22:00:08
5628
原创 HDFS写入监控链路调研设计
1. 背景: 线上HDFS的DataNode中频繁出现Slow write日志 从日志分析来看,Slow write分为write to mirror和write to disk两类 为便于分析网络或者磁盘写入的情况,设计了HDFS的写入监控链路,采集DataNode中出现的slow日志收集,供后续分析。2. HDFS的源码分析 下...
2019-08-05 11:21:17
1051
原创 spark处理数据倾斜的案例
在前期的工作遇到了很多数据倾斜的案例,在此记录下解决的心得1) 大表join小表: 执行某段sql,出现了Executor OOM的现象,查看其stage的状况: 第3个stage读取了21.1G的数据,并shuffle写入了2.6G的数据,由于两个表根据字段进行join,因此必然会触发shuffle操作。最后的stage4 需要从stage3 shuffl...
2019-06-30 16:33:31
981
原创 spark读取Hbase的优化
因为要对HBase中的链路数据进行分析,考虑到直接扫描HBase表对HBase集群压力较大,因此通过扫描HFile文件来完成。 HBase的中数据表是按照小时来存储的,在扫描某一个小时的数据表时,首先建立该表的快照(Snapshot),再基于HBase提供的TableSnapshotInputFormat类来完成HFile的读取,核心的代码如下:val in...
2019-06-30 15:47:20
4253
7
原创 Kubernetes部署入门
Kubernetes正成为云计算中部署和管理软件的新标准,提供了自动化部署、系统自愈、水平扩展、服务发现和负载均衡、自动更新和回滚、秘钥和配置管理、存储挂载等功能,前期在k8s中部署了springboot项目,把一些配置信息记录下来。 1) 创建Docker镜像#指定基础镜像FROM hub.xfyun.cn/odeon/openjdk:8-jdk#...
2019-05-02 21:44:41
163
原创 oozie workflow开发步骤
oozie是Hadoop平台中的任务调度系统,可以将不同类型的作业串联起来,oozie中的核心概念称为workflow,即工作流,每种类型的作业都是一个工作流,oozie中已经集成的workflow包括hive、spark、hdfs、distcp等,有时我们可能需要扩展workflow,添加业务需要的逻辑,在这里介绍下扩展workflow的一般步骤。 这里以扩展liv...
2018-10-05 13:01:40
1182
原创 sparksql集成sentry遇到的问题
sparksql本身并不提供安全认证机制,当前集群的安全认证主要包括sentry和ranger两大块,在通过sparksql执行建表时,sentry的权限报错'org.apache.hadoop.hive.metastore.api.MetaException: User xxx does not have privileges for CREATETABLE',然而通过hive的b...
2018-07-24 20:50:05
3545
3
原创 基于spark logicplan的表血缘关系解析实现
随着公司平台用户数量与表数量的不断增多,各种表之间的数据流向也变得更加复杂,特别是某个任务中会对源表读取并进行一系列复杂的变换后又生成新的数据表,因此需要一套表血缘关系解析机制能清晰地解析出每个任务所形成的表血缘关系链。 实现思路: spark对sql的操作会形成一个dataframe,dataframe中的logicplan包含了sql的语法树,通过对lo...
2018-04-30 23:33:52
6672
10
原创 scala与java混合编译出现的问题
工程项目中同时包含scala和java代码,如果在java中调用scala的类,编译时可能会报找不到scala类的错误,出现这种问题的解决办法是需要对scala进行先行编译,具体需要在pom文件中添加一下plugin: <plugin> <groupId>org.apache.maven.plugins</groupId> <artif...
2018-04-22 17:54:01
1944
原创 spark读取表出现Unsupported encoding: DELTA_BYTE_ARRAY问题
利用spark读取parquet表时,有时会出现以下异常:java.lang.UnsupportedOperationException: Unsupported encoding: DELTA_BYTE_ARRAY 原因:源表的parquet文件采用ParquetWriterV2写入的,DELTA_BYTE_ARRAY encoding是Parquet V2的新特色,与V1不完全兼容...
2018-03-22 17:45:17
1480
原创 修改spark thriftserver返回日志信息
通过spark thriftserver提交sql至spark运行时,由于thriftserver默认读取的是本地的日志文件,因此getQueryLog会返回空,为了支持spark运行模式下返回任务运行信息,对getQueryLog方法进行修改。 首先在org.apache.hive.service.cli.operation.Operation类中添加接口: ...
2018-03-18 13:40:00
1638
3
原创 自定义logger采集hdfs的审计日志
Hadoop提供了日志审计功能,可以记录对hdfs的操作,包括创建文件、上传文件、删除文件等。在某个业务场景中,我们期望将hdfs的操作日志记录到日志平台中,日志平台基于Kafka实现,因此需要将日志发送到Kafka中。 首先继承log4j的AppenderSkeleton实现自定义的appender:@Datapublic class DcLog4jAppender ex...
2018-03-11 14:07:23
2240
原创 python aspect拦截工具介绍
aspectlib是一个第三方的python库,提供了一种便捷的aop拦截方法,下面介绍其使用方法。 首先需要安装aspectlib库,执行命令 pip install aspectlib。 下面的代码是拦截系统的open方法,在调用open之前打印出文件名:import aspectlib@aspectlib.Aspectdef mock_open(*param): ...
2018-03-10 20:57:21
1433
原创 spark jobserver设计[3]--状态监控
jobserver在运行用户的作业时,需要提供相关的监控信息给用户,包括作业运行进度、各个阶段的运行诊断、节点的信息等。 一 日志展示 spark执行任务时按照宽窄依赖将任务划分为不同的stage,每个stage包含多个task,在此以stage和task的完成情况展示任务执行进度。spark提供了SparkListener抽象类,通过继承该类并且实现相关的抽象方法...
2018-02-17 21:36:08
706
原创 spark jobserver设计[2]--作业运行
jobserver主要运行3种类型的作业:sql、jar、python,下面分别概述这3种作业的运行原理。 yarn端接收任务的rest接口为/sparkDriver/runSparkJob,传入的参数为: jobType:作业类型(sql/jar/python) jobCode: 作业实例code userId: 用户id ...
2018-02-17 21:35:54
712
原创 spark jobserver设计[1]--整体架构概览
sparkjobserver的设计初衷即"spark as service",将spark作为一个long running服务并且对外提供rest接口,用户在不用关心底层配置细节的情况下提交作业至jobserver上运行。目前,jobserver这块已经承担了公司大数据平台后台的作业运行,进过几次迭代开发,性能与稳定性已经明显提升。 sparkjobserver的特性如下: ...
2018-02-17 21:35:35
1260
原创 自定义SparkSql语法的一般步骤
SparkSql提供了对Hive的结构化查询语言,在某些业务场景下,我们可能需要对sql语法进行扩展,在此以自定义merge语法说明其一般步骤。 Hive中parquet格式表的数据文件可能会包含大量碎片文件(每次执行insert时都会产生独立的parquet文件),碎文件过多会影响hdfs读写效率,对表中的文件合并的一般步骤是通过对rdd做repartition操作,再重新写入
2017-10-22 13:03:42
2659
原创 pyspark中使用自定义模块的问题
在使用pyspark时,调用自定义的模块(.zip、egg),可能会遇到以下问题:File "/usr/install/anaconda2/lib/python2.7/site-packages/pyspark/serializers.py", line 454, in loads return pickle.loads(obj)ImportError: No module na
2017-09-04 20:01:35
3422
原创 AspectJ使用示例
AspectJ是一个面向切面的AOP框架,AOP的织入方式分为编译期织入、装载期织入、运行期织入。编译期织入是指在类编译期间利用特殊编译将切面织入到类中,这样生成到字节码中已经包含了切面;装载期织入是指在字节码加载到虚拟机时将切面织入到类中。下面给出一个AspectJ使用示例,spark的rdd类中由很多写hdfs文件的方法,为了保证spark的执行效率,需要对这些方法进行屏蔽。 首先...
2017-05-14 15:03:40
3112
原创 Spark-ThriftServer源码分析
Spark1.1之后的版本引入了ThriftServer和CLI,使得Hive用户和RDBMS用户可以直接通过JDBC方式提交SQL至Spark运行而无需编写sparksql代码,下面对spark-thriftserver的源码进行简单分析。
2017-04-22 10:49:23
3870
原创 Sqoop2中Connectors开发方法
Sqoop是Hadoop生态圈中的ETL抽取工具,可以从关系型数据库抽取数据至HDFS、HBase、Hive中,其内在机制利用了MapReduce进行多节点并行抽取,可以有效地提升抽取速度。1. Sqoop抽取原理 Sqoop抽取的核心思想是对sql语句进行分割,例如对表A进行抽取时,首先要指定一个抽取字段,默认是表的主键,假设为objectId,首先会计算出min(objectId...
2016-10-30 13:29:25
3340
1
Thingking in Java
2016-09-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人