springboot dubbo 多模块项目dubbo提供者和消费者配置及代码

注:本文只是介绍我成功使用springboot dubbo 多模块项目的配置及核心代码,若问题没得到解决或需要可运行的源码,文章末尾有说明

springboot集成dubbo过程坑太多,dubbo提供者和消费者分别在单独的springboot程序中使用成功(各种坑),结果后面用springboot多模块开发,将dubbo提供者、消费者springboot程序分别作为一个模块集成近来,之前还可以的duboo消费者又出问题了,@Reference注解无效报空指针null问题!简直无语+崩溃。

又花了大半天网上找来找去加上自己摸索尝试终于解决问题,springboot多模块集成dubbo成功!赶紧做笔记记录下来。

springboot 集成 dubbo 提供者比较简单基本没什么问题,而消费者的@Reference注解就有一堆的坑,各种出幺蛾子。(当然,吐槽归吐槽,dubbo还是非常棒的,感谢阿里开发dubbo团队。)

关于dubbo版本依赖选择

网上见的比较多的2个版本dubbo依赖

        <!-- dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

		<!-- dubbo依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
            <!-- 避免依赖冲突,也就是避免阿里巴巴的dubbo中自带的spring依赖跟我们自己添加的依赖产生冲突 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

不在springboot dubbo多模块项目中,上面2个版本的dubbo依赖我都成功使用过,但是在多模块项目中 spring-boot-starter-dubbo这个版本dubbo依赖死活不成功(当然是我没有找到正确的方法),后面改用 dubbo-spring-boot-starter 版本依赖在springboot dubbo多模块项目中成功启动运行.

下面介绍我在springboot dubbo多模块项目中集成dubbo的提供者、消费者 配置和核心代码

springboot集成dubbo的 提供者 和 消费者 的配置及部分核心代码
  • dubbo服务接口
package com.example.springbootapi.dubbo.service;

/**
 * @author
 */
public interface UserService {
    public String print(String s);
}

  • dubbo提供者

pom.xml (dubbo依赖、zookeeper依赖、zkclient依赖)

        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>compile</scope>
        </dependency>

springboot配置文件 application.properties

server.port=9991
#应用名
spring.dubbo.application.name=provider
#dubbo依赖版本为dubbo-spring-boot-starter时,dubbo提供者必须有这个server=true
spring.dubbo.server=true
#注册中心地址
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
#协议端口
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#扫描包,接口服务实现的包,根据个人接口服务类所在位置自己做修改
spring.dubbo.scan=com.example.springbootserver.service

dubbo实现接口服务类

package com.example.springbootserver.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.example.springbootapi.dubbo.service.UserService;
import org.springframework.stereotype.Component;

@Service(interfaceClass = UserService.class)
@Component
public class UserServiceImpl implements UserService {
    @Override
    public String print(String s) {
        return "say:" + s;
    }
}

springboot启动入口启动类

package com.example.springbootserver;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubboConfiguration
@SpringBootApplication
public class SpringbootserverApplication {

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

}

  • dubbo消费者

pom.xml (dubbo依赖、zookeeper依赖、zkclient依赖)

        <!-- dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>compile</scope>
        </dependency>

springboot配置文件 application.properties

server.port=9992
#dubbo消费者配置放在dubbo-consumer.xml中

dubbo-consumer.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://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="client"/>
    <dubbo:registry address="zookeeper://127.0.0.1:2181" timeout="60000"/>
    <!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。url="dubbo//172.16.1.112:20880"-->
    <dubbo:consumer check="false" />

    <!--reference 采用xml配置实现,在代码中获取远程服务需要加注解@Autowired-->
    <dubbo:reference id="UserService" check="false"  interface="com.example.springbootapi.dubbo.service.UserService"/>

    <!-- 需要使用到提供者服务的包路径,多个包时用逗号隔开。注: 网上好多这里写错了 -->
    <dubbo:annotation package="com.example.springbootclient.controller"/>
</beans>

dubbo远程服务获取

package com.example.springbootclient.controller;

import com.example.springbootapi.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author
 */
@Controller
public class UserController {
    //reference 在xml配置,这里需要用注解Autowired
    @Autowired
    public UserService userService;

    @RequestMapping("/test")
    @ResponseBody
    public String test(){
        String s = userService.print("hhhhhhhhhhh");
        return s;
    }
}

springboot启动入口启动类

package com.example.springbootclient;

import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;

/**
 * 消费者: 先扫描dubbo 然后 扫描spring
 * @author
 */
@EnableDubboConfiguration
@ImportResource(locations = {"classpath:dubbo-consumer.xml"})
@ComponentScan(basePackages = "com.example.springbootclient.controller")
@SpringBootApplication
public class SpringbootclientApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootclientApplication.class, args);
    }

}

上面介绍的配置、代码 均来自 我的博文里的 springboot dubbo系列第三篇

最后

本文只是简单将 在springboot 集成dubbo 的提供者和消费者 的配置及部分核心代码展示,以及一些建议。如果能解决读者问题,那是最好了,如果还没有解决的话,可以看下我前面写的springboot 入门系列文章,都有详细开发过程及可以运行的源码。第一、二篇简单入门上手,第三篇介绍springboot dubbo多模块项目开发附源码,第四篇介绍springboot dubbo多模块项目开发有模块既是消费者又是提供者附源码。

若哪里说的不对,请评论指出谢谢!

Dubbo 是一种分布式服务框架,它可以帮助开发者快速构建分布式应用,提供了服务的注册,发现,调用等功能。下面是 Dubbo 消费者提供者配置。 ## Dubbo 提供者配置 Dubbo 提供者需要在服务启动的时候注册到注册中心,以供消费者发现和调用。Dubbo 提供者配置,可以通过 XML 或者注解的方式进行配置。下面是 Dubbo 提供者的 XML 配置示例: ```xml <dubbo:application name="provider" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:service interface="com.example.service.UserService" ref="userService" /> ``` - `dubbo:application`: 配置 Dubbo 应用的名称,用于在注册中心进行标识。 - `dubbo:registry`: 配置注册中心的地址,这里使用了 ZooKeeper 作为注册中心,地址为 `zookeeper://127.0.0.1:2181`。 - `dubbo:protocol`: 配置 Dubbo 的协议和端口号,这里使用了 Dubbo 协议,端口号为 `20880`。 - `dubbo:service`: 配置服务的接口和实现类,`interface` 属性指定了服务的接口,`ref` 属性指定了服务的实现类。可以通过 `timeout`、`loadbalance` 等属性设置服务调用的超时时间和负载均衡策略等。 ## Dubbo 消费者配置 Dubbo 消费者需要从注册中心获取提供者的地址,通过接口调用提供者的服务。Dubbo 消费者配置,同样可以通过 XML 或者注解的方式进行配置。下面是 Dubbo 消费者的 XML 配置示例: ```xml <dubbo:application name="consumer" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <dubbo:reference id="userService" interface="com.example.service.UserService" /> ``` - `dubbo:application`: 配置 Dubbo 应用的名称,用于在注册中心进行标识。 - `dubbo:registry`: 配置注册中心的地址,这里使用了 ZooKeeper 作为注册中心,地址为 `zookeeper://127.0.0.1:2181`。 - `dubbo:reference`: 配置接口的引用,`id` 属性指定了引用的名称,`interface` 属性指定了要引用的接口。可以通过 `check`、`retries` 等属性设置服务的健康检查和重试次数等。 以上是 Dubbo 消费者提供者的基本配置,可以根据自己的需求进行调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值