《App后台开发运维与架构实践》第2章 App后台基础技术

  2.1 從App業務邏輯中提煉API接口
  
  業務邏輯思維導圖
  
  功能-業務邏輯思維導圖
  
  基本功能模塊關系
  
  功能模塊接口UML(設計出API)
  
  在設計稿標注API
  
  編寫API文檔
  
  2.2 設計API的要點
  
  根據對象設計API
  
  API的命名
  
  API的安全性
  
  API所返回的數據:禁止返回Null值
  
  圖片的處理:圖片數據庫保存原圖,在App客戶端本地緩存圖片不存在時,按圖片尺寸向服務端請求動態生成。
  
  返回的提示信息:給用戶看的提示和給程序員看的提示。
  
  在線API測試文檔:使用Swagger-UI搭建,按TDD(測試驅動開發)原則進行開發。
  
  在App客戶端啟動時調用一個API獲取必要的初始化信息:比如App版本
  
  關于API的版本升級問題:V2版本的API的Controller必須要繼承V1版本的Controller,V2版本的API只重寫需要改動的API。
  
  2.3 如何選擇合適的數據庫產品
  
  2.3.1 Redis、MongoDB、MySQL讀寫數據的區別
  
  Redis的數據是存放在服務器的內存,當內存用滿了后需要擴容,就只能使用Redis的分布式方案。為了防止斷電或Redis程序重啟造成內容數據的丟失,可調整Redis配置文件,按照一定的策略把數據持久化傳到硬盤。
  
  MongoDB同時使用了硬盤和內存,其使用了操作系統提供的MMAP(內存文件映射)機制進行數據文件的讀寫,MMAP可以把文件直接映射到進程的內存空間中,這樣文件就會在內存中有對應的地址,這時對文件的讀寫是能通過操作內存進行的,而不需要使用傳統的如fread、fwrite文件操作方式。
  
  MySQL的數據是放在硬盤中的。雖然MySQL也有緩存,但MySQL緩存的是查詢的結果,而不是緩存數據。
  
  2.3.2 Redis、MongoDB、MySQL查找數據的區別
  
  Redis的數據是基于“鍵值對”存儲。Redis查找數據,每次都是直奔目標,讀寫速度當然快。
  
  MongoDB和MySQL中查找數據,有兩種模式:知道id或索引,不知道id或索引。前者直奔目標,效率高;后者逐個查找,效率低。
  
  2.3.3 Redis、MongoDB、MySQL適用場景
  
  Redis適用場景:讀寫頻率高的數據、熱點數據。
  
  MongoDB適用場景:網站數據(實時的插入、更新與查詢),大尺寸、低價值的數據,高伸縮性的場景(數十或者數百臺服務器組成的數據庫),存儲地理坐標的數據;不適合高度事務性的系統、傳統的商業智能應用及需要復雜SQL的問題。
  
  MySQL適用場景:事務性的系統(涉及金錢),需要復雜SQL的問題。
  
  2.4 如何選擇消息隊列軟件
  
  2.4.1 為什么使用消息隊列
  
  將一些需要花比較多的時間,而且遲點完成不影響整個任務的完成進度的小任務,放到消息隊列中,可加快后臺請求的響應時間;比如發送郵件、發送短信、推送消息等任務就非常適合放到消息隊列中。同時消息隊列也能把大量的并發請求變成串行的請求,減輕服務器的負擔。
  
  2.4.2 消息隊列的工作流程
  
  App后臺(隊列生產者)把消息推入到消息隊列;
  
  守護進程(隊列消費者)不斷地檢測消息隊列中有沒有新的消息,沒有消息就休息一會兒再檢測消息隊列中有沒有新的消息(這樣做能避免消息隊列占據過多的服務器資源),有消息的話就從消息隊列取出消息,用新的線程處理相關的業務,在主線程中繼續檢測消息隊列是否有新消息。
  
  2.4.3 常見的一些消息隊列產品
  
  RabbitMQ:重量級的消息隊列,適合企業級的開發,其支持大量的協議,比如AMQP、XMPP、SMTP、STOMP;同時RabbitMQ自帶了一個Web監控界面,可方便監控隊列的情況。
  
  Redis:雖然是一個key-value系統,但其也支持隊列這種數據格式,可看作是一個輕量級的消息隊列。在App后臺架構中Redis被廣泛使用,如果把其作為消息隊列,能減少項目中的運維成本。
  
  ZeroMQ:號稱最快的消息隊列,尤其針對大吞吐量的需求場景。
  
  ActiveMQ
  
  2.5 使用分布式服務實現業務的復用
  
  隨著業務不斷增加,后臺系統由一個單一的應用慢慢膨脹為一個巨無霸系統,它聚合了大量的應用和服務,各個模塊之間由很多功能重復實現,造成了開發、運維、部署的麻煩。
  
  2.5.1 巨無霸系統的危害
  
  維護上的麻煩
  
  代碼管理上的不方便
  
  數據庫連接資源的耗盡
  
  2.5.2 遠程服務的優點
  
  把重復實現的模塊獨立部署為遠程服務,新增的業務調用遠程服務所提供的功能實現相關的業務,不依賴于里面具體的代碼實現。當遠程服務里面的業務需要發生變化時,只要接口的傳入參數和返回值保持不變,就不會影響到調用這些遠程服務的業務。
  
  2.5.3 遠程服務的實現
  
  REST
  
  REST(Representational State Transfer),即表述性狀態傳遞,它是一組架構約束條件和原則。滿足這些約束條件的原則的應用程序或設計就是RESTful。
  
  REST架構的特點:每一個URI代表一種資源;客戶端和App后臺之間,傳遞這種資源的某種表述;客戶端通過GET、POST、PUT、DELETE等HTTP動詞,對App后臺資源進行操作,實現“表述性狀態傳遞”。
  
  REST設計原則中最重要的是請求是無狀態的。
  
  RPC
  
  RPC(Remote Procedure Call),即遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
  
  開源的RPC庫
  
  阿里巴巴開源Dubbo,其是一個分布式服務框架,致力于提供高性能和透明化的RPC遠程調用服務和SOA服務治理方案。
  
  當當網在Dubbo的基礎上實現了如下的新功能,并將其命名為Dubbox。
  
  支持REST風格遠程調用(HTTP+JSON/XML)。
  
  支持基于Kryo和FST的Java高效序列化實現。
  
  支持基于嵌入式Tomcat的HTTP remoting體系。
  
  將Dubbo中Spring由2.x升級到目前常用的3.x版本。
  
  將Dubbo中的Zookeeper客戶端升級到最新的版本,以修正老版本中包含的bug。
  
  2.6 搜索技術入門
  
  常見的開源搜索軟件介紹
  
  復制代碼
  
  <?xml version="1.0" encoding=www.venkeng.com/ "utf-8" ?>
  
  <configuration>
  
  <configSections>
  
  <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Unity.Configuration"/>
  
  </configSections>
  
  <unity>
  
  <typeAliases>
  
  <typeAlias alias="IEarPhone" type="Xu.UnityDemo.Interface.IEarPhone,Xu.UnityDemo" />
  
  <typeAlias alias="IPhone" type=www.qwert888.com"Xu.UnityDemo.Interface.IPhone,Xu.UnityDemo" />
  
  <typeAlias alias="NubiaPhone" type="Xu.UnityDemo.Model.NubiaPhone,Xu.UnityDemo" />
  
  <typeAlias alias="MiPhone" type="Xu.UnityDemo.Model.MiPhone,Xu.UnityDemo" />
  
  <typeAlias alias="NubiaEarPhone" type="Xu.UnityDemo.Model.NubiaEarPhone,Xu.UnityDemo" />
  
  <typeAlias alias="MiEarPhone" type="Xu.UnityDemo.Model.MiEarPhone,Xu.UnityDemo" />
  
  </typeAliases>
  
  <containers>
  
  <container name="IOCcontainer">
  
  <type type="IPhone" mapTo="MiPhone" name="Mi"></type >
  
  <type type="IPhone" mapTo="NubiaPhone"></type >
  
  <type type="IEarPhone" mapTo="NubiaEarPhone"></type >
  
  </container>
  
  </containers>
  
  </unity>
  
  </configuration>
  
  復制代碼
  
    主要用到兩個節點<typeAlias>和<type>。<typeAlias>節點的alias是別名在<type>節點中的type使用,type是“命名空間+對象名,所在程序集名稱”。<type>節點的type是“需要映射的對象”mapTo是“映射的目標對象”name是“標識名”在多個類繼承同個接口的時候區分使用。其余的節點如圖Unity配置文件節點圖。
  
  代碼如下:
  
  復制代碼
  
  ExeConfigurationFileMap fileMap =www.yunshengyule178.com new ExeConfigurationFileMap();
  
  fileMap.ExeConfigFilename www.fengshen157.com/= Directory.GetCurrentDirectory() + "/Config/UnityIocConfig.xml";
  
  Configuration configuration =www.bais7.com ConfigurationManager.www.mhylpt.com/ OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
  
  UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);
  
  //獲取特定配置節下已命名的配置節<container name="IOCcontainer">下的配置信息
  
  section.Configure(_container, "IOCcontainer");
  
  復制代碼
  
  五、三種依賴注入
  
  1、構造函數注入
  
  構造函數注入是最常用的一種注入方式,如下:
  
  復制代碼
  
  private IPhone _iPhone;
  
  private IUnityContainer _container;
  
  public ValuesController(www.yisengyule.com IUnityContainer container, IPhone iPhone)
  
  {
  
  _container = container;
  
  _iPhone = iPhone;
  
  Lucene
  
  Solr
  
  ElasticSearch
  
  Sphinx
  
  CoreSeek
  
  2.7 定時任務
  
  Linux定時任務Crontab
  
  Java定時任務框架Quartz

转载于:https://www.cnblogs.com/qwangxiao/p/10688027.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 &#xff08; i ≥ j &#xff09; 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 f[i][…

深度学习第二课--图像识别与KNN

图像分类的难点 视角不同尺寸不同变形光影背景干扰同类内的差异 例如躺椅、座椅、 图像识别的核心 数据驱动学习。就像人看过很多猫以后&#xff0c;就知道什么是猫。把很多同一类的图片“喂给”计算机&#xff0c;让计算机自己去学习该类图片的特征。之后做出评估。KNN解决…

Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

题意&#xff1a;把数组分成两个集合 每个集合中元素数量为1的个数相同&#xff08;此个数可以是0&#xff09; 分析&#xff1a; 这类问题就是要各种可能情况考虑到 然后分类讨论 完整地正确分类就AC 否则gg 如果数量为1的元素数为偶数个 对半分 如果元素数量…

centos安装多个tomcat

1.参考前文安装jdk、第一个tomcat 2.安装第二个tomcat后&#xff0c;修改/etc/profile vi /etc/profile #tomcat1  export CATALINA_BASE/opt/tomcat1  export CATALINA_HOME/opt/tomcat1  export TOMCAT_HOME/opt/tomcat1 #tomcat2  export CATALINA_BASE2/opt/tomcat…

[小技巧][Java]Arrays.fill() 初始化 二维数组

Arrays.fill()并不能提高赋值的效率&#xff0c;在函数的内部也是用for循环的方式 实现的。 fill()函数源码&#xff1a; public static void fill(Object[] a, Object val) {for (int i 0, len a.length; i < len; i)a[i] val;}for (int i 0; i < n; i) {Arrays.fil…

Grid game CodeForces - 1104C 放格子|思维|找规律

题意&#xff1a;4*4的格子中输入0放 2*1的图案输入1放1*2的图案 当摆满一行或一列后此行列图案清空 就想毛熊方块一样 分析&#xff1a;开始感觉很唬人 要搜索还是要dp啥的 后来发现原来2*1就放左下 1*2就放左上 然后来啥清空啥 就能够循环不断地放下去 然后变成了一道巨水题…

团队开发之团队介绍

团队名&#xff1a;又双叒叕队 团队口号&#xff1a;Bug不死&#xff0c;我们不休&#xff01; 团队成员&#xff1a;符满迪该团队成员拥有个人公众平台&#xff0c;对公众平台的运营有良好的实践经验。而且具有较好的编程能力&#xff0c;精通Java语言&#xff0c;对微信小程序…

数据结构与算法分析

本系列的笔记基于七月算法的《求职面试》课程以及《数据结构域算法分析-java语言描述》第2版&#xff0c;做学习笔记。 以下是这系列的目录。每个专题只做笔记&#xff0c;不求每个专题都要深入到很深很深。算法分析 表 栈 队列 并查集 哈希表 树 堆 图论 递归 深度优…

[算法][算法复杂度]常用算法复杂度速查表

复杂度通常会使用大 -O记号来表示&#xff0c;比如快速排序的平均时间复杂度是 O(nlog(n))。虽然我们应该做「理解派」&#xff0c;但是即使每个算法/数据结构都理解了&#xff0c;不时仍有可能忘记具体某个算法/数据结构的复杂度&#xff08;特别是在最好、最坏和平均情形下的…

十张伟大的科学瞬间

题图&#xff1a; 搭载 ORBCOMM OG2-M1 卫星的猎鹰 9 号运载火箭发射&#xff0c;人类一直很渺小。 ▎2019 更新 北京时间 2019 年 4 月 10 日 21 点&#xff0c;人类首张黑洞照片正式发布&#xff01; 这次的直接成像除了帮助我们直接确认了黑洞的存在&#xff0c;同时也通过模…

为什么gets如此危险?

这一段搬运自stackoverflow: Why is gets() dangerous The first internet worm (the Morris Internet Worm) escaped about 30 years ago (1988-11-02), and it used gets() and a buffer overflow as one of its methods of propagating from system to system. The basic pr…

[Leetcode][第329题][JAVA][矩阵中的最长递增路径][DFS][拓扑排序]

【问题描述】[中等] 【解答思路】 1. 记忆化深度优先搜索 复杂度 class Solution {public int[][] dirs {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public int rows, columns;public int longestIncreasingPath(int[][] matrix) {if (matrix null || matrix.length 0 || matri…

code1928: 日期差值 技巧模拟

1928: 日期差值 时间限制: 1 Sec 内存限制: 32 MB 题目描述 有两个日期&#xff0c;求两个日期之间的天数&#xff0c;如果两个日期是连续的我们规定他们之间的天数为两天。 输入 有多组数据&#xff0c;每组数据有两行&#xff0c;分别表示两个日期&#xff0c;形式为YYYYMMD…

第二十八期:阿里云VS腾讯云 谁才是中国未来的云计算之王?

阿里云早在 2009 年就已经开始布局云计算领域&#xff0c;具有先发优势。据统计&#xff0c;40% 的中国 500 强企业、近一半中国上市公司、80% 中国科技类公司是阿里云的客户。而腾讯云基于腾讯自身在游戏、视频、社交、出行等业务的强势地位&#xff0c;一路奋起直追&#xff…

[小技巧][JAVA][转换]字符数组char[]与字符串String之间互相转换

1.字符数组转为字符串 方法1&#xff1a;直接在构造String时转换。 char[] data {‘a’, ‘b’, ‘c’}; String str new String(data);方法2&#xff1a;调用String类的方法转换。 String s String.valueOf(char[] ch)2.字符串转为字符数组 情况一&#xff1a;如果是”a…

CentOS 7 Apache服务的安装与配置(转)

https://blog.51cto.com/13525470/2070375 一、Apache简介 Apache 是一个知名的开源Web服务器。早期的Apache服务器由Apache Group来维护&#xff0c;直到1999年6月Apache Group在美国德拉瓦市成立了非盈利性组织的公司&#xff0c;即Apache软件基金会&#xff08;Apache Softw…

第二十九期:全球首部AI交响变奏曲问世,AI技术应用再拓边界

人工智能技术&#xff0c;史上第一次升级到了复杂音乐的创作领域&#xff1a;交响曲。 全球首部 AI 交响变奏曲《我和我的祖国》&#xff0c;昨晚已由深圳交响乐团全球首演&#xff0c;它的出品方是中国平安人工智能研究院。 此前&#xff0c;你可能了解过 Google 的 Magenta、…

[小技巧][JAVA][转换]整型int与字符串String相互转换

字符串转换整型String - >Int 1). int i Integer.parseInt([String]); 或者 //radix 进制 int i Integer.parseInt([String],[int radix]); //intValue() 输出int数据。 2). int i Integer.valueOf(String).intValue(); 或者 int i Integer.valueOf(String);整型转换字…

codeup 2044 暴力搜索

2044: 神奇的口袋 时间限制: 1 Sec 内存限制: 32 MB 提交: 735 解决: 333 [提交][状态][讨论版][命题人:外部导入] 题目描述 有一个神奇的口袋&#xff0c;总的容积是40&#xff0c;用这个口袋可以变出一些物品&#xff0c;这些物品的总体积必须是40。John现在有n个想要得到…

MySql DDL语言(数据库和数据表的管理)

数据定义语言&#xff0c;负责数据库和数据表的管理 ⒈数据库的管理 1.创建数据库    1 create database if not exists DatabaseName; #if not exists可以省略 2.修改数据库 ①重命名数据库名称&#xff08;已经废弃&#xff0c;强制修改只能到数据库指向的文件夹重命名…