【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解

本文主要是介绍【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我,第一次用到外观模式,应该是3年多以前。那时候是做一个收费系统,在当时的U层和B层之间,加了一层Facade。当时,在一些复杂的业务逻辑处理时,感受到了加入外观层的好处,但对于一些简单的(我指的是,当时很多facade里面的方法都只是简单的返回了B层的方法执行结果)业务,总感觉是没有必要了。那么,外观模式,究竟可以发挥出多大的威力呢????

一、目前的框架

后来,在项目的开发中,用到的设计模式不算少。但外观的比例,却也真的没有那么大。那么最近呢,公司的框架,在service之上,再增加了一个facade层,将facade的接口服务注册到Dubbo中心,对外统一提供API服务。整个的设计师没有问题的,但是,对于架构组的说法,以及目前的用法,我谈一下我的思考(我认为自己对,但我不太确定,只是简单说一下我的看法)

首先,我先整体的说说项目中框架里的调用关系(哈哈,猜的没错,本宝宝要手绘图纸了。丑啊)

我先大概介绍一下。

1,关于事务,采取的是声明式事务,加到了service层,粒度是整个类!首先是我感觉整个类上都加上注释,统一为一样的默认配置,这种做法是有待考究的。因为我不认为每一个方法需要的事务行为都是一致的,再极端一点,我认为有些单表的单条数据操作,不需要事务! 而,我自己的想法是,因为我们统一对外的接口是facade层,所以,我认为是将事务控制到facade这层的方法。 而不再需要在service层加类事务注解,甚至是在基类baseservice上也加上事务管理。      但,当时跟我说的是,由于我们的facade接口对外实现,是通过Dubbo进行的,所以如果将事务注解到facade,可能会和Dubbo之间发生一些别的问题!(这一点,我还没有仔细研究过Dubbo的机制原理和协议,不太肯定和加事务到facade有没有什么冲突或者联系)

 

2,对于外观模式的作用。

引用自《大话设计模式》:外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式的使用场景,三个阶段:首先,在设计初期阶段,应该要有意识的将不同的两个层分离;其次,在开发阶段,子系统往往因为不断的重构烟花而变得越来越复杂,增加外观facade可以提供一个简单的接口,减少他们之间的依赖;第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展,为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与facade对象交互,facade与遗留代码交互所有复杂的工作。

 

而我们的这个系统,从严格意义上来说,也算是一个需要与旧系统实现打交道的,业务都比较成熟。在换新框架的时候,业务逻辑复用,但代码上的复用不多甚至没有。所以,从某种程度上来说,也算是一个新的系统。 简单类比到外观的使用场景,那么应该符合第二点。

先再看看外观的用途:

所以,我就认为当前的facade层只是简单的返回service的方法,那么增加这一层的意义不大。因为增加facade这一层,它并没有做到简化解耦当前项目中controller调用Dubbo服务接口的依赖,因为接口基本等同于service层!   (个人目前的拙见)

而且,外观模式,是一种结构型的设计模式。什么是结构型????

二、API Gateway

谈到外观模式,就联想到最近正在做,正在计划引入项目的API网关服务。在这里面,我就感受到了外观的精巧奇妙。嘿嘿(来张漂亮的图):

API 网关,事实上就相当于外观,客户端统一从API网关服务中调用服务,而API Gateway负责整合具体的服务。

看看API网关的优点(我认为很多就像是外观模式的优点)

1,使服务和客户端解耦。

2,使客户端和服务部署环境解耦。

3,提供了最佳的API给每个客户端。

4,减少的请求/往返次数。例如,API网关可以一次性检索多个服务的数据。更少的请求也意味着更少的开销,提高了用户体验。一个API网关对于移动应用至关重要。

5,简化了客户端的调用,因为API网关可以组合服务,并提供组合后的façade接口。

对于API Gateway这一段的说法,更详细的可以参考:

谷歌翻译版:微服务API Gateway    原文地址:Pattern: API Gateway / Backend for Front-End

三、总结

这次的总结,其实就两句话:

1,如无必要,勿增实体

2,已增实体,就必须发挥其最大功用(而且是好的用处)

第三点,算是对于自己的一个反思:我需要好好深入的学习一些东西,要做到从理论和实践都能具有强大的说服力。而且,在研究这段的过程中,发现自己对于理论的联系能力和辩驳能力都增强了很多,但是实践的速度太慢。比如,测试事务加到哪儿的那一块内容,测了好几个小时,才测完了加到不同地方,不同执行操作的影响。

我还可以做到更好,加油!  嘿嘿,整整API getaway ,特别好玩儿的一个东西!

这篇关于【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106747

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.