【设计模式 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

相关文章

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是