CN110008271B - 基于单数据库的微服务事务提交方法 - Google Patents

基于单数据库的微服务事务提交方法 Download PDF

Info

Publication number
CN110008271B
CN110008271B CN201910270203.5A CN201910270203A CN110008271B CN 110008271 B CN110008271 B CN 110008271B CN 201910270203 A CN201910270203 A CN 201910270203A CN 110008271 B CN110008271 B CN 110008271B
Authority
CN
China
Prior art keywords
sql
transaction
request
gateway
cache
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
Application number
CN201910270203.5A
Other languages
English (en)
Other versions
CN110008271A (zh
Inventor
金博玉
王文宣
刘蜀东
朱玥
何继文
刘辉军
舒刚
杨硕
邱桂苹
陈群
李利民
孙宏伟
汪智奇
胡步军
蒋文韬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Casicloud-Tech Co ltd
Original Assignee
Casicloud-Tech Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Casicloud-Tech Co ltd filed Critical Casicloud-Tech Co ltd
Priority to CN201910270203.5A priority Critical patent/CN110008271B/zh
Publication of CN110008271A publication Critical patent/CN110008271A/zh
Application granted granted Critical
Publication of CN110008271B publication Critical patent/CN110008271B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • G06F16/244Grouping and aggregation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/25Integrating or interfacing systems involving database management systems
    • G06F16/252Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q20/00Payment architectures, schemes or protocols
    • G06Q20/08Payment architectures
    • G06Q20/085Payment architectures involving remote charge determination or related payment systems

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Business, Economics & Management (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Accounting & Taxation (AREA)
  • Computational Linguistics (AREA)
  • Mathematical Physics (AREA)
  • Finance (AREA)
  • Strategic Management (AREA)
  • General Business, Economics & Management (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种基于单数据库的微服务事务提交方法,包括外部api网关逐层向下调用多个微服务;sql网关为事务id分配一个事务sql缓存空间,在其中存储sql网关接收的所有sql请求。外部api网关在第一次执行请求时执行,步骤1,外部api网关计算事务id发出的sql提交数量,保存至请求类型缓存空间中;步骤2,外部api网关对sql网关发出开启事务id请求,将sql提交数量存储到事务sql缓存空间中;当sql网关接收到sql请求或开启事务id请求时,sql网关判断接收的sql数量是否达到提交数量,如达到则统一提交。在以后再次执行同样请求时,仅执行步骤2即可。本方法既能保证多微服务事务强一致性,又在性能上不需要牺牲过多。

Description

基于单数据库的微服务事务提交方法
技术领域
本发明属于保证微服务事务一致性领域,特别是涉及一种对同一数据库的微服务事务提交方法。
背景技术
随着微服务技术的快速发展,越来越多的微服务应用支撑起了大量的业务,其中有些服务需要保证事务的强一致性,比如一个电商网站的付款与积分系统,当用户进行付款操作后需要对用户的付款进行扣除操作,同时对积分进行修改,这两个操作密不可分,不允许出现一个成功而另一个失败的情况,这就构成了一个事务。
本发明涉及联系较紧密、请求较频繁的两个或多个微服务的数据库合并事务问题。这些微服务一般的特点有:
1.微服务之间联系紧密,甚至可能按比例部署在同一台服务器上。
2.微服务同一个api所需的数据库操作相似(比如,都是执行某两条sql,只是参数不同)。
3.微服务由于联系紧密,所以实现上是共用同一个数据库的,只是表不同。
4.微服务业务不能用最终一致性保证(见后续描述)
本发明所提出的解决方案,适用于满足上述条件的微服务。
一个事务一般需要满足acid条件:
原子性(a):所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。
一致性(c):事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元。
隔离性(i):所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。
持久性(d):所谓的持久性,就是说一单事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。
目前,市面上应用的数据库系统,比如mysql、oracle、sqlserver等都支持事务的提交,比如mysql,可以开启一个事务,在其中写入多条sql语句后提交该事务,数据库就能保证提交的多条语句满足上述的acid特性,在以前的应用系统中也确实都是使用这种方式实现事务,然而,这种实现对于多微服务系统来说却有很大的局限性。
在多微服务系统中,应用由多个微服务构成,每个微服务对外提供接口供其它服务调用,自身仅仅完成自身的操作,不再关心其它服务内部的实现,一旦出现多个服务都需要操作数据库,并且期望是一个事务的话,就很难做到acid特性的保证。
针对上述问题,很多人提出了自己的解决方案,比如:
两阶段提交:
MySQL从5.5版本开始支持2PC,又叫做XA Transactions。其中,XA是一个两阶段提交协议,该协议分为以下两个阶段:
第一阶段:事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.
第二阶段:事务协调器要求每个数据库提交数据。
其中,如果有任何一个数据库否决此次提交,那么所有数据库都会被要求回滚它们在此事务中的那部分信息。除了MySQL以外,SQL Server、Oracle等主流数据库都支持两阶段事务。分布式应用的两阶段提交与数据库支持的两阶段提交大同小异,思想都是一样的,只是可能会修改提交的主体不再是数据库中的事务协调器,并且使用了AMQP等消息机制实现通知。两阶段提交的使用方式有很多,不同的系统可能采用不同的方式实现,但是思想都是一致的。
保证最终一致性的思想是认为,分布式系统不需要保证强一致性,在大部分情况下只要保证“最终一致性”就可以满足业务需要。事实上,微服务事务确实没有必要满足强一致性,这种方案可以满足大部分的业务需求。不过,也确实存在着某些对可靠性要求很高的业务,必须满足acid特性。
上述的两种技术主要缺陷如下:
两阶段提交:两阶段提交的主要问题是:第一次分布式提交时,事务发起方需要等待所有的子事务提供方都成功提交“预处理”后,再发送一次提交请求到数据库,后面多了一步同步的提交工作,导致性能损耗非常大,并且影响可用性。本文提出的方式利用缓存与计数的方式省去了第二次提交的过程,可以一定程度上缓解性能损耗的问题。
保证最终一致性:保证最终一致性的问题是,虽然最终一致性能够适应大部分的业务需求,但仍有少部分需求要求必须实现acid特性,所以保证最终一致性不能满足所有的业务需求。本文所述的方法主要满足这部分特殊需求。
发明内容
本发明要解决的技术问题是提供一种微服务事务提交方法,在多个微服务使用的数据库是单库情况下,既能保证多微服务事务强一致性,同时在性能上不需要牺牲过多的方法。
本发明方法包括:
外部api网关接收外部调用方发送的事务请求时,分配一个id,记为事务id;
外部api网关在缓存A中为所述事务id的请求类型分配一个请求类型缓存空间,相同的请求类型具有同样的业务逻辑,调用同样的微服务;
外部api网关携带所述事务id逐层向下调用多个微服务,直至对sql网关发出sql请求,所有sql包装成一个数据库事务,对同一数据库进行请求;
sql网关在缓存B中为所述事务id分配一个事务sql缓存空间,在其中存储sql网关接收的所有sql请求;
外部api网关在所述请求类型缓存空间中查询是否存在与所述事务id相同的请求类型,如果不存在,执行如下步骤:
步骤1,外部api网关计算所述事务id对sql网关发出的所有sql请求数量之和,记为sql提交数量,保存至所述请求类型缓存空间中;
步骤2,外部api网关对sql网关发出开启所述事务id请求,将缓存A中的sql提交数量存储到缓存B中事务sql缓存空间中;
sql网关接收到sql请求或开启所述事务id请求时,sql网关将当前事务sql缓存空间中的sql请求数量与事务sql缓存空间中的sql提交数量比较,如相等则统一提交所述事务sql缓存空间中存储的所有sql请求;
如果在所述事务类型缓存空间中查到与所述事务id相同的请求类型,执行上述步骤2。
进一步地,所述方法还包括:步骤1中sql提交数量计算方法为,外部api网关逐层向下调用微服务时,每一层都返回本层及下层的sql请求数量之和。
进一步地,所述方法还包括:所述相同的请求类型的判断方法为,当请求的方法和url都相同时,请求类型相同。
进一步地,所述方法还包括:所述请求类型缓存空间为key-value形式存储,其中key为所述请求的请求类型,value为sql提交数量;事务sql缓存空间为key-value形式存储,其中key为事务id,Value中存储sql网关接收的所有sql请求以及sql提交数量。
进一步地,所述方法还包括:缓存A和缓存B位于缓存服务器中。
本发明在二阶段提交的基础上,提出了利用缓存统计一个事务的sql数量,利用sql网关通过计数触发提交,从而省去了第二阶段提交的过程。在这个微服务使用单库的情形下,对于二阶段提交来说有一定的性能优势,实现了多微服务系统的数据库的事务提交。sql网关中间件进行高效的sql聚合与提交操作,从而减轻现有技术中的多段提交对性能的影响,而且也保证了acid特性。
附图说明
图1微服务系统交互示意图。
图2sql网关装置交互示意图。
图3系统在缓存B未命中情况下的时序图。
图4缓存B命中情况下的时序图
具体实施方式
下面结合附图对本发明作进一步详细描述。
以下本发明通过优选实施例进行了描述,然而本发明并非局限于这里所描述的实施例,在不脱离本发明范围的情况下还包括所做出的各种改变以及变化。
本发明的思路是,在实际的web应用中,有很多请求涉及到的数据库操作步骤都是固定的,所以可以充分利用缓存机制,做到后续再遇到同样的api调用时,不需要再进行二阶段提交,而是进行计数机制计数提交。
图1,表示一个微服务系统的整体架构,其中的箭头表示数据流向,整个系统对外的表现就是:接收外部请求,执行数据业务(执行sql等),回应外部一个请求的id,记为事务id。外部可以在后续通过请求id查看该请求的执行结果。
从图中可以看出,外部API网关的向下层调用的是服务A,服务A又会调用服务B和C,而服务A、B、C都会执行一些sql语句,这些sql语句在sql网关汇聚(利用缓存),最终形成一个事务请求,发送给同一数据库做统一处理。
首先我们先看一下sql网关本身是如何工作的(图2),这样有利于后面理解整个微服务系统的工作流程。
对于sql网关装置本身,如图2所示,需要做如下操作:
(1)接收请求
接收上层的请求,请求共分两种:sql语句请求和事务开启请求。
Sql语句请求:由上层的服务调用,主要结构是:事务id+sql语句;
事务开启请求:由API网关调用,主要结构是:事务id+事务sql数量。
(2)处理请求
每当收到一个请求,都需要做不同的处理,首先是对于每个事务id,都会分配一个key-value缓存(在缓存空间A中),如图2所示,缓存空间A中,每条记录的key就是事务id,value分为两部分,第一部分是事务sql的数量,第二部分是各个sql语句。
当收到上述两种中的任何一种请求后,首先判断该事务id当前有没有缓存,如果没有,新建一个缓存条目,key为事务id(比如图中的001),value中放入请求相关的数据,之后再接收请求时,如果已经存在缓存001,则将数据放入该条目中,同时进行本条目中的数据判断。
数据判断的过程:对于某个id的事务来说,如果缓存中存在事务的sql数量,并且目前接收到的sql数量已经达到该数量,则提交该事务,顺便更新该id的事务状态并清除缓存,否则不提交该事务。
明确了sql网关装置本身的逻辑之后,我们再来看一下系统整体的事务处理操作:
对于第一次收到某请求,缓存空间B无法命中的情况,本装置主要的执行逻辑如图3所示。
图3中,每个箭头表示数据流向,并且在箭头上有步骤来表示此数据流向的含义,每个步骤的标号表示如下信息:第一个数字表示大步骤,第一个字母表示并发操作,举例来说,“2A”、“2B”表示第二个大步骤中,并行进行A和B两种操作。
带有“-R”字样的标号,表示是某个调用的直接返回,比如有些带有双向箭头的数据,从上到下是正常的调用,比如“2A”,调用后从下到上即为直接返回数据,记为“2A-R”。
缓存空间B未命中情况下本方法分为9个步骤。
步骤1:外部调用方发送一个事务操作的请求(1),括号中为图中表示操作的标号,说明书中以下表示均相同,外部api网关接收外部调用方发送的事务请求时,分配一个id,记为事务id,返回该事务id用于查询事务结果(1-R);
步骤2:外部网关查询缓存空间B是否命中(2A),此时返回结果为未命中(2A-R);外部api网关携带事务id调用服务A进行事务操作,后续所有服务间调用都携带该事务id(2B);sql网关记录本事务的执行情况为“执行中”(2C);
步骤3:服务A调用sql网关准备执行3个sql(3A),同时,服务A分别调用服务B(3B)和服务C(3C);
步骤4:服务B调用sql网关准备执行3个sql(4A),服务C调用sql网关准备执行2个sql(4B);此时sql网关接收到步骤3中的任意请求时,都判断是否提交(4C);
步骤5:服务B将本服务执行3个sql的数量信息返回服务A(5A),服务C将本服务执行2个sql的数量信息返回服务A(5B),此时sql网关接收到步骤4中的任意请求时,都判断是否提交(5C);
步骤6:服务A将本服务以及本服务调用的下层所有服务的sql数量之和,即3+3+2=8,返回到外部网关(6-R);
步骤7:外部api网关记录本类型请求sql数量为8(7A),外部api网关报告sql网关此事务id需要8个sql(7B),此时sql网关接收到任意请求时,都判断是否提交(7C);
步骤8:sql网关收到外部api网关报告和8个sql语句之后,增加一条更新本事务执行情况为“成功”的语句,提交该事务(8)。
步骤9:事务执行完毕时,清除缓存(9)。
缓存空间B命中情况下本方法分为7个步骤,见图4。
步骤1:外部调用方发送一个事务操作的请求(1),外部api网关接收外部调用方发送的事务请求时,分配一个id,记为事务id,返回该事务id用于查询事务结果(1-R);
步骤2:外部网关查询缓存空间B是否命中(2A),此时结果为命中,并返回本类型请求sql数量8(2A-R);外部api网关携带事务id调用服务A进行事务操作,后续所有服务间调用都携带该事务id(2B);sql网关记录本事务的执行情况为“执行中”(2C);
步骤3:服务A调用sql网关准备执行3个sql(3A),同时,服务A分别调用服务B(3B)和服务C(3C),外部api网关将收到的sql数量8(2A-R)通知sql网关(3D);
步骤4:服务B调用sql网关准备执行3个sql(4A),服务C调用sql网关准备执行2个sql(4B);此时sql网关接收到步骤3中的任意请求时,都判断是否提交(4C);
步骤5:sql网关接收到步骤4中的任意请求时,都判断是否提交(5);
步骤6:sql网关收到外部api网关报告和8个sql语句之后,增加一条更新本事务执行情况为“成功”的语句,提交该事务(6)。数据库返回事务执行“成功”或“失败”结果(6-R)。
步骤7:事务执行完毕时,清除缓存(7)。

Claims (5)

1.基于单数据库的微服务事务提交方法,其特征在于,包括:
外部api网关接收外部调用方发送的事务请求时,分配一个id,记为事务id;
外部api网关在缓存A中为所述事务id的请求类型分配一个请求类型缓存空间,相同的请求类型具有同样的业务逻辑,调用同样的微服务;
外部api网关携带所述事务id逐层向下调用多个微服务,直至对sql网关发出sql请求,所有sql包装成一个数据库事务,对同一数据库进行请求;
sql网关在缓存B中为所述事务id分配一个事务sql缓存空间,在其中存储sql网关接收的所有sql请求;
外部api网关在所述请求类型缓存空间中查询是否存在与所述事务id相同的请求类型,如果不存在,执行如下步骤:
步骤1,外部api网关计算所述事务id对sql网关发出的所有sql请求数量之和,记为sql提交数量,保存至所述请求类型缓存空间中;
步骤2,外部api网关对sql网关发出开启所述事务id请求,将缓存A中的sql提交数量存储到缓存B中事务sql缓存空间中;
sql网关接收到sql请求或开启所述事务id请求时,sql网关将当前事务sql缓存空间中的sql请求数量与事务sql缓存空间中的sql提交数量比较,如相等则统一提交所述事务sql缓存空间中存储的所有sql请求;
如果在所述请求类型缓存空间中查到与所述事务id相同的请求类型,执行上述步骤2。
2.如权利要求1所述的基于单数据库的微服务事务提交方法,其特征在于,步骤1中sql提交数量计算方法为,外部api网关逐层向下调用微服务时,每一层都返回本层及下层的sql请求数量之和。
3.如权利要求1所述的基于单数据库的微服务事务提交方法,其特征在于,所述相同的请求类型的判断方法为:当请求的方法和url都相同时,请求类型相同。
4.如权利要求1所述的基于单数据库的微服务事务提交方法,其特征在于,所述请求类型缓存空间为key-value形式存储,其中key为所述请求的请求类型,value为sql提交数量;事务sql缓存空间为key-value形式存储,其中key为事务id,Value中存储sql网关接收的所有sql请求以及sql提交数量。
5.如权利要求1所述的基于单数据库的微服务事务提交方法,其特征在于,缓存A和缓存B位于缓存服务器中。
CN201910270203.5A 2019-04-04 2019-04-04 基于单数据库的微服务事务提交方法 Active CN110008271B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910270203.5A CN110008271B (zh) 2019-04-04 2019-04-04 基于单数据库的微服务事务提交方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910270203.5A CN110008271B (zh) 2019-04-04 2019-04-04 基于单数据库的微服务事务提交方法

Publications (2)

Publication Number Publication Date
CN110008271A CN110008271A (zh) 2019-07-12
CN110008271B true CN110008271B (zh) 2020-12-15

Family

ID=67169968

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910270203.5A Active CN110008271B (zh) 2019-04-04 2019-04-04 基于单数据库的微服务事务提交方法

Country Status (1)

Country Link
CN (1) CN110008271B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110740187B (zh) * 2019-10-25 2021-12-28 家乡互动(厦门)网络科技有限公司 一种微服务架构的实现方法
US11372736B2 (en) 2020-05-20 2022-06-28 International Business Machines Corporation Rollback for dependency services in cloud native environment

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673275A (zh) * 2009-08-11 2010-03-17 东软集团股份有限公司 一种保证数据库内事务一致的方法及装置
CN107247784A (zh) * 2017-06-14 2017-10-13 郑州云海信息技术有限公司 一种分布式事务的控制方法及事务管理器

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101706811B (zh) * 2009-11-24 2012-01-25 中国科学院软件研究所 一种分布式数据库系统事务提交方法
US10176209B2 (en) * 2015-06-26 2019-01-08 Vmware, Inc. Abortable transactions using versioned tuple cache
CN105912384A (zh) * 2016-04-01 2016-08-31 广东凯通软件开发有限公司 流程引擎事务处理方法及装置
CN108304271B (zh) * 2018-01-16 2021-08-06 深圳市康拓普信息技术有限公司 一种微服务架构下的分布式事务管理器以及管理方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101673275A (zh) * 2009-08-11 2010-03-17 东软集团股份有限公司 一种保证数据库内事务一致的方法及装置
CN107247784A (zh) * 2017-06-14 2017-10-13 郑州云海信息技术有限公司 一种分布式事务的控制方法及事务管理器

Also Published As

Publication number Publication date
CN110008271A (zh) 2019-07-12

Similar Documents

Publication Publication Date Title
US9417977B2 (en) Distributed transactional recovery system and method
CN107787490B (zh) 分布式数据库网格中的直接连接功能
CN103077222B (zh) 机群文件系统分布式元数据一致性保证方法及系统
US9055065B2 (en) Managing participant order in distributed transactions
CN110276614B (zh) 分户账的更新方法和装置
CN111259083A (zh) 分布式事务处理方法及装置
US8856178B2 (en) Committing events where transaction threads have read-only access to shared memory
US7461065B2 (en) Method and system for utilizing shared numeric locks
CN105354328B (zh) 一种解决NoSQL数据库并发访问冲突的系统及方法
CN109255701B (zh) 一种网贷业务数据处理方法
CN110008271B (zh) 基于单数据库的微服务事务提交方法
CN102831156A (zh) 一种云计算平台上的分布式事务处理方法
CN107016029B (zh) 一种业务数据的处理方法、装置及系统
CN106874130A (zh) 一种微服务架构中分布式事务的处理方法
CN112541830A (zh) 用于事务一致性的处理方法、处理装置、和处理系统
US10558488B2 (en) Sharing transaction contexts in an optimized colocation of java and non-java language applications
CN112131305A (zh) 账户处理系统
CN112671827A (zh) 一种分布式事务最终一致性方法
CN115712670A (zh) 一种数据源管理系统
US9473561B2 (en) Data transmission for transaction processing in a networked environment
CN104537563A (zh) 一种额度数据处理方法及服务器
CN117541172A (zh) 基于子账户拆分的热点账户并发处理方法、装置及设备
CN113760924A (zh) 一种分布式事务的处理方法和装置
US11669547B2 (en) Parallel data synchronization of hierarchical data
US9542463B2 (en) Method and system for optimizing XA open and XA close operations in a distributed database system

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