晚上 申请订阅号和2个小程序 实现统一登录 和模板发送消息
安装单车,用15分钟(不要太多)
https://blog.csdn.net/huaweitman/article/details/64128427
看世纪高通的面试题
wxjava原理总结(之后)
订阅号 一个小程序申请成功,后面如果有需要再申请一个小程序 实现互通(union_id)
单车也安装完了
软负载与nginx那些强大的不可不说的功能:
nginx为什么可以这么快处理用户的请求呢?
nginx启动后的进程,master进程,是以root身份启动,执行内容为:/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
worker进程都是以我们指定的nobody身份运行,其中有一个worker进程是旧的worker进程奔溃后,自动重新创建的,你能找到他吗?
nginx在启动后,会有一个master进程和多个worker进程。master进程主要用来管理worker进程,包含:接收来自外界的信号,向各个worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。基本的网络事件,则是放在worker进程中来处理了。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。
master进程在接收到HUP信号后是怎么做的呢?
首先master进程在接到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接收新的请求,而老的进程在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。当然,直接给master进程发送信号,这是比较老的操作方式,nginx在0.8版本之后,引入了一系列命令行参数,来方便我们管理。
之后新增的,./nginx -s reload nginx,./nginx -s stop是怎么做到的?原理是什么?
拿reload来说,我们看到,执行命令时,我们是启动一个新的nginx进程,而新的nginx进程在解析到reload参数后,就知道我们的目的是控制nginx来重新加载配置文件了,它会向master进程发送信号,然后接下来的动作,就和我们直接向master进程发送信号一样了。
worker进程是如何处理我们的http请求的?
master(master进程会先建立好需要listen的socket)--------fork生成子进程workers,继承socket(此时workers子进程们都继承了父进程master的所有属性,当然也包括已经建立好的socket,当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)------当一个连接进入,产生惊群现象(惊群现象:指一个fd的事件被触发后,等候这个fd的所有线程/进程都被唤醒。虽然都被唤醒,但是只有一个会去响应。)。
shiro第三章:授权
授权:在应用中控制谁能访问哪些资源,由主体,资源,权限,角色组成
主体:Subject
资源:任何东西
权限:是否可以访问资源
角色:权限的集合
3.1授权方式 有三种
3.1.1
3.1.2 基于角色的访问控制(隐式角色)
3.1.3 基于资源的访问控制(显示角色)
3.3Permission
Shiro对权限字符串缺失部分的处理
如“user:view”等价于“user:view:”;而“organization”等价于“organization:”或者“organization::”。可以这么理解,这种方式实现了前缀匹配。
另外如“user:”可以匹配如“user:delete”、“user:delete”可以匹配如“user:delete:1”、“user::1”可以匹配如“user:view:1”、“user”可以匹配“user:view”或“user:view:1”等。即可以匹配所有,不加可以进行前缀匹配;但是如“:view”不能匹配“system:user:view”,需要使用“::view”,即后缀匹配必须指定前缀(多个冒号就需要多个来匹配)。
8、性能问题
通配符匹配方式比字符串相等匹配来说是更复杂的,因此需要花费更长时间,但是一般系统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不建议使用,可能造成查询权限及匹配变慢。可以考虑比如在sql查询时加上权限字符串之类的方式在查询时就完成了权限匹配。
3.4 授权流程
流程如下:
1、首先调用Subject.isPermitted/hasRole接口,其会委托给SecurityManager,而SecurityManager接着会委托给Authorizer;
2、Authorizer是真正的授权者,如果我们调用如isPermitted(“user:view”),其首先会通过PermissionResolver把字符串转换成相应的Permission实例;
3、在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的角色/权限;
4、Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给ModularRealmAuthorizer进行循环判断,如果匹配如isPermitted/hasRole会返回true,否则返回false表示授权失败。
ModularRealmAuthorizer进行多Realm匹配流程:
1、首先检查相应的Realm是否实现了实现了Authorizer;
2、如果实现了Authorizer,那么接着调用其相应的isPermitted/hasRole接口进行匹配;
3、如果有一个Realm匹配那么将返回true,否则返回false。
Gc线程是否为守护线程?
首先要知道什么是守护线程?
守护线程:在程序运行的时候,后台提供的一种通用服务的线程。不是必须的,比如Gc线程
守护线程 和 用户线程(非守护线程)的区别?
区别:虚拟机的分开
如果用户线程已经全部退出运行,只剩下守护线程存在,虚拟机也就退出了。
因为没有被守护的,自然就没有运行程序的必要了。
将线程转换为守护线程:调用Thread对象的setDaemon(true)实现
注意:
1.必须在start方法之前(测试一下)
2.在Daemon线程中产生的线程也是Daemon线程
3.Daemon线程应该永远不会访问固有资源,如文件,数据库,因为它会在任何时候甚至在一个操作中发生中断。
守护线程的应用场景?
非关键业务,必要操作文件,数据库链接
@Async是什么线程(测试)