监控系统概要

监控系统 三剑客 metrics monitor alert 监控什么 主机级别 CPU Memory Disk space Processes 应用程序 Error and success rates Service failures and restarts Performance and latency of responses Resource usage 网络相关 Connectivity Error rates and packet loss Latency Bandwidth utilization 服务池资源 Pooled resource usage Scaling adjustment indicators Degraded instances 外部依赖的度量 Service status and availability Success and error rates Run rate and operational costs Resource exhaustion 如何采集Metrics 黄金指标 延迟 延迟可以知道一个任务需要多久 流量 知道系统的繁忙程度 错误 错误的分类和管理 饱和 资源的利用率 可以说,任何的组件都可以通过这四个指标进行监控 组件说明 服务器组件 To measure CPU, the following measurements might be appropriate: Latency: Average or maximum delay in CPU scheduler Traffic: CPU utilization Errors: Processor specific error events, faulted CPUs Saturation: Run queue length 应用程序与服务 Latency: The time to complete requests Traffic: Number of requests per second served Errors: Application errors that occur when processing client requests or accessing resources Saturation: The percentage or amount of resources currently being used ...

2021-07-03 · 2 min · bystander

motan源码阅读-客户端服务引用

一旦服务器启动,服务开始提供,并且在配置中心注册了(配置中心可以是本地的地址,也可以是zk,也可以是其他的实现),那么客户端就要开始调用了 点击看大图 服务引用 RefererConfig.getRef() 先是获取集群支持(先忽略,主要是配置中心相关的) configHandler.refer(interfaceClass, clusters, proxy) 开始获取接口代理 1.一旦知道接口名,Class.forName加载接口类,就开始通过proxy工厂来为服务端接口创建代理了 2.jdk的Proxy类,直接来创建代理.同时代理要传入RefererInvocationHandler 这个类可以看错是真正的stub,封装了rpc调用请求.当在客户端获取到服务接口的bean的时候,实际上调用过程被这个类拦截,进行封装发送rpc 1.当接口被调用的时候,这个拦截器险根据拦截到的请求构造一个rpc请求 2.这里就会存在一个策略.该调用哪个,以FailoverHaStrategy为例 1.选择一个服务提供方 1.如果是jvm服务,那么直接从本地的服务map中取出一个调用就行 2.如果是真正的远程服务,这时候就进入nettyClient部分了 把请求向netty的Channel中写就行了.服务端会从Channel中取进行处理,然后放回来.这样客户端就拿到结果了

2016-05-31 · 1 min · bystander

motan源码阅读-服务的发布

这一篇继续从这个demo开始,分析一下这个服务是怎么发布出去的.关键的代码从motanDemoService.export();开始. 一图胜千言. 点击看大图 服务发布ServiceConfig.export() 1.加载有的配置中心url列表/新建 2.doExport(ProtocolConfig,port,registryURLs) //配置中心地址列表 2.1导出的时候,会先判断是否存在.其实就是根据协议名,ip,接口,参数来生成一个唯一key. 2.2ConfigHandler.export(Class interfaceClass, T ref, List registryUrls) //接口.实现.配置中心url列表 2.2.1.根据协议名创建协议,这里ProtocolFilterDecorator 2.2.2.根据接口,实现类,serviceUrl,构造一个Provider,用来提供服务 2.2.3.使用协议进行导出Provider, export(Provider provider, URL url) 2.2.3.1创建一个Exporter 2.2.3.1.1.创建的时候会将服务提供方Provider和url有个映射关系,这样当一个url请求过来的时候,就知道改调用谁了.ProviderMessageRouter,讲一个请求路由注册到server上,同时包装了一个心跳包 2.2.3.2进行导出 导出就是一个服务器打开的过程/server.open(); 2.2.3.2.1进入nettyServer初始化,主要就是添加handler,编码解码.和一个rpc处理的 相当于一个请求过来的时候,先进行解码,然后调用业务处理handler进行处理,处理完成后,进行编码,然后返回给客户端 服务器启动后,相当于这个服务就发布了 2.2.4.注册register(registryUrls, serviceUrl) //这一步就是将serviceUrl,向对应的jvm/rpc服务中心注册url,本地注册就是LocalRegistryService类里一个map..zk的.就是向zk写node.等等

2016-05-30 · 1 min · bystander

motan源码阅读-入门和运行demo

