Dubbo两小时快速上手教程(直接代码、Spring、SpringBoot)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 最近项目中需要用到dubbo,虽然我知道dubbo是一个RPC框架,但是没有去详细了解这个框架。既然项目要用,那就先把Dubbo的应用给学会,等熟练使用之后,再去了解Dubbo内部的原理。如果想要项目代码,直接联系我即可。如果想要demo代码,直接联系我即可。

听说微信搜索《Java鱼仔》会变更强!


本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦


最近项目中需要用到dubbo,虽然我知道dubbo是一个RPC框架,但是没有去详细了解这个框架。既然项目要用,那就先把Dubbo的应用给学会,等熟练使用之后,再去了解Dubbo内部的原理。如果想要项目代码,直接联系我即可。如果想要demo代码,直接联系我即可。


(一)什么是Dubbo


目前来说,Dubbo是最有名的RPC服务调用框架,他是阿里开源的一个SOA服务治理框架,功能较为完善,支持多种传输和序列化方案。Dubbo最常用的应用就是远程调用。

Dubbo中服务端最核心的对象有四个:


ApplicationConfig:配置当前应用信息


ProtocolConfig:配置提供服务的协议信息


RegistryConfig:配置注册相关信息


ServiceConfig:配置暴露的服务信息


Dubbo客户端中核心的对象有两个:


ApplicationConfig:配置当前应用信息


ReferenceConfig:配置引用的服务信息


(二)Dubbo实战


接下来通过三种方式入门Dubbo。首先会通过代码直接展示dubbo的直连和注册中心实现方式,接着使用Spring和SpringBoot的方式分别展示如何使用Dubbo。


在写dubbo相关代码前,我们首先要定义一个公共的客户端服务,这个服务里存放的是service接口。服务提供者引入这个工程,写实现类,提供dubbo接口;服务消费者引入这个工程,通过这个工程的service接口调用。


因此新建这样一个模块,命名为dubbo-client,整体代码结构如下,只需要写一个service接口即可:


网络异常,图片无法展示
|


User类:

@DatapublicclassUserimplementsSerializable {
privatestaticfinallongserialVersionUID=-9206514891359830486L;
privateLongid;
privateStringname;
privateStringsex;
}

UserService:

publicinterfaceUserService {
UsergetUser(Longid);
}

2.1 直接代码


接下来通过直接代码的方式生成一个dubbo服务,并且用另外一个类去调用这个dubbo服务:


2.1.1 引入依赖


核心依赖就两个,一个dubbo的依赖,另外一个上面的公共接口方法

<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.4.1</version></dependency><dependency><artifactId>dubbo-client</artifactId><groupId>com.javayz</groupId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

2.1.2 编写服务提供者


服务提供者主要配置以下几个属性:


1、application:设置应用的名称等信息


2、protocol :设置服务的协议


3、register:设置服务的连接方式


4、service:将需要暴露的服务注册出来


publicclassDubboProvider {
publicstaticvoidmain(String[] args) throwsIOException {
//暴露UserService服务//1、applicationApplicationConfigapplicationConfig=newApplicationConfig("sample-provider");
//2、protocol -dubbo协议ProtocolConfigprotocolConfig=newProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
//3、register//直连的方式,不暴露到注册中心RegistryConfigregistryConfig=newRegistryConfig(RegistryConfig.NO_AVAILABLE);
//4、serviceServiceConfigserviceConfig=newServiceConfig();
serviceConfig.setInterface(UserService.class);
serviceConfig.setRef(newUserServiceImpl());
//5、将application、protocol、register注册到serviceserviceConfig.setRegistry(registryConfig);
serviceConfig.setProtocol(protocolConfig);
serviceConfig.setApplication(applicationConfig);
serviceConfig.export();
System.out.println("服务已经暴露");
System.in.read();
    }
}

2.1.3 编写服务消费者


消费者的实现主要就三步:


1、配置application:设置应用的名称等信息


2、配置reference:主要配置要引用的信息


3、获取到接口,调用服务。

publicclassDubboConsumer {
publicstaticvoidmain(String[] args) {
//1、applicationApplicationConfigapplicationConfig=newApplicationConfig("sample-consumer");
//2、配置referenceReferenceConfigreferenceConfig=newReferenceConfig();
referenceConfig.setApplication(applicationConfig);
referenceConfig.setInterface(UserService.class);
referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider&timestamp=1618036935244");
UserServiceuserService= (UserService) referenceConfig.get();
Useruser=userService.getUser(1L);
System.out.println(user);
    }
}

先启动提供者,再启动消费者,如果user信息打印出来了就说明调用成功。


这里的Register使用的是直连的方式,我们也可以使用注册中心,这里以zookeeper为例。首先在项目中引入zookeeper相关依赖:

<!--zk客户端依赖:curator--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.13.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.13.0</version></dependency>

服务提供者修改一处地方,将RegistryConfig修改为zookeeper的连接方式

//register//直连的方式,不暴露到注册中心//RegistryConfig registryConfig=new RegistryConfig(RegistryConfig.NO_AVAILABLE);//通过注册中心暴露dubboRegistryConfigregistryConfig=newRegistryConfig("zookeeper://192.168.78.128:2181");

消费者同样修改一处位置,将referenceConfig中的setUrl方法替换为zookeeper:

