分布式框架-dubbo

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: 分布式框架-dubbo

一、Dubbo的启动方式

依赖容器:Tomcat容器

使用main方法,代码如下:

  1. import org.springframework.context.support.ClassPathXmlApplicationContext;

  2. import java.io.IOException;

  3. publicclassMainThreadStart{
  4. publicstaticvoid main(String[] args) throws IOException{
  5. ClassPathXmlApplicationContext context =
  6. newClassPathXmlApplicationContext("classpath:spring/spring-context.xml");
  7.        context.start();
  8. // 阻塞主线程
  9. System.in.read();
  10. }
  11. }

运行的结果如下:这就把服务注册到zk上了。

使用内置的main方法:如果用内置的main方法启动的话必须在resources文件夹下创建META-INF/spring的文件夹

源代码中:运用上面的方式必须在resources文件夹下创建META-INF/spring/*.xml对文件。


运行如下:也把服务注册到zk上了。

二、Dubbo的容器

dubbo默认支持的是spring容器,还有日志的log4j,logback的。还有api的。

三、如何去搭建控制台:看服务的调用和整个服务的状态

①、需要从网上去下载这样的项目:这个用来创建管控台和监控台。

总共有三个项目:主要的是下面两个

dubbo-admin:管控台 dubbo-monitor-simple:监控台

②、进行编译:必须需要jdk1.8才能够进行编译

③、部署dubbo的管控台

④、在打包后的application.properties文件中修改对应的配置信息:

通过localhost:7001访问即可:默认账号和密码相同

管控台可以用来做服务的降级,路由,负载均衡,可以查看服务与服务之间的关系

部署监控台

解压上面的.gz文件,进行相应的配置

3、启动监控台:(通过start.bat/start.sh启动)

有相应的注册服务

如果想要让服务能够被监控到,并且生成对应的图表,需要加上上面的配置信息。这样才能在监控中心上显示。

四、服务检查

当启动每一个服务的时候,去检查这个服务能否被订阅上,如果订阅不上这里就会报错

所以一般将消费端的服务检查给取消掉。主要用于服务的循环依赖的时候。

check默认为true。

五、多协议支持

dubbo(默认)单一连接(一个一个的来进行处理),长连接协议(可靠性的协议)。[操作过程中数据量比较小的传输),不适用大文件,视频等的传输。因为tcp主要是靠滑动窗口来保证数据的安全的。很耗时间

hessian:短连接协议(传输数据量比较大的情况,在项目开发中会针对不同流量来进行协议的设定)。

webService协议,rmi协议,http协议,thirft协议。

如何添加多协议支持

①、加相应的配置

②、加入相应的依赖:因为hessian协议是需要jetty容器支持的

  1. <dependency>
  2. <groupId>com.caucho</groupId>
  3. <artifactId>hessian</artifactId>
  4. <version>4.0.7</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.mortbay.jetty</groupId>
  8. <artifactId>jetty</artifactId>
  9. <version>6.1.26</version>
  10. </dependency>

运行的结果如下:这时就有dubbo和hessian协议的,不指定的话每个服务都会注册两个协议的数据

在zk上就相应的配置信息

指定服务暴漏哪个协议上:可以指定一个服务一个协议,一个服务多个协议

六、多注册中心:比如有三个服务,A,C,D服务分别注册到三个注册中心上去。解决不同服务之技的依赖的关系。

这时有一个E服务,上面的三个A,C,D服务都依赖E服务,因为注册中心无法跨服务进行通信的,所以把E服务分别注册到三个注册中心上

配置的信息如下:

指定服务注册到哪个注册中心上去:

七、多版本支持

服务的开发会随着业务的不同而迭代版本:

启动下该服务:

消费端去指定:

八、消费端的异步调用:只支持dubbo协议,异步的调用就是消费不会马上返回效果。当子线程没有返回结果的时候,主线程就已经结束了。用的是java中的Future的异步对象。

只针对dubbo协议有效的,非dubbo协议是没有效的

九、主机问题(解决注册中心上面注册的是服务器名称问题)

源码:ServiceConfig->findConfigedHosts

例如:WeizhoYang:8080/=>    192.168.124.241:8080

默认是动态分配ip地址的可以改为静态的

为true就是动态的,false就是静态的。

下面的就可以指定ip地址了。

十、直连/服务只订阅/服务只注册(针对测试)[开发环境]

服务只订阅:不需要把自己的服务注册上去,只是订阅zk其他的服务

场景:在开发中服务在测试的时候不能直接注册到注册中心上的

本地的服务和服务器上的服务将会形成为一个集群,这个集群就会形成负载,有可能负载到刚好你这台服务器上的时候,然后你把本地的服务给关掉了。

上面的图是场景,首先有两个服务A(开发中),服务A(完善的服务),它俩个服务是同一个接口。如果不只订阅的话都会注册到注册中心上去。这时由消费端去订阅服务端,因为dubbo有自身的负载均衡的策略的,随机获取可用的服务列表,当获取到url2的时候,这时消费端可能会报错的情况,因为开发的服务的可能会在不停的调试。所以用服务只订阅的方式来解决这个问题。

那么这时开发的服务A不会注册到注册中心上,这时消费端如何去测试服务端升级的功能呢?

消费端直连到开发的服务A就可以解决了。

①、在服务的配置文件中添加register="false"就可以了。

②、通过消费端去直连服务端暴漏出接口的url,这样就可以测试开发中的服务。

总结:直连就是绕过了注册中心,而是直接去查找服务。

服务只注册:意思服务只能注册,不能订阅

多的环境下,外部的消费者不能直接消费到里面的注册服务的,只有zk的内部的服务才能够进行调用。由于在A环境和B环境,而在A环境中和B环境中都有注册中心,而在A环境中的注册中心上有A服务和B服务还有C服务,而C服务是依赖A服务的,这时B环境可以依赖C服务的,但是A服务没有在B环境下注册,所以这时B环境去依赖C服务会报错的。所以只需要让C服务只注册就可以了。

服务端的配置

总结:这就是双环境下的问题。因为每个服务既是消费者,又是服务者,两个身份因为不管多注册中心,和单个注册中心的话,都会找相同的服务进行负载的。服务只注册针对的是测试环境,B环境对C服务只是直连的关系,B环境消费C服务是消费不了的,但是可以依赖C服务,所以在只订阅和只注册中直连都会用到。

负载均衡(配置实现)

在dubbo中负载均衡的几种方式:

所有的负载均衡的策略:父类AbstractLoadBalance ①、static int calculateWarmupWeight(int uptime, int warmup, int weight) 这个方法主要计算负载均衡的权重的。

②、publicInvokerselect(List<invoker> invokers, URL url, Invocation invocation) 这个方法主要用来根据invokers和url通过负载均衡算法机制选择一个调用器Invoker。这个类中用了模板的设计模式,抽像类的,抽象类中可以定义抽象方法的。

③、protected abstractInvokerdoSelect(List<invoker> invokers, URL url, Invocation invocation); 这个方法由在具体的负载均衡的类中进行实现的,通过调用select方法然后调用doSelect方法来选择具体的负载均衡机制。

④、protected int getWeight(Invoker invoker, Invocation invocation)  这个方法是调用权重的方法 具体的负载均衡的类中:有一致性hash(通过接口中不同的方法名来进行hash,然后从中选择一个可用的服务来进行实现),最小的响应时间,随机的负载,轮询的方式负载。

演示负载均衡:

启动两个provider的服务

启动第一台的时候就把provider的服务给注册上去。


启动第二台的时候就发现dubbo服务下面多出来一个链接

随便启动一台的消费端,下面的结果就是随机的负载均衡。

默认的负载均衡策略是RandomLoadBalance->random

RoundRobinLoadBalance ->roundrobin 轮询负载均衡

LeastActiveLoadBalance->leastactive 最小的响应时间进行负载,这个性能最高

ConsistentHashLoadBalance->consistenthash 一致性hash负载(环形结构,虚拟结点)

当其中一个命中的话,其他的都会命中这个因为是个环形结构为了保证高可用性,也可以保证数据的不丢失。在环上按照均匀的去分布。

消费端配置负载均衡策略:

测试下:

十一、服务调用超时问题

1、建议开发的服务都设置重试的次数和超时时间,一般设置不大于5秒,写个3000ms就可以了。

2、在集群中配置集群容错的策略:

Failover cluster:失败的时候将自动切换并重试其他的服务器,通过retries=2来设置重试的次数,在消费端配置。

Failfast:快速失败,只发起一次调用,写操作,比如新增记录,非幂等的请求。

Failsafe  cluster:失败安全,出现异常信息直接忽略掉异常,主要用于日志操作出现异常情况。

Failback  cluster:失败自动恢复,后台记录失败请求,定时重发这个消息(主要用于消息推送)

Forking cluster:并行调多个服务,只要一个成功就返回,只应用在读数据的时候。

BroadCast  cluster:广播调用所有服务提供者,逐个调用,只要有一个报错就返回异常。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
26天前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
26天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
2天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
15 2
|
25天前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
45 6
|
25天前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
28 6
|
23天前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
23 1
|
1月前
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
130 3
|
1月前
|
机器学习/深度学习 并行计算 Java
谈谈分布式训练框架DeepSpeed与Megatron
【11月更文挑战第3天】随着深度学习技术的不断发展,大规模模型的训练需求日益增长。为了应对这种需求,分布式训练框架应运而生,其中DeepSpeed和Megatron是两个备受瞩目的框架。本文将深入探讨这两个框架的背景、业务场景、优缺点、主要功能及底层实现逻辑,并提供一个基于Java语言的简单demo例子,帮助读者更好地理解这些技术。
79 2
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
52 1
下一篇
DataWorks