Dubbo常见用法

Dubbo

Dubbo官方地址:https://dubbo.apache.org/zh/docs/quick-start/

Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,并提供了三大核心能力:面向接口的远程方法调用智能容错和负载均衡,以及服务自动注册和发现

简单来说就是一个管理微服务的框架,只有在分布式框架的时候才会使用,本质上就是一个做服务调用的框架,告别Web Service模式中的WSdl,以服务者与消费者的方式通过Dubbo进行调用注册。

RPC:全称Remote Procedure Call, 即远程过程调用;主要作用是屏蔽网络编程细节,实现调用远程方法就像调用本地方法(同一个进程中的方法)一样的体验。同时屏蔽底层网络通信的复杂性,让我们更加专注业务逻辑的开发。

SOA:是一种思想,一种方法论,一种分布式的服务架构,解决了多服务凌乱问题,SOA架构解决数据服务的复杂程度,同时SOA又有一个名字,叫做服务治理。

Dubbo的流程

Provider:服务提供者

Register:注册中心(Eureka、Consul、Zookeeper)

Consumer:消费者,调用服务方

Monitor:监控,Provider和Consumer 用异步的方式发送信息至Monitor,可以将服务调用信息保存至本地,需要单独配置,若果宕机不会影响服务调用

调用顺序:
在这里插入图片描述

  1. 首先启动注册中心。
  2. 启动服务提供者,服务提供者将自身的ip、端口以及暴露的接口注册到注册中心(如果发生更改将会在将信息自动注册到注册中心)。
  3. 启动服务消费者,消费者将自身的信息注册到注册中心(通过配置可关闭)同时拉取提供者的信息进行保存,(如果提供者的信息发生改变,注册中心将会通知消费者进行更改)
  4. 消费者在拿到提供者的信息之后,如果需要调用接口,将不通过注册中心直接调用提供者。
  5. 消费者和提供者通过异步的方式发送消息至Monitor,Consumer和Provider会将信息存放在本地磁盘,平均1min会发送一次信息。

怎么使用Dubbo?

Dubbo源码地址: git clone https://github.com/apache/dubbo.git

Dubbo支持多种开发模式:xml,注解,与SpringBoot整合

SpringBoot 整合模式

服务提供者

  1. 需要引入spring boot dubbo 启动器
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.8</version>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
</dependency>
  1. 需要在配置类中标明注册中心的地址、服务的通信方式、Dubbo对外暴露的端口号、以及需要扫描的包名
dubbo:
  scan:
    # 包名根据自己的实际情况写
    base-packages: com.dubbo.service
  protocol:
    # 用于消费者调用的端口号 
    port: 20880
    # 消费者调用的通信协议
    name: dubbo
  registry:
    #zookeeper注册中心地址
    address: zookeeper://192.168.0.107:*
  1. 将需要对外暴露的接口实现类加上注解@DubboService

// 该实现类的方法将对外提供
@DubboService
public OrderServiceImpl implements OrderService {
    
}

服务消费者

  1. pom 以及 yml 文件配置和服务提供者的相同。

  2. 在远程调用时需要在调用的接口上使用注解@DubboReference

@Controller
public class OrderController {

    // 该接口将使用远程调用
    @DubboReference
    private OrderService orderService;
    
    public String getOrder (Long orderId) {
        orderService.getOrderById(orderId);
    }
}

配置的优先级

  1. jvm 启动配置
-Ddubbo.timeout=4000
  1. 外部配置中心

  2. 自身程序中方法上的注解

