Dubbo学习笔记(三)

目录

一、推荐好文:

二、常用注解

1. @DubboService 注解

2. @DubboReference 注解

3. @EnableDubbo 注解

三、Dubbo配置

3.1 配置原则

3.2 重试次数

3.3 超时时间

3.3.1 Dubbo消费端

3.3.2 Dubbo服务端

3.3.3 配置原则

3.4 启动时检查

3.5 版本号

3.6 本地存根

四、SpringBoot与dubbo整合的三种方式

五、高可用

5.1 zookeeper宕机与dubbo直连

5.2 负载均衡

5.3 服务降级&服务熔断

六、原理篇

七、如何查看历史版本文档:


一、推荐好文:

  • 分布式事务:Seata 微服务架构下的一站式分布式事务解决方案 | Apache Dubbo ★★★★★
  • 核心功能:一文帮你快速了解 Dubbo 核心能力 | Apache Dubbo
  • 版本选择:聚焦稳定性,Dubbo Java 发版规划公布 | Apache Dubbo
  • 2.7.5版本功能:Dubbo Java 2.7.5 功能解析 | Apache Dubbo
  • dubbo融合nacos:Dubbo 融合 Nacos 成为注册中心 | Apache Dubbo
  • dubbo中使用zookeeper:在 Dubbo 应用中使用 Zookeeper | Apache Dubbo
  • Dubbo 与 Spring Cloud 相互调用:微服务最佳实践,零改造实现 Spring Cloud & Apache Dubbo 互通 | Apache Dubbo
  • 新版-dubbo-admin-介绍:新版 Dubbo Admin 介绍 | Apache Dubbo
  • Dubbo Admin服务测试功能 | Apache Dubbo
  • Sentinel 为 Dubbo 服务保驾护航 | Apache Dubbo
  • 平安健康Dubbo3的迁移:平安健康的 Dubbo3 迁移历程 | Apache Dubbo
  • 注解开发:在 Dubbo 中使用注解 | Apache Dubbo  ★★★★★
  • Provider配置:Dubbo 基础用法 - Provider 配置 | Apache Dubbo
  • Consumer配置:Dubbo 基本用法 - Dubbo Consumer 配置 | Apache Dubbo
  • 浅谈rpc:浅谈 RPC | Apache Dubbo
  • Dubbo 2.7 比较重要的三大新特性:Dubbo2.7 三大新特性详解 | Apache Dubbo
  • 集群容错:Dubbo 集群容错 | Apache Dubbo
  • 优雅停机:Dubbo 优雅停机 | Apache Dubbo
  • 负载均衡:Dubbo的负载均衡 | Apache Dubbo
  • 外部化配置:Dubbo 外部化配置 | Apache Dubbo
  • Dubbo-Api-Docs -- Apache Dubbo文档展示&测试工具 | Apache Dubbo

上面的文章都来源于官网的博文,还有很多好的内容值得好好学,如本地调用、心跳方案等等。当然这些文档比较老是一个缺点:

Dubbo学习笔记(三)_第1张图片

  • Dubbo中@EnableDubbo注解原理-CSDN博客
  • Dubbo的简单使用_dubbo使用-CSDN博客
  •  dubbo的常用配置讲解 - 知乎 
  •  https://www.cnblogs.com/darling2047/p/9765341.html
  •  dubbo负载均衡策略(XML、注解、SpringBoot配置)「建议收藏」-腾讯云开发者社区-腾讯云
  •  Dubbo入门与实践-腾讯云开发者社区-腾讯云       
  •  10 Dubbo 配置实战-腾讯云开发者社区-腾讯云
  • dubbo的应用场景与高级特性之高级用法篇-腾讯云开发者社区-腾讯云
  • https://adbycool.blog.csdn.net/article/details/130965383
  • https://aobing.blog.csdn.net/article/details/109018922        
  • https://souyunku.blog.csdn.net/article/details/121635728
  • Dubbo面试题(总结最全面的面试题)-腾讯云开发者社区-腾讯云
  • Dubbo中的常用组件-腾讯云开发者社区-腾讯云
  • 精选Dubbo面试题(43题)-腾讯云开发者社区-腾讯云
  • Dubbo:@DubboService和@Service、@DubboReference和@Reference的区别和关系-CSDN博客
  • 搜B站的dubbo面试视频

