分布式中台实践-Dubbo学习之架构讲述

2024-02-16 13:58

本文主要是介绍分布式中台实践-Dubbo学习之架构讲述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Dubbo作为阿里巴巴的一个开源架构,其目标是完成传统程序的分布式部署,为大数据并发提供技术支撑。

1、系统架构

 

消费者:负责订阅注册中心的服务和接收注册中心的通知。另外,消费者能够根据本身的服务记录直接调用生产者的服务。

生产者:对外提供服务和向注册中心注册服务。

注册中心:注册订阅服务和主动发现服务状态并通知。

监控中心:负责监控消费者和生产者的服务调用次数

在消费者、生产者和注册中心维持者长连接,因此注册中心能够及时的了解生产的服务状态,并将其通知到消费者。在生产者和消费者之间的核心因素为通信协议,Dubbo支持的通信协议包括Dubbo、RMI、Hessian、Http、webService、memcached和Redis,其调用都通过代理方式实现。

2、Maven配置

Dubbo项目的版本维护采用Maven,因此在开发之前需要首先配置Maven的依赖关系,配置信息如下:

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.7</version>

</dependency>

3、最佳实践

Dubbo的实现可以采用配置文件和注解,其官方建议采用XML的配置方式实现。

3.1采用组播技术注册生产者

作为一个快速实现的案例,我们定义一个简单的接口和简单的实现,如下:

public interface GreetingsService {

String sayHi(String name);

}

public class GreetingsServiceImpl implements GreetingsService {

@Override

public String sayHi(String name) {

return "hi, " + name;

}

}

消费者为了进行远程调用,必须与服务方公用服务调用接口。另外,服务方必须依托于服务容器,此案例采用Spring+Tomcat作为容器方。

3.2服务实现后需要将其注册到祖册服务中心:

<dubbo:application name="demo-provider" version="1.0"/>

<dubbo:registry address="multicast://224.1.1.1:9090"/>

<dubbo:protocol name="dubbo" port="20880"/>

<bean id="greetingsService" class="com.baeldung.dubbo.remote.GreetingsServiceImpl"/>

<dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService"

ref="greetingsService"/>

具体参数解析:

注册服务地址为:multicast://224.1.1.1:9090

注册协议采用dubbo,接口采用20880

另,将生产服务接口和实现也通过服务实现。

3.3服务消费者注册

<dubbo:application name="demo-consumer" version="1.0"/>

<dubbo:registry address="multicast://224.1.1.1:9090"/>

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService"/>

3.4 启动服务

public class MulticastRegistryTest {

@Before

public void initRemote() {

ClassPathXmlApplicationContext remoteContext

= new ClassPathXmlApplicationContext("multicast/provider-app.xml");

remoteContext.start();

}

@Test

public void givenProvider_whenConsumerSaysHi_thenGotResponse(){

ClassPathXmlApplicationContext localContext

= new ClassPathXmlApplicationContext("multicast/consumer-app.xml");

localContext.start();

GreetingsService greetingsService

= (GreetingsService) localContext.getBean("greetingsService");

String hiMessage = greetingsService.sayHi("baeldung");

assertNotNull(hiMessage);

assertEquals("hi, baeldung", hiMessage);

}

}

当生产者启动时,Dubbo自动将服务注册到服务中心,本机为组播注册。消费者向注册中心订阅,并创建服务代理调用服务方的服务。此外,消费者也可以直接向服务方发起服务,

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService" url="dubbo://127.0.0.1:20880"/>

4、简单注册服务

组播注册服务适用于服务方和消费方在同一局域网的情景,如果在公网上建议采用单独的注册服务。如果在测试环境,则可以通过简单的注册服务实现;如果在生产环境,建议采用zookeeper实现服务注册于发现。

4.1启动简单注册服务

<dubbo:application name="simple-registry" />

<dubbo:protocol port="9090" />

<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService"

ref="registryService" registry="N/A" ondisconnect="disconnect">

<dubbo:method name="subscribe">

<dubbo:argument index="1" callback="true" />

</dubbo:method>

<dubbo:method name="unsubscribe">

<dubbo:argument index="1" callback="true" />

</dubbo:method>

</dubbo:service>

<bean class="com.alibaba.dubbo.registry.simple.SimpleRegistryService"

id="registryService" />

服务方服务注册替换为:

<dubbo:registry address="127.0.0.1:9090"/>

5、集群服务配置

5.1可以通过Zookeeper实现注册服务集群的配置管理,配置如下

<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

另外,在Maven依赖中,需要做如下配置:

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.11</version>

</dependency>

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

5.2Dubbo支持服务集群的另一个特性是在前端支持负载均衡,配置如下:

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService" loadbalance="roundrobin" />

通过以上的特性,Dubbo能够实现注册服务的集群化和服务的集群化,从而能够使得服务实现横向的扩展,最终完成大规模集群的应用。

5.3为了保证服务集群的稳定,Dubbo还实现了服务的容灾处理,包括:

失败重连、失败安全、快速重启、失败回复等技术,保证服务的稳定可靠,其配置方式如下:

<dubbo:service interface="com.baeldung.dubbo.remote.GreetingsService"

ref="greetingsService" cluster="failover"/>

<dubbo:reference interface="com.baeldung.dubbo.remote.GreetingsService"

id="greetingsService" retries="2" timeout="2000" />

通过以上讲述,我们能够看到Dbubbo作为中台的广阔应用前景。当然,此处也会是作为架构的管中窥豹,向服务的协议、服务的调用

远程代理模式、注册服务、监控等服务还没有深入的讲述,本篇文章仅仅作为Dubbo的入门之作,希望能够帮到大家。

参考文献:

http://www.baeldung.com/dubbo

 

 

 

 


这篇关于分布式中台实践-Dubbo学习之架构讲述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714737

相关文章

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n