@DubboService(methods = {
        @Method(name = "getOrder",timeout = 3500)
})
4. 自身程序中接口上的注解
```java
@DubboService(timeout=2000)
public class OrderService{
    
}
  1. 自身程序中的配置文件(yml)
dubbo:
    timeout:3000
  1. Dubbo默认配置文件dubbo.propertise
dubbo.timeout=1000

高级用法

启动时检查

在消费者启动时,会去检查依赖的是否可以使用,如果不是可以使用将会不会正常启动

可以通过 check=“false” 来关闭启动时检查

集群容错措施

集群容错

可以通过cluster进行配置

Failover Cluster(失败重试)

当请求失败的时候将自动切换到其他服务器进行请求,但重试会延迟反应时间,不建议设置过多,失败重试为缺省设置,重试次数为2次,也就是当请求失败时一共访问三次服务。

可以通过 retries=“*” 来配置重试次数

Failfast Cluster(快速失败)

当请求失败时,直接结束并抛出异常,通常适用在写入、保存操作。

Failsafe Cluster(失败安全)

当请求失败时,不会抛出异常。

Failback Cluster(失败自动恢复)

当请求失败时,后台会自动记录,并定时重发,通常用在发送短信、邮件业务,不关心返回结果的业务。

Failback Cluster(并行调用多个服务器)

同时向多个服务器发出请求,只有一个返回数据即可,通常用于实时性要求较高的读操作,会消耗大量资源。

Broadcast Cluste(广播调用所有提供者)
逐个调用所有提供者,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

负载均衡

可以通过loadbalance进行配置

Random 加权随机

默认算法,默认权重相同

RoundRobin 加权轮询

按公约后的权重设置轮询比率,循环调用节点

RoundRobin 加权最少活跃调用优先

活跃数越低,越优先调用,相同活跃数的进行加权随机。活跃数指调用前后计数差(针对特定提供者:请求发送数 - 响应返回数),表示特定提供者的任务堆积量,活跃数越低,代表该提供者处理能力越强。

ShortestResponse 加权最短响应优先

在最近一个滑动窗口中,响应时间越短,越优先调用。相同响应时间的进行加权随机。

ConsistentHash 一致性 Hash

相同参数的请求总是发到同一提供者。

服务分组

当一个接口有多种实现时,可以用 group 区分

多版本

可以通过version熟悉进行配置

当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。

可以按照以下的步骤进行版本迁移:

  1. 在低压力时间段,先升级一半提供者为新版本
    2.再将所有消费者升级为新版本
    3.然后将剩下的一半提供者升级为新版本
本地存根

可在消费者方 使用 stub 属性来配置
在服务提供者方实现,在调用接口前后进行拦截。

本地伪装

可在消费者方 使用 mock 属性来配置

在服务提供者方实现,调用接口后抛出了RPCException 异常是,进入本地伪装方法,优先级高于本地存根。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
griddata函数是SciPy库中的一个函数,用于根据给定的数据点在一个多维空间中进行插值。根据报错信息,AttributeError: 'NoneType' object has no attribute 'close',我们可以推断出错误发生在调用close方法的地方,并且该方法试图关闭一个NoneType对象,而NoneType对象是一个空对象,没有close方法。 这个错误通常是由于传递给griddata函数的数据不正确或不完整所引起的。可能的原因包括: 1. 数据点输入不正确:griddata函数需要三个参数:points,values和xi。其中points是一个形状为(N, D)的数组,表示N个D维空间中的数据点;values是一个长度为N的一维数组,表示与数据点对应的值;xi是一个形状为(M, D)的数组,表示需要进行插值的点。如果这些参数中有任何一个不正确或不完整,都可能导致错误。 2. 数据点缺失:如果给定的数据点中存在空值或缺失值,则可能会导致NoneType对象出现。在进行插值之前,应该确保数据点中没有缺失值。 3. 插值方法选择不正确:griddata函数允许选择不同的插值方法,例如'linear'、'nearest'、'cubic'等。如果选择了不支持或不适合的插值方法,也可能引发错误。 为了解决这个问题,我们可以按照以下步骤进行检查和调试: 1. 检查数据点的输入是否正确。确保points、values和xi的形状和类型正确,并且没有缺失值。 2. 尝试使用其他插值方法。如果使用'linear'方法出现错误,可以尝试使用其他方法,例如'nearest'或'cubic'。这可以通过在griddata函数中指定meth参数来实现。 3. 检查SciPy库的版本。有时候,特定版本的SciPy库可能会存在一些bug或问题。升级或降级SciPy库的版本,可能会解决一些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值