二、常用注解

在 Dubbo Spring Boot 开发中,你只需要增加几个注解,并配置 application.properties 或 application.yml文件即可完成 Dubbo 服务定义: 

注解有 @DubboService、@DubboReference 与 @EnableDubbo。其中 @DubboService 与 @DubboReference 用于标记 Dubbo 服务@EnableDubbo 启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径。 

1. @DubboService 注解

@DubboService : 用在服务提供方类上方,暴露服务;@Service注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service注解;定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露

Since: 2.7.7 开始有的,替代了@Service 。

package org.apache.dubbo.samples.annotation.impl;

import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.samples.annotation.AnnotationConstants;
import org.apache.dubbo.samples.annotation.api.HelloService;

@DubboService(version = AnnotationConstants.VERSION,
        timeout = 2000,
        methods = {@Method(name = "sayGoodbye", timeout = 250, retries = 0)}
)
public class AnnotationHelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        System.out.println("provider received invoke of sayHello: " + name);
        sleepWhile();
        return "Annotation, hello " + name;
    }

    public String sayGoodbye(String name) {
        System.out.println("provider received invoke of sayGoodbye: " + name);
        sleepWhile();
        return "Goodbye, " + name;
    }

    private void sleepWhile() {
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

2. @DubboReference 注解

@Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解。(感觉相当于 @Autowired,注入provider到consumer)

Since: 2.7.7 开始有的,替代了@Reference 。

@DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调用。 

package org.apache.dubbo.samples.annotation.action;

import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.Method;
import org.apache.dubbo.samples.annotation.AnnotationConstants;
import org.apache.dubbo.samples.annotation.api.GreetingService;
import org.apache.dubbo.samples.annotation.api.HelloService;

import org.springframework.stereotype.Component;

@Component("annotationAction")
public class AnnotationAction {

    @DubboReference(interfaceClass = GreetingService.class,
            version = AnnotationConstants.VERSION,
            timeout = 1000,
            methods = {@Method(name = "greeting", timeout = 3000, retries = 1)})
    //使用注解@DubboReference生成了greetingService的代理实例,它里面的参数
    //timeout = 3000对greeting生效,timeout = 1000对greeting以外的方法生效。
    private GreetingService greetingService;

    //greetingService实例去调用greeting方法
    public String doGreeting(String name) {
        try {
            return greetingService.greeting(name);
        } catch (Exception e) {
            e.printStackTrace();
            return "Throw Exception";
        }
    }

    //greetingService实例去调用replyGreeting方法
    public String replyGreeting(String name) {
        try {
            return greetingService.replyGreeting(name);
        } catch (Exception e) {
            e.printStackTrace();
            return "Throw Exception";
        }
    }
}

3. @EnableDubbo 注解

@EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上。

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

Spring Boot 注解默认只会扫描 main 类所在的 package,如果服务定义在其它 package 中,需要增加配置 EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})

三、Dubbo配置

3.1 配置原则

Dubbo学习笔记(三)_第2张图片

  1. JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
  2. XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
  3. Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

3.2 重试次数

失败自动切换,当出现失败,重试其它服务器,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

重试次数配置如下:

    

Dubbo学习笔记(三)_第3张图片

“重试”还有另一层含义:当服务器有多台时,会去别的机器上重试。

切记:在一些非幂等操作中,重试次数 retries 一定要设置为0,因为缺省值(默认值)为2。

配置项参考手册 | Apache Dubbo

3.3 超时时间

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间。

3.3.1 Dubbo消费端

全局超时配置


指定接口以及特定方法超时配置

    

3.3.2 Dubbo服务端

全局超时配置


指定接口以及特定方法超时配置

    

3.3.3 配置原则

