dubbo不同版本调用模型变更和spirng cloud alibaba dubbo入门实例

1. 前言

本文基于Spring Cloud Version:Spring Cloud Hoxton.SR8,Spring Boot Version:2.3.2.RELEASE,Nacos Version:1.3.3,Dubbo Version:2.7.8

本文是对自己最近学习Spring Cloud alibaba dubbo的一个总结,方便以后查阅。
参考文档:《一文聊透 Dubbo 元数据中心》《浅说 Dubbo 服务自省》《Dubbo 3.0 - 开启下一代云原生微服务》

2. dubbo更新的几个重要变革点

1. 接口即服务

dubbo 2.7.0之前版本之前的服务是接口级的,即 com.abc.UserService 这样一个 Java 接口就表示一个服务,一个应用里能包含多个服务。注册信息和元数据都耦合在一起会有大量的重复信息,会导致注册中心数据量的膨胀,进而增大注册中心的网络开销,直接造成了服务地址推送慢等负面影响。服务上下线会随时发生,变化的其实是注册信息,元数据是相对不变的。

2. dubbo应用级发现以及三大心:注册中心、元数据中心、配置中心

Dubbo 2.7.0版本之后新增在元数据中心、配置中心。

注册中心:注册的则是应用级名称,类似spring cloud。注册中心组侧的信息包括:服务分组、服务版本、服务名、地址列表等。

元数据中心:指的是服务分组、服务版本、服务名、方法列表、方法参数列表、超时时间等,这些信息将会存储在元数据中心之中。

配置中心:配置中心(v2.7.0)在 Dubbo 中承担两个职责:
1、外部化配置。启动配置的集中式存储 (简单理解为 dubbo.properties 的外部化存储)。
2、服务治理。服务治理规则的存储与通知。

在这里插入图片描述

3. Dubbo 服务自省

Dubbo 2.7.5 引入元数据服务,元数据服务也是一个 Dubbo 服务(接口),它用于描述其它 Dubbo 接口的接口(这就是 MetadataService 名字的由来)。Dubbo 虽然2.7.0引入了元数据中心,但是去中心化的元数据服务是更好的选择。
在Dubbo 2.7.5后,注册中心的元数据信息入下:

dubbo.metadata-service.urls=[ "dubbo://192.168.0.114:20889/com.alibaba.cloud.dubbo.service.DubboMetadataService?
anyhost=true&application=nacos-dubbo-provider&bind.ip=192.168.0.114&bind.port=20889&deprecated=false
&dubbo=2.0.2&dynamic=true&generic=false&group=nacos-dubbo-provider
&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService
&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs
&pid=10160&qos.enable=false&release=2.7.8&revision=2.2.3.RELEASE&side=provider&timestamp=1609739497434&version=1.0.0" ]

dubbo.protocols.dubbo.port=20889

preserved.register.source=SPRING_CLOUD

注册中心里的元数据主要包含的则是元数据服务的接口信息,客户端则是通过注册用心获取到这些信息后使用TCP直接去调用服务端的元数据服务端口获取接口相关信息。

在这里插入图片描述

4. Dubbo 3.0 开启下一代云原生微服务

dubbo 3.0 新增了很多新特性,如:引入可扩展的协议HTTP2/protobuf、在请求模型上,新协议将原生支持 Reactive 响应式编程、对云原生 K8s 的支持和 Mesh 支持功能。据说基于dubbo 3.0 核心的 HSF3.0 已在阿里巴巴内部大规模落地,期待该版本早些对外发布。

3. spring cloud alibaba dubbo 入门实例

官方Wiki提醒:目前 Dubbo Spring Cloud 仍处于 preview 阶段,请等待成熟后再应用于生产环境。

服务提供方:nacos-dubbo-provider

配置信息:

spring:
 application:
   name: nacos-dubbo-provider
 cloud:
   nacos:
     server-addr: xx.xx.xx.xx:8848
     discovery:
       group: DUBBO-SERVER
     config:
       file-extension: yml
 main:
   allow-bean-definition-overriding: true

dubbo:
 cloud:
   subscribed-services: '""'
 protocol:
   name: dubbo
   port: -1
 scan:
   base-packages: com.example.nacosdubbo.service

接口实现代码:

@DubboService(timeout = 60000)
public class StudentService implements IStudentService {
    
    
   @Override
   public Student queryByIdno(String idNo) {
    
    
       Student student = new Student();
       student.setIdNo("NO"+idNo);
       student.setAge(13);
       student.setName("张三丰");
       student.setGrade(8);
       student.setClazz(2);
       return student;
   }
}

启动类:

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

}

服务调用方:nacos-dubbo-client

配置:

server:
  port: 6050
spring:
  application:
    name: nacos-dubbo-client
  cloud:
    nacos:
      server-addr: xx.xx.xx.xx:8848
      discovery:
        group: DUBBO-SERVER
  main:
    allow-bean-definition-overriding: true
dubbo:
  cloud:
    subscribed-services: nacos-dubbo-provider
  protocols:
    dubbo:
      port: -1
  consumer:
    check: true
  metadata-report:
    address:

接口调用:

@RestController
public class NacosTestController {
    
    
   @DubboReference
   private IStudentService studentService;
   @RequestMapping("student/{idNo}")
   public Student oneNacosConfig(@PathVariable("idNo") String idNo) {
    
    
       Student student = studentService.queryByIdno(idNo);
       return student;
   }
}

启动类:

@SpringBootApplication
public class NacosDubboClientApplication {
    
    

   public static void main(String[] args) {
    
    
       SpringApplication.run(NacosDubboClientApplication.class, args);
   }
}

猜你喜欢

转载自blog.csdn.net/mapleleafforest/article/details/112179881