在使用spring-boot-starter,会发现,有的项目名称是 XX-spring-boot-starter,有的是spring-boot-starter-XX,这个项目的名称有什么讲究呢?从springboot官方文档摘录如下:
从这段话可以看出spring-boot-starter命名的潜规则。
命名潜规则
spring-boot-starter-XX是springboot官方的starter
XX-spring-boot-starter是第三方扩展的starter
打印方法执行时间的功能,需要用到aop,咱们的项目就叫做 aspectlog-spring-boot-starter 吧。
项目的pom文件如下:
关于spring-boot-configuration-processor的说明,引自springBoot官方文档:
简单说就是:写starter时,在pom中配置spring-boot-autoconfigure-processor,在编译时会自动收集配置类的条件,写到一个 META-INF/spring-autoconfigure-metadataproperties 中。
本次我们就选用@ConditionalOnProperty。即配置文件中有aspectLogenable=true,才加载我们的配置类。
下面开始写自动配置类
配置类简要说明:
当配置文件有 aspectLogenable=true 时开启,如果配置文件没有设置 aspectLogenable 也开启。
META-INF/springfactories 是spring的工厂机制,在这个文件中定义的类,都会被自动加载。多个配置使用逗号分割,换行用\
如果有兴趣可以查看这2篇blog:
@Enable 驱动原理(设置连接)
@EnableAutoConfiguration 处理逻辑(设置连接)
这是我们最终的目录结构
在IDEA中,进行mvn intall
打包完成后,在其他项目中的pom中引入进行测试最近新启动一个项目,用springboot开发,需要整合rocketmq,到网上收集了一下资料,大多都是一些简单的实现,类似于练习作业的那种。作为产品开发缺乏的东西太多。这里我给出完整的集成和消息调度方案,有不足之处欢迎留言指正。
这里先讲mq的集成,再讲消息发送的设计和消息消费的调度
消息发送实现类
消息体基类
消息
具体业务对应的消息体
监听类
mq消息接收启动类
消息分发
具体业务处理类
注解
消息类型定义
当然消费者端也可以用topic+tag的方式去调用业务实现类,这里给个简单的例子。对象存储服务(Object Storage Service,简称OSS)
对象存储,也叫做基于对象的存储,是用来描述解决和处理离散单元的方法的通用术语,这些离散单元被称作为对象。
服务就是,给你提供对象存储,这项服务了。
当然不要认为只要一家 阿里云oss,国内很多,只是铺天盖地都是他的广告而已。
两种方式,
一种是后台提供接口,让前端或其他子系统调用,不需要他接触我使用的什么方法和储存的配置东西,就给一个文件进行放入到oss 里面
两种,后台值提高配置接口,剩下的你就这几调用他们的sdk里面内容就可以了。例如阿里云的就直接使用android 或ios sdk 配置就行了,你需要什么参数,我都会给你的。
所以介于这两种写的东西也不一样,各个工程师的理解也不一样。
所以这样很简单了不少,这样就封装成一个bean 就可以了。
使用
接着就api 的使用了。。。
不同的 sdk存储方法不一样,参数也不一样。
这个是里java 直接 使用
还是原文档好点。这里这写流程了,因为思路比什么都重要。
后台工作量打一些,
写入两个方法就行,一个上传文件,一个删除文件
删除
上传文件,是前台上传的时候用,删除,是他要删除的,你主动去调用。
不同平台使用不同的sdk ,就需要知道他们参数就可以了就行。
例如ios
需要五个参数
两个参数
上传
原来和ios 一样,直接android 重构OSSFederationCredentialProvider 实现
就可以了,一个接口就行了。
就给他结果就行了
阿里云有三种方式权限
案例使用的是sts 方法。
阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。RAM提供RAM用户和RAM角色两种身份。其中,RAM角色不具备永久身份凭证,而只能通过STS获取可以自定义时效和访问权限的临时身份凭证,即安全令牌(STS Token)。
expiration 就是过期的时间。netty-socektIO官网
socketio是一个nettysocket node版的java实现版,其性能优于webSocket等socket技术,socketio有nameSpace等,分区方式,比较灵活。
originHost为socket客户端的地址,serverHost请使用ip,lz在使用过程中尝试过使用localhost,但服务未能调用成功。
socketIoConfig用于生产bean,在socketService等其他地方调用该SocketIOServer的bean
业务中需要应用到Websocket长连接进行数据传输,由于服务使用的是Zuul10版本,对ws协议支持较弱,后续尝试使用了 spring-boot-starter-websocket 来完成的。关于怎么集成的话网上有非常多的文章了,我就不多费口舌了。
我们目前实现的功能是可以通过WebSocket调用接口发送埋点,另外还需要监听用户离开的事件为这个埋点画上一个终止访问时间。目前测试下场景有:
前4点触发了任意 *** 作,服务端都会监听到 DISCONNECT 离开事件。但是第5点直接断网, 服务端竟然是无感知的,这个时候产生的问题就是客户断网了,服务端是认为在线的,如果不重新联网登录的话,那么这个用户将会一直一直在线,埋点会一直计算。完了个蛋~
至于为什么断网之后,ws会认为他是在线的, 可能管道打开了之后由于断网导致断开时间发送不出去吧。
我目前能够想到比较简单的办法就是: 心跳续约
捋清了思路,大概就知道如何做了。
然后特意看了下 spring-boot-starter-websocket 的源码,发现其实他有提供此功能。
先说下如何实现:
我们是在在实现了 DelegatingWebSocketMessageBrokerConfiguration 的配置类中重写 configureMessageBroker 方法。
比较关键就是 setTaskScheduler 和 setHeartbeatValue 一个负责调度、一个负责配置间隔。
这俩要么都填要么都不填。
配置了这俩参数之后,服务启动的时候会触发一个 HeartbeatTask 线程来专门维持心跳。
我们可以看看他的流程是如何运转的。
核心任务调度类: orgspringframeworkmessagingsimpbrokerSimpleBrokerMessageHandlerHeartbeatTask
服务端在启动的时候 SimpleBrokerMessageHandler 在初始化完成之后会回调 start 的方法,然而他会触发一个 startInternal 开始调度任务,判断依据就是有没有配置 TaskScheduler ( 对应的就是配置类中的setTaskScheduler ),一旦启动之后,会根据你给的心跳数组 serverHeartbeat ,来选择调度时间。
orgspringframeworkmessagingsimpbrokerSimpleBrokerMessageHandler
检测心跳、超过间隔则剔除、并且定期回写心跳给客户端。
还有一点需要注意的是读的间隔时间:
假设用户网络不好,心跳漏发了一次,这个时候如果按照本次的逻辑而言,该用户的最后心跳时间肯定会超时。而它的做法是, 将设定的读超时时间 3 ,就相当于有3次机会。
这个在创建session的时候 SessionInfo 里面就已经做好了处理:
orgspringframeworkmessagingsimpbrokerSimpleBrokerMessageHandlerSessionInfo#SessionInfo
所以这个时候,你可能需要根据业务能够接受的时长去配置,也别忘了这个事。
还有很关键的一点就是让客户端的心跳发送间隔和服务端尽可能保持一致,不然有可能出现莫名其妙的下线情况,尽可能还是在这种地方加好日志。
好了,希望在遇到断网问题的时候,能够帮助到你。
如果有疑问请留言,我会尽快答复。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)