dubbo推荐在Provider上尽量多配置Consumer端属性:

  • 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等。
  • 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的。

推荐用法 | Apache Dubbo

配置的覆盖规则:

        1) 方法级配置别优于接口级别,即小Scope优先

  2) Consumer端配置 优于 Provider配置 优于 全局配置,

  3) 最后是Dubbo Hard Code的配置值(见配置文档)

Dubbo学习笔记(三)_第4张图片

Dubbo学习笔记(三)_第5张图片

3.4 启动时检查

官网介绍:启动时检查 | Apache Dubbo 

import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Task implements CommandLineRunner {

    @DubboReference(check = false)
    private DemoService demoService;

    @Override
    public void run(String... args) throws Exception {

    }
}

设置 @DubboReference(check = false) 就可以跳过启动时检查,即服务DemoService的提供方没有启动时,也能正常启动消费方的服务。但上面的这段代码显然达不到效果,因为消费方Task实现了CommandLineRunner接口,它在spring boot 初始化后就会执行,会对demoService进行初始化为null,但这时服务提供方还没启动!CommandLineRunner用处请参考:

  • Spring-boot中的CommandLineRunner的作用 - 简书
  • SpringBoot中CommandLineRunner详解(含源码) - 知乎

Dubbo学习笔记(三)_第6张图片

3.5 版本号

网址:多版本 | Apache Dubbo

Dubbo学习笔记(三)_第7张图片

3.6 本地存根

网址:本地存根 | Apache Dubbo 

四、SpringBoot与dubbo整合的三种方式

B站尚硅谷视频第19集:19_尚硅谷_配置_与SpringBoot整合的三种方式_哔哩哔哩_bilibili

官网地址:XML 配置 | Apache Dubbo

                Schema 配置参考手册 | Apache Dubbo 

Dubbo学习笔记(三)_第8张图片

第三种方式(使用注解API的方式)举例:

说明:每一个dubbo标签都对应一个配置类,如标签对应ServiceConfig类。

package com.atguigu.gmall.config;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MethodConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.atguigu.gmall.service.UserService;

@Configuration
public class MyDubboConfig {
	
	@Bean
	public ApplicationConfig applicationConfig() {
		ApplicationConfig applicationConfig = new ApplicationConfig();
		applicationConfig.setName("boot-user-service-provider");
		return applicationConfig;
	}
	
	//
	@Bean
	public RegistryConfig registryConfig() {
		RegistryConfig registryConfig = new RegistryConfig();
		registryConfig.setProtocol("zookeeper");
		registryConfig.setAddress("127.0.0.1:2181");
		return registryConfig;
	}
	
	//
	@Bean
	public ProtocolConfig protocolConfig() {
		ProtocolConfig protocolConfig = new ProtocolConfig();
		protocolConfig.setName("dubbo");
		protocolConfig.setPort(20882);
		return protocolConfig;
	}
	
	/**
	 *
		
	
	 */
	@Bean
	public ServiceConfig userServiceConfig(UserService userService){
		ServiceConfig serviceConfig = new ServiceConfig<>();
		serviceConfig.setInterface(UserService.class);
		serviceConfig.setRef(userService);
		serviceConfig.setVersion("1.0.0");
		
		//配置每一个method的信息
		MethodConfig methodConfig = new MethodConfig();
		methodConfig.setName("getUserAddressList");
		methodConfig.setTimeout(1000);
		
		//将method的设置关联到service配置中
		List methods = new ArrayList<>();
		methods.add(methodConfig);
		serviceConfig.setMethods(methods);
		
		//ProviderConfig
		//MonitorConfig
		
		return serviceConfig;
	}
}

五、高可用

5.1 zookeeper宕机与dubbo直连

现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。

原因:

健壮性

  1. 监控中心宕掉不影响使用,只是丢失部分采样数据
  2. 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  3. 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  4. 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  5. 服务提供者无状态,任意一台宕掉后,不影响使用
  6. 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

高可用:通过设计,减少系统不能提供服务的时间;

Dubbo直连:即直接连接dubbo服务提供方,不经过zookeeper注册中心。相当于直接告诉服务消费方 demoService 所在的位置。

//dubbo直连的写法
@DubboReference(url = "dubbo://127.0.0.1:20880")
@DubboReference(url = "127.0.0.1:20880")
private DemoService demoService;

//不是下面这种写法哦
@DubboReference(url = "zookeeper://127.0.0.1:2181")
dubbo:
  application:
    name: dubbo-spring-boot-demo-consumer

  protocol:
    name: dubbo
    port: -1

#测试dubbo直连时,须注释掉配置文件中指定注册中心的代码,否则会一直找注册中心而报错
#  registry:
#    address: zookeeper://127.0.0.1:2181

  consumer:
    check: false

测试步骤:

  • (1)关掉zk服务server端,并将服务提供方和服务消费方配置文件中指定zk注册中心的代码注释掉;
  • (2)启动Provider服务提供方的应用;
  • (3)配置服务消费方@DubboReference注解的url参数【协议名+服务提供方IP地址+端口号】,协议名dubbo可以省略,然后启动观察效果——可以正常调用。如果不指定这个参数会报如下的错误。

java.lang.IllegalStateException: No such any registry to reference org.wuya.DemoService on the consumer IP地址 use dubbo version 3.1.5, please config to your spring config.

面试题1:注册中心宕机后,服务还可以正常调用吗?

答:可以,因为只要调用过一次后,服务提供者和消费者本地都有了缓存,不需要再经过注册中心,通过本地缓存通讯。

面试题2:没有注册中心,可不可以进行服务调用呢?

答:可以调用,可以采用dubbo直连的方式调用。注册中心其实就是用来保存服务提供者信息的,于是我们完全可以绕过注册中心使用Dubbo直连来完成Dubbo服务调用。

5.2 负载均衡

详见 Dubbo学习笔记(四)——负载均衡与SPI机制-CSDN博客

5.3 服务降级&服务熔断

Dubbo学习笔记(三)_第9张图片

Dubbo学习笔记(三)_第10张图片

在练习时,dubbo整合hystrix后,启动项目总是报错,切换版本也不行,网上搜了也有人遇到同样的问题,但……,可能是依赖冲突,但用Maven helper处理后还不行,看官方文档示例也一样,不管他了。


   org.springframework.cloud
   spring-cloud-starter-netflix-hystrix
   2.2.5.RELEASE

这一块可以看看官方文档内容:(不止下面这两篇)

在大促之前对弱依赖调用进行服务降级 | Apache Dubbo

限流 & 熔断 | Apache Dubbo

微服务实战中如何理解服务熔断和降级的区别_服务熔断和服务降级的区别-CSDN博客

熔断是降级的一种策略
而降级是对于整体的负荷的考虑,资源不够用了就暂停非重要资源的访问。
降级又分为主动降级和被动降级,主动降级:大促时主动关闭非核心业务;被动降级:熔断降级、限流降级等
熔断在一段时间内服务失败率达到阈值触发熔断,触发熔断后的一段时间内客户端将直接返回熔断干预的返回结果,并且会尝试熔断恢复。

六、原理篇

代码架构 | Apache Dubbo

看看尚硅谷视频,少却能讲明白:

  • RPC原理
  • netty通信原理
  • dubbo原理:
    • 1、框架设计:见上面官方链接中。
    • 2、启动解析、加载配置信息—— BeanDefinitionParser、DubboBeanDefinitionParser、DubboNamespaceHandler
    • 3、服务暴露:

Dubbo学习笔记(三)_第11张图片

  • 4、服务引用:

Dubbo学习笔记(三)_第12张图片

  • 5、服务调用:

Dubbo学习笔记(三)_第13张图片

七、如何查看历史版本文档:

Dubbo学习笔记(三)_第14张图片

最好的资料在官网!尤其这种国人开发的软件! 老版本的文档更全。

你可能感兴趣的:(分布式,dubbo)