近日看《许式伟的架构课》中一段关于系统分解的描述所有思考,略记于此。

原文片段如下:

系统设计,简单来说就是 “对系统进行分解” 的能力。这个阶段核心要干的事情,就是明确子系统的职责边界和接口协议,把整个系统的大框架搭起来。

那么怎么分解系统?

首先我们需要明确的是分解系统优劣的评判标准。也就是说,我们需要知道什么样的系统分解方式是好的,什么样的分解方式是糟糕的。

最朴素的评判依据,是这样两个核心的点:

  • 功能的使用界面(或者叫接口),应尽可能符合业务需求对它的自然预期;
  • 功能的实现要高内聚,功能与功能之间的耦合尽可能低。

在软件系统中有多个层次的组织单元:子系统、模块、类、方法 / 函数。子系统如何分解模块?模块如何分解到更具体的类或函数?每一层的分解方式,都遵循相同的套路。也就是分解系统的方法论。

......

一个程序员的系统分解能力强不强,其实一眼就可以看出来。你都不需要看实现细节,只需要看他定义的模块、类和函数的使用接口。如果存在大量说不清业务意图的函数,或者存在大量职责不清的模块和类,就知道他基本上还处在搬砖阶段。

无论是子系统、模块、类还是函数,都有自己的业务边界。它的职责是否足够单一足够清晰,使用接口是否足够简单明了,是否自然体现业务需求(甚至无需配备额外的说明文档),这些都体现了架构功力。

完整原文 https://time.geekbang.org/column/article/117783

佩服作者对系统设计这样大问题的能简化到2个朴素的判断依据,而不是学院式的抽象含糊的说明。

近期由于工作内容需要,也常思考业务需求对接口的预期是什么?

对于服务端软件而言,接口在形式上比有UI交互的前端软件更加稳定且标准;然而对于业务需求的预期有时会缺少思考,设计上更倾向于技术的可行便利。

当然这两者并不矛盾,如果业务在接口标准上达成共识,就能取得很好的效果。

对于服务端软件,软件配置的组织与设计是一个重要而容易被忽视的接口。

以nginx软件为例,个人认为nginx配置方式的设计对业务需求的表达有时就不够自然清晰。甚至在某些场景下功能配置的耦合情况不少。

示例1

  1. # 示例例来源 http://nginx.org/en/docs/http/websocket.html
  2. http {
  3. map $http_upgrade $connection_upgrade {
  4. default upgrade;
  5. '' close;
  6. }
  7. server {
  8. ...
  9. location /chat/ {
  10. proxy_pass http://backend;
  11. proxy_http_version 1.1;
  12. proxy_set_header Upgrade $http_upgrade;
  13. proxy_set_header Connection $connection_upgrade;
  14. }
  15. }
  16. }

上面这段示例的目的是实现WebSocket的代理,但从配置上看不出WebSocket的任何信息,而是依赖于配置人员对WebSocket升级流程与Nginx代理流程十分了解的基础上才能判断出这段配置能实现WebSocket代理。

示例2

  1. # 示例例来源 http://nginx.org/en/docs/http/converting_rewrite_rules.html
  2. location / {
  3. root /var/www/myapp.com/current/public;
  4. try_files /system/maintenance.html
  5. $uri $uri/index.html $uri.html
  6. @mongrel;
  7. }
  8. location @mongrel {
  9. proxy_pass http://mongrel;
  10. }

上面这段示例目的是优先尝试本地文件,不存在再像后端获取。其中的location @mongrel {}块部分是涉及到nginx开发中subrequest的概念。

subrequest的设计在代码内部很好的处理复杂请求的业务流程,是nginx开发中模块解耦,降低开发复杂度,并保持高性能的重要利器。

而这样一个重要特性却可能会造成配置片段的隔离性,当这个特性被大量使用时,配置文件看上去就显得特别复杂。与公司运维童鞋交流过程中也收到过反馈,说ngxin配置的格式,看着特别像代码而不是配置项。

关于subrequest更多信息可以参考http://nginx.org/en/docs/dev/development_guide.html#http_subrequests


