dubboadmin(dubboadmin使用手册)
本篇文章给大家谈谈dubboadmin,以及dubboadmin使用手册对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Dubbo的基本使用
- 2、dubbo-环境隔离
- 3、dubbo调用问题之序列化
- 4、dubbo系列之-qos运维-2021-01-17
- 5、Dubbo——服务调用、服务暴露、服务引用过程
- 6、如何在linux部署dubbo-admin管理端
Dubbo的基本使用
官网地址:
如果在消费端和服务端都配置了负载均衡策略,以消费端为准。
在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不一样的。
消费者调用一个服务,分为三步:
1.消费者发送请求(饥旁网络传输)
2.服务端执行服务
3.服务端返回响应(网络传输)
如果在服务端和消费端各配置了一个timeout,那就比较复杂了,假设
1.服务执行为5s
2.消费端timeout=3s
3.服务端timeout=6s
那么消费端掉用服务时,消费端会收到超时异常(因为消费端超时了),服务端一切正常(服务端没有超时)。
官网地址:
集群容错表示:服务消费者在掉用某个服务时,这个服务有多个服务提供烂埋橡者,在经过负载均衡后选择其中一个服务提供者之后进液顷行调用,但调用报错后,Dubbo所采取的后续处理策略。
官网地址:
服务降级表示:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。
集群容错和服务降级的区别在于:
1.集群容错时整个集群范围内的容错
2.服务降级时单个服务提供者的自身容错
官网地址:
本地存根:名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在服务消费端执行的,这段逻辑一般都是由服务提供者提供,服务提供者可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。
官网地址:
本地伪装就是Mock,Dubbo中的Mock的功能相对于本地存根更简单一点,Mock其实就是Dubbo中的服务容错的解决方案。
官网地址:
如果当前服务支持参数回调,意思就是对于某个服务接口中的某个方法,如果想支持消费者在调用这个方式时能设置回调逻辑,那么该方法就是需要提供一个入参用来表示回调逻辑
因为Dubbo协议是基于长连接,所以消费者在两次调用同一个方法想指定不同的回调逻辑,那么就需要在调用时在指定一定key进行区分。
官网地址:
理解起来比较容易,主要要理解CompletableFuture,如果不理解,就直接把它理解为Future
其他异步调用方式:
官网地址:
泛化调用可以用来做服务测试。
在Dubbo中,如果某个服务想要支持泛化调用,就可以将该服务的generic属性设置为true,那对于服务消费者来说,就可以不用依赖该服务的接口,直接利用GenericService接口来进行服务调用
官网地址:
实现了GenericService接口就是泛化服务
官网地址:
github地址:
官网地址:
注意动态配置修改的是服务参数,并不能修改服务的协议,IP,PORT,VERSION,GROUP,因为这5个信息是服务的标识信息,是服务的身份证号,是不能修改的。
官网地址:
[img]dubbo-环境隔离
大家在平时开发和测毁纳试阶段定位一些bug的时候,需要调用本地启动的dubbo服务debug。如果与服务器、其他同事共用一个注册中心的话,就会调用到别人的服务或者自己本地的服务被别人调用到,造成一些调用失败或者其他异常。
解决如上问态余清题有大致几种解决方案:
1、dubbo直连;
2、dubbo group 服务分组;
3、dubbo version 版本过渡;
在开发以及测试环境下,经常需要绕过注册中心,只测试指定服务的提供者,这时候可 以使用点对点直连的方式。点对点直连方式,将以服务接口为单位,忽略注册中心的提供者表。A接口配置点对点,不影响B接口从注册中心获取列表。
消费者应用,在注入的提供者api上添加 @Reference(version = "1.0.0", url = "dubbo://ip:port") 即可!
此时,如果提供者不希望本地的服务被别人调用到,设置:dubbo.registry.register=false,默认值是true。该属性含义: 是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
通过服务分组实现环境隔离,不用绕过注册中心,大家可以共用一个注册中心。服务注册分组,使跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。
场景:服务A希望调用到本地的服务B(此时,B服务正常的调用远程服务C),而不是远程服务B。
本地服务B的配置设置如下: //应用全局配置 dubbo.provider.group=local-group //设置本地B所提供的dubbo服务均在local-group分组下如图:
//针对某个Api进行配置
也可以针对某个api单独做分组,例如:@Service(version = "1.0.0",group = "local-group")服务A:在注入的B dubbo服务的api上加 @Reference(version = "1.0.0", group = "local-group") 即可。
服务分组的几个属性解释:
1、dubbo.registry.group=local-group
该值自行定义,确保唯一即可,该属性含义:服务注册分组,跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。 该配置不推荐配置,配置之后服务在dubbo admin上默认无法查看,也调用不到该服 务。不同环境,通过zookeeper做数据隔离。
2、dubbo.provider.group=local-group
该属性含义:服务分组,当一个接口有多个实现,可以用分组区分。该配置使当前服务所有的提供者都在local-group下。也可以只针对某个api做配置@Service(version ="1.0.0",group ="local-group");推荐后者!
3、dubbo.consumer.group=local-group
该配置使当前服务只消费local-group分组下的提供者,建议只针对某个api进行配置即可,例如: @Reference(version ="1.0.0", group ="local-group")
帆前 当一个接口的实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。dubbo.provider.version=1.0 //服务版本, 建议使用两位数字版本,如:1.0 ,通常在接口不兼容时版本号才需要升级。
dubbo.consumer.version=1.0 //消费1.0版本的提供者
可全局配置,亦可配置到某个api服务上,此时优先级大于全局配置。
提供者服务示例:@Service(version ="your version")
消费者api服务示例: @Reference(version ="your version")
dubbo调用问题之序列化
dubbo的版本是2.5.3,接口调用后,provider方接收不到请求,超时后报错:Waiting server-side response timeout by scan timer.详细日志如下:
通过dubbo admin查看providers和consumers,可以找到服务,双方状态正常,dubbo版本也一致。 其实如果接口的provider方异常,调用方直接会收到类似于No provider available 或Forbid consumer access service from registry use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist)的者唤错误提示。
然后,查看接口请求参数,发现其实现了java序列化接口,和错误日志中的序列化方式一致。
后来测试时发现,竟然存在部分请求成功,着重分析后发现请求对象数据存在差异,请求对象衡嫌州的类定义中部分自定义域没有实现序列化接口。之前调用成功的请求中,其请求参数中未实现序列化的字段值为null。后来测试当整个请求参数不实现序列化时,发现接收方也可以收到请求。
跨服务调用时,传参必须实现序列化,其内部引用的对象也必须序列化。
1.方法的参数没有实现序列化,或其内部引用的对象没有实现序列化。
2.方法返回值没有序列化。(根据错误日志就能看明确发现)
3.调用双方形参版本不一致。(根据错误日志就能看明确发现)
4.注册中心配置错误导致的异常咐蔽。(根据错误日志或dubbo admin可以明确发现)
5.网络异常导致的超时。
dubbo系列之-qos运维-2021-01-17
dubbo自带的运维工具dubbo-admin,主要面向开发人员去管理服务,携带很多管理、控制等功能,然后在dubbo新版本又推出了qos(Quality of Service),主要面向运维管理。我在之前公司有用到次功能,在和k8s结合时,通过http发送主动下线功能(下线注册,但不下线服务),等到流量完全停止,在下线pod,实现平滑发布。
怎么样去管理?
dubbo通过 QosProtocolWrapper 这个包装器实现qos发布,QosProtocolWrapper 是Protocol 三大包装器(filter,listener,qos)其中之一,默认会开启qos功能,可以配置关闭
qos 主要提供了ls,online,offline,help 功能,具体说,只有三种,上下线服务和查看服务
我们跟读一下源码,看看qos 服务的启动,请求处理,上下线等。
在dubbo 生产者服务暴露和消费者消费引用的过程中都会启动qos,并且qos 通过cas来保证一个jvm只启动一次。
同样qos 功能也是通过netty启动server,处理类指定为 QosProcessHandler,这个handler实现了netty的 ByteToMessageDecoder 可以将网络流中的字节解码为对象
channelActive() 方法含有为连接建立的时候回调,这里有个定时任务500ms,会刷一个美体的dubbo给客户端,我们验证下。
我们看看 QosProcessHandler#decode 是扰坦怎么处理请求的。
上面方法讲究,先读取第一个字节判断请求是http 还是 tcp,为什么用第一个字节呢,我们知道http信息头开始为 GET /xx 或者 POST /xx,第一个字符要么G要么P,判断为http 则用http编解码,如果为tcp 则用 LineBasedFrameDecoder 编解码,这是一个换行分割读取的解码方式遇到(\n,\r)[就是telnet时候的回车]时,就截断,如果为tcp 还会添加一个 IdleStateHandler 作为心跳检测,最后处理指令的handler 为 TelnetProcessHandler。
先演示下效果
为了便于观察我们这里看http的处理指令的方式 HttpProcessHandler。
HttpCommandDecoder. decode (msg)会将get或者post请求携带的路径等返回给 commandContext , BaseCommand.class 为指令扩展点会根据uri 传入的指令,来指定要处理的类,优缓败桐点类似策略模式。我们看看offline 是怎么处理的
可以传入枯戚服务,默认所有服务,18行中从注册工厂中获取服务对应的注册中心,然后调用注册中心的unregister() 最后层层调用到zk客户端的delete()方法来,删除zk临时节点。
qos 的功能和简单,之所以单独拿出来讲是因为这里涵盖了我们web开发中常提到的“http服务器”概念,通过netty 启动服务,然后处理请求。
Dubbo——服务调用、服务暴露、服务引用过程
1、InvokerInvocationHandler jdk动态代理
5、RegistryDirector返回Invokers
Router分为:Script 脚本路由、Condition 条件路由
6、通过MockInvokersSelector的route方法(getNormalInvokers)拿到能正常执行的invokers
8、当回到AbstractClusterInvoker后,执行首纳(默认FailoverClusterInvoker,根据配置的是,Failfast Cluster(快速失败) , Failsafe Cluster(失败安全) , Failback Cluster(失败自动恢复) , Forking Cluster(并行调用多个服务器,只要一个成功即返回) , Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错))doInvoker方法
9、FailoverClusterInvoker调用AbstractClusterInvoker的select方法
10、执行doSelect方法
11、调用AbstractLoadbalance的select方法
12、根据配置的负载均衡策略调用对应的(如RoundRobinLoadBalance)类的doSelect方法
13、返回invokers.get()方法
14、调用FailoverClusterInvoker的invoke方法
均继承自抽象类AbstractDirectory
Directory 获取 invoker 是从 methodInvokerMap 中获取的,主要都是读操作,那它的写操作是在什么时候写的呢?就是在回调方法 notify 的时候操作的,也就是注册中心有变化,则更新 methodInvokerMap 和 urlInvokerMap 的值
根据dubbo-admin配置的路由规则来过滤相关的invoker,当我们对路由规则点击启用,就会触发 RegistryDirectory 类的 notify 方法。
notify方法调用refreshInvoker方法。
route方法的实现类为ConditionRoute 根据条件进行过滤
1、调用mathThen方法
2、调用matchCondition方法
3、调用isMatch判断
4、调用isMatchGlobPattern方法
集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是Dubbo Cluster集群的作用。
通过cluster来指定集群容错方式
其实就是应对出错情况采取的策略
用于芹磨有状态服务,尽可能让客户端总是向同一提供者发起调用,除非提供者挂了,再连另一台,自动开启延迟链接,以减少长接数
启动时服务提供者将当前进程启动时间注册到ZK;服务消费者发现该节点后计算服务启动时间(相对当前时间),在默认预热时间的前20%时间内,该节点权重始终固定为2,这样客户端的负载均衡器只会分发极少的请求至节点。
在预热时间之后的80%时间内,该节点权重将随着时间的推移而线性增长;待预热时间到期后,权重自动恢复为默认值100;负载均衡器的内核是一个标准的WLC算法模块,即加权最少连接算法;
如果某个节点Hang住或宕机,其权重会迅速自动调节降低,避免持续性影响;当节点下线时,服务端提前触发权重调节,重载默认权重至1并发布到注册中心,服务消费者将迅速感知到该事件;
服务提供者优雅下线步骤(注意这套逻辑仅在服务端执行)在ok.htm?down=true对应的controller中加入下列逻辑,注意嫌芹斗要判断down是否为true,因为正常来说false表示启动验证而不是关机
服务者消费者配置
dubbo服务支持参数动态调整,例如动态调整权重,但dubbo实现方式较为特殊,并不是常规思路。
ServiceConfig类拿到对外提供服务的实际类ref,然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成具体服务到Invoker的转换(javassistProxyFacory、JdkProxyFactory),接着要做Invoker转换到Export的过程
服务发布:本地暴露、远程暴露
为什么会有 本地暴露 和 远程暴露 呢?不从场景考虑讨论技术的没有意义是.在dubbo中我们一个服务可能既是 Provider ,又是 Consumer ,因此就存在他自己调用自己服务的情况,如果再通过网络去访问,那自然是舍近求远,因此他是有 本地暴露 服务的这个设计.从这里我们就知道这个两者的区别
1、spring启动,解析配置文件
2、创建dubbo标签解析器
3、解析dubbo标签
4、ServiceBean解析
5、容器创建完成,触发ContextRefrestEvent
6、export暴露服务
7、duExportUrls
8、doExportUrlsFor1Protocol
9、getInvoker
10、protocol.export
11、开启服务器 openServer()如nettyServer
12、注册服务到注册中心 registerProvider
Filter 在服务暴露前,做拦截器初始化,在加载所有拦截器时会过滤支队provider生效的数据。
可以。zookeeper的信息会缓存到本地作为一个缓存文件,并且转换成 properties 对象方便使用。建立线程池,定时检测并连接注册中心,失败了就重连。
注册服务到zk其实就是在zk上创建临时节点,当节点下线或者down掉时,即会删除临时节点,从而使服务从可用列表中剔除。
持久节点
临时节点
1、export的时候进行zk订阅
2、设置监听回调的地址,回调给FailbackRegistry的notify
3、创建持久节点
4、设置对该节点的监听
5、更新新的服务信息,服务启动和节点更新回调,都会调用到这里
6、更新缓存文件
7、对比新旧信息是否有变化,有则重新暴露服务
高并发大业务量情况下,暂时屏蔽边缘业务
MockClusterInvoker
SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。
如何在linux部署dubbo-admin管理端
这个比较简单,编译打包成功后,将dubbo-admin/target/dubbo-admin-2.8.xxx.war 复制到jetty、tomcat下的webapps就算完成部署了(当然,也可以部署到其它姿凯唤兼容的servlet容器,比如jboss、weblogic)
然后浏览: 会提示登陆用户名、密码,迹凯这是在配置文件里写死的,配置文件的路径为:
dubbo-admin/src/main/webapp/WEB-INF/dubbo.propertiesdubbo.registry.address=zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,127.0.0.1:2183
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
即用户名、密码均为root,登录孙培成功后,刷新下页面,如果提示404之类的,退回到浏览(这个跟部署的contextPath有关,如果contextPath设置为/dubbo-admin,刷新下就可以了,如果contextPath设置成/,则登录后要退回/浏览)
关于dubboadmin和dubboadmin使用手册的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。