CN112256456B - 一种基于Dubbo服务的会话消息的传递方法和装置 - Google Patents
一种基于Dubbo服务的会话消息的传递方法和装置 Download PDFInfo
- Publication number
- CN112256456B CN112256456B CN202011206768.6A CN202011206768A CN112256456B CN 112256456 B CN112256456 B CN 112256456B CN 202011206768 A CN202011206768 A CN 202011206768A CN 112256456 B CN112256456 B CN 112256456B
- Authority
- CN
- China
- Prior art keywords
- filter
- request
- context message
- dubbo service
- local variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种基于Dubbo服务的会话消息的传递方法和装置,该传递方法包括:第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对第一请求进行处理;第一过滤器从第一请求中获取第一上下文消息,并将第一上下文消息存储在第一线程局部变量中,在第一过滤器完成上下文消息的存储后,第二过滤器将第一上下文消息存储在第二线程局部变量;在第一Dubbo服务发生级联调用时,可以从第二线程局部变量中获取第一上下文消息,以进行第一请求的后续逻辑处理。在本发明中,扩展的过滤器将上下文消息存储在新增的局部变量中,当发生级联调用时,可以从新增的局部变量获取上下文消息,避免Dubbo服务中会话消息的问题丢失。
Description
技术领域
本发明属于Dubbo服务技术领域,更具体地,涉及一种基于Dubbo服务的会话消息的传递方法和装置。
背景技术
目前,基于开源Java API(Application Programming Interface,简写为API)网关框架Soul和微服务框架Dubbo的组合架构如图1所示,API网关作为消费方,将原始请求转发到后端的Dubbo服务A,Dubbo服务A在对原始请求进行处理的过程中,需要将原始请求分解为逻辑1和逻辑2,其中,逻辑1是调用另外的微服务Dubbo服务B,逻辑2是紧跟在逻辑1后处理,当两个逻辑串行执行完成后,Dubbo服务A的此业务方才算处理完成。例如,原始请求是请求修改密码接口,Dubbo服务A在对原始请求进行处理的过程中,可以将原始请求分解为两个逻辑,逻辑1:验证旧密码是否正确;逻辑2:将旧密码修改成新密码。对于逻辑1,需要调用另外的Dubbo服务去验旧密码。验证通过后,再执行逻辑2为用户修改密码,在实际应用场景下,逻辑2在执行过程中,需要用到原始请求的上下文消息。
然而,针对前述应用场景,现有的Dubbo源代码的设计方案为:API网关的原始请求的上下文消息传递到后端的Dubbo服务A中,并且存储到该Dubbo服务A当前工作线程的线程局部变量InternalThreadLocal<RpcContext>中。如果当前工作线程再继续调用另外一个Dubbo服务时,那么线程局部变量InternalThreadLocal<RpcContext>会被清空,将会导致原始请求的上下文消息丢失,前述应用场景的逻辑2由于无法获取到上下文消息而导致业务执行失败。
鉴于此,克服该现有技术产品所存在的不足是本技术领域亟待解决的问题。
发明内容
针对现有技术的以上缺陷或改进需求,本发明提供了一种基于Dubbo服务的会话消息的传递方法和装置,其目的在于,扩展过滤器和线程局部变量,扩展的过滤器将上下文消息存储在新增的局部变量中,当发生级联调用时,可以从新增的局部变量获取上下文消息,以解决Dubbo服务中会话消息丢失的问题。
为实现上述目的,按照本发明的一个方面,提供了一种基于Dubbo服务的会话消息的传递方法,所述传递方法应用于Dubbo服务系统,所述Dubbo服务系统包括至少一个节点,在所述节点上部署Dubbo服务,其中,所述Dubbo服务包括多个执行线程;
所述传递方法包括:
第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对所述第一请求进行处理,其中,所述目标执行线程配套设置有第一线程局部变量、第二线程局部变量、第一过滤器和第二过滤器;
所述第一过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第一线程局部变量中,
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量;
在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理。
优选地,所述目标执行线程还配套设置有第三过滤器和第三线程局部变量,其中,所述第一线程局部变量和所述第二线程局部变量均用于存储所述第一Dubbo服务作为提供方的上下文消息,所述第三线程局部变量用于存储所述第一Dubbo服务作为消费方的上下文消息;
所述在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理包括:
在所述第二过滤器完成上下文消息的存储后,所述目标执行线程继续处理所述第一请求的后续逻辑;
所述目标执行线程对所述第一请求的后续逻辑进行解析,判断所述第一请求的后续逻辑是否包括第一子逻辑和第二子逻辑,其中,所述第一子逻辑需要调用第二Dubbo服务,所述第二逻辑需要基于所述第一子逻辑返回的数据进行处理;
若所述第一请求的后续逻辑包括第一子逻辑和第二子逻辑,则所述第一Dubbo服务基于所述第一子逻辑向所述第二Dubbo服务生成第二请求;
所述第二子逻辑获取所述第二Dubbo服务基于所述第二请求的响应结果,并从所述第二线程局部变量中获取所述第一上下文消息,从而根据所述第一上下文消息和所述响应结果完成后续处理。
优选地,若所述第一请求的后续逻辑包括第一子逻辑和第二子逻辑,则所述第一Dubbo服务基于所述第一子逻辑向所述第二Dubbo服务生成第二请求之后,所述第二子逻辑获取所述第二Dubbo服务基于所述第二请求的响应结果,并从所述第二线程局部变量中获取所述第一上下文消息,从而根据所述第一上下文消息和所述响应结果完成后续处理之前还包括:
所述第三过滤器从所述第二请求中获取第二上下文消息,并将所述第二上下文消息存储在第三线程局部变量中;
所述第三过滤器清除所述第一线程局部变量中的上下文消息;
所述目标执行线程将经过所述第三过滤器的第二请求发送至所述第二Dubbo服务;
所述目标执行线程在接收到所述第二Dubbo服务基于所述第二请求的响应结果后,所述第三过滤器清除所述第三线程局部变量中的上下文消息。
优选地,所述在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理还包括:
在所述目标执行线程完成对所述第一请求的处理后,所述第二过滤器清除所述第二线程局部变量中的上下文消息;
所述第一过滤器清除所述第一线程局部变量和所述第二线程局部变量中的上下文消息;
所述第一Dubbo服务将所述目标执行线程回收至线程池。
优选地,所述第一过滤器为Dubbo服务原生的作为提供方的过滤器,所述第三过滤器为Dubbo服务原生的作为消费方的过滤器;
所述传递方法包括:
基于Dubbo服务的原生接口org.apache.dubbo.rpc.Filter扩展过滤器,以为执行线程设置所述第二过滤器。
优选地,所述第一Dubbo服务和所述第二Dubbo服务设置在同一个节点上;或,所述第一Dubbo服务和所述第二Dubbo服务设置在不同节点上。
优选地,所述传递方法还包括:
为所述第一过滤器设置第一优先级,为所述第二过滤器设置第二优先级,其中,所述第一优先级高于所述第二优先级;
当所述第一Dubbo服务作为提供方时,根据优先级排序先触发执行所述第一过滤器再触发执行第二过滤器。
优选地,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量包括:
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量;或,
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一线程局部变量中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量。
优选地,上下文消息包括:消费方地址、服务方地址、服务方应用名、请求的方法名、请求参数集合、请求参数类型集合、请求对象、应答对象和调用地址。
为实现上述目的,按照本发明的另一个方面,提供了一种基于Dubbo服务的装置,所述基于Dubbo服务的装置包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行本发明所述的会话传递。
总体而言,通过本发明所构思的以上技术方案与现有技术相比,具有如下有益效果:本发明提供一种基于Dubbo服务的会话消息的传递方法和装置,该传递方法包括:第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对所述第一请求进行处理,其中,所述目标执行线程配套设置有第一线程局部变量、第二线程局部变量、第一过滤器和第二过滤器;所述第一过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第一线程局部变量中,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量;在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理。在本发明中,对过滤器和线程局部变量进行了扩展,在提供Dubbo服务时,扩展的过滤器将上下文消息存储在新增的局部变量中,当发生级联调用时,可以从新增的局部变量获取上下文消息,避免Dubbo服务中会话消息的问题丢失。
附图说明
图1是本发明实施例提供的一种Dubbo服务的应用场景的系统结构示意图;
图2是本发明实施例提供的Dubbo服务的部分源代码(展示了原生的线程局部变量)示意图;
图3是本发明实施例提供的Dubbo服务的部分源代码(展示了原生的移除消息方法)示意图;
图4是本发明实施例提供的Dubbo服务的部分源代码(展示了原生的ConsumerContextFilter的执行逻辑)示意图;
图5是本发明实施例提供的Dubbo服务的部分源代码(展示了原生的ContextFilter的执行逻辑)示意图;
图6是本发明实施例提供的一种基于Dubbo服务的会话消息的传递方法的流程示意图;
图7是本发明实施例提供的Dubbo服务的过滤器架构示意图;
图8是本发明实施例提供自定义的SessionContextFilter的部分代码示意图;
图9是本发明实施例提供自定义的线程局部变量的部分代码示意图;
图10是本发明实施例提供自定义的SessionContextFilter的部分代码(展示了原生的SessionContextFilter的执行逻辑)示意图;
图11是本发明实施例提供的另一种基于Dubbo服务的会话消息的传递方法的流程示意图;
图12是本发明实施例提供的又一种基于Dubbo服务的会话消息的传递方法的流程示意图;
图13是本发明实施例提供的一种基于Dubbo服务的装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在本发明的描述中,术语“内”、“外”、“纵向”、“横向”、“上”、“下”、“顶”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明而不是要求本发明必须以特定的方位构造和操作,因此不应当理解为对本发明的限制。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
针对目前原始请求的上下文消息会丢失的问题,发明人对Dubbo服务的源代码进行了研究分析,确定上下文消息会丢失的原因所在,在不影响Dubbo服务原始架构的情况下,对Dubbo服务的源代码进行适应性修改,以保证Dubbo服务在应用于级联调用的应用场景下,会话消息不会丢失,确保业务能够正常执行。
首先,先对Dubbo服务的源代码进行分析,确定上下文消息会丢失的原因所在。
在实际应用场景下,一个Dubbo服务既可以作为消费方也可以作为提供方。相应地,在Dubbo服务的源代码中,设置有Dubbo请求的上下文类RpcContext,一个执行线程配套设置有两个线程局部变量。如图2所示,展示了部分Dubbo服务的源代码,在源代码中设置有一个线程局部变量LOCAL,用来记录Dubbo服务作为消费方的上下文消息;还设置有另一个线程局部变量SERVER_LOCAL,用来记录Dubbo服务作为服务方的上下文消息。
针对两个用于存储上下文消息的局部变量,有两个消息移除的方法与之对应,在业务完成后,将局部变量中的消息销毁,避免信息泄露,同时在局部变量中的消息被移除后,将执行线程归还于线程池,以供后续使用。如图3所示,展示了部分Dubbo服务的源代码,在源代码中设置了一个消息移除方法removeContext(),用来移除Dubbo服务作为消费方的上下文消息,即,移除线程局部变量LOCAL中的上下文消息;还设置了另一个消息移除方法removeServerContext(),用来移除Dubbo服务作为提供方的上下文消息,即,移除线程局部变量SERVER_LOCAL中的上下文消息。
针对图1所示的场景,当Dubbo服务A接收到来自于API网关的原始请求后,Dubbo服务A作为提供方,将原始请求的上下文消息存储在线程局部变量SERVER_LOCAL中,当Dubbo服务A执行逻辑1时,会作为消费方去调用其他Dubbo服务B,此时,Dubbo服务A作为消费方,Dubbo服务B作为提供方。在Dubbo服务的源代码中,还配套设置有Dubbo服务作为消费方的过滤器ConsumerContextFilter和Dubbo服务作为提供方的过滤器ContextFilter,在Dubbo服务A作为消费方时,会触发ConsumerContextFilter,如图4所示,因为在获取到提供方的应答后,ConsumerContextFilter触发onReaponse方法,将响应结果放回至SERVER_LOCAL中,因此ConsumerContextFilter的执行逻辑为先执行removeServerContext(),移除线程局部变量SERVER_LOCAL中的上下文消息,ConsumerContextFilter中的核心方法invoke触发后,再触发removeContext(),移除线程局部变量LOCAL中的上下文消息。在Dubbo服务B作为提供方时会触发ContextFilter,如图5所示,在ContextFilter中的核心方法invoke触发后,会清除掉线程局部变量LOCAL和SERVER_LOCAL,即两个线程局部变量中上下文消息会被清空。其中,在源代码中特意注明为了满足异步场景,必须清除调用前的上下文消息。
结合前述分析,可以看出当发生RPC级联调用时,Dubbo服务A的角色发生了改变,Dubbo服务A由提供者变成了消费者,触发了ConsumerContextFilter,线程局部变量SERVER_LOCAL中的上下文消息被移除,导致线程局部变量SERVER_LOCAL中的上下文消息丢失。
为了解决前述问题,本实施例提供了一种基于Dubbo服务的会话消息的传递方法,所述传递方法应用于Dubbo服务系统,所述Dubbo服务系统包括至少一个节点,在所述节点上部署Dubbo服务,其中,所述Dubbo服务包括多个执行线程。
如图6所示,所述传递方法包括:
步骤101:第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对所述第一请求进行处理。
其中,消费方可以为API网关,也可以为其他Dubbo服务。
其中,Dubbo服务中设置有多个执行线程,每个执行线程可以并行执行,以处理并发的请求。在每个执行线程完成当前请求的处理后,会被回收至线程池,以供处理后续后续的请求。
在本实施例中,第一Dubbo服务接收到来自于消费方的第一请求后,从线程池中选取空闲的执行线程作为目标执行线程,通过目标执行线程对所述第一请求进行处理。
其中,所述目标执行线程配套设置有第一线程局部变量、第二线程局部变量、第一过滤器和第二过滤器。其中,第一过滤器为Dubbo服务原生的提供方过滤器ContextFilter,第二过滤器为自定义的提供方过滤器SessionContextFilter;第一线程局部变量为原生的SERVER_LOCAL,用来记录作为服务方的上下文,第二线程局部变量为自定义的局部变量,同样用来记录作为服务方的上下文。
在实际应用场景下,如图7所示,Dubbo服务的原生接口org.apache.dubbo.rpc.FilterDubbo下自带了多个Filter(过滤器),同时也可以根据实际需要扩展Filter。具体而言,可以基于Dubbo服务的原生接口org.apache.dubbo.rpc.Filter扩展过滤器,以为执行线程设置所述第二过滤器。如图8所示,SessionContextFilter为本实施例扩展的第二过滤器,该第二过滤器用于将第一上下文消息存储到新的内存空间,即,将第一上下文消息存储在第二线程局部变量。
如图9所示,为第二过滤器SessionContextFilter设置第二线程局部变量LOCAL,同时设置一个消息移除方法destory(),用于移除第二线程局部变量LOCAL中的上下文消息。在实际应用场景下,在业务完成后,如图10所示,必须将第二线程局部变量LOCAL中的上下文消息销毁,以避免信息泄露。
步骤102:所述第一过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第一线程局部变量中。
在实际应用场景下,HTTP协议本身是无状态的网络数据传输协议,在B/S(浏览器/服务器)模式中,服务器本身不知道哪个用户登录了并且在和自己交互,为了解决这个问题业界通用做法是cookie/session(会话)机制。用户登录后cookie作为当前用户的唯一标识在浏览器端存储,与之对应的,服务端有一个session。session表示的就是该用户登录了,创建了一个会话,后续的请求都会以该用户的名义发起,直到会话过期。请求的上下文消息,就是记录该请求的一些基本信息,比如请求是哪个session发起的,对方的ip是多少等信息。后端调用链往往会很长,在调用链后端逻辑有时候需要这个请求的上下文消息。
具体而言,上下文消息包括:消费方地址、服务方地址、服务方应用名、请求的方法名、请求参数集合、请求参数类型集合、请求对象、应答对象和调用地址。
步骤103:在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量。
在实际应用场景下,Dubbo服务的Filter被调用是发生在业务接口之前的,通常可以通过Filter做一些全局性的操作。在发生调用时,多个Filter按照指定的顺序依次执行,之后才是业务接口执行。
在此需要强调的是,本实施例的第二过滤器SessionContextFilter的执行顺序必须晚于Dubbo自带的第一过滤器ContextFilter的执行顺序。因为第一过滤器ContextFilter执行后会将第一上下文消息放到SERVER_LOCAL中,如果第二过滤器SessionContextFilter早于第一过滤器ContextFilter执行,第一过滤器SessionContextFilter的拷贝逻辑就没有意义。
基于前述考虑,在本实施例中,为所述第一过滤器设置第一优先级,为所述第二过滤器设置第二优先级,其中,所述第一优先级高于所述第二优先级;当所述第一Dubbo服务作为提供方时,根据优先级排序先触发执行所述第一过滤器再触发执行第二过滤器,从而保证第二过滤器事务执行顺序晚于所述第一过滤器的执行顺序,从而保证第二过滤器能够获取到正确的第一上下文消息。
具体地,第二过滤器可以通过如下两种方式获取第一上下文消息,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一线程局部变量中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量,即采用拷贝的方式从第一线程局部变量中获取第一上下文消息,然后再将第一上下文消息存复制到所述第二线程局部变量。在其他实施例中,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量。
步骤104:在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理。
在实际应用场景下,所述目标执行线程还配套设置有第三过滤器和第三线程局部变量,其中,所述第三过滤器为Dubbo服务原生的作为消费方的过滤器;所述第一线程局部变量和所述第二线程局部变量均用于存储所述第一Dubbo服务作为提供方的上下文消息,所述第三线程局部变量用于存储所述第一Dubbo服务作为消费方的上下文消息;
在本实施例中,在所述第二过滤器完成上下文消息的存储后,所述目标执行线程继续处理所述第一请求的后续逻辑。
所述目标执行线程对所述第一请求的后续逻辑进行解析,判断所述第一请求的后续逻辑是否包括第一子逻辑和第二子逻辑,其中,所述第一子逻辑需要调用第二Dubbo服务,所述第二逻辑需要基于所述第一子逻辑返回的数据进行处理。若所述第一请求的后续逻辑包括第一子逻辑和第二子逻辑,则所述第一Dubbo服务基于所述第一子逻辑向所述第二Dubbo服务生成第二请求。
其中,所述第一Dubbo服务和所述第二Dubbo服务设置在同一个节点上;或,所述第一Dubbo服务和所述第二Dubbo服务设置在不同节点上。
为便于理解,结合图1,所述第一Dubbo服务可以理解Dubbo服务A,所述第二Dubbo服务可以理解Dubbo服务B,第一请求可以理解为API网关向Dubbo服务A发起的请求,第一子逻辑可以理解为逻辑1,第二子逻辑理解为逻辑2,第二请求可以理解为Dubbo服务A向Dubbo服务B发起的请求,用于获取第二逻辑需要的中间数据。
在本实施例中,当所述第一Dubbo服务向所述第二Dubbo服务发起请求时,所述第一Dubbo服务由服务提供者转变为消费者,会触发执行第三过滤器。第三过滤器从所述第二请求中获取第二上下文消息,并将所述第二上下文消息存储在第三线程局部变量中;然后,所述第三过滤器清除所述第一线程局部变量中的上下文消息,即,存储在第一线程局部变量中的上下文消息已经丢失了。第二请求再经过了第二过滤器后,所述目标执行线程执行后续逻辑,将经过所述第三过滤器的第二请求发送至所述第二Dubbo服务;所述目标执行线程在接收到所述第二Dubbo服务基于所述第二请求的响应结果后,所述第三过滤器清除所述第三线程局部变量中的上下文消息,从而避免局部变量中的上下文消息被泄露。
进一步地,所述第二子逻辑获取所述第二Dubbo服务基于所述第二请求的响应结果,并从所述第二线程局部变量中获取所述第一上下文消息,从而根据所述第一上下文消息和所述响应结果完成后续处理。
最后,在所述目标执行线程完成对所述第一请求的处理后,所述第二过滤器清除所述第二线程局部变量中的上下文消息;所述第一过滤器清除所述第一线程局部变量和所述第二线程局部变量中的上下文消息;所述第一Dubbo服务将所述目标执行线程回收至线程池。
区别于现有技术,本实施例的传递方法包括:第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对所述第一请求进行处理,其中,所述目标执行线程配套设置有第一线程局部变量、第二线程局部变量、第一过滤器和第二过滤器;所述第一过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第一线程局部变量中,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量;在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理。在本发明中,对过滤器和线程局部变量进行了扩展,在提供Dubbo服务时,扩展的过滤器将上下文消息存储在新增的局部变量中,当发生级联调用时,可以从新增的局部变量获取上下文消息,避免Dubbo服务中会话消息的问题丢失。
实施例2:
为便于理解前述方案,基于图11和图12进行举例说明。
在图11中,API网关作为消费方,向Dubbo服务A发起调用业务接口的第一请求,Dubbo服务A接收到该请求后选择目标执行线程,由于Dubbo服务A作为提供方会触发目标执行线程中的ContextFilter,将第一请求的上下文消息存储到SERVER_LOCAL中,然后触发invoke后续逻辑,第一请求流向Dubbo服务A的SessionContextFilter,SessionContextFilter从SERVER_LOCAL中拷贝第一请求的上下文消息,并将得到的上下文消息存储在自定义的局部变量中,然后触发invoke后续逻辑,调用Dubbo服务A的业务接口。
在调用Dubbo服务A的业务接口时存在两种情况:(1)Dubbo服务A可以独立的完成API网关的请求;(2)Dubbo服务B需要调用其他的Dubbo服务获取中间数据,根据中间数据进行后续逻辑处理。
针对情况(1),在完成调用Dubbo服务A的业务接口后,分别触发SessionContextFilter中的消息移除方法,销毁存储在自定义的局部变量中的上下文消息,然后触发ContextFilter中的消息移除方法,将原生的局部变量SERVER_LOCAL和LOCAL中的上下文消息清除,并将响应结果返回至API网关。此外,还将目标执行线程归还至线程池。
针对情况(2),当需要调用其他Dubbo服务时,Dubbo服务A会由业务提供方转变为业务消费方。如图12所示,Dubbo服务A作为消费方,向Dubbo服务B发起调用业务接口的第二请求,在将第二请求发送至Dubbo服务B之前,由于Dubbo服务A作为消费方会触发目标执行线程中的ConsumerContextFilter,将第二请求的上下文消息存储到自定义的局部变量LOCAL中,然后将SERVER_LOCAL中的上下文消息清除,再触发invoke执行后续逻辑,将第二请求发送至Dubbo服务B,Dubbo服务B对第二请求进行处理,并基于第二请求得到的响应结果发送至Dubbo服务A。在Dubbo服务B完成业务接口调用后,Dubbo服务A的目标执行线程中的ConsumerContextFilter中的消息移除方法将LOCAL中的上下文消息清除。Dubbo服务A接收到响应结果后,从自定义的局部变量中获取上下文消息,完成后续逻辑处理。在Dubbo服务A完成业务接口调用后,分别触发SessionContextFilter中的消息移除方法,销毁存储在自定义的局部变量中的上下文消息,然后触发ContextFilter中的消息移除方法,将原生的局部变量SERVER_LOCAL和LOCAL中的上下文消息清除,并将响应结果返回至API网关。此外,还将目标执行线程归还至线程池。
实施例3:
请参阅图13,图13是本发明实施例提供的一种基于Dubbo服务的装置的结构示意图。本实施例的基于Dubbo服务的装置包括一个或多个处理器41以及存储器42。其中,图13中以一个处理器41为例。
处理器41和存储器42可以通过总线或者其他方式连接,图13中以通过总线连接为例。
存储器42作为一种基于会话传递的非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,上述实施例的方法以及对应的程序指令。处理器41通过运行存储在存储器42中的非易失性软件程序、指令以及模块,从而执行各种功能应用以及数据处理,实现前述实施例的方法。
其中,存储器42可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器42可选包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至处理器41。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(Read Only Memory,简写为ROM)、随机存取存储器(RandomAccessMemory,简写为RAM)、磁盘或光盘等。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种基于Dubbo服务的会话消息的传递方法,其特征在于,所述传递方法应用于Dubbo服务系统,所述Dubbo服务系统包括至少一个节点,在所述节点上部署Dubbo服务,其中,所述Dubbo服务包括多个执行线程;
所述传递方法包括:
第一Dubbo服务接收到来自于消费方的第一请求后,选取目标执行线程对所述第一请求进行处理,其中,所述目标执行线程配套设置有第一线程局部变量、第二线程局部变量、第一过滤器和第二过滤器;
所述第一过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第一线程局部变量中;
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量;
在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理;
所述目标执行线程还配套设置有第三过滤器和第三线程局部变量,其中,所述第一线程局部变量和所述第二线程局部变量均用于存储所述第一Dubbo服务作为提供方的上下文消息,所述第三线程局部变量用于存储所述第一Dubbo服务作为消费方的上下文消息;
所述在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理包括:
在所述第二过滤器完成上下文消息的存储后,所述目标执行线程继续处理所述第一请求的后续逻辑;
所述目标执行线程对所述第一请求的后续逻辑进行解析,判断所述第一请求的后续逻辑是否包括第一子逻辑和第二子逻辑,其中,所述第一子逻辑需要调用第二Dubbo服务,所述第二子逻辑需要基于所述第一子逻辑返回的数据进行处理;
若所述第一请求的后续逻辑包括第一子逻辑和第二子逻辑,则所述第一Dubbo服务基于所述第一子逻辑向所述第二Dubbo服务生成第二请求;
所述第二子逻辑获取所述第二Dubbo服务基于所述第二请求的响应结果,并从所述第二线程局部变量中获取所述第一上下文消息,从而根据所述第一上下文消息和所述响应结果完成后续处理。
2.根据权利要求1所述的传递方法,其特征在于,若所述第一请求的后续逻辑包括第一子逻辑和第二子逻辑,则所述第一Dubbo服务基于所述第一子逻辑向所述第二Dubbo服务生成第二请求之后,所述第二子逻辑获取所述第二Dubbo服务基于所述第二请求的响应结果,并从所述第二线程局部变量中获取所述第一上下文消息,从而根据所述第一上下文消息和所述响应结果完成后续处理之前还包括:
所述第三过滤器从所述第二请求中获取第二上下文消息,并将所述第二上下文消息存储在第三线程局部变量中;
所述第三过滤器清除所述第一线程局部变量中的上下文消息;
所述目标执行线程将经过所述第三过滤器的第二请求发送至所述第二Dubbo服务;
所述目标执行线程在接收到所述第二Dubbo服务基于所述第二请求的响应结果后,所述第三过滤器清除所述第三线程局部变量中的上下文消息。
3.根据权利要求1所述的传递方法,其特征在于,所述在所述第一Dubbo服务发生级联调用时,可以从所述第二线程局部变量中获取所述第一上下文消息,以进行所述第一请求的后续逻辑处理还包括:
在所述目标执行线程完成对所述第一请求的处理后,所述第二过滤器清除所述第二线程局部变量中的上下文消息;
所述第一过滤器清除所述第一线程局部变量;
所述第一Dubbo服务将所述目标执行线程回收至线程池。
4.根据权利要求1所述的传递方法,其特征在于,所述第一过滤器为Dubbo服务原生的作为提供方的过滤器,所述第三过滤器为Dubbo服务原生的作为消费方的过滤器;
所述传递方法包括:
基于Dubbo服务的原生接口org.apache.dubbo.rpc.Filter扩展过滤器,以为执行线程设置所述第二过滤器。
5.根据权利要求1所述的传递方法,其特征在于,所述第一Dubbo服务和所述第二Dubbo服务设置在同一个节点上;或,所述第一Dubbo服务和所述第二Dubbo服务设置在不同节点上。
6.根据权利要求1所述的传递方法,其特征在于,所述传递方法还包括:
为所述第一过滤器设置第一优先级,为所述第二过滤器设置第二优先级,其中,所述第一优先级高于所述第二优先级;
当所述第一Dubbo服务作为提供方时,根据优先级排序先触发执行所述第一过滤器再触发执行第二过滤器。
7.根据权利要求1所述的传递方法,其特征在于,在所述第一过滤器完成上下文消息的存储后,所述第二过滤器将所述第一上下文消息存储在所述第二线程局部变量包括:
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一请求中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量;或,
在所述第一过滤器完成上下文消息的存储后,所述第二过滤器从所述第一线程局部变量中获取第一上下文消息,并将所述第一上下文消息存储在所述第二线程局部变量。
8.根据权利要求1所述的传递方法,其特征在于,上下文消息包括:消费方地址、服务方地址、服务方应用名、请求的方法名、请求参数集合、请求参数类型集合、请求对象、应答对象和调用地址。
9.一种基于Dubbo服务的装置,其特征在于,所述装置包括至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行如权利要求1~8任一项所述的传递方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011206768.6A CN112256456B (zh) | 2020-11-03 | 2020-11-03 | 一种基于Dubbo服务的会话消息的传递方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011206768.6A CN112256456B (zh) | 2020-11-03 | 2020-11-03 | 一种基于Dubbo服务的会话消息的传递方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112256456A CN112256456A (zh) | 2021-01-22 |
CN112256456B true CN112256456B (zh) | 2021-10-01 |
Family
ID=74267292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011206768.6A Active CN112256456B (zh) | 2020-11-03 | 2020-11-03 | 一种基于Dubbo服务的会话消息的传递方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112256456B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108322530A (zh) * | 2018-01-29 | 2018-07-24 | 广东欧珀移动通信有限公司 | 上下文环境信息的传递方法、装置、服务网关及存储介质 |
CN110855726A (zh) * | 2018-08-20 | 2020-02-28 | 北京京东尚科信息技术有限公司 | 通信方法、装置以及网关、计算设备和介质 |
CN111666211A (zh) * | 2020-05-26 | 2020-09-15 | 平安壹钱包电子商务有限公司 | 服务动态测试方法、装置、计算机设备及存储介质 |
-
2020
- 2020-11-03 CN CN202011206768.6A patent/CN112256456B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108322530A (zh) * | 2018-01-29 | 2018-07-24 | 广东欧珀移动通信有限公司 | 上下文环境信息的传递方法、装置、服务网关及存储介质 |
CN110855726A (zh) * | 2018-08-20 | 2020-02-28 | 北京京东尚科信息技术有限公司 | 通信方法、装置以及网关、计算设备和介质 |
CN111666211A (zh) * | 2020-05-26 | 2020-09-15 | 平安壹钱包电子商务有限公司 | 服务动态测试方法、装置、计算机设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112256456A (zh) | 2021-01-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109992465B (zh) | 服务追踪方法、装置和计算机可读存储介质 | |
JP4705173B2 (ja) | ネットワークを利用したモジュール的ポリシー決定 | |
US9904585B1 (en) | Error handling in executing workflow state machines | |
CN104219316A (zh) | 一种分布式系统中的调用请求处理方法及装置 | |
US9766927B1 (en) | Data flow management in processing workflows | |
JP6861720B2 (ja) | Fixプロトコルに基づくサービス実施方法、装置、及びシステム | |
US11831562B2 (en) | Distributed database-driven resource management and locking in a cloud native mobile core network node architecture | |
WO2014194677A1 (zh) | 一种业务流程的控制方法及网络设备 | |
CN107026879B (zh) | 一种数据缓存方法及后台应用系统 | |
US20230046979A1 (en) | Microservice call method and apparatus, device, and medium | |
KR20140093720A (ko) | 클라우드 내의 메시징을 위한 방법 및 장치 | |
CN110995481A (zh) | 配置方法、服务器及计算机可读存储介质 | |
CN113992738A (zh) | 基于微服务网关的反向代理方法、装置、设备及存储介质 | |
US11647103B1 (en) | Compression-as-a-service for data transmissions | |
CN110740464A (zh) | 一种nf服务发现方法及设备 | |
US8224933B2 (en) | Method and apparatus for case-based service composition | |
CN112256456B (zh) | 一种基于Dubbo服务的会话消息的传递方法和装置 | |
EP2445171B1 (en) | File transfer protocol client and implementing method thereof | |
CN112954008B (zh) | 一种分布式任务处理方法、装置、电子设备及存储介质 | |
CN115865886A (zh) | 一种基于http的跨网络数据交互方法和装置 | |
US11228657B2 (en) | Hybrid proxying with user space hold | |
WO2021072278A1 (en) | Systems and methods for implementing soft locking in a stateless microservice environment | |
McEwan et al. | Mobility in JCSP: New Mobile Channel and Mobile Process Models | |
CN114531498B (zh) | 数据传输方法、装置、电子设备及存储介质 | |
CN117579700B (zh) | 基于消息队列的通用型微服务处理方法、系统和设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |