开发者学堂课程【高校精品课-上海交通大学-企业级应用体系架构:Messaging1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/75/detail/15828
Messaging1(一)
内容介绍:
一、回顾上节内容
二、参考文件
三、异步通信
四、JMS
五、编程类型
一、回顾上节内容
问题:cloud 与sever之间的hash算法是如何做到一致的?Hash 可以明确告诉是什么,两端只要使用相同的算法即可。Hash 算法本身并不保密,本来目的就是想告诉大家使用的 hash 算法是什么,只有使用的相同,才能够知道输入的内容生成的密钥能否相同。所以该算法本身不保密,可以告诉大家。此外,cloud 与 server 没有用到 user 概念,即 cloud 概念实际为一个程序,user 是一个人的概念,知道 server 使用什么 hash 算法,在用户端获取真正的输入去做真正的处理。所以程序在执行哈希算法,是这样的逻辑。
继续回顾上节讲解的属性:
关于安全性,此处举例较直观:
Tactics for achieving security can be divided into
- those concerned with resisting attacks,
- those concerned with detecting attacks,
- and those concerned with recovering from attacks.
Using a familiar analogy,
- putting a lock on your door is a form of resisting an attack, //在家中做安全性:在门上加一把锁,对应上述抵御攻击 resisting attacks,不允许进入
- having a motion sensor inside of your house is a form of detecting an attack,detecting attacks
//如果有人进入需要知道,所以探测攻击,在门或者窗户上安装运动传感器,对应探测攻击
- and having insurance is a form of recovering from an attack. //如果进入防止做坏事,所以需要从攻击中恢复,买财产保险,万一丢失可以赔付,对应 recovering from attacks
所以总体来讲,提高安全性有以上三方面措施。
三方面措施具体如下:
- Authenticate users. 对于用户做认证,引用公钥私钥作认证,使用私钥加密,公钥解开,便于让他人知道是谁
- Authorize users. //进行授权,使用 permission 或 policy,policy 中做定义,permission 集合作认证,都是在授权,查看是否有相同权限操作
-Maintain data confidentiality. //数据保密
· Encryption //加密最重要
·Communication links //链路上
- virtual private network (VPN) //使用 VPN 加密
- Secure Sockets Layer (SSL) //使用安全套接字协议加密
-Maintain integrity. //完整性
·checksums //校验和
·hash results //散列值(数据一旦发生变化,散列到不同地方,类似如果密码不一样,得不到相同散列值,就无法知道内容)
- Limit exposure //系统在定义接口时是 public 还是 protected,尽量少暴露
- Limit access //访问上可以加控制
· Firewalls //防火墙,不需要端口关掉
以上方式可以采取一些策略来抵御攻击。那么如何发现攻击呢,需要入侵检测的系统。该系统会检测网络的流量,做一些记录,然后分析是否存在问题,问题比较复杂,一般下载入侵检测的软件直接安装即可。实际上会分析通信的数据包做一些过滤。
The detection of an attack is usually through an intrusion detection system.
-Such systems work by comparing network traffic patterns to a database.
- In the case of misuse detection, the traffic pattern is compared to historic patterns of known attacks.
- In the case of anomaly detection, the traffic pattern is compared to a historical baseline of itself.
- Frequently, the packets must be filtered in order to make compariso
- Filtering can be on the basis of protocol, TCP flags, payload sizes, source or destination address, or port number.
以上是如何发现,那么入侵检测中具体做的事情可以看到:
Intrusion detectors must have
-some sort of sensor to detect attacks,
//传感器探测,软件传感器,知道黑客黑入后执行什么操作
-managers to do sensor fusion,
-databases for storing events for later analysis,
-tools for offline reporting and analysis,
-and a control console so that the analyst can modify intrusion detection .actions.
接着是恢复:
Tactics involved in recovering from an attack can bedivided into
- those concerned with restoring state and
//一方面考虑状态如何恢复,所以数据要经常做备份等
- those concerned with attacker identification.
//了解谁入侵,考虑身份
The tactics used in restoring the system or data to a correct state overlap with those used for availability
- since they are both concerned with recovering a consistent state from an inconsistent state.
The tactic for identifying an attacker is
- to maintain an audit trail.
//审计
恢复需要靠不断的备份启动可用性,加在一起是完整的对系统安全性的考虑。
二、参考文件 References
l Single Sign On, http://en.wikipedia.org/wiki/Single_sign
l Kerberos: The Network Authentication Protocol,
l Kerberos(protocol),
http://en.wikipedia.org/wiki/Kerberos_(protocol)
l SAML,
http://en.wikipedia.org / wiki/Security Assertion_Markup_Language
l CAS, http:// www.jasig.org/cas
l Jasig CAS Documentation, http://www.unicon.net/ files/
cas-server-3-4-11-snapshot-manual.pdf
l CAS ppt, http:// www.jusfortechies.com/java/cas/ppt.php
CAS 为开源的实现,实现 Kerberos
三、异步通信
异步通信用消息机制,先来看几个场景:
l Messaging in Java EE Applications
- What is a Messaging? //考虑为什么使用消息机制
- What is JMS API? //java 中消息机制
- JMS Programming Model //模型变更
l Kafka //为什么使用 Kafka
- Introduction
- Quick start
在一个企业中碰到的最大问题是企业中会有各种各样的系统。会发现一个企业从小到大,各种各样的系统是逐渐开发起来,不是一次性搞定,例如 ERP 最先有。例如企业2015年先有 ERP,2016年 CRM,2017年上 Procurement与Groupware,以此类推。
此外,系统还需要与第三方系统进行交互,例如顾客、供应商、伙伴、雇员,但这带来两个问题
1、系统集成:会有很多系统进行交互:
需要做集成,带来的问题是:
这么多系统在交互时,可以使用异构的语言、数据库、操作系统,两两之间如果进行交互就要开发接口,开发接口根据不同的系统进行定制,数量多会带来如图
如果两两之间都要开发互相通信的端口,例如最左侧系统,两个实现源不同,所以需要开发两种不同的接口。图上红线全为接口,通信起来非常麻烦。
2、快速响应:
假设开发了一个订票服务,客户端发送请求,例如 web 系统 servlet 处理,首先需要在自己系统中寻找该用户是否为合法用户,如果是继续订,再找航线,例如需要从伦敦到北京,航线有直达有转机,该信息不在系统中,可能在航管局中,需要到它的系统中查找有哪些航线,找到航线后再查看航空公司,找到后查看航班,找到航班后查看是否有票,有则订票。逻辑中涉及到自己系统,航管局系统,航空公司系统,那么这三者之间,一个请求需要到三个不同系统中处理,并且航空公司系统离自身系统较远,所以完成操作在时间上对于用户很长,但是现实中看不到像携程订票等待时间并不长。如果一直等,响应时间会非常长。此外,需要访问系统有三个才能完成操作,假如航空公司系统崩溃,那么操作就会失败,想成功的前提是三个系统都正常运行,任何差错一出现,整个订票操作就会失败,即系统的容错性很差。
1、系统集成解决:用一个中介者模式进行解决。系统之间不要直接交互,都与中介者进行交互,中介者 mediator暴露一个统一接口,接收数据发送数据,通信时统一语言,使用纯文本。就不需要开发很多接口。纯文本如果规范就是suaprest,即 webservice,做异构系统的集成。中介者模式都使用文本进行处理,并且只有发和收两个接口,那么相当于系统向中介转发邮件一样,就相当于所有人在没有电话的年代,要想通信,给对方发封信,只需要将信交给邮局即可。要想知道别人发的信,可以在邮件检查自己的信箱。而系统是全部转发到 mediator 进行处理,这是消息中介解决的第一个问题,即异构系统的集成或同步系统要以中介者模式做集成,让大家两两之间不互相交互,那么系统集成代价降低。
2、异步通信解决:将事件改为下图
Servlet 在接收到客户端请求后会将请求存在一个信箱中,然后告诉用户,请求已经被接受,稍后通知。然后在后台会有一个程序不断查找是否有信,一旦有信,就会转发到后面进行处理,直到最后一步完成,才会处理完成将信箱中的信删除,然后告诉用户成功。但是如果过程中,如果一个系统不能访问,那么信就会被保留,不断尝试直到整个成功才会将信从 box 中删除。理解为信为客户端发送的请求,只有在尝试若干次不成功后才会放弃,不到 timeout会进行不断尝试。所以当用户发送一个请求后,会先告诉用户被接受,进行等待,就会立刻得到响应。处理结果是后台不断尝试,终于定完后再通过短信发送,与当时发送的请求可能相隔五分钟或者十分钟。
所以异步的好处:消除了单一故障节点(如果系统失败,则不断尝试,只要能尝试响应,便不断尝试)。
缺点:例如原来在调用时使用接口 book,要求传入 string 类型:用户名、int 类型:航班号、char[]数组类型:目的地,如果客户端发送的消息在调用后,参数类型不匹配就会立刻发现。但是在此处发消息不能这么做,需要在一个信中只能写文本,将内容全部转换成字符串,变成一个文本进行 send,send 方法里面的参数为 string,(为一个统一接口,不能传入上述三个参数,要求只能是一个 string)需要将所有内容全部转换成字符串才能传入。如果约定传入的字符串应该是键值对,例如{user:李四、des:london},如果写错为{username:李四 date:},那么在通过 send发送时可以返回。处理的逻辑在解析文本时得不到想要的东西这时才会发现错误,其实系统是一个弱类型。只要发字符串即可,至于字符串中的内容不是想要的,在编译时是不知道的,这就是所说的弱类型参数。第二个缺点为只能 send到IMS Destination 处,处理的结果是靠重新刷新或者发送短信,即 send 本身不会返回一个处理结果,所以没有结果值,也就不能抛出异常。因为 send 只是在 send 值接收过来后放到 box 即缓存中,真正的处理结果或者没处理成功需要抛出异常不能直接返回客户端。
以上就是异步通信的缺点,但是在此处需要用到优势,容忍这些缺陷。这两个场景的差异是:前面的场景类似于打电话,例如打电话让舍友帮忙找东西,那么就会一直不挂电话只能一直等待。后面的场景类似于发微信给舍友帮忙找东西,然后就可以做其他事,并且不能够立刻得到消息,找到后舍友回头再发送消息。但是在该过程中舍友到底什么时候找并不知道,所以这种场景容易接收消息机制。两种场景合并起来说明需要使用消息机制来异步通信。
l 什么是消息?
Messaging is a method of communication between software components or applications. //软件或者应用之间进行通信 ,消息机制是进行通信的方式之一,但是在此不谈服务器或客户端的概念。或者在该场景中,客户端和服务器表达的意思与之前不同
- A messaging system is a peer-to-peer facility: //接收消息与发送消息两方对等,都是消息服务器的客户端。当A给 B 发信,B 回信 A 时,两者对等。发信时不是直接发信,而是通过消息中介,例如 A 是你,B 是同学,那么消息中介就是邮局,邮局中有很多信箱,A 在发信时发送到B的信箱中,B 看信箱就可以看到,若想回信,发送到 A 的信箱中,A在信箱中可以看到。过程中可以看到是点对点的
- A messaging client can send messages to, and receive messages from any other client. //无论 A 或 B 都是客户端,在发消息并且接收消息
- Each client connects to a messaging agent that provides facilities form, creating, sending, receiving, and reading messages.
Messaging enables distributed communication that is loosely coupled.
l 发消息有什么好处?
JMS enables communication that is not only loosely coupled but also:
- Asynchronous: A receiving client does not have to receive messages at the same time the sending client sends them.The sending client can send them and go on to other tasks; the receiving client can receive tnem much later. //异步,发消息未必要立刻处理。例如 a.m(),a 对象调用 m 方法时除非 m 返回一行代码无法执行,如果m 非常堵,等待的时间很长。例如交作业可以全部放在讲台上,进行批改,不需要等待很长时间。所以异步不需要阻塞一直等,提高效率。
- Reliable: A messaging provider that implements the JMS API can ensure that a message is delivered once and only once. Lower levels of reliability are available for applications that can afford to miss messages or to receive duplicate messages. //可靠性,例如在排队有急事要走那么就得不到处理结果,但是如果是将作业放在讲台上处理完事情后批改,不需要担心作业是否会丢失,具有可靠性。在访问时一个请求如果对方不在,那么可以一直放到消息服务器中不断尝试,就能解决问题。
l 为什么要使用消息机制?
例如上图是一个类似于在线售票的例子。如果是双十一,订单数非常多,系统来不及处理,只能先将订单放下,有空再进行处理。本质上类似:纵坐标是系统能够处理的请求数,例如有一个极限,横坐标为时间。如果真正的负载如图,在绝大多数时间内可以处理,就用同步调用,不需要使用消息机制,使用 a.m()下单即可。
但如果负载如图,那么在超出的时间内肯定处理不及时,在下面的时间内资源优势过剩,所以要想提高用户的体验度,解决方法是将资源翻倍,覆盖住最高点,但是资源浪费现象比较严重。还有一种方式是遇到超出时不进行处理,放置请求,先进行缓存,到低于的时间内再进行处理被缓存下来的请求。即在忙时收下来不进行处理,在闲时利用空隙处理掉,仍然使用这么多计算资源就可以搞定。唯一缺点是发过来的请求需要到下一个时间点才能处理,就是所谓的异步,但是总的用户体验比较好。对于用户不是在低的时间点才得到响应,是在该时间点上得到一个处理结果,当时就得到了一个响应。强调响应和处理结果不同,响应是告诉收下来等待,处理结果是订单没下成功。这就是异步通信带来的好处。