分布式框架-dubbo

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 分布式框架-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)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
14天前
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
52 3
|
18天前
|
机器学习/深度学习 并行计算 Java
谈谈分布式训练框架DeepSpeed与Megatron
【11月更文挑战第3天】随着深度学习技术的不断发展,大规模模型的训练需求日益增长。为了应对这种需求,分布式训练框架应运而生,其中DeepSpeed和Megatron是两个备受瞩目的框架。本文将深入探讨这两个框架的背景、业务场景、优缺点、主要功能及底层实现逻辑,并提供一个基于Java语言的简单demo例子,帮助读者更好地理解这些技术。
42 2
|
30天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
1月前
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
45 1
|
2月前
|
数据采集 分布式计算 MaxCompute
MaxCompute 分布式计算框架 MaxFrame 服务正式商业化公告
MaxCompute 分布式计算框架 MaxFrame 服务于北京时间2024年09月27日正式商业化!
83 3
|
1月前
|
存储 SQL 消息中间件
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
Hadoop-26 ZooKeeper集群 3台云服务器 基础概念简介与环境的配置使用 架构组成 分布式协调框架 Leader Follower Observer
47 0
|
2月前
|
XML 负载均衡 监控
分布式-dubbo-简易版的RPC框架
分布式-dubbo-简易版的RPC框架
|
1月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
3月前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
107 2
基于Redis的高可用分布式锁——RedLock