一、阿里放弃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 ServiceConfiggreetingService() { 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 ReferenceConfiggreetingService() { ReferenceConfig referenceConfig = new ReferenceConfig<>(); referenceConfig.setInterface(GreetingService.class); referenceConfig.setVersion("1.0"); return referenceConfig; } }