工作中一直在使用rpc,但是只是对简单的原理比较熟悉.最近看到有motan的一个介绍,代码拉下来看了看,除了测试用例比较少之外.其他还是不错的,和阿里的rpc框架比起来,还是弱了一些,好处就是方便用来学习. motan 是weibo的一个rpc框架,据说已经在线上使用了. 在学习rpc框架之前,建议看一个hello world级别的文章RPC框架几行代码就够了,写的非常好,看完基本就知道rpc的核心了. Remote Procedure Calls中最关键的那个图,就能说明了. 本地client调用本地client stub,stub对消息进行封装,通过socket发送,服务端的server stub接收到,然后解包,将里面传递的方法名,方法参数.等等信息,识别出来,调用服务端对应的服务,然后得到结果后,又通过socket返回,本地client又进行解包.就行了. 这里面会涉及到,封装,封装就是吧对象序列化,这样才能在网络中传递. 而生产环境的rpc框架需要考虑的有: stub怎么生成,序列化怎么最高效,如何统一不同机器之前的调用,(大小端的机器等),如何识别该调用哪个机器,负载均衡.socket通信.等等. 先跑个demo熟悉一下. 下载motan源码,导入ide,然后先启动服务端,MotanApiExportDemo,这个类,然后控制台会打出服务已经启动.然后运行MotanApiClientDemo,会发现一个控制台打出motan,服务端打出hello motan.就说明跑起来了. 如果控制台日志没有.修改对应resources下面的log4j.properties文件.首行添加log4j.rootLogger=debug,stdout ,会设置默认日志级别为debug,并且在控制台输出. 或者直接fork我这个 后面会逐步分析,希望坚持下来.

2016-05-29 · 1 min · bystander

eclipse插件开发-tycho使用

不说废话,直接上。本文主要包括tycho的使用,版本号的自动更新。 eclipse插件开发中,依赖的管理是个问题。如果采用常规的搞个lib目录,然后加到MF文件中。一旦依赖越来越多。或者要更换版本号就变得非常麻烦。所以要用到tycho 首先说明一下目录结构。一个parent的maven工程,一个plugin工程,。两个features。一个是deps的。一个是plugin的,这个依赖deps是独立的mvn项目。可以先不用管。一个deps依赖工程(这个依赖工程独立)。 在主pom下。 步骤如下。 关于依赖部分 新建一个普通的mvn工程,比如deps。打包类型写成<packaging>bundle</packaging>,同时在pom.xml中添加build部分 <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>3.0.1</version> <extensions>true</extensions> <configuration> <niceManifest>true</niceManifest> <manifestLocation>META-INF</manifestLocation> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Embed-Dependency>*</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> <Embed-Directory>lib</Embed-Directory> <Bundle-ClassPath>{maven-dependencies}</Bundle-ClassPath> <_exportcontents>*</_exportcontents> <_failok>true</_failok> <_nouses>true</_nouses> <Import-Package></Import-Package> </instructions> </configuration> </plugin> </plugins> </build> 然后正常添加一些依赖到这个工程中。然后执行一下mvn clean install ,你就会发现本地mvn仓库生成了一个jar包,这个jar里直接打包了所有的jar 关于插件部分 新建一个类型为pom的parent工程。用来包含下面的子工程,通过 <modules> <module>xxx.plugin.1</module> <module>xxx.plugin.2</module> </modules> 来管理。同时 添加如下的插件 <properties> <tycho.version>0.24.0</tycho.version> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <executions> <execution> <id>attach-sources</id> <phase>none</phase> </execution> </executions> <version>2.4</version> </plugin> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-maven-plugin</artifactId> <version>${tycho.version}</version> <extensions>true</extensions> </plugin> <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>target-platform-configuration</artifactId> <version>${tycho.version}</version> <configuration> <pomDependencies>consider</pomDependencies> </configuration> </plugin> </plugins> </build> 新建一个专门用来管理依赖的features,这样用户就可以安装这个features,来把所有的依赖安装到eclipse插件目录了。packing是eclipse-feature 新建一个plugin,新建一个这个插件对应的feature。然后通过右键转换成mvn工程。如图 新建一个repository项目,这个项目主要就是为了发布,生成发布相关的文件。新建Update set project。然后添加两个features。转换成mvn。其中packing改成eclipse-repository。 注意,这里的版本号必须对应。比如plugin.xml的版本是1.5.0.qualifier,那么对应pom中必须是1.5.0-SNAPSHOT 然后去根目录下执行一下mvn clean install,就会在repository目录生成需要部署的zip文件或者web site文件 遗留问题是以后要是升级版本号怎么办。。不用担心。。主pom中添加 <plugin> <groupId>org.eclipse.tycho</groupId> <artifactId>tycho-versions-plugin</artifactId> <version>${tycho.version}</version> </plugin> 然后 在根目录执行 mvn -Dtycho.mode=maven org.eclipse.tycho:tycho-versions-plugin:set-version -DnewVersion=1.6.0 即可全部替换pom和plugin的版本号 另外如果项目导入后在eclipse中报错,一般是因为缺少了上面说的那个依赖。可以直接复制到eclipse的plugin依赖目录。或者在mvn clean install之后,通过安装 依赖feature的方式解决。 附上一些文档 ...

2016-05-21 · 1 min · bystander