Django Web应用开发实战第十六章
一、即时通信
- AJAX技术:通过AJAX实现网页与服务器的无刷新交互,在网页上每隔一段时间就通过AJAX从服务器中获取数据。然后将数据更新并显示在网页上,这种方法简单明了,实时性不高。
- Comet(Pushlet)技术:Comet是一种Web应用架构,服务器以异步方式向浏览器推送数据,无须浏览器发送请求。Comet架构非常适合事件驱动的Web应用,以及对交互性和实时性要求较高的应用,如股票交易行情分析、聊天室和Web版在线游戏等。
- XMPP协议:XMPP(可扩展消息处理现场协议)基于XML的协议,是专为即时通信系统设计的通信协议。用于即时消息以及在线现场探测,这个协议允许用户向其他用户发送即时消息。
- Flash的XmlSocket:Flash Media Server是一个强大的流媒体服务器,基于RTMP协议,提供了稳定的流媒体交互功能。内置远程共享对象(shared object)的机制。是浏览器创建并连接服务器的远程共享对象。。
- WebSocket协议:WebSocket是通过单个TCP连接提供全双工(双向通信)通信信道的计算机通信协议,可在浏览器和服务器之间进行双向通信,允许多个用户连接到同一个服务器,并通过API进行通信并立即获得响应。WebSocket不仅限于聊天/消息传递应用程序,还适用于实时更新和即时消息交换的应用程序。比如现场体育更新、股票行情、多人游戏、聊天应用、社交媒体等。
二、前后端分离与微服务架构
- vue:一套用于构建用户界面的渐进式框架,它被设计为可以自底向上逐层应用。Vue的核心只关注视图层,不仅易上手,还便于与第三方库或已有的项目整合。另一方面,当Vue与现代化的工具链以及各种类库结合使用时,Vue完全能够为复杂的单页应用提供驱动。
- axios.js:一个HTTP库,用于实现前端的AJAX异步请求,从Vue2.0开始,官方推荐使用axios发送AJAX异步请求。
设置跨域访问
# Vue和Django各自部署在不同服务器,两者的协议+域名+端口号各不相同,因此Vue的AJAX请求访问不到Django的API。为了实现两者之间的数据传输,后端服务器系统必须设置跨域访问。可通过第三方DjangoCors Headers实现。
pip install django-cors-headers INSTALLED_APPS = [
...
'corsheaders',
] MIDDLEWARE = [
...
# 跨域访问
'corsheaders.middleware.CorMiddleware',
] # 设置HTTP请求是否允许携带Cookies信息,默认值为False
CORS_ALLOW_CREDENTIALS = True # 只允许白明白设置的域名列表发送HTTP请求,默认False,若设置True允许所有域名发送HTTP请求。
CORS_ORIGIN_ALLOW_ALL = True # 设置允许发送HTTP请求的域名列表
CORS_ORIGIN_WHITELIST = () # 设置HTTP请求方式
CORS_ALLOW_METHODS = (
'GET',
'DELETE',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
) # 设置非标准HTTP请求头
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
...
)
微服务架构
微服务(Microservice Architecture)是一种架构概念,它将功能分解成不同的服务,降低系统的耦合性,提供更加灵活的服务支持,各个服务之间通过API接口进行通信。
微服务实现原理:
- 传统的微服务使用单体式开发,即所有网页功能在一个web应用中实现,然后在某个服务器部署上线。
- 当网站的访问量或数据量过大时,将导致单体式系统的某个功能出现异常,整个网站也随之瘫痪。
- 对于大型网站来说,微服务架构可以将网站功能拆分为多个不同的服务,每个服务部署在不同的服务器,每个服务之间通过API通信,从而构建网站功能。
- 服务之间的通信需要考虑服务的部署方式。比如重试机制
- 限流、熔断机制、负载均衡和缓存机制等。保证每个服务的稳健性。
- 微服务架构一共有6种设计模式。
- (1)聚合器微服务设计模式:聚合器调用多个微服务实现应用或网页所需功能,每个微服务有自己的缓存和数据库,这是一种常见的、简单的设计模式
(2)代理微服务设计模式:是聚合微服务设计模式的演变模式,应用程序或网页根据业务需求的差异调用不同的微服务,代理可以委派HTTP请求,也可以进行数据转换工作
-
(3)链式微服务设计模式:每个微服务之间通过链式方式进行调用,如微服务A接收到请求后会与B进行通信,类似地,微服务B会与微服务C进行通信,所有微服务都使用同步消息传递。在整个链式调用完成之间,浏览器会一直处于等待状态(4)分支微服务设计模式:聚合器微服务设计模型的扩展模式,允许微服务之间相互调用
-
- (4)数据共享微服务设计模式:部分微服务可能会共享缓存和数据库,即两个或两个以上的微服务共用一个缓存和数据库。这种情况只有在两个微服务之间存在强耦合关系时才能使用,对于使用微服务实现的应用程序或网页而言,这是一种反设计模式
-
- (5)异步消息传递微服务设计模式:由于API接口使用同步模式,如果API接口执行的程序耗时过长,就会增加用户的等待时间,因此某些微服务可以选择使用消息队列(异步请求)代替API接口的请求和响应
-
summary:微服务设计模式不是唯一的,具体还需要根据项目需求、功能和应用场景等多方面综合考虑。对于微服务架构,架构的设计意识比技术开发更为重要,整个架构设计需要考虑多个微服务的运维难度、系统部署依赖、微服务之间通信成本、数据一致性、系统集成测试和性能监控等。
功能拆分
功能拆分一般遵从以下原则:
- 单一职责、高内聚低耦合
- 服务粒度适中
- 以业务模型切入
- 演进式拆分
- 避免环形依赖与双向依赖
微服务各阶段实现功能
- 开发阶段:根据微服务架构设计模式进行功能拆分,将功能拆分成多个微服务,并且统一规范设计每个微服务的API接口,每个API接口符合RESTful设计规范。如果服务之间不同服务器,就需要考虑跨域访问。
- 测试阶段:用于验证各个服务之间的API接口否输入输出是否符合开发需求,还需要验证各个API接口之间的调用逻辑是否合理。
- 部署阶段:根据部署方案执行,部署方案需要考虑服务的重试机制、缓存机制、负载均衡和集群等部署方式。
- 运维监控阶段:需要对网站系统实时监控,监控内容包括:日志收集、事故预警、故障定位和性能跟踪等,并且还需要根据监测结构适当调整部署方式。
部署启动
目前部署Django项目有两种主流方案:Nginx+uWSGI+Django或者Apache+uWSGI+Django。
- Nginx或Apache作为服务器最前端,负责接收浏览器所有HTTP请求并统一管理。
- 静态资源的HTTP请求由Nginx或Apache自己处理
- 非静态资源的HTTP请求则由Nginx或Apache传递给uWSGI服务器,然后传递给Django应用,最后由Django进行处理并做出响应,从而完成一次Web请求。
# 启动nginx
systemctl start nginx # 重新读取nginx配置文件
cd /etc/nginx/
sudo nginx -c nginx.conf
sudo nginx -s reload # 通过配置文件启动uWSGI服务器
uwsgi --ini nusic_uwsgi.ini
Django Web应用开发实战第十六章的更多相关文章
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制
在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...
- Kali Linux Web 渗透测试视频教程— 第十六课-拒绝服务攻击
Kali Linux Web 渗透测试视频教程— 第十六课-拒绝服务攻击 文/玄魂 目录 Kali Linux Web 渗透测试视频教程— 第十六课-拒绝服务攻击................... ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- [原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇)
原文:[原创].NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) .NET 业务框架开发实战之十 第一阶段总结,深入浅出,水到渠成(后篇) 前言:接着上篇来. 系列文章链接: [ ...
- 微软实战训练营(X)重点班第(1)课:SOA必备知识之ASP.NET Web Service开发实战
微软实战训练营 上海交大(A)实验班.(X)重点班 内部课程资料 链接:http://pan.baidu.com/s/1jGsTjq2 password:0wmf <微软实战训练营(X)重点班第 ...
- iOS 11开发教程(十六)iOS11应用视图之删除空白视图
iOS 11开发教程(十六)iOS11应用视图之删除空白视图 当开发者不再需要主视图的某一视图时,可以将该视图删除.实现此功能需要使用到removeFromSuperview()方法,其语法形式如下: ...
- 进击的Python【第十六章】:Web前端基础之jQuery
进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...
- Web前端开发实战6:CSS实现导航菜单结合二级下拉式菜单的简单变换
前面几篇博文都在讲导航菜单和二级下拉式菜单,事实上有非常多方法都能够实现的.详细的情况还要视情况而定. 在后面学习到jQuery框架之后,会有更丰富的动画效果.因为在学习Ajax和jQuery的初步阶 ...
- 风炫安全web安全学习第三十六节课-15种上传漏洞讲解(一)
风炫安全web安全学习第三十六节课 15种上传漏洞讲解(一) 文件上传漏洞 0x01 漏洞描述和原理 文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接.但是想真正把 ...
- Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
随机推荐
- script 标签中 defer 和 async 的区别
https://www.cnblogs.com/huangtq/p/18422775 在 <script> 标签中,defer 和 async 是两个用于控制 JavaScript 脚本加 ...
- layui 自动触发radio和select
layui对radio和select做了包装,正常用jquery选中后使用trigger不起作用. 那么,怎么让其自动触发呢? 对radio来说,必须在$选中后.next('.layui-form-r ...
- 腾讯元宝登顶App Store免费榜榜首!国产AI APP混战升级
最近,国产AI APP市场热闹非凡,竞争愈发激烈.其中,腾讯元宝的表现格外亮眼,它在短短一周内,借助微信的强大助力,一路逆袭,成功登上苹果App Store免费榜榜首.这一变化不仅展现了腾讯在AI领域 ...
- wxpython-窗体关闭
` def close(self, event): wx.Exit() `
- Oracle临时表会随另外一个表的创建自动提交并清空
创建一个临时表,用它导入一些数据 用这个临时表生成另外一个表,用create table ... 但生成的这表总是空的. 原来create table 前会进行提交commit, 而临时表在commi ...
- OpenGL ES与GLSL ES各版本对应说明
OpenGL ES 3.2 OpenGL ES 3.2 and OpenGL ES Shading Language 3.20 OpenGL ES 3.1 OpenGL ES 3.1 and Open ...
- 大模型提示词(Prompt)模板推荐
只有提示词写得好,与大模型的互动才能更高效.提示词不仅仅是与AI对话的起点,更是驱动模型产生高质量输出的关键因素.本文将介绍大模型提示词的概念.意义,并分享一些实用的提示词模板,帮助AI玩家更好地利用 ...
- Codeforces Round 970 (Div. 3)
A. Sakurako's Exam 分类讨论即可,当a为奇数,无法消去1,或者a==0且b为奇数时,无法消去2 #include <bits/stdc++.h> using namesp ...
- CH9121default与classical设置方法
SYN发送间隔调整方法: 网口连接设备后双击设备列表中要配置的设备在扩展参数中单击获取扩展参数,在超时处理模式选项选择Classical然后执行设置扩展参数,最后点击复位模块后生效(仅TCP CLIE ...
- IDEA强制注册登录版本号:IntelliJ IDEA 2021.2.2
建议采用 IntelliJ IDEA 2021.2.2 版本进行 Evaluate for free 试用 IntelliJ IDEA 2021.3.3 以前的版本可以不用注册登录idea账户, ...