然而这个视角的分析太片面。从另一个视角看,nginx的配置是提供了足够的灵活性和可扩展性,为实现各类不同的业务提供了可能性。nginx的配置不仅是业务需求的展示,而且还能承载业务逻辑,实现灵活扩展的功能。openresty的ngx_http_lua_module就是一个很好的实例。

  1. # 示例来自 https://github.com/openresty/lua-nginx-module/
  2. location = /request_body {
  3. client_max_body_size 50k;
  4. client_body_buffer_size 50k;
  5. content_by_lua_block {
  6. ngx.req.read_body() -- explicitly read the req body
  7. local data = ngx.req.get_body_data()
  8. if data then
  9. ngx.say("body data:")
  10. ngx.print(data)
  11. return
  12. end
  13. -- body may get buffered in a temp file:
  14. local file = ngx.req.get_body_file()
  15. if file then
  16. ngx.say("body is in file ", file)
  17. else
  18. ngx.say("no body found")
  19. end
  20. }
  21. }

在配置文件上承载业务逻辑,对于配置的管理与维护就提出了新的挑战。

孰是孰非,我并没有明确的倾向性,在实际项目中还要考虑组织结构、协作流程、历史数据、现有架构等等因素……才能设计出一个恰如其分的方案。

再看开头提到徐大牛提出的2个判断依据。接口满足业务预期;功能高内聚低耦合。用于判断方案的合理性确实是一个很不错的标准。

谈nginx配置的更多相关文章

  1. Nginx配置性能优化与压力测试webbench【转】

    这一篇我们来说Nginx配置性能优化与压力测试webbench. 基本的 (优化过的)配置 我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置.你应该能够在服务器的/et ...

  2. Nginx配置优化详解

    如果你已经安装过Nginx并在生产环境中使用,那么Nginx配置优化你一定也要做,这样才能看到Nginx性能,本文就从基本配置优化开始到高层配置教你如何优化Nginx 大多数的Nginx安装指南告诉你 ...

  3. nginx配置反向代理或跳转出现400问题处理记录

    午休完上班后,同事说测试站点访问接口出现400 Bad Request  Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...

  4. Windos环境用Nginx配置反向代理和负载均衡

    Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...

  5. Windows下Nginx配置SSL实现Https访问(包含证书生成)

    Vincent.李   Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...

  6. Nginx 配置简述

    不论是本地开发,还是远程到 Server 开发,还是给提供 demo 给人看效果,我们时常需要对 Nginx 做配置,Nginx 的配置项相当多,如果考虑性能配置起来会比较麻烦.不过,我们往往只是需要 ...

  7. Nginx配置详解

    序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...

  8. Nginx配置Https

    1.申请证书: https://console.qcloud.com/ssl?utm_source=yingyongbao&utm_medium=ssl&utm_campaign=qc ...

  9. nginx配置为windows服务中的坑

    网上搜索“nginx 配置为windows服务”,很容易搜索到使用windows server warpper来配置,于是按照网上的方法我从github上的链接下载了1.17版本,前面都很顺利,很容易 ...

随机推荐

  1. HTML5 Geolocation(地理定位)

    一.背景 在HTML规范中,增加了获取用户地理信息的API,这样使得可以基于用户位置开发互联网应用,即基于位置服务 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. Inter ...

  2. 安卓入门教程(十五)- Fragment,Service,WAMP下载

    Fragment概述 Fragment可以被嵌入到Activity中,一个Activity可以有多个Fragment. 创建Fragment public class MyFragment exten ...

  3. 农场派对(party)(信息学奥赛一本通 1497)

    [题目描述] N(1≤N≤1000)头牛要去参加一场在编号为 x(1≤x≤N) 的牛的农场举行的派对.有 M(1≤M≤100000) 条有向道路,每条路长 Ti(1≤Ti≤100):每头牛都必须参加完 ...

  4. mysql 创建分组

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  5. span 不使用float 靠右对齐且垂直居中

    一般让div 里的span 靠右对齐用的方法比较多的是float:right. 这次由于各种原因我不想用float 先看效果: HTML 部分 <div class="customer ...

  6. compass和paoding分词器的基本使用

    1.实现搜索的技术: 数据库查询:like查询:lucene全文检索技术: 1)在数据量比较大,查询字段比较多的情况下,如果采用数据库like sql查询,性能比较差:采用lucene来查询,性能相对 ...

  7. #C++初学记录(STL容器以及迭代器)

    STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...

  8. 分布式并行计算MapReduce

    作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapReduce ...

  9. 2019_软工实践_Beta(2/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ?按照时间进度的安排进行相应的检查 展示GitHub当日代码/文档签入记 ...

  10. uniapp - 阿里图库字体图标使用

    [iconfont下载] https://www.iconfont.cn/search/index?searchType=icon&q=%E4%B8%8A%E4%BC%A0 可能报错,找不到线 ...