您的位置:

Dubbo被阿里放弃原因分析

一、阿里放弃Dubbo的原因

Dubbo是阿里巴巴旗下的分布式服务框架,但是在2018年,阿里巴巴宣布放弃对Dubbo的开发和维护,转而支持Apache Dubbo(原名Apache Dubbox)。具体原因如下:

1、项目架构不够透明化

Dubbo使用ZooKeeper作为服务注册中心和调用时的路由管理,这使得Dubbo的内部结构比较难以理解和扩展。而ZooKeeper本身也有着灵活性不够、性能不高等问题。这些问题都限制了Dubbo的扩展和发展。

2、缺少社区支持

尽管Dubbo曾经是国内最火的RPC框架,但是缺少社区支持一直是Dubbo的一个问题。相比之下,Apache Dubbo有着更加活跃的社区,社区成员更加广泛,这使得Dubbo的发展受到了限制。

3、技术栈日益老旧

Dubbo使用的技术栈相对较老,虽然能够满足一般的需求,但是在大数据和AI等领域可能就存在一些不足之处。

二、阿里用什么替代了Dubbo

阿里放弃Dubbo并不代表放弃分布式服务框架,相反,阿里一直在积极推进分布式服务框架的发展。那么,阿里用什么替代了Dubbo呢?以下是3个代表性的框架。

1、Apache Dubbo

Apache Dubbo是在Dubbo基础上演化而来的分布式服务框架,是基于Java实现的RPC框架,其主要特点有:

(1)高性能,低延迟

(2)支持多种序列化方式,包括Hessian、JSON、FST等

(3)支持集群和负载均衡,可扩展性好

(4)支持多种注册中心,包括Zookeeper、Redis、Simple、Multicast等

(5)支持多种协议,包括dubbo、http、hessian等

2、Spring Cloud

Spring Cloud是一个基于Spring Boot的分布式系统开发工具集,其核心组件是Spring Cloud Netflix,常用组件有Eureka、Feign、Ribbon、Zuul等。Spring Cloud能够方便地实现服务注册、服务发现、负载均衡、熔断器等功能。

3、Service Mesh

Service Mesh是一种新兴的微服务网络架构。它提供了一种语义透明的方法,用于发布、维护和管理服务的生命周期。常用的Service Mesh有Istio、Linkerd等。

三、总结

从Dubbo被阿里放弃的原因和阿里用什么替代了Dubbo两个方面来看,Dubbo的发展被内部结构不够透明化、缺少社区支持、技术栈日益老旧等问题所限制。而阿里用Apache Dubbo、Spring Cloud、Service Mesh等技术来替代Dubbo,从而实现分布式服务的发展。随着分布式技术的发展,我们相信未来分布式服务框架将会更加强大和智能,为AI等领域的应用提供更好的支持。

以下是Dubbo的代码示例:

//服务提供者
public class DubboProviderApplication {
 
    public static void main(String[] args) throws Exception {
        SpringApplication.run(DubboProviderApplication.class, args);
 
        //阻塞主线程,避免服务停止
        new CountDownLatch(1).await();
    }
 
    //在ProviderConfig中添加:registry、protocol、service
    @Bean
    public ServiceConfig greetingService() {
        ServiceConfig
    serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(GreetingService.class);
        serviceConfig.setRef(new GreetingServiceImpl());
     
        return serviceConfig;
    }
 
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-provider");
        return applicationConfig;
    }
 
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");//注册中心地址
        registryConfig.setClient("curator");
        return registryConfig;
    }
 
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");//协议名
        protocolConfig.setPort(20880);//协议端口
        return protocolConfig;
    }
 
}
   
  
//服务消费者
public class DubboConsumerApplication {
 
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DubboConsumerApplication.class, args);
        GreetingService greetingService = context.getBean(GreetingService.class);
        String message = greetingService.sayHello("dubbo");
        System.out.println(message);
    }
 
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("dubbo-consumer");
        return applicationConfig;
    }
 
    @Bean
    public ConsumerConfig consumerConfig() {
        ConsumerConfig consumerConfig = new ConsumerConfig();
        consumerConfig.setTimeout(3000);//配置超时时间
        consumerConfig.setCheck(false);
        return consumerConfig;
    }
 
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress("zookeeper://127.0.0.1:2181");//注册中心地址
        registryConfig.setClient("curator");
        return registryConfig;
    }
 
    @Bean
    public ReferenceConfig greetingService() {
        ReferenceConfig
    referenceConfig = new ReferenceConfig<>();
        referenceConfig.setInterface(GreetingService.class);
        referenceConfig.setVersion("1.0");
     
        return referenceConfig;
    }
 
}