0.刚开始对海星框架的原理的理解(restemplete和配置文件加载的理解)

刚开始肯定是要对海星框架跑起来

海星框架

 

1.基础学习

1.海星框架的配置加载

1.海星框架的配置加载主要是starfish-configuration这个jar包里实现的,项目启动首先进入的是BootstrapListener,然后获取到当前项目的路径。接下来会尝试获取配置文件,首先会进行判断是以jar还是war包的方式运行。通常开发环境都是以jar的方式运行,服务器环境是以war的方式运行,我在自己本地debug的时候发现进入了开发环境,然后会尝试获取项目中的conf/config.properties,因为我开发时候的配置文件放在resources目录下,所以这个方法就会返回空字符串。所以在开发环境下,即使没有config和install这两个配置文件也是不影响运行的,项目的运行完全依赖于spring中的配置文件中的配置项。

2.继续上一步判断,如果此时以war包的方式运行,而服务器上就会有平台生成的配置文件,这是就能正确读取配置文件中的配置项了,并把配置项放到environment。

最后进入postProcessBeanFactory来进行配置项的转化,比如修改全局配置项,对加密密码进行解密,对自定义配置项进行转换处理。

总结:

  1. 不需要在项目的src/main/resources目录下放配置文件了,放了也没有作用。项目的运行依赖于sping自己的配置文件中的配置项,例如application.properties文件

  2. 在application.properties文件可以只配置 @bic.bic.ip 就可以,其他核心服务需要的配置项可以省略(前提是部署在同一台服务器上)

  3. 通过运管中心配置自定义参数,不需要服务重启即可加载的场景中,那么配置后会在config.propertes文件中生成一个配置项。例如ppemweb.1.test=abc,代码中只需要使用@Value(“${test}”)注解即可获取修改后的值,不需要担心配置项中的组件标识和实例号。

  4. 线上环境有config,install两个配置文件,开发环境是不需要这两个文件的。如果开发时需要使用配置文件中的内容也不是不可以的,只需要把配置文件放到项目的根目录即可。例如项目根路径是D:\工作文档\农行信访项目\code\ppem,那么把conf目录放到根目录里面即可。

  5. 如果config配置文件和application.properties配置文件中的配置项是相同的,则config中的配置项有效。因为congfig中的配置项被解析后,给予了最高优先级。

2.海星框架的寻址调用

Spring Cloud通过在声明RestTemplate Bean时使用@LoadBalanced注解,在框架bean初始化的时候通过@LoadBalanced寻找到需要被增强的RestTemplate bean,并调用其中的api对其功能进行增强。海星也参照了该原理使用了@HikHttpLoadBalanced注解去声明对RestTemplate的改造。不过海星更进一步在框架内默认声明了被增强的RestTemplate bean,并且使用了 @Primary注解,这样用户在使用的时候就可以直接@AutoWired注入使用了,且因为@Primary注解的关系,如果当前IOC容器内存在多个RestTemplate实例则会优先注入海星寻址调用RestTemplate bean。

海星默认提供的Resttemplate对象不支持普通的resttemplate调用!若需要调用特定IP端口的服务,请声明一个普通的RestTemplate bean即可。但是因为海星内置的RestTemplate Bean使用了@Primary注解,因此即便声明了用户自己的RestTemplate bean,仍然无法仅通过@AutoWire注解完成注入。此时应当为重新声明的RestTemplate bean指定bean name并根据bean name进行指定注入。

1.比亚迪项目中的四个接口,出入口车辆,查询车流量,近七天访客趋势,模拟事件报文下发接口。

1.这四个接口是我在比亚迪项目中自己完成的接口,虽然实现上并不难,不过我在实际编码中学到了代码规范以及其他一些不一样的实现方法。
项目刚开始的时候就给了我一个ui图和车辆信息的数据表,首先根据设计的ui图确定大体编码思路,ui图中设计的是每四小时的进出园车流量的柱状图。于是先定义一个坐标信息(里面有两个list,第一个list是作为x轴信息,比如4,8,12,16,每四小时的时间信息。第二个list存放y轴以及线段名称)。然后开始编写接口,首先要获得当天的日期,然后确定当天的起始时间00到结束时间23.59,对这段时间进行分段处理。主要用到的mapkey这个注解,他能将存放对象的list转化为key值为对象的某一属性的map。我在mapper里编写相应的方法,并且把starttime和endtime,以及出入园状态status作为传入参数,然后mapkey注解把时间作为key。然后编写sql语句,用resultmap返回一个自定义的类,里面有时间和数据条数。这样查询的结果就是key为yyyymmddhh24,value为每个小时对应的数据条数。然后对这个map进行处理,得到每四个小时的车流量数据,最后返回坐标信息。
2.近七日访客趋势
还是根据项目给的ui图,ui图上的横坐标是最近七天的日期,纵坐标是每天的访客数量。还是一样的思路,先定义一个坐标信息(里面有两个list,第一个list是作为x轴信息,比如8.16,8.15,8.14,每天的日期信息。第二个list存放y轴(每天的访客人数)以及线段名称)。首先确定查询的起始时间和结束时间,起始时间是六天前的起始时间,结束时间是当天的最晚时间。然后用到的mapkey这个注解,他能将存放对象的list转化为key值为对象的某一属性的map。key值为格式化的yyyymmdd,value值是通过count查询出的每天的所有游客数据,这样就得到了这个map信息,然后对横纵坐标进行填充和处理就得到了坐标信息类,最后返回坐标信息。

