本博客介绍 Springboot 框架集成 Dubbo 实现微服务的 3 种常用方式, 对于 Dubbo 知识不是很熟悉的, 请先学习我上一篇博客: SpringBoot 系列之集成 Dubbo 实现微服务教程, 本博客只是对上篇博客的补充, 上篇博客已经介绍过的就不重复介绍
还是使用上篇博客的例子, 业务场景:
某个电商系统, 订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试
模块 | 功能 |
---|---|
订单服务模块 | 创建订单等 |
用户服务模块 | 查询用户地址等 |
测试预期结果:
订单服务 web 模块在 A 服务器, 用户服务模块在 B 服务器, A 可以远程调用 B 的功能
例子具体细节, 请参考 SpringBoot 系列之集成 Dubbo 实现微服务教程, 然后所谓的方式不同, 其实主要就是对于配置文件使用的不同, 按照这种差异, 进行分类描述:
application.properties 方式
这种方式, 同样需要导入 dubbo-starter, 然后配置 application 即可
比如我的服务端配置:
- #server.port=7010
- 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=20882
- dubbo.monitor.protocol=registry
- #dubbo.scan.base-packages=com.example.springboot.dubbo
然后对于暴露服务和引用服务, 还是使用 @Service[暴露服务] 使用 @Reference[引用服务]
xml 配置文件方式
在 Springboot 官方建议的还是使用 application 或者其它方式, 不过只是建议, Springboot 还是可以支持 xml 的
以服务提供者配置为例, 新建一个 provider.xml 的配置文件
- <?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.test.dubbo.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.test.dubbo.service.impl.UserServiceImpl"></bean>
- <!-- 连接监控中心 -->
- <dubbo:monitor protocol="registry"></dubbo:monitor>
- </beans>
然后在 application 类或者其它自定义配置类里引用 @ImportResource(locations="classpath:provider.xml")
对于 xml 方式进行使用的, 可以参考我之前博客: Dubbo 系列之服务注册与发现
全注解 API 的方式
接着介绍全注解方式来实现, 也即不使用 application 进行配置, 也不使用 xml 配置文件, 然后一些自定义配置总是要, 那要怎么实现? 这里可以通过写一个 Config 类来实现
- package com.example.springboot.dubbo.service.impl;
- import org.apache.dubbo.config.*;
- import com.example.spring.dubbo.service.UserService;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import java.util.ArrayList;
- import java.util.List;
- @Configuration
- public class MyDubboConfig {
- @Bean
- public ApplicationConfig applicationConfig() {
- ApplicationConfig applicationConfig = new ApplicationConfig();
- applicationConfig.setName("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.test.dubbo.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);
- return serviceConfig;
- }
- /**
- * <dubbo:provider timeout="1000"></dubbo:provider>
- */
- @Bean
- public ProviderConfig providerConfig(){
- ProviderConfig providerConfig = new ProviderConfig();
- providerConfig.setTimeout(1000);
- return providerConfig;
- }
- /**
- * <dubbo:monitor protocol="registry"></dubbo:monitor>
- */
- @Bean
- public MonitorConfig monitorConfig(){
- MonitorConfig monitorConfig = new MonitorConfig();
- monitorConfig.setProtocol("registry");
- return monitorConfig;
- }
- }
每一个组件手动创建到容器中, 让 dubbo 来扫描其他的组件
来源: https://www.cnblogs.com/mzq123/p/12183142.html