Springboot与Dubbo整合

基于 dubbo-spring-boot-starter整合方式

定义接口

public interface DemoService {
    String sayHello(String name);
}

添加maven依赖

<dependencies>

        <dependency>
            <!--common存放公共的接口类和实体的模块-->
            <artifactId>common</artifactId>
            <groupId>com.heron</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--监控包,引入主体依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!--处理properties ,xml配置文件的时候使用-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
        </dependency>

        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.6</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <!--Curator是Netflix公司开源的一套Zookeeper客户端框架-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.13.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.5</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

服务提供者

@Service(version = "1.0.0")  //dubbo的注解
	public class DefaultDemoServiceImpl implements DemoService {

		@Value("${dubbo.application.name}")
		private String serviceName;

		public String sayHello(String name) {
			System.out.println("收到请求···");
			return String.format("[%s] : Hello, %s", serviceName, name);
		}

	}

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

provider配置

spring:
  application:
    name: dubbo-provider-demo  #应用名 ,也是dubbo.application.name默认的值
dubbo:
  scan:
    base-packages: com.heron.impl  #dubbo扫描的@Service注解作为服务组件的基础包
  protocol:
    name: dubbo  #通讯使用的协议
    port: 12321  #配置 -1 就是随机端口
  registry:
    address: zookeeper://127.0.0.1:2181       #注册中心地址

消费者

@RestController
@EnableAutoConfiguration
public class ConsumerApplication {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Reference(version = "${consumer.service.version}", url = "${consumer.service.url}")
    private DemoService demoService;

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

    @GetMapping("/hello")
    public String runner() {
      logger.info(demoService.sayHello("mercyblitz"));
      return "comsumer info ";
    }
}

消费者配置

spring:
  application:
    name: dubbo-consumer-sample
dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181
    check: true
  consumer:
    methods:
      - name:
consumer:
  service:
    version: 1.0.0
server:
  port: 8090

这种方式使用@Reference 注入调用服务,@Service暴露服务 @EnableAutoConfiguration 启动启动服务
分别启动 zookeeper ,provider ,comsumer ,访问http://localhost:8080/hello即可。

整合优缺点

优点: 使用starter整合的方式简单方便,只需要很少的配置即可。
缺点:无法控制到方法这一粒度层次,例如以下例子,就没有对应的method注解

<dubbo:service interface="com.heron.DemoService" ....">
		<dubbo:method name="sayHello" timeout="1000"></dubbo:method>
</dubbo:service>

还有像多注册中心等。另外dubbo官方文档的配置参数都是基于xml的配置,没有关于注解使用的介绍,对应使用者来说相对不够便利。

SpringBoot中使用xml配置 — 推荐

  1. 配置
    依赖与上面保持一致,但是去掉dubbo-spring-boot-starter的依赖,引入xml文件来定义注册中心和暴露服务,不再使用注解。
    以provider为例,引入 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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://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:application name="dubbo-provider-demo"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="12321" />

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.heron.service.DemoService" ref="demoService" />

    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="com.heron.impl.DefaultDemoServiceImpl" />

    <!-- 包扫描的形式,配合注解暴露服务-->
    <!--<dubbo:annotation package="com.heron" /> -->

</beans>

启动类:

@ImportResource(value = {"classpath:provider.xml"})
@SpringBootApplication
public class ProviderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderServiceApplication.class,args);
        try {
            System.in.read();  //阻塞main方法,防止退出
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其余的编写服务的方式,都一样。值得注意的是,如果没有引入springboot的web依赖,main方法启动完成后会自动退出,所以这里增加了 System.in.read()阻塞main方法,防止退出。 也可以引入springboot的web模块,这样有了tomcat容器就可以在容器中运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值