分销业务场景
分销一、什么是分销在西方经济学中,分销的含义是建立销售渠道的意思。分销渠道又叫营销渠道,是指某种商品或服务从生产者向消费者转移的过程中,获取这种商品或服务的所有权,帮助所有权转移的所有企业和个人。
分销,简单的说,就是让更多的人帮助企业卖货,企业通过裂变分销,实现分销渠道裂变从而达到销售商品的目的。企业为了销售商品,主要的任务是把自己的商品销售出去来获取更多的利润。
传统的销售渠道就是公司招聘销售员,由销售员进行推销产品,另外也会通过互联网进行一些宣传,总而言之一切都是为了把货卖出去。而分销模式是通过分销员向自己身边的朋友以及家人宣传和推广商品并且成交订单,分销员就可以获得一定比例的返佣。
分销的三级代理模式:
二、分销模式的应用分销模式主要是商家在销售商品或服务时,通过其用户的粉丝效应或者朋友交际圈来扩大销售覆盖人群最终实现商品的销售,在电商、保险、信用卡、社区团购较为常见。我们平常在进行商品下单的时候,常需要我们填些推荐码时,或者通过专属的分享链接进行下单,例如我们常见的有淘宝联盟、直播电商平台中主播挂的购物链接等等,这都是属于分销模式。
分销模式最主要的特点为:下级的收 ...
「Sentinel - 7」-- 规则配置持久化
规则配置持久化规则Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:
通过 API 直接修改 (loadRules)
通过 DataSource 适配不同数据源修改
通过 API 修改比较直观,可以通过以下几个 API 修改不同的规则:
12FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。
规则管理模式Sentinel的控制台规则管理有三种模式:Sentinel的规则默认是保存在内存中,Sentinel重启之后规则就会丢失
推送模式
说明
优点
缺点
原始模式
API 将规则推送至客户端并直接更新到内存中,扩展写数据源(WritableDataSource),默认就是这 ...
「Sentinel - 6」-- 系统自适应保护 & 来源控制
系统自适应保护Sentinel 系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
背景在开始之前,先回顾一下 Sentinel 做系统自适应保护的目的:
保证系统不被拖垮
在系统稳定的前提下,保持系统的吞吐量
长期以来,系统自适应保护的思路是根据硬指标,即系统的负载 (load1) 来做系统过载保护。当系统负载高于某个阈值,就禁止或者减少流量的进入;当 load 开始好转,则恢复流量的进入。这个思路给我们带来了不可避免的两个问题:
load 是一个“果”,如果根据 load 的情况来调节流量的通过率,那么就始终有延迟性。也就意味着通过率的任何调整,都会过一段时间才能看到效果。当前通过率是使 load 恶化的一个动作,那么也至少要过 1 秒之后才能观测到;同理,如果当前通过率调整是让 load 好转的一个动作,也需要 1 秒之后才能继续调整,这样就浪费了系统的处理能力。所以我们看到的曲线,总是会有抖动。
恢 ...
「Sentinel - 5」-- 熔断降级
熔断降级概述除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
注意:本文档针对 Sentinel 1.8.0 及以上版本。1.8.0 版本对熔断降级特性进行了全新的改进升级,请使用最新版本以更好地利用熔断降 ...
「Sentinel - 4」-- 热点参数限流
热点参数限流热点参数规则热点参数规则(ParamFlowRule)类似于流量控制规则(FlowRule):
属性
说明
默认值
resource
资源名,必填
count
限流阈值,必填
grade
限流模式
QPS 模式
durationInSec
统计窗口时间长度(单位为秒),1.6.0 版本开始支持
1s
controlBehavior
流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持
快速失败
maxQueueingTimeMs
最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持
0ms
paramIdx
热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList
参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode
是否是集群参数流控规则
false
clusterConfig
集群流控相关配置
我们可以通过 ParamFlowRuleM ...
「Sentinel - 3 」-- 流量控制&规则
流量控制&规则流量控制规则 (FlowRule)流量规则的定义重要属性:
Field
说明
默认值
resource
资源名,资源名是限流规则的作用对象
count
限流阈值
grade
限流阈值类型,QPS 或线程数模式
QPS 模式
limitApp
流控针对的调用来源
default,代表不区分调用来源
strategy
调用关系限流策略:直接、链路、关联
根据资源本身(直接)
controlBehavior
流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流
直接拒绝
同一个资源可以同时有多个限流规则。
通过代码定义流量控制规则理解上面规则的定义之后,我们可以通过调用 FlowRuleManager.loadRules() 方法来用硬编码的方式定义流量控制规则,比如:
1234567891011private static void initFlowQpsRule() { List<FlowRule> rules = new ArrayList<>(); Flow ...
「Sentinel - 2」-- Sentinel基本使用
Sentinel基本使用简介Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard,但是结合 Dashboard 可以取得最好的效果。
我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为几个步骤:
定义资源
定义规则
检验规则是否生效
先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
对于主流的框架,我们提供适配,只需要按照适配中的说明配置,Sentinel 就会默认定义提供的服务,方法等为资源。
定义资源方式一:主流框架的默认适配为了减少开发的复杂程度,我们对大部分的主流框架,例如 Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor 等都做了适配。您只需要引入对应的依赖即可方便地整合 Sentinel。可以参见:主流框架的适配。
我们 ...
Vim基础
Vim基础Vim的操作模式Vim有四种操作模式,分别为:
正常模式(normal-mode)
插入模式(insert-mode)
命令模式(command-mode)
可视模式(visual-mode)
① 正常模式正常模式主要用来浏览和修改文本内容的。
一般的打开Vim之后默认的都是正常模式。在任何模式下,只要按下 Esc 键就可以返回正常模式。
② 插入模式插入模式是用来向文本中添加内容的。
i:表示进入插入模式,并在光标所在字符前开始输入;
a:表示进入插入模式,并在光标所在字符后开始输入;
o (字母o):表示进入插入模式并在光标所在行的下一新行开始输入;
s:表示进入插入模式,并删除光标所在的字符;
I:在行首开始输入文字并进入插入模式。此行首指第一个非空白字符处。如果行首有空格,则在 空格之后输入文字并进入插入模式;
A:在行尾开始输入文字并进入插入模式。这个好用,您不必管光标在此行的什麽地方,只要按 A 就会在行尾等着您输入文字;
O (大写字母O):在光标所在行的上面单独开一新行来输入文字并进入插入模式;
S:删除光标所在行并进入插入模式;
③ 命令模式命令 ...
「设计模式」- 单例模式
单例模式饿汉式在类加载的时候直接将Singleton对象提前创建好,等需要用的时候调用getSingleton()方法获取即可。
提前创建,是一种空间换时间的方式,无法实现延迟加载。
12345678910111213141516171819/** * 饿汉式 * 特点: * 1. 空间换时间 -- 一上来就创建对象(慢),后面直接用就好; * 2. 线程安全; */class Singleton { // 私有构造方法,其他类不能访问该构造方法,即无法通过构造器来实例化对象 private Singleton() { } // 私有当前类的实例对象,让外部对象无法直接对其进行访问 private static final Singleton s = new Singleton(); // 对外提供公共的访问方法 public static Singleton getS() { return s; }}
JDK源码中的典型实现: java.lang.Runtim ...
浅析面向对象和面向过程
浅析面向对象和面向过程面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着开发者以不同的方式去分析、设计和开发软件。
早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的不足也越来越明显,随之应运而生的就是面向对象思想,并成为目前开发者们使用的主流思想。两者都贯穿于软件分析、设计和开发各个阶段,根据面向对象思想的使用场景,又可以分别称为 面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)。
C语言是一种典型的面向过程语言,Java是一种典型的面向对象语言。
面向过程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。 这种适合简单的任务,不需要过多协作的情况下。比如,如何开车?我们很容易就列出实现步骤:
点火 –> 挂挡 –> 给油 –> 走你
面向过程适合简单、不需要太多模块协作的事务,重点关注如何一步一步地执行。
但是当我们思考比较复杂的设计任务时,比如“如何造车?”,就会发现列出1234这样的步骤,是不可能的。因为造车太复杂,需要很多部门协作才能完成。此时面向对象思想就非 ...
浅析数仓
浅析数仓随着互联网及物联网等技术发展,越来越多的数据被生成,如何有效利用这些数据就成为了企业决胜的法宝了。大型公司会基于数据做出BI、推荐系统、决策支持、统计分析、报表等业务。
OLTP VS OLAP1970年随着关系数据库理论的提出,诞生了一系列经典的RDBMS,如MySQL、Oracle、SQL Server、DB2等。这些RDBMS为社会信息化的发展做出的重大贡献。然而随着数据库使用范围的不断扩大,它被逐步划分为操作型数据库OLTP(在线事务处理)跟分析型数据库OLAP(在线分析处理)。
OLTP操作型数据库OLTP(On-Line Transaction Processing 在线事务处理)也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通常对记录进行CRUD。OLTP模式下用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段,主要用于操作型处理。
OLAP分析型数据库OLAP(On-Line Analytical Processing)叫在线分析处理,主要用于历史数据分析。这类数据库作为公司的单 ...
浅析CAP理论&Base理论
浅析CAP理论&Base理论CAP理论CAP理论是分布式应用的理论基础,虽然所有的分布式系统在设计时都会向其看齐,但事实上的所有分布式系统都不可能同时满足CAP三种特性:
一致性 [C: Consistency]在分布式环境中,一致性是指数据在多个副本(分布式节点)之间能否保持数据强一致的特性。在一致性的要求下,当一个系统在数据一致状态下执行更新操作后,应该保证系统的数据仍然处于一致状态。
可用性 [A: Available]可用性是指系统提供的服务必须一直处于可用的状态,对用户的每一个请求操作总是能够在有限时间内返回结果。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。
分区容错性 [P: Partition Tolerance]分布式系统在遇到任何网络分区故障的时候,仍然能够保证对外提供满足一致性或者可用性的服务,除非是整个网络环境都发生了故障。分区容错性要求应用虽然是一个分布式系统,但看上去是在一个可以运转正常的整体。比如现在的分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没 ...
「Spring Cloud-2-2」-- Eureka内部机制及源码分析
Eureka 内部机制及源码分析Eureka 运作原理Eureka-server 对外提供的是 restful 风格的服务,以http动词的形式对url资源进行操作:get、 post、 put、 delete,只要利用这些restful接口我们就能对项目实现注册和发现,只不过eureka已经帮我们使用java语言封装好了client端的代码,让开发者只需要在项目中依赖Eureka Client就能实现注册和发现。
只要能发起 Http 请求,那就可以向Eureka Server进行服务注册和发现,不管是什么语言。
服务注册当Eureka Client项目启动时,就会向Eureka Server发送自己的元数据(原始数据),如:运行的 ip、端口 port、健康的状态监控等。使用的是HTTP/ResuFul 请求风格。Eureka Server会在自己内部保留这些元数据(JVM内存中),形成一个服务列表。注册过程中为避免网络问题,会尝试3次。Eureka提供的是ResutFul风格的HTTP请求,Eureka封装的Java客户端底层使用的是Jersey框架进行HTTP请求。
注册调用链 ...
「Spring Cloud-2-1」-- Eureka Quick Start
Spring Cloud EurekaEureka是服务注册发现中心。Eureka 来源于古希腊词汇,意为“发现了”。在软件领域, Eureka是Netflix公司开源的一个服务注册与发现的组件,和Netflix公司其它的一些服务组件(例如:负载均衡、 熔断器、网关等) 一起被Spring Cloud社区整合为Spring Cloud Netflix模块。 Eureka是Netflix贡献给Spring Cloud的一个开源框架。
同为注册中心,相比动物管理员Zookeeper,Spring Cloud Eureka有什么区别呢?
核心点在于分布式微服务中的CAP定理!
问:为什么 Zookeeper 不适合做注册中心?
Zookeeper 注重数据的一致性,Eureka 则侧重服务的可用性。
在 Zookeeper中,若Leader挂了,则Zookeeper集群整体不对外提供服务了,直到重新选举出一个新的Leader出来(选举时间大约120s 左右),才能继续对外提供服务。
Eureka注重服务的可用性,当Eureka集群只要有一台活着,它就能对外提供服务。
Zookeeper ...
「Spring Cloud - 1」-- 浅析分布式架构和微服务架构
浅析分布式架构和微服务架构分布式架构在《分布式系统原理与范型》一书中有如下定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”;
分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法完成的计算、存储等任务。其目的是利用更多的机器,处理更多的数据。
分布式系统(distributed system)是建立在网络之上的软件系统。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、提升CPU核数)无法明显改善时,应用程序也无法进一步优化的场景,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议,带来更多的问题。
因此,随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,急需一个治理系统确保架构有条不 ...
Ribbon
轮训算法的实现
%取模运算的结果得到一个整型的周期函数,让得到的结果总是小于除数的。
1 % 2 = 1
2 % 2 = 0
3 % 2 = 1
4 % 2 =0
…
这样就得到一个[0,1]区间的一个周期函数。
CAS在Java层面是无锁的状态,但是在JVM层面还是有锁的,总线锁或者缓存锁。
基于CAS的自旋锁,如果有线程同时操作可能会导致短暂的CPU飙升,还有总所周知的ABA问题。
Java SPI
Java SPISPI(Service Provider Interface),是一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,其核心是基于“面向接口编程+策略模式+配置文件”组合实现的动态加载机制。
SPI是一种机制,Java SPI只是它的其中一种实现。
SPI整体机制如图:
当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类的全路径名。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行反射加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader。
SPI和API的区别在现今的微服务的框架下,我们最常见的是提供API服务,也就是接口和实现都部署在同一个集群中,向外通过Http/Rpc协议进行暴露,外部调用方通过引入j ...
跨域问题及解决方案
跨域问题什么是跨域问题?出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面的URL具有相同的协议(protocol),主机/域名(host)和端口号(port)。
URI、URL和URN的区别当我们打开浏览器,要访问一个网站或者一个ftp服务器的时候,输入一串字符串, 比如:https://blog.csdn.net/或者:ftp://192.168.0.111/,这样我们就可以得到一个html格式的页面或者一个文件。那么这个地址是什么意思呢?就必须要从URI、URL、URN讲起。
定义
URI = Uniform Resource Identifier 统一资源标志符
URL = Uniform Resource Locator 统一资源定位符
URN = Uniform Res ...
普通Token令牌 vs. JWT令牌
普通Token令牌 vs. JWT令牌
SpringSecurityOauth2令牌参考: SpringSecurityOauth2令牌
令牌分类常见的令牌有两种:普通令牌Token 和 JWT令牌
JWT令牌请见博文:浅析JWT
普通令牌唯一标识存储在数据库或内存中的用户信息,在认证时,SpringSecurity服务端会拿着普通令牌去数据库中查询用户信息来实现认证鉴权。
JWT令牌JWT令牌本身就存储着用户信息,在认证时,SpringSecurity从JWT令牌中按照约定的加密算法,解析出用户信息即可实现认证,不需要借助数据库等进行存储,进一步提高了认证鉴权的性能。
普通Token令牌普通令牌是SpringSecurityOauth2给客户端颁发的一个无含义的令牌,在令牌发布时,SpringSecurityOauth2将用户信息存储到程序指定的存储位置,并用普通令牌唯一标识这个存储信息,当用户再次携带令牌访问时,SpringSecurityOauth2会根据令牌查询用户信息,进而实现权限角色的限制。
普通令牌需要一个存储用户信息的地方,这个地方可以本地内存,也可以是数据库(R ...
JVM钩子
JVM钩子JVM进程在接收到kill -15信号通知的时候,是可以做一些清理动作的,比如:删除临时文件等。当然了,开发者也可以基于该信号自定义做一些额外的操作,比如:让tomcat容器停止,让dubbo服务下线,清理数据等。这种自定义JVM清理动作的方式,是通过JDK中提供的ShutdownHook实现的。JDK提供了Java.Runtime.addShutdownHook(Thread hook) 方法,可以注册一个在JVM关闭时需要执行的钩子方法。
kill命令原理请见博文:kill -9的原理
JVM钩子的作用JVM钩子方法的执行时机是在所有非守护线程都执行完成之后,在JVM进程退出之前,利用钩子线程去执行一些清理工作,如:释放资源,文件清理等等。
我们都知道,在Linux中,Java应用是作为一个独立进程运行的,Java程序的终止就是基于JVM进程的关闭实现的,JVM进程关闭方式分为3种:
正常关闭:当最后一个非守护线程运行结束 或者 调用了 System.exit( ) 或者 通过其他特定平台的方法关闭 或者 执行 kill [-15](接收到SIGINT(2)、SIG ...