【设计模式 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,谈谈对外观模式的理解的更多相关文章
- 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...
- 设计模式(十一)外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- C#设计模式-外观模式
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模 ...
- C#设计模式(11)——外观模式(Facade Pattern)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- [设计模式] 10 外观模式 facade
外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构. ...
- 结合Mybatis源码看设计模式——外观模式
定义 提供了一个统一的接口,用来访问子系统中一群接口 适用场景 子系统复杂,增加外观模式提供简单调用接口 构建多层系统结构,用外观对象作为每层入口 详解 外观模式,主要理解外观.通俗一点可以认为这个模 ...
- C++设计模式——外观模式
前言 在实际开发时,面对一个大的系统,总是会将一个大的系统分成若干个子系统,等子系统完成之后,再分别调用对应的子系统来完成对应的整体功能,这样有利于降低系统的复杂性:最终进行实现某个具体的功能时,我们 ...
- C#设计模式(11)——外观模式(Facade Pattern)(转)
一.引言 在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ...
- 《微服务架构设计模式》读书笔记 | 第8章 外部API模式
目录 前言 1. 外部API的设计难题 1.1 FTGO应用程序的服务及客户端 1.2 FTGO移动客户端API的设计难题 1.3 其他类型客户端API的设计难题与特点 2. API Gateway模 ...
随机推荐
- CodeForces 32C Flea
题目链接:http://codeforces.com/problemset/problem/32/C 本文链接:http://www.cnblogs.com/Ash-ly/p/5513436.html ...
- (寒假开黑gym)2018 USP Try-outs
layout: post title: (寒假开黑gym)2018 USP Try-outs author: "luowentaoaa" catalog: true tags: m ...
- Codeforces #432 Div2 D
#432 Div2 D 题意 给出一些数字,如果这些数字的的 \(gcd\) 不为1则称这些数字 \(good\). 可以有两种操作: 花费 x 删掉一个数 花费 y 将一个数加 1 问使这些数 \( ...
- 设置参数进行java的jvm监控
1.设置jconsole监控服务器的tomcat参数及java jvm大小,执行命令vi ../tomcat/bin/catalina.sh “在服务器安装的tomcat目录下” JAVA_OPTS ...
- hibernate中session的线程安全问题
Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Sessio ...
- [CTSC2017]最长上升自序列(伪题解)(Dilworth's theorem+网络流)
部分分做法很多,但每想出来一个也就多5-10分.正解还不会,下面是各种部分分做法: Subtask 1:k=1 LCS长度最长为1,也就是说不存在j>i和a[j]>a[i]同时成立.显然就 ...
- [Codeforces 10E] Greedy Change
Brief Introduction: 给你一些种类的硬币,用最少的硬币数表示X 求最小的使贪心算法错误的X Algorithm: 一道论文题,<A Polynomial-time Algori ...
- [BZOJ 3157] 国王奇遇记
Link: BZOJ 3157 传送门 Solution: 题意:求解$\sum_{i=1}^n m^i \cdot {i^m}$ $O(m^2)$做法: 定义一个函数$f[i]$,$f[i]=\su ...
- small test on 5.30 night T1
数学题使劲推就对了. 让我们设 g(x) = ∑ C(i,x) * b^i ,然后后面验算了一张纸QWQ,懒得再打一遍了,回家我就把这张演算纸补上QWQ,先上代码. #include<cstd ...
- 【左偏树】BZOJ2809-[APIO2012]dispatching
[题目大意] 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同 ...