Dubbo创建提供者、消费者项目(dubbo怎么使用)
需要先开启zookeeper和dubbo
Dubbo环境搭建
spring版本
Dubbo服务提供消费者接口搭建
创建Maven项目=> gmail-interface 用于存放共同的服务接口(存放实体bean和接口interface)
创建Maven项目=> user-service-provider
服务提供者(提供接口实现类)(接口的实现类impl)
创建Maven项目=> order-service-consumer
服务消费者(使用到提供者的接口的实现类)(接口的实现类impl)
在接口项目中有自己的引用格式(pom.xml)(可以在其他maven项目中使用接口)(用于在消费者和提供者引用)
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
在消费者和提供者 pom.xml 中引用dubbo,接口项目,zookeeper客户端(也可使用其他的注册中心,可在dubbo官网查询)

<!-- 引入接口项目的接口 --> <dependency> <groupId>com.atguigu.gmall</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 引入dubbo --> <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency>
在消费者(consumer.xml)和提供者(provider.xml)的resources下分别创建两个xml(使用的是spring配置方式配置dubbo和zookeeper)(xml名字随便取,之后使其ioc生效修改名字就行)

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) --> <dubbo:application name="user-service-provider"></dubbo:application> <!-- 2、指定注册中心的位置 --> <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> <!-- 3、指定通信规则(通信协议?通信端口) --> <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> <!-- 4、暴露服务 ref:指向服务的真正的实现对象 --> <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> <!--统一设置服务提供方的规则 --> <dubbo:provider timeout="1000"></dubbo:provider> <!-- 服务的实现 --> <bean id="userServiceImpl01" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean> <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl02" timeout="1000" version="2.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> <bean id="userServiceImpl02" class="com.atguigu.gmall.service.impl.UserServiceImpl2"></bean> <!-- 连接监控中心 --> <dubbo:monitor protocol="registry"></dubbo:monitor> </beans>

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan> <dubbo:application name="order-service-consumer"></dubbo:application> <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> <!-- 配置本地存根--> <!--声明需要调用的远程服务的接口;生成远程服务代理 --> <!-- 1)、精确优先 (方法级优先,接口级次之,全局配置再次之) 2)、消费者设置优先(如果级别一样,则消费方优先,提供方次之) --> <!-- timeout="0" 默认是1000ms--> <!-- retries="":重试次数,不包含第一次调用,0代表不重试--> <!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 --> <dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" timeout="5000" retries="3" version="*"> <!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> --> </dubbo:reference> <!-- 配置当前消费者的统一规则:所有的服务都不检查 --> <dubbo:consumer check="false" timeout="5000"></dubbo:consumer> <dubbo:monitor protocol="registry"></dubbo:monitor> <!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> --> </beans>
启动检查
超时(timeout,ms,设置提供者消费者使用超时时间,精确优先(方法先,接口后),消费者优先,)
重试(retries,设置重试次数不包括最开始调用,重试会调用其他的提供者)
多版本使用(version)
提供者
消费者
本地存根(消费者先执行部分逻辑,再调用提供者服务)
需要先在接口应用处写上接口
再在提供者位置上实现接口

public class UserServiceStub implements UserService { private final UserService userService; /** * 传入的是userService远程的代理对象 * @param userService */ public UserServiceStub(UserService userService) { super(); this.userService = userService; } @Override public List<UserAddress> getUserAddressList(String userId) { // TODO Auto-generated method stub System.out.println("UserServiceStub....."); if(!StringUtils.isEmpty(userId)) { return userService.getUserAddressList(userId); } return null; } }
提供者配置(stub):
springboot版本
SpringBoot与dubbo整合的三种方式:
1)、导入dubbo-starter,在主运行方法上使用@EnableDubbo在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】
2)、保留dubbo xml配置文件(spring中的xml配置);
导入dubbo-starter,使用@ImportResource导入dubbo的配置文件(@ImportResource(locations="classpath:provider.xml"))即可
3)、使用注解API的方式:
将每一个组件手动创建到容器中,让dubbo来扫描其他的组件
第一种方式(使用@Service【暴露服务】使用@Reference【引用服务】)
导入依赖(接口依赖,dubbo-spring-boot-starter依赖)(包含了dubbo,zookeeper)
<dependency>
<groupId>com.atguigu.gmall</groupId>
<artifactId>gmall-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
在application.properties中配置dubbo

dubbo.application.name=user-service-provider dubbo.registry.address=127.0.0.1:2181 dubbo.registry.protocol=zookeeper dubbo.protocol.name=dubbo dubbo.protocol.port=20881 dubbo.monitor.protocol=registry dubbo.scan.base-packages=com.atguigu.gmall
提供者:
在springboot的主运行方法下开启dubbo的注解功能(@EnableDubbo)
将提供者的 spring包下的注解@service换为@Component
并使用dubbo包下的注解@service(将接口暴露到dubbo中,能给其他应用提供接口)
这样就不需要大量的在springboot中配置了
消费者
开启springboot主运行方法中的dubbo注解(@EnableDubbo)
在dubbo中远程引用其他应用的接口
将@Autowired改为@Reference
application.xml(因为监控中心使用的是8080端口,所以应用我们使用8081端口)

server.port=8081 dubbo.application.name=boot-order-service-consumer dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.monitor.protocol=registry
负载均衡(根据什么规则分配任务给各个服务器,提供者,消费者都可以定义)
dubbo高可用机制(zk宕机,dubbo直连,负载均衡,服务降级,集群容错整合hystrix)
详情参考
随机权重(dubbo默认)
@Reference(loadbalance="random")
轮询权重
@Reference(loadbalance="random")
最小活跃(最小调用任务时长)
@Reference(loadbalance="leastactive")
第二种方式(和spring配置一样)
导入dubbo-starter
导入依赖(接口依赖,dubbo-spring-boot-starter依赖)(包含了dubbo,zookeeper)
<dependency> <groupId>com.atguigu.gmall</groupId> <artifactId>gmall-interface</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.0</version> </dependency>
保留provider.xml 和 consumer.xml
在消费者(consumer.xml)和提供者(provider.xml)的resources下分别创建两个xml(使用的是spring配置方式配置dubbo和zookeeper)(xml名字随便取,之后使其ioc生效修改名字就行)


在springboot主运行方法上使用
@ImportResource(locations="classpath:provider.xml")
第三种方式(使用config将配置加入容器)
在springboot主运行方法上使用扫描配置
@EnableDubbo(scanBasePackages="com.atguigu.gmall")
使用config配置dubbo

@Configuration public class MyDubboConfig { @Bean public ApplicationConfig applicationConfig() { ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName("boot-user-service-provider"); return applicationConfig; } //<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry> @Bean public RegistryConfig registryConfig() { RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setProtocol("zookeeper"); registryConfig.setAddress("127.0.0.1:2181"); return registryConfig; } //<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol> @Bean public ProtocolConfig protocolConfig() { ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName("dubbo"); protocolConfig.setPort(20882); return protocolConfig; } /** *<dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl01" timeout="1000" version="1.0.0"> <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> </dubbo:service> */ @Bean public ServiceConfig<UserService> userServiceConfig(UserService userService){ ServiceConfig<UserService> 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<MethodConfig> methods = new ArrayList<>(); methods.add(methodConfig); serviceConfig.setMethods(methods); //ProviderConfig //MonitorConfig return serviceConfig; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~