RegistryConfigregistryConfig=newRegistryConfig("zookeeper://192.168.78.128:2181");
ReferenceConfigreferenceConfig=newReferenceConfig();
referenceConfig.setRegistry(registryConfig);
referenceConfig.setApplication(applicationConfig);
referenceConfig.setInterface(UserService.class);
//referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider&timestamp=1618036935244");

2.2 通过Spring


通过Spring的方式只不过是把上面写在Java中的代码拿到配置文件中去,并把接口注入到Bean容器中,在resource文件夹下新建两个配置文件: provider.xml

<?xmlversion="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:applicationname="sample-provider"/><!-- 使用zookeeper广播注册中心暴露服务地址 --><dubbo:registryaddress="zookeeper://192.168.78.128:2181"/><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocolname="dubbo"port="20880"/><!-- 声明需要暴露的服务接口 --><dubbo:serviceinterface="com.javayz.client.service.UserService"ref="userService"/><!-- 和本地bean一样实现服务 --><beanid="userService"class="com.javayz.example1.service.impl.UserServiceImpl"/></beans>

consumer.xml

<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><dubbo:applicationname="sample-consumer"/><dubbo:registryaddress="zookeeper://192.168.78.128:2181"/><dubbo:referenceid="userService"interface="com.javayz.client.service.UserService"/></beans>

这里的配置文件和上方的代码均一一对应。接着是服务的提供者和消费者: SpringDubboProvider

publicclassSpringDubboProvider {
publicstaticvoidmain(String[] args) throwsIOException {
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("provider.xml");
System.out.println("服务已经暴露");
System.in.read();
    }
}

SpringDubboConsumer

publicclassSpringDubboConsumer {
publicstaticvoidmain(String[] args) {
ClassPathXmlApplicationContextcontext=newClassPathXmlApplicationContext("consumer.xml");
UserServicebean=context.getBean(UserService.class);
System.out.println(bean.getUser(1L));
    }
}

2.3 通过SpringBoot的方式


新建两个SpringBoot项目,一个是服务提供者,一个是服务消费者,引入dubbo的核心依赖

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.4.1</version></dependency>

这里的配置都写在application.properties中,首先是服务提供者:

dubbo.application.name=dubbo-providerdubbo.registry.address=zookeeper://192.168.78.128:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880

服务提供者需要写服务的实现类,这里需要注意@Service注解采用的是dubbo包下:

importcom.javayz.client.entity.User;
importcom.javayz.client.service.UserService;
importorg.apache.dubbo.config.annotation.Service;
importorg.springframework.stereotype.Component;
@Service@ComponentpublicclassUserServiceImplimplementsUserService {
@OverridepublicUsergetUser(Longid) {
Useruser=newUser();
user.setId(id);
user.setName("javayz");
user.setSex("man");
returnuser;
    }
}

接着在启动类上添加一个@EnableDubbo注解即可。


服务的消费者同样是先写一下配置文件:

server.port=8081dubbo.application.name=dubbo-consumerdubbo.registry.address=zookeeper://192.168.78.128:2181

接着通过@Reference注解将service对象引进来

@SpringBootApplicationpublicclassSpringbootconsumerApplication {
@ReferenceUserServiceuserService;
publicstaticvoidmain(String[] args) {
SpringApplication.run(SpringbootconsumerApplication.class, args);
    }
@BeanpublicApplicationRunnergetBean(){
returnargs-> {
System.out.println(userService.getUser(1L));
        };
    }
}

(三)dubbo的常用配置


<dubbo:application/>用于配置当前应用信息<dubbo:register/>用于配置连接注册相关信息<dubbo:protocol/>用于配置提供服务的协议信息,提供者指定协议,消费者被动接受<dubbo:service/>用于暴露一个服务,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心<dubbo:provider/>当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值<dubbo:consumer/>当ReferenceConfig某属性没有配置时,采用此缺省值<dubbo:reference/>用于创建一个远程服务代理

更加具体的配置信息我在官网中找到了,大家可参考:


dubbo.apache.org/zh/docs/v2.…


(四)企业中如何通过dubbo实现分布式调用


在企业中,如果消费者直接通过RPC去调用提供者,理论上需要把提供者的整个Jar包引入到项目中。但是这样的话服务提供这种的其他无关代码也会被引入其中,导致代码污染。


因此实际开发过程中,服务提供者和调用者之间会增加一层Client模块。这个Client中主要写的是Service的接口定义,接口的返回实例对象以及接口的请求实例对象。简单来讲,所有的定义都在Client中完成


使用时,服务提供者引入这个Client,然后写实现方法,服务消费者引入这个Client,然后通过dubbo直接调用即可。


另外企业开发中,可能会出现多个接口实现,这种情况下可以给Service设定group、version等进行区分。


(五)总结


Dubbo的基本使用就这些,Dubbo毕竟只是一个RPC的工具,我们可以用它很方便地暴露、消费服务。但是两个小时也只是会上手使用,它内部的一些配置,一些理念以及最重要的原理都是需要我们自己去深耕的。我是鱼仔,我们下期再见!


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
4月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
100 2
|
21天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
42 6
|
1月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
344 12
|
2月前
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
81 8
|
2月前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
3月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
461 12
|
3月前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
153 10
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
206 5
|
3月前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
86 1