干货速来!透彻剖析微服务架构设计模式,深入开发Java有奇效
什么是微服务模式随着网络基础设施的高速生长,以及越来越多的个体接入互联网,在思量构建支持海量请求以及多变业务的软件平台时,微服务架组成为多数人的首选。微服务架构的泛起时服务事物生长纪律的:当问题足够大,有足够多的的不确定因素时,人们习惯于把大的问题拆分成小的问题。通太过割,抽象和重用小而可靠的功效模块来构建整体方案。
可是当这些小的,可重用的部门多来越多的时候,又会泛起新的问题。再相似的阶段,人们遇到的问题也是相似的,这个时候人们需要一些共识,需要用一些通用的词汇来形貌问题以及解决方案,这也是人们知识的总结,微服务模式就是这样的总结和归纳综合,是一种可以通用的共识,用于形貌微服务领域的中的问题及解决方案。
单体结构的历程在企业生长的初期,应用法式相对较小,所有的代码运行在一个应用法式中有以下利益应用的开发很简朴:IDE 和其他开发工具只需要构建这一个单独的应用法式。易于对应用法式举行大规模的更改:可以更改代码和数据库模式,然后构建和部署。
测试相对简朴直观:开发者只需要写几个端到端的测试,启动应用法式,挪用 REST API,然后使用 Selenium 这样的工具测试用户界面。部署简朴明晰:开发者唯一需要做的,就是把 WAR 文件复制到安装了 Tomcat 的服务器上。
横向扩展不费吹灰之力:FTGO 可以运行多个实例,由一个负载平衡器举行调理。不幸的是,开发人员已经意识到的,单体架构存在着庞大的局限性。每一次开发冲刺(Sprint), 开发团队就会实现更多的功效,显然这会导致代码库膨胀。
而且,随着公司的乐成,研发团队的规模不停壮大。代码库规模变大的同时,团队的治理成本也不停提高。过分的庞大性吓退开发者系统自己过于庞大和庞大,以至于任何一个开发者都很难明白它的全部。
因此,修复软件中的问题和正确地实现新功效就变得难题且耗时。种种交付停止时间都可能被错过。
更糟糕的是,这种极端的庞大性正在形成一个恶性循环:由于代码库太难于明白,因此开发人员在更改时更容易堕落,每一次更改都市让代码库变得更庞大、更难明开发速度缓慢庞大的项目把开发人员的 IDE 工具搞得很慢,构建一次应用需要很长时间,更要命的是,因为应用太大,每启动一次都需要很长的时间。因此,从编辑到构建、运行再到测试这个周期花费的时间越来越长,这严重地影响了团队的事情效率。
从代码提交到实际部署的周期很长,而且容易出问题从代码完成到运行在生产情况是一个漫长且艰苦的历程。一个问题是,众多开发人员都向同一个代码库提交接码更改,这经常使得这个代码库的构建效果处于无法交付的状态。
当我们实验接纳功效分支来解决这个问题时,带来的是漫长且痛苦的合并历程。紧接着,一旦团队完成一个冲刺任务,随后迎接他们的将是一个漫长的测试和代码稳定周期。把更改推向生产情况的另一个挑战是运行测试需要很长时间。
因为代码库如此庞大,以至于一个更改可能引起的影响是未知的,为了制止牵一发而动全身的结果,纵然是一个微小的更改,开发人员也必须在连续集成服务器上运行所有的测试套件。系统的某些部门甚至还需要手工测试。如果测试失败,诊断和修复也需要更多的时间。
因此,完成这样的测试往往需要数天甚至更长时间。需要恒久依赖某个可能已经由时的技术栈单体地狱的最终体现,也体现在团队必须恒久使用一套相同的技术栈方面。
单体架构使得接纳新的框架和编程语言变得极其难题。在单体应用上接纳新技术或者实验新技术都是极其昂贵和高风险的,因为这个应用必须被彻底重写。效果就是,开发者被困在了他们一开始选择的这个技术之内。有时候这也就意味着团队必须维护一个正在被废弃或过时的技术所开发的应用法式。
单体地狱的银弹-微服务架构软件架构其实对功效性需求影响并不大。事实上,在任何架构甚至是一团糟的架构之上,你都可以实现一组用例(应用的功效性需求)架构的重要性在于它影响了应用的非功效性需求,也称为质量属性或者其他的能力。随着 FTGO 应用的增长,种种质量属性和问题都浮出水面,最显著的就是影响软件交付速度的可维护性、可扩展性和可测试性。训练有素的团队可以减缓项目陷入单体地狱的速度。
团队成员可以努力维护他们的模块化应用。他们也可以编写全面的自动化测试。可是另一方面,他们无法制止大型团队在单体应用法式上协同事情的问题,也不能解决日益过时的技术栈问题。团队所能做的就是延缓项目陷入单体地狱的速度,但这是不行制止的。
为了逃避单体地狱,他们必须迁移到新架构:微服务架构。今天,针对大型庞大应用的开发,越来越多的共识趋向于思量使用微服务架构。
但微服务到底是什么?不幸的是,微服务这个叫法自己表示和强调了尺寸。针对微服务架构有多种界说。有些仅仅是在字面意义上做了界说:服务应该是微小的不凌驾 100 行代码,等等。
另外有些界说要求服务的开发周期必须被限制在两周之内。曾在 Netflix 事情的著名架构师Adrian Cockcroft 把微服务架构界说为面向服务的架构,它们由松耦合和具有界限上下文的元素组成。这个界说不错,但仍旧有些庞大难明。
立方体模型会是更好的界说。扩展立方体和服务X 轴扩展:在多个实例之间实现请求的负载平衡X 轴扩展是扩展单体应用法式的常用方法。在负载平衡器之后运行应用法式的多个实例。负载平衡器在 N 个相同的实例之间分配请求。
这是提高应用法式吞吐量和可用性的好方法Z 轴扩展:凭据请求的属性路由请求Z 轴扩展也需要运行单体应用法式的多个实例,但差别于 X 轴扩展,每个实例仅卖力数据的一个子集。图 1-5 展示了 Z 轴扩展的事情原理。
置于前端的路由器使用请求中的特定属性将请求路由到适当的实例。例如,应用法式可能会使用请求中包罗的 userId 来路由请求。在这个例子中,每个应用法式实例卖力一部门用户。
该路由器使用请求 Authorization头部指定的 userId 来从 N 个相同的应用法式实例中选择一个。对于应用法式需要处置惩罚增加的事务和数据量时,Z 轴扩展是一种很好的扩展方式Y轴扩展:凭据功效把应用拆分为服务X 轴和 Z 轴扩展有效地提升了应用的吞吐量和可用性,然而这两种方式都没有解决日益增长的开发问题和应用庞大性。为相识决这些问题,我们需要接纳 Y 轴扩展,也就是功效性剖析。
Y 轴扩展把一个单体应用分成了一组服务服务本质上是一个麻雀虽小但五脏俱全的应用法式,它实现了一组相关的功效,例如订单治理、客户治理等。服务可以在需要的时候借助 X 轴或 Z 轴方式举行扩展。例如,订单服务可以被部署为一组负载平衡的服务实例。
微服务架构的归纳综合性界说是:把应用法式功效性剖析为一组服务的架构气势派头。请注意这个界说中并没有包罗任何与规模有关的内容。重要的是,每一个服务都是由一组专注的、内聚的功效职责组成。微服务架构的利益和毛病优点大型的庞大应用法式可以连续交付和连续部署拥有连续交付和连续部署所需要的可测试性。
自动化测试是连续交付和连续部署的一个重要环节。因为每一个服务都相对较小,编写和执行自动化测试变得很容易。因此,应用法式的 bug 也就更少。拥有连续交付和连续部署所需要的可部署性。
每个服务都可以独立于其他服务举行部署。如果卖力服务的开发人员需要部署对该服务的更改,他们不需要与其他开发人员协调就可以举行。因此,将更改频繁部署到生产中要容易得多使开发团队能够自主且松散耦合。你可以将工程组织构建为一个小型(例如,两个比萨 )团队的荟萃。
每个团队全权卖力一个或多个相关服务的开发和部署。每个团队可以独立于所有其他团队开发、部署和扩展他们的服务。效果,开发的速度变得更快每个服务都相对较小并容易维护微服务架构的另一个利益在于:相比之下每个服务都比力小。
开发者更容易明白服务中的代码。较小规模的代码库不会把 IDE 等开发工具拖慢,这样可以提升开发者的事情效率。服务的启动速度也比大型的单体应用快得多,千万别小看这一点,快速启动的服务会提高效率,加速研发(提高调试、部署等环节的效率)。更好的容错性微服务架构也可以实现更好的故障隔离。
例如,某个服务中的内存泄漏不会影响其他服务。其他服务仍旧可以正常地响应请求。
相比之下,单体架构中的一个故障组件往往会拖垮整个系统更容易实验和采取新的技术原则上,当开发一个新的服务时,开发者可以自由选择适用于这个服务的任何语言和框架。固然,许多公司对此往往有种种限制和规范,但重要的是团队有了选择的权利,而不是被之前选定的技术绑架。更进一步,因为服务都相对比力小,使用更好的编程语言和技术来重写一项服务变得有可能。
这也意味着,如果对一项新技术的实验以失败而了结,我们可以直接抛弃这部门事情而不至于给整个应用带来失败的风险。这跟单体架构是完全差别的,单体架构之下的技术选型会严重限制后期新技术的实验毛病固然,没有一项技术可以被称为“银弹”。微服务架构也存在一些显著的毛病和问题微服务架构的主要毛病和问题如下:服务的拆分和界说是一项挑战接纳微服务架构首当其冲的问题,就是基础没有一个详细的、良好界说的算法可以完成服务的拆分事情。
与软件开发一样,服务的拆分和界说更像是一门艺术。更糟糕的是,如果对系统的服务拆分泛起了偏差,你很有可能会构建出一个漫衍式的单体应用:一个包罗了一大堆相互之间紧耦合的服务,却又必须部署在一起的所谓漫衍式系统。
这将会把单体架构和微服务架构两者的毛病集于一身。漫衍式系统带来的种种庞大性使用微服务架构的另一个问题是开发人员必须处置惩罚建立漫衍式系统的分外庞大性。服务必须使用历程间通信机制。
这比简朴的方法挪用更庞大。此外,必须设计服务来处置惩罚局部故障,并处置惩罚远程服务不行用或泛起高延迟的种种情况。开发者需要思考到底应该在应用的什么阶段使用微服务架构使用微服务架构的另一个问题是决议在应用法式生命周期的哪个阶段开始使用这种架构。在开发应用法式的第一个版本时,你通常不会遇到需要微服务架构才气解决的问题。
此外,使用经心设计的漫衍式架构将减缓开发速度。这对初创公司来说可能是得不偿失的,其中最大的问题通常是在快速生长业务模型和维护一个优雅的应用架构之间的取舍。微服务架构使得项目开始阶段的快速迭代变得很是难题。
初创公司险些肯定应该从单体的应用法式开始。可是稍后,当问题变为如那边理庞大性时,那就是将应用法式功效性地剖析为一组服务的时候了。由于盘根错节的依赖关系,你会发现重构很难题服务的拆分计谋如何界说一个微服务架构呢?跟所有的软件开发历程一样,一开始我们需要拿到领域专家或者现有应用的需求文档。跟所有的软件开发一样,界说架构也是一项艺术而非技术。
本节我们将先容一种界说应用法式架构的三步式流程界说其架构的第一步是将应用法式的需求提炼为种种关键请求。可是,不是凭据特定的历程间通信技术(如 REST 或消息)来形貌这些请求,而是使用更抽象的系统操作这个观点。系统操作(system operation)是应用法式必须处置惩罚的请求的一种抽象形貌。它既可以是更新数据的下令,也可以是检索数据的查询。
每个下令的行为都是凭据抽象领域模型界说的,抽象领域模型也是从需求中派生出来的。系统操作是形貌服务之间协作方式的架构场景该流程的第二步是确定如何剖析服务。有几种计谋可供选择。
一种源于业务架构学派的计谋是界说与业务能力相对应的服务。另一种计谋是围绕领域驱动设计的子域来剖析和设计服务。
但这些计谋的最终效果都是围绕业务观点而非技术观点剖析和设计的服务。界说应用法式架构的第三步是确定每个服务的 API。为此,你将第一步中标识的每个系统操作分配给服务。
服务可以完全独立地实现操作。或者,它可能需要与其他服务协作。在这种情况下,你可以确定服务的协作方式,这通常需要服务来支持其他操作识别系统操作界说应用法式架构的第一步是界说系统操作。
起点是应用法式的需求,包罗用户故事及其相关的用户场景(请注意,这些与架构场景差别)。使用图 2-6 中所示的两步式流程识别和界说系统操作。第一步建立由关键类组成的抽象领域模型,这些关键类提供用于形貌系统操作的词汇表。第二步确定系统操作,并凭据领域模型形貌每个系统操作的行为。
建立抽象领域模型界说系统操作的第一步是为这个应用法式描绘一个抽象的领域模型。注意这个模型比我们最终要实现的简朴许多。应用法式自己并不需要一个领域模型,因为我们在稍后会学到,每一个服务都有它自己的领域模型。
只管很是简朴,抽象的领域模型仍旧有助于在开始阶段提供资助,因为它界说了形貌系统操作行为的一些词语建立领域模型会接纳一些尺度的技术,例如通过与领域专家相同后,分析用户故事和场景中频繁泛起的名词。例如 Place Order 用户故事,我们可以把它剖析为多个用户场景,Given a consumerAnd a restaurantAnd a delivery address/time that can be served by that restaurantAnd an order total that meets the restaurant's order minimumWhen the consumer places an order for the restaurantThen consumer's credit card is authorizedAnd an order is created in the PENDING_ACCEPTANCE stateAnd the order is associated with the consumerAnd the order is associated with the restaurant在这个用户场景中的名词,如 Consumer、Order、Restaurant 和 CreditCard,表示了这些类都是需要的同样,Accept Order 用户故事也可以剖析为多个场景,如下Given an order that is in the PENDING_ACCEPTANCE stateand a courier that is available to deliver the orderWhen a restaurant accepts an order with a promise to prepare by a particulartimeThen the state of the order is changed to ACCEPTEDAnd the order's promiseByTime is updated to the promised timeAnd the courier is assigned to deliver the order经由分析最终我们可以得出如下的类图结构每一个类的作用如下:Consumer:下订单的用户。Order:用户下的订单,它用来形貌订单并跟踪状态。OrderLineItem:Order 中的一个条目。
DeliveryInfo:送餐的时间和地址。Restaurant:为用户准备生产订单的餐馆,同时也要提倡送货。
MenuItem:餐馆菜单上的一个条目。Courier:送餐员卖力把订单送到用户手里。可跟踪送餐员的可用性和他们的位置。
Address:Consumer 或 Restaurant 的地址。Location:Courier 当前的位置,用经纬度表现界说系统操作当界说了抽象的领域模型之后,接下来就要识别系统必须处置惩罚的种种请求。我们并不讨论详细的用户界面,可是你能够想象在每一个用户场景下,前端的用户界面向后端的业务逻辑发出请求,后端的业务逻辑举行数据的获取和处置惩罚识别系统指令的切入点是分析用户故事和场景中的动词。
例如 Place Order 用户故事,它很是明确地告诉我们,这个系统必须提供一个 Create Order 操作。许多用户故事都市直接对应或映射为系统下令。表 2-1 列出了一些关键的系统下令下令规范界说了下令对应的参数、返回值和领域模型类的行为。
行为规范中包罗前置条件(即当这个操作被挪用时必须满足的条件)和后置条件(即这个操作被挪用后必须满足的条件)。例如,以下就是 createOrder() 系统操作的规范。
前置条件对应着 Place Order 用户场景中的 givens,后置条件对应着场景中的Then。当系统操作被挪用时,它会检查前置条件,执行操作来完成和满足后置条件。抽象的领域模型和系统操作能够回覆这个应用“做什么”这一问题。
这有助于推动应用法式的架构设计。每一个系统操作的行为都通过领域模型的方式来形貌。每一个重要的系统操作都对应着架构层面的一个重大场景,是架构中需要详细形貌和特别思量的地方。现在我们来看看如何界说应用法式的微服务架构系统操作被界说后,下一步就是完成应用服务的识别。
如之前提到的,这并不是一个机械化的流程,相反,有多种拆分计谋可供选择。每一种都是从一个侧面来解决问题,而且使用它们独占的一些术语。
可是殊途同归,这些计谋的效果都是一样的:一个包罗若干服务的架构,这样的架构是以业务而不是技术观点为中心凭据业务能力举行服务拆分建立微服务架构的计谋之一就是接纳业务能力举行服务拆分。业务能力是一个来自于业务架构建模的术语。业务能力是指一些能够为公司(或组织)发生价值的商业运动。
特定业务的业务能力取决于这个业务的类型。例如,保险公司业务能力通常包罗承保、理赔治理、账务和合规等。在线商店的业务能力包罗:订单治理、库存治理和发货组织的业务能力通常是指这个组织的业务是做什么,它们通常都是稳定的。
与之相反,组织接纳何种方式来实现它的业务能力,是随着时间不停变化的。这个准则在今天尤其显着,许多新技术在被快速接纳,商业流程的自动化水平越来越高。
例如,不久之前你还通过把支票交给银行柜员的方式来兑现支票,现在许多 ATM 机都支持直接兑现支票,现在,人们甚至可以使用智能手机照相的方式来兑现支票。正如你所见,“兑现支票”这个业务能力是稳定稳定的,可是这个能力的实现方式正在发生戏剧性的变化从业务能力到服务一旦确定了业务能力,就可以为每个能力或相关能力组界说服务。下图显示了 FTGO应用法式从能力到服务的映射。
某些顶级能力(如会计记账能力)将映射到服务。在其他情况下,子能力映射到服务上图显示的服务仅仅是界说架构的第一次实验。随着我们对应用法式领域的相识越来越多,它们可能会随着时间的推移而变化,特别是架构界说流程中的一个重要步骤是观察服务如何在每个关键架构服务中协作。
例如,你可能会发现由于过多的历程间通信而导致特定的剖析效率低下,导致你必须把一些服务组合在一起。相反,服务可能会在庞大性方面增长到值得将其拆分为多个服务的水平凭据子域举行服务拆分领域驱动设计是构建庞大软件的方法论,这些软件通常都以面向工具和领域模型为焦点。领域模型以解决详细问题的方式包罗了一个领域内的知识。它界说了当前领域相关团队的词汇表,DDD 也称之为通用语言(Ubiquitous language)。
领域模型会被精密地映射到应用的设计和实现环节。在微服务架构的设计层面,DDD 有两个特别重要的观点,子域和限界上下文领域驱动为每一个子域界说单独的领域模型。子域是领域的一部门,领域是 DDD 中用来形貌应用法式问题域的一个术语。识别子域的方式跟识别业务能力一样:分析业务并识别业务的差别专业领域,分析产出的子域界说效果也会跟业务能力很是靠近。
FTGO 的子域包罗:订单获取、订单治理、餐馆治理、送餐和会计。正如你所见:这些子域跟我们之前界说的业务能力很是靠近。DDD 把领域模型的界限称为限界上下文(bounded context)。
限界上下文包罗实现这个模型的代码荟萃。当使用微服务架构时,每一个限界上下文对应一个或者一组服务。换一种说法,我们可以通过 DDD 的方式界说子域,并把子域对应为每一个服务,这样就完成了微服务架构的设计事情。
图 2-9 展示了子域和服务之间的映射,每一个子域都有属于它们自己的领域模型。DDD 和微服务架构简直就是天生一对。DDD 的子域和限界上下文的观点,可以很好地跟微服务架构中的服务举行匹配。而且,微服务架构中的自治化团队卖力服务开发的观点,也跟 DDD 中每个领域模型都由一个独立团队卖力开发的观点吻合。
更有趣的是,子域用于它自己的领域模型这个观点,为消除上帝类和优化服务拆分提供了好措施上帝类的处置惩罚上帝类是在整个应用法式中使用的全局类。上帝类通常为应用法式的许多差别方面实现业务逻辑。它有大量字段映射到具有许多列的数据库表。
大多数应用法式至少有一个这样的上帝类。Order 类是 FTGO 应用法式中上帝类的一个很好的例子。这并不奇怪:究竟 FTGO 的目的是向客户提供食品订单。
系统的大多数部门都涉及订单。如果 FTGO 应用法式具有单个领域模型,则 Order 类将是一个很是大的类。它将具有与应用法式的许多差别部门相对应的状态和行为。下图显示了使用传统建模技术建立的 Order 类的结构Order 类具有与订单处置惩罚、餐馆订单治理、送餐和付款相对应的字段及方法。
由于一个模型必须形貌来自应用法式的差别部门的状态转换,因此该类还具有庞大的状态模型。在现在情况下,这个类的存在使得将代码支解成服务变得极其难题一种解决方案是将 Order 类打包到库中并建立一其中央 Order 数据库。处置惩罚订单的所有服务都使用此库并会见会见数据库。这种方法的问题在于它违反了微服务架构的一个关键原则,并导致我们特别不愿意看到的紧耦合。
例如,对 Order 模式的任何更改都要求其他开发团队同步更新和重新编译他们的代码。另一种解决方案是将 Order 数据库封装在 Order Service 中,该服务由其他服务挪用以检索和更新订单。该设计的问题在于这样的一个 Order Service 将成为一个纯数据服务,成为包罗很少或没有业务逻辑的贫血领域模型(anemic domain model)。
这两种解决方案都没有吸引力,但幸运的是,DDD 提供了一个好的解决方案。更好的方法是应用 DDD 并将每个服务视为具有自己的领域模型的单独子域。这意味着FTGO 应用法式中与订单有关的每个服务都有自己的领域模型及其对应的 Order 类的版本。
Delivery Service 是多领域模型的一个很好的例子。如图 2-11 所示为 Order,它很是简朴:取餐地址、取餐时间、送餐地址和送餐时间。
此外,Delivery Service 使用更合适的 Delivery 名称,而不是称之为 Order。Delivery Service 对订单的任何其他属性不感兴趣Kitchen Service 有一个更简朴的订单视图。它的 Order 版本就是一个 Ticket(后 厨 工 单)。
如图所 示,Ticket 只包罗 status、requestedDeliveryTime、prepareByTime 以及告诉餐馆准备的订单项列表。它不体贴消费者、付款、交付等这些与它无关的事情Order Service 具有最庞大的订单视图,如图所示。纵然它有相当多的字段和方法,它仍然比原始版本的谁人 Order 上帝类简朴得多。每个领域模型中的 Order 类表现同一 Order 业务实体的差别方面。
FTGO 应用法式必须维持差别服务中这些差别工具之间的一致性。例如,一旦 Order Service 授权消费者的信用卡,它必须触发在 Kitchen Service 中建立 Ticket。同样,如果 Kitchen Service 拒绝订单,则必须在 Order Service 中取消订单,而且为客户退款。
我们通常会用用漫衍式事务去处置惩罚这些问题,这又是微服务架构的另一个问题了。以上就是小编整理的微服务架构设计模式,有那里禁绝确的,请列位朋侪多多指出,小编和大家一起配合学习进步~~~喜欢请点赞评论转发,关注小编,后续小编会带来更富厚的学习内容更新~~~。
本文关键词:干货,速,来,透彻,剖析,微,服务,架构,设计模式,开云平台官网入口
本文来源:开云平台官网入口-www.lurekillercn.com
同类文章排行
- 无锡“疯狂”之后,滴滴外卖将进入9城,美团按捺不住了
- 『图片素材』 简约风书籍杂志-开云平台官网入口
- 欧冠神奇男人背后有位吝啬鬼主席!还嘲笑他吗?
- 2021造价工程师考试新手指南 快来看看吧!
- 临汾经济开发区举行“向导干部大课堂”生态情况掩护专题讲座
- “开云平台官网入口”切尔西宣布外租90后新星库尔图瓦为蓝军
- 0-0黎巴嫩后 孙兴慜连说3次对不起:这种表现太差了-开云平台官网
- 刚刚,2019客如云开放平台大会开幕,餐饮SaaS下个5年在哪里?
- 高考作文经典高分素材200篇(一),再也不怕凑不够800字
- 生态环境部一周要闻(6.16-6.22)
最新资讯文章
- 疫情之下,这些人的孝敬可与医护人员比肩,他们就在你我身边
- 2019年汉语言文学考研必备――外国文学名词解释(二)
- 打开环保设施开放大门,将公众请进来
- 全球首部环境法治评估报告发布!
- 生态环境部党组书记、部长李干杰主持召开部党组会议
- 在麻辣香锅店里打工之后,发现做餐饮一点都不简朴
- 小吃码:中国餐饮行业新动能
- 上市餐企转战新零售,净利润率升至18.3%!
- 拉姆塞:很失望 没为阿森纳踢到最后一刻 感恩这11年
- 开云平台官网入口|瓦伦西亚:所有人都很看好并支持着我们的教
- 0-0黎巴嫩后 孙兴慜连说3次对不起:这种表现太差了-开云平台官网
- 清华大学 给一其中学提的贺信!
- 市生态情况局组织收听收看省生态情况厅新时代新知识团体学习
- 生态环境部部长李干杰亮相部长通道
- 新能源汽车市场下沉已是必然趋势
- 火锅加盟如何成功火锅加盟如何成功呢
- 春怡火锅,采用明档与特有的川西建筑文化相结合
- 大众餐饮成功突围的两种建议
- 欧联-拉卡泽特助攻两天才小将破门 阿森纳3-0胜
- 萨拉赫当选2018年BBC非洲最佳球员 KO马内凯塔