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×tamp=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);
}
}