2.比亚迪项目中的事件告警,esc源码,mpc推送


事件订阅整体流程:比亚迪组件先从esc订阅事件,返回结果。然后esc接收到事件后判断是否订阅,如果订阅转发到消息队列中,然后比亚迪项目组件监听这个队列获取事件。

1.比亚迪项目中aciveMq使用的学习与总结,对esc事件服务以及相关服务的学习。1.在queue模式下,avtivemq的配置类中配置JmsListenerContainerFactory进行配置,然后消费者监听队列的时候可以使用JmsListener注解来使用配置的这个ContainerFactory,注解中最主要的就是destination(即监听的队列名称)。消费者这部分很好理解,整个链路的核心是生产者是谁,消费者监听的队列的数据从哪来,对这一部分跟着项目和源码深入学习。

2.首先事件服务esc组件有很多功能,这里用到了事件按需订阅,保证业务组件接收到的是“需要”的事件,降低业务组件处理的压力,比亚迪项目中用到了六个事件,都与温度、交通等有关。代码部分的实现:首先事件订阅的init类先继承CommandLineRunner,以保证订阅事件在容器初始化完成后进行,需要注入escClient和hikDiscoveryClient。核心是用到了esc包中Escclient中的eventRouter方法(里面还有一个类似的subscribeEvent方法,就是对eventRouter方法进行了封装)。eventRouter方法需要传入一个EventRouterDto,这个数据传输类存的主要是需要订阅的事件信息(比如:dstServiceType;//接收事件的组件,这里就是bydmls,以及事件类型,事件等级、事件发送目的URL....),对EventRouterDto里注入了六种项目中需要的事件的信息,然后调用eventRouter方法,这个方法里面调用了esc组件中的/eventService/v1/eventRouter(事件订阅接口),并且header是里面方法生成的token,token生成入参为(安全会话ID和随机数据加密密钥-16进制编码 ),请求的实体就是传入的EventRouterDto的信息,然后返回成功信息。所以就实现了每个事件向哪个队列转发,并且能选择需要的事件向对应的队列转发,然后作为消费者只需要监听对应的队列就可以了。
1.整体链路和问题排查
1.排查问题:项目本地启动的时候消费者监听队列收不到生产者发送的事件报文信息。先在运管中心查看mq的组件,每触发一次事件,mq的入队数和出队数都会增加,而且出队数和入队数是相等的。然后这个项目也部署在服务器上,可能服务器上的组件也在监听这个队列,从而把消息都消费了。后续收到了移动侦测的事件,但是理论上还应该收到温度报警的事件。先查看运管中esc的日志,修改日志的等级,如果ESC接收到事件,会看到recv event后面的事件信息,然后确实看到了131331事件码的移动侦测事件。用clientdemo来添加设备然后布防,可以发现该设备一直在发送移动侦测的事件。触发温度报警后,可以看到报警信息,然后esc日志中出现了温度报警事件的信息。

2.所以无论是周界侦察或者温度报警,ESC都是接收到了事件的。然后继续排查esc组件是否转发了事件,ESC组件接收到事件后,会将事件信息与内部的订阅条目一条一条匹配,匹配规则包括事件源(srcIndex)、事件类别(ability),如果匹配成功,会将事件转发到订阅地址。这边也看到了转发成功了,有send send to dst amq://10.19.218.110:7018/queue/bydspslms.mq.error.event.queue。

3.所以无论是esc还是mq都是没有问题的。于是查看byd组件的日志,调整byd组件日志等级,能看到事件告警信息的成功插入。所以说,本地项目无法消费的原因是因为都被另一个服务器上的组件消费了。

4.修改事件报文的格式,设备上发事件的实际报文和hido上事件类型管理中的事件中的报文格式有区别,对照设备实际发送的报文进行修改。
2.mpc推送

 

4.代码规范的学习(url中禁止使用变量,)

3.这个项目与pdms的关联

4.mypdbs中车辆态势看板的概要设计(解决问题:接口的并发量(redis缓存,http连接池、异步线程池、completefuture))、定时任务的使用

3.车辆态势看板概要设计文档编写以及开发中接口优化的思考

0.redis缓存

1.http连接池

http连接池

http性能测试

首先,明确两点:
1.http连接池不是万能的,过多的长连接会占用服务器资源,导致其他服务受阻
2.http连接池只适用于请求是经常访问同一主机(或同一个接口)的情况下
3.并发数不高的情况下资源利用率低下

那么,当你的业务符合上面3点,那么你可以考虑使用http连接池来提高服务器性能
使用http连接池的优点:
1.复用http连接,省去了tcp的3次握手和4次挥手的时间,极大降低请求响应的时间
2.自动管理tcp连接,不用人为地释放/创建连接

使用http连接池的大致流程 :
1.创建PoolingHttpClientConnectionManager实例
2.给manager设置参数
3.给manager设置重试策略
4.给manager设置连接管理策略
5.开启监控线程,及时关闭被服务器单向断开的连接
6.构建HttpClient实例
7.创建HttpPost/HttpGet实例,并设置参数
8.获取响应,做适当的处理
9.将用完的连接放回连接池

2.异步线程池

3.异步任务completefuture

 

 

 posted on 2022-08-05 17:07  “樂·~  阅读(43)  评论(0编辑  收藏  举报