00:00
好,我们来说第三小节定制point,那前面呢,我们测试了非常多的监控端点,这端点呢都会返回一些默认数据,比如说现在的这些健康信息,它呢也会返回一些默认数据,但是呢,大家考虑这么一个场景,如果我们当前项目里边除了这几个组件外,我还引入了其他的这个组件,我这些组件呢,跟我们这些东西全部健康了以后,我们才认为这个项目是一个健康的,否则呢,我们认为项目是宕机的,那怎么办呢?我们就需要编写我们自定义的健康状态检查信息,那这些自定义的健康状态信息,那我们该怎么做,非常简单,我们只需要呢实现一个叫healthy indicator这个接口,其实呢,我们来参照我们现在,现在我们看到能有一个磁盘的这个健康状态的检查,把这个CTRLC拿过来,来到我们的这个里边,我们来搜一下,会专门呢,会有一个跟磁盘这个返回磁盘健康信息的这个叫desk space healthy indic。
01:01
就是这个它呢继承于abstract healthy indicor,然后呢,我们可以来实现healthy indicor这个接口,所以呢,我们现在要做的就是如果我们有定制化的组件,那我们只需要做的一件事情,就是比如我们的健康信息,那么就可以这么来做,来我们的假设我们的这个组件叫做呃,My component,哎,我们的这个组件,我们组件的这个健康检查信息,好把这个拿过来,记住我们这个后缀名呢,一定得叫这个健康检查,然后呢,接下来我们可以实现接口,当然也可以来继承人的抽象类,既然呢这直接有抽象类,我呢就可以amstract来继承这个抽象类,这个抽象类的这个名字呢叫abstract healthy indicator,我们把这个复制过来。因为人家磁盘的这个健康状态信息呢,就都是这么做的,继承这么一个类,这个类里边呢,只有一个方法需要我们重写,就是do healthy check,就是我们来做一个健康检查,把这个健康检查的信息最终呢利用build,哎,我们检查的这个状态是up状态,也是说OK状态,还是呢,我们这个宕机状态,你在这呢一构建,然后把这些详细信息一返回就行了,所以我们的这个做法呢,也是这么来做,既然这都写了,那我就直接来实现我们这个方法,那么现在这个方法呢,因为我们是继承的这个父类,所以我只需要实现一个do和c check,那这一块呢,就要编写我们真实的,真实的咱们这个检查方法,检查我们组件状态是否健康,假设呢,比如你连的是猫GODB,对吧?你如果连的是猫GODB,你想要在这检查猫GODB是否健康,那你就得获取连接进行一些测试,获取连接进行测试,而我们现在呢?
02:47
就来简单一些,呃,非常简单,那我就在这来做一个判断,F如果呢,一等等一啊,我在这就随便写了一个一等等一,那认为呢就是健康,否则呢,那就是不健康,所以我只是在这呢想给大家说一下,当然这一块呢,条件健康不健康是自己来写的,那么这个健康的情况下,我们可以这么来返回,有个叫build,有一个呢,如果你是健康,你说你是up,就是说呢,这是健康。
03:14
健康,如果呢,你不健康,你呢就应该返回你的这个信息呢,就是道,哎,这叫不健康,当然呢,你想要有更详细的返回,应该是这样子的build,如果我们直接调这个健康方法,你会发现其实是调用build里边的statuss,给它这个状态设置了一个up,所以呢,我们这一块的这个我们还可以写成这样叫builder,点一个status,那么来指定一个status就行了,那status呢有down,有up down呢就是宕机,Up呢就是正常,然后no呢就是状态不支out of service就是不能服务,那我们可以给他给一个状态,凡是不是up的,那都是不健康,Out of service啊,那这就是我们这个build,那准备好了以后,哎,当然我们这个健康呢,那我们就应该用up,那下边呢,我们可以可以用这种写法叫build,点一个status啊,这个status。
04:14
这次呢,我们是status里边的out of service,好,然后呢,这是我们这种,当然呢,我们返回的不仅是健康还是不健康,我们有可能还要返回一些其他信息,比如呢,无论你是健康不健康,你可能会给我们带一些这些数据,String,我就写一个string object,我们来模拟啊,这个数据呢,就被带在一个map里边哈西map其实呢,我们完全照着这个desk space这一块来写就行了,比如你的这个健康呢,是这样子的,那如果是健康信息,那可能呢,我们的检查最终会返回一些数据,比如哎,我们这个影响了多少行,对吧,我们去查芒果DB,我们的这个芒果DB,我们的这个查询语句影响了多少行,哎,然后呢,我们给了一个COUNT1,然后呢,Map点一个再来put,哎,我们这个芒果DB呢,现在我们的这个连接耗费了多少毫秒,给我们来写一个毫秒,来写个100,好,我随便呢写了一些信息,如果是不健康呢,有可能也有一些信息,你想要返回。
05:14
比如呢不健康来put给一个呢,我们的这个message error错误的原因,这个原因呢,你可以说咱们这个连接超时对吧,当然这块的所有的原因都是你基于你的这个业务代码,这个一到底等不等于一,这是你的业务代码返回的,你认为健康不健康呢?好,然后呢,接下来map点我们再来put一个,比如呢,我们这个是连接超时,包括呢,它超时的这个超时了多少毫秒,我们可以给他给一个3000对吧。好,然后呢,这就是我们来放的一些信息,当然这些详细信息也要返回,我们可以使用这个build里边呢,有一个叫with detail with detail呢就是把这些详细信息也给你,With detail呢,你可以自己写KV,比如K呢code,我们来模拟业务状态码,Code呢,然后值直是对象,那我们业务状态码呢,我们假设,呃,假设写一个100啊,这随便的意思,然后呢,比如我们还要带一些信息业务给我们返回来的这个信息,这个信息呢,我直接封装到map里边,我可以这么来写,所以呢,你只要在前边真正的检查完成,检查完成会给我们返回的这个东西,你判断呢,它是健康不健康,如果是健康我们返回这一系列,不健康呢,返回这一系列,最终呢我们就OK了,然后我们把这个组件呢,我们只需要放到容器中,按一个component就行,那我们这个健康检查组件就写好了,来启动起来,那现在来看我们的这个健康信息那。
06:44
我们重新来检查我们当前应用的健康信息,那就不只有DB组件,Desk space组件,P组件,那还有我们的这个组件叫my com health这个组件,当我们这个组件的名字大家记住啊,是healthy indicator,就是这个钱截取以后,我们这个呢,就是我们当前组件的名字,所以我们可以来给大家看一下。
07:06
我们再来检查健康状况,回车,好,健康状况里边呢,就多了一个马康,哎,我们当前呢是健康的,然后呢,我们的这个携带的所有信息code等于100,我们花费了100毫秒,Code呢,我们是在这带的,诶我们相当于是with带的,然后呢,我们map里边的count Ms这些呢,其实也都带了,这就相当于我们定制了一个组件的健康信息,那如果我们这个组件呢给当掉了,那接下来其实就是怎么说呢,我们这一块只要当了,那这整个呢完整都是大,所以呢,如果我写了一个一等等二,假设我们健康检查呢给失败了,我们就可以来看一下,那么当前应用呢,他认为全部宕机。来我们这个呢,可能不是当期,我们当前的这个状态呢,叫out of service。好,我们可以来给大家看一下回车。
08:03
好,我们发现呢,我们这个组件是out of service,这相当于呢无服务了啊,这就是我们说的自定义我们这个health信息,我们如果有一个自定义的组件,我们还需要这么来做,那只需要这么来做,或者呢,你实现我们的这个接口就行,那我现在呢,是直接使用了这个抽象类,这个抽象类呢,我们只需要做一个方法叫do health check就行了,我们做一个真正的你去来检查我们业务逻辑组件对不对,这一块的这种写法呢,大家也参照一下,这是我们定制健康信息,那健康信息未来里边呢,你有什么组件,你都可以使用我这种方式,再来叠加我们整个的这个组件健康状态,只要呢全部OK,那我们的statuss就是OK,否则的话呢,只有一个失败,那这一块呢,就是失败,那再来接下来。我们可以再来定制一个叫英EL信息,就是当前应用的详细信息,那当前应用的这个详细信息呢,有可能要展示在我们当前的控制面板这个大板上,但是这个详细信息呢,默认是里边什么都没有的,那我们想要给这一块有详细信息,那我们常用的这两种方式,第一个我直接编写配置文件,你想要给你返回什么信息就返回什么信息,那么在配置文件里边有一个英开头的就是它,它里边呢,接下来你随便写什么就是什么,比如我写一个APP内,我当前应用的名字就叫boot me,然后呢,我们再来写一个APP version,哎,我当前应用的版本,我写了一个1.0.0,好,这是我们定义的一些英port信息,我来可以来启动一下,你只要在我们的配置文件里边编写了这个信息,相当你给这个当前应用定义了一些这个应用的这个ino应应用的这个信息,这个信息呢,接下来使用你的IQ tra ino,我们就可以获取到我们当前的。
09:55
能有详细信息来回车来看到,那就是APP name,不的命,APP version,还有1.0.0,但是呢,有可能我们的这个应用的这个名字或者版本号等等,我们有一些信息呢,可能还是不是在这写死的,比如我们当前应用的版本,我们往往是在po文件里边定义的,我们来看我们的版本不就是这个吗?VERSION001啊,Snap short就是它,所以呢,如果你还想要获取po文件的内容也是没问题的,比如呢,我们就写一个me,我们这个项目呢,在me上显示的这个project name,那如果你想要获取po文件里边的内容,只需要这样的写法,双enter符,然后呢,接下来po文件呢,它本来也是一个层级的,最大层叫project project里边呢会有一个artifact ID,这是当前应用的名字,所以呢,你只需要写project。
10:47
点一个,诶,这都有提示ifact ID那就行了,所以呢,我们相当于po文件里边曾经是什么呀,我就在这取就行了,你想要取副类的这个名也能取,那就是project parent的ID,所以我们在这儿取了一个,那我们也可以me project,我们的这个versionship在里边,我们的版本号双at服务,我直接project里边的模式,好,我们来测试一下。
11:15
那么当前的英镑信息呢,就能拿到。来看一下我们的这个英信息回车,好,我们这个英信息呢,这两个就是从me配置文件里边整到的啊,这个呢,就是我们自己自定义的,这是我们说的第一种方式,那第一种方式呢,我们可以这么来做,或者呢,我们直接可以写一个这个实践类叫info contributet,这info contribute我们写完以后,我们在这里边构建的是什么信息,那么就返回的是什么信息,我们可以来测试一下啊,除了健康信息,我们可能还要返回一些,呃,这个health信息,那那我呢我呢把所有的东西,我们当前应用的一些AQ tra IQ好来放在这,放在这个包下,然后呢,这个包下呢,有我们的这个health信息,然后呢,我们再来写一个。
12:13
好,我们再来写一个这个a traor这个包弄过来,然后呢,我们再来写一个英O,好,我们我们定制的这个info,我们可以来写一个叫APP info,因为我们这个info呢,我们需要实现的这个接口叫info的contributor这个接口,所以我们把这个名,但这一块的名都没必要必须叫,不是像health一样,必须叫health in indicator这个东西,这个名字呢就随便了,然后呢,我们叫info,我们的这个contributetbu,好,我们的info contributet我们写了以后呢,接下来我们来给它添加一个实现,这个实现里里边呢就有一个叫contribute,相当于我们自己来构建我们的应用的信息,但所有的这个组件我们只需要放到容器中就能生效,我们怎么构建呢?在info的这个构建器里边,我们使用它的,比如with detail这个东西,其实我们好像见过很多,对吧,那with detail里边我就可以来写我们构建的一些信息,比如我们的这个message。
13:13
我们当前应用的一些提示,哎,你好,然后呢,我们在想要构建更多的信息,With detail,比如呢,我们hello,哎,我们访问hello,我们在这打印个安特硅谷,这都是一些我们定制的KV信息等等等等,我们可以定制非常多的信息,甚至于呢,我们想要给走一个集合也行,比如with details,这里边呢,能传一个map,我们也可以用快速的这个工具collection,像我们之前的演示代码一样,点一个我们这个single啊,Single map,我们这个单实例的这个map,然后这个map呢,我们给一个K,比如呢,我们这个word的一个666,这都是我们应用的一些基本信息,那这个信息我们都准备好了以后,我现在重新启动应用,我们这个应用呢,你再来访问info ino里边呢,就会返回我们自定义的构建这些信息,让大家来想象一下啊,我在配置文件里边还定义了一些当前应用的信息,我呢自己呢通过类也定义了一些信。
14:13
信息为什么要我们要通过代码定义呢?因为有可能我们的一些信息要通过代码或者发送请求,或者调用某个方法才能真正得到,所以呢,我们代码使用也是有场景的,我们再来测试一下ino,好,我们会发现呢,它的返回是所有的合并结果,这就是我们说的info andpoint的自定义,再来加上另外一个自定义,我们用的非常多的是matrix,因为我们后来说的这些监控度量指标,那现在来看一下啊。我们应用里边现存的这个监控度量指标matrix,好,我们现在定制了三个end port,一个是health,一个是英O,一个是matrix,这个matrix呢,也是我们后来经常要定制的,我发现呢,它监控指标有这么多,但这些指标呢,不一定,不一定能满足我们的需求,比如举一个例子,我现在想要统计当前这个请求,哎,我特别感兴趣这个请求,比如CT这个请求,这个请求呢被调用了多少次,那我们想要统计它,那怎么办呢?那我们往往呢,是需要额外再填一个指标,而这个指标呢,需要出现在监控大板上,那怎么办?我们就可以这么来做,我们可以来定制化我们的这个matrix,这个呢,我们spring boot默认啊支持非常多的这个指标,比如GVM的一些指标,我们的内存的一些信息,Buffer的一些信息,包括我们的现成的一些信息啊,类加载的一些信息,这块呢,我们都可以得到,包括CPU的一些指指标,我们磁盘空间的一些指标,还有我们。
15:45
那如果整合了第三方的一些技术,比如卡夫卡啊,日志toca等等这些指标呢,我们都可以拿到,包括任何我们spring整合进来的这个指标,Spring通过spring integration这个项目能整合进来的,相当于呢,我们默认它已经自动配置了非常多的这些指标,那就是我们现在看到的这些,哎,GVM的一些监控信息,然后呢,日志的一些信息,包括我们系统里边CPU的一些信息,比如我们来看一下CPU的使用,CPU的数量。
16:17
我们当前CPU呢有多少个,那我们看到呢,我们CPU是八核,那么就展示八,所以呢,这就是我们所有的这个指标,其实人家默认给我们返回了很多,而我们需要呢,往往需要定制一些,那怎么办?我们只需要这么来做,比如我们在这举了一个例子,我在这呢写了一个业务逻辑,这个业务逻辑里边呢,我们可以让他构造的时候传入一个这个东西叫meter regry,我一翻译过来就叫我们的这个指标的注册的这些工厂想到这个注册中心,我们到底要在监控哪个指标,我们可以把它放到注册中心里边,那我就可以这么来做,比如我来到我的这个controller里边,那我们有service,那就用service,那我们以前呢有一个account service,比如我们就来看一下啊c service的这个self c方法,它到底被调了多少次,那我就可以这么来做,你呢可以使用构造器注入的方式,比如我来使用构造器c service。
17:14
Implementment,我们使用构造器注入的方式,它呢只有一个有参数构造器,在构造器上呢,写一个叫meter,我们的registry,相当于拿到我们的这个指标的这个注册中心,然后呢,我们在这个注册中心里边,我们来调一个办法,调一个什么呢?它有非常多种度量指标,比如呢,以时间类的叫timer,我们技术类的叫count,还有呢,各种其他的啊,我们比如还能配置一些呃,Con信息,还有我们的这个聚合类的信息,那么现在呢,就现在用这个count,我们来简单来做一个统计,然后将下来这块的name name是什么?那就是我们的这个指标名,将要展示的指标名,那这个名字呢,我们就叫city service,我们希望呢,这个指标名字叫city service的这个save city方法被调用的次数,所有C点一个count,诶我们在这么一写,看看呢,我们可以不用打,然后呢,我们在这呢,就有一个这个叫指标注册,我们先把。
18:15
把这个指标注册进来,然后呢,接下来因为它返回一个counter,能把这个counter呢就拿到这儿,然后大家看咱家神奇的时候就到了,因为我们是一个计数,以后呢,接下来我们这个方法每被调用一遍,我们只需要在它的这个方法里边调用count的equipmentment,增加一个次数就行了,所以我们这样呢,就会很方便的利用到底层的这个meterry,就是我们说的引入的第三方的这个包,叫make meter这个包,然后呢,我们就可以来做一个统计的技术,我们现在来测试一下,然后我们这个项目呢,一启动我们的注册指标的这些指标中心里边就会注册一个新的指标项,叫city service service city的这个技术,然后呢,我们想每次调用它增加一个技术,那我们就在这个方法里边,把这个cer让它rement加一次就行了,我们来测试一下。
19:09
好,我们先来看一下所有的这个指标,Matrix回车,在matrix里边呢,我们发现前面多了一个叫city service save save city的技术,而这个技术呢,我们来看一下走,那我们现在呢,统计是零个,因为我们现在还没有任何的调用,如果我们来调用一下,我们可以来调用一下local host 8080。我们来登录进来,因为这个东西呢,还要登录来,我们来调用,调用一下这个save CT可以看一下save CT方法好,我们这个调用呢,好像这个save city还我们还得登录,我们来看一下啊,谁调用了这个啊,那就那就在这,那么还得登录,那么使用postman帮你们问一下。当然这个CCT呢,我们要调用,因为要登录我们,所以得带上解CID这一串,我们重新来来分啊,123456,我们把这个解赛程ID拿过来,F12刷新。
20:12
好慢,页面呢,访问有错误,511不管它了。然后呢,接下来我们来看一下啊解3ID这个复制过来。复制一下。好,来到我们这一块save CT,那就是它我们我们的这个请求呢,就叫CT请求里边的数据也在这,然后呢,给图里边,我们带一个我们自己的,好,我来点一个剩的。好,那这个请求成功我们来多次的几次,那请求成功了以后呢,我们这个统计指标就上来了,我们可以来看一下我们的指标刷新,好我们调用了三次,那没问题,这就是我们说的我们自定义加入的一些指标统计信息,当然这几个信息呢,都是我们后来常用的,我们要定制health信息,定制我们的英O信息,定义我们的指标信息,那么指标信息呢就会很方便,当然你也可以使用这种方式,直接给容器中放一个叫meter bound这种写法,然后呢,Build来我们来构建一个,然后把它注册到这个RY里边也是可以的,那除了我们这样注册指标外,我们有可能呢,还是要直接再来新增一个监控端点来看看一下啊,因为我们官方里边呢,给我们现在默认给的这个监控端点来,注意就只有列表里边的这些,那相关的场景一导入以后呢,就会有这些监控端点,但往往呢,我们引入了一些复杂场景,我们还要定制自己的。
21:39
空端点那怎么办?那我们这几个呢,只是来在已有的这个端点上,我们来做一个一个扩展,我们完全要定制自己的端点n point。但怎么做,以前呢,还是挺麻烦的,但是有了TRA2版本以后,我们只需要用这两个注解,第一个注解,你写一个自己的这个端点,标注一个endpoint这个注解,然后呢,把它放到容器中,告诉你我的这个端点呢,哪个是读方法,哪个是操作方法,所谓的读方法,那就是往往我们在这监控,我们要拿到这个端点,比如说现在呢,有一个端点叫matrix,这是一个端点,还有一个端点呢叫info,那接下来呢,我们自定一个端点,比如叫AA,那我们这个A1在哪里,我们这个A1的数据从哪返回,就是从它的这个读法返返回的,所以我们现在自己可以来准备一个监控端点。
22:33
比如我们的这个端点呢,我们就叫my end point,哎,My service,我们的这个业务的end point,你也不用实现任何接口,你需要标注一个注解叫end point,说一下你的端点名,你看这个端点名呢,非常重重要,这个端点名呢,未来就是出现在这一块跟我们boot并驾齐驱的其他端点,那么现在呢,来监控我们的这个端点叫my service端点,我们来监控我们的这个服务端点啊我们这个服务端点呢,接下来你把它放到容器中,然后呢,你写上两个方法,第一个方法呢,Public返回值无所谓,比如你返回一个map,啥都行,对象都行,然后呢,但是你的这个方法必须呢,是一个叫我们称为叫read operation,所谓的read f就是我是一个端点的读操作,比如呢,我们就叫get,假设呢,我们想要监控docker的这个信息,哎,比如我们要get docker info。
23:34
那我们把docker的信息呢,我们可以直接给它返回,比如我们来返回一个怎么办呢?我就直接使用collections这个集合吧,Single map,然后呢,我们就来返回一个docker,呃,Docker info,然后docker的这个详细信息,那我们就来说docker started started,哎,我们这个docker呢,已经启动了,我们在这准备了一个map,直接给你返回,然后呢,注意你既然是一个get方法,相当于这个东西呢,就是一个属性,这个方法呢,不一定不能有传参下来呢,你还可以写一个方法啊,必须呢是无参,但是呢,这个可以是right方法,随便写,比如呢,我们就叫stop do,我们想要停掉do,这都是我们的端点,端点呢是参与我们后来的整个线上的管理功能,At right operation说这是一个写操作,然后呢,接下来那我们这个我就只在控制台输出一句话,这个呢就叫doer stop,然我们假设呢,你掉了。
24:34
这个方法docker呢,我就给你把docker停掉好,我自己呢写了一个端点,然后呢,我来启动一下,但是呢,我们现在看到的是我们默认是所有端点都不暴露的,所以呢,我们可以配置让我们的自己的端点暴露出来,我们来稍等一下啊,那先来看默认情况,我自己写了一个端点以后呢,怎么办?来看一下。我们自己写了一个端点。
25:01
来到这看一下我们有哪些端点,好大家看啊,这些端点呢有很多,然后呢,这有matrix的一些端点,大家看我们这呢,就有一个my service的这个端点,那这个端点呢,如果我来访问,大家看它呢,就会给我们打印叫docker started,相当你访问你自定义的这个端点,自然会调用你的这个叫什么方法来着,我们自定义的端点呢,可以不用参与开启,你想要开启,你就在这儿要绑定一些配置文件的配置项就行了啊,Configu properties就行了,那么现在呢,这一块就是我们这个,就是我们这个端点的读操作,所以呢,我们发送请求,最终呢,我们就会返回这个数据,因为这个数据呢是一个对象map,所以呢,人家把这个数据直接以节省的方式返回了,而原始数据呢,大家看到就是这个节省串,那同样的我们这个端点呢,其实也会在控制台里边给我们看到。比如我们来在这CMD,我们去GMX剪cons索去GMX里边,如果我们来当前管理应用,我们想要停掉doer,我们呢可能不需要登录服务器,我们只需要呢GMX,我们连上我们的这个应用,我们这个应用呢,因为我们暴露了一个端点,我们这个端点呢叫my service,所以我们直接来到我们的这个端点,我们的这个端点呢,如果有属性,自然有属性,我们这呢,直接有一个操作,两个操作,一个叫get do infer,然后呢,我们能看到这个我们一点,它相当于我们就这个方法掉了我们的值是它,然后呢,如果我掉了stop docker。
26:41
来可以看一下,我在这调用stop docker停,然后大家看我返回值呢是那但是呢,我们控制台docker stop已经打印了,现在这个方法呢,已经被调了,所以呢,整个我们的endpoint其实是参与我们整个线上的运维监控功能的,这就是我们说的定制化,从定制化我们的health信息到英O到我们的MATRIX11直到我们的定制化,我们完整的endpoint,相当于我们已经定制化到跟spring boot同级的这个级别了。好,那更多的这个监控信息呢,大家完全可以参照I tra里边的所有东西,全部都可以参照我们这个官方文档,我HTP请求的这个跟踪,你要跟踪呢,你必须先有一个这个叫HTV的等等等这些怎么做,当然我们更多的这些监控功能,包括监控里边的详细指标,那一定都是要去向生产环境里边部署的时候,可能要再来定制化的一些,那这些的东西呢,大家也可以来参照上硅谷的。
27:41
这个大厂学院,来时刻关注我们这个大厂学院,我们会来更深入的去来讲解我们的整个point机制。
我来说两句