springboot与dubbo整合入门(三种方式)(代码片段)

ypfbolg ypfbolg     2022-12-11     454

关键词:

Springboot与Dubbo整合三种方式详解

整合环境:

jdk:8.0

dubbo:2.6.2

springboot:2.1.5

项目结构:

技术图片

1、搭建项目环境:

  (1)创建父项目与三个子项目,创建项目时,都使用spring initializr,创建时,父项目中注意的一点:

  技术图片

  (2)创建三个子项目,在已有的父项目上右键,新建模块;

  (3)创建完成后:将三个子项目在父项目pom.xml中配置:

  技术图片

  (4)修改所有子项目中的parent标签:(删掉之前parent中的springboot)修改为:

  技术图片

  (5)项目创建完成;

2、配置项目dubboservice,只包含接口:

 技术图片

3、第一种方式使用xml文件:

3.1、配置项目dubboserviceimpl(服务提供者):

(1)引入dubbo相关依赖,以及zookeeper客户端依赖,由于需要与其他服务器通信,引入web依赖,pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>top.free</groupId>
        <artifactId>springboot-dubbo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>top.free</groupId>
    <artifactId>dubboserviceimpl</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--依赖dubboservice接口-->
        <dependency>
            <groupId>top.free</groupId>
            <artifactId>dubboservice</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--dubbo与springboot整合依赖-->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
       <!-- zookeeper依赖-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

 

  (2) 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://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="provider" />
    <!--address 注册中心的地址   protocol  指的是注册中心的协议的格式 -->
    <dubbo:registry address="XXXXXXXX:2181" protocol="zookeeper"/>
    <!-- interface告诉注册中心是哪个类型 
         ref说明具体是哪个服务
         timeout连接超时的时间
    -->
    <dubbo:service interface="top.free.dubboservice.TestDubboService" ref="serviceImpl" timeout="60000"></dubbo:service>
    <!--, 配置端口,协议是dubbo,消费者消费的时候必须通过端口来消费,端口可以随便写,但是不能被占用,一个dubbo,独占一个端口 -->
    <dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>
</beans>

(3) 配置实现类ServiceImpl:

技术图片      

package top.free.dubboserviceimpl;
import org.springframework.stereotype.Component;
import top.free.dubboservice.TestDubboService;

@Component
public class ServiceImpl implements TestDubboService 
    @Override
    public String getData(String user) 
        return "你好,我们通信了:"+user;
    

 

(4)主启动类上加上:@ImportResource(locations = "classpath:provider.xml")

 

package top.free;

import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource(locations = "classpath:provider.xml")
public class DubboserviceimplApplication 
    public static void main(String[] args) 
        SpringApplication.run(DubboserviceimplApplication.class, args);
    

(5)在application.properties中加上项目启动的端口号: server.port=8080

3.2、配置dubboweb项目(消费者)

(1)引入dubbo相关依赖,以及zookeeper客户端依赖,由于需要与其他服务器通信,引入web依赖,pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>top.free</groupId>
        <artifactId>springboot-dubbo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>top.free</groupId>
    <artifactId>dubboweb</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dubboweb</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>top.free</groupId>
            <artifactId>dubboservice</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

 

 (2)配置controller:

技术图片

 

package top.free.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.free.dubboservice.TestDubboService;

@RestController
public class TestDubboWeb 
    //serviceImpl会显示红色,这个是因为编译时找不到bean注入,不影响结果
    @Autowired
    private TestDubboService servcieImpl;

    @RequestMapping("/test/user")
    public String getData(@PathVariable("user")String user)
        String data =servcieImpl.getData(user);
        return data;
    

 (3)配置消费者的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://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="consumer"/>
    <!--address 注册中心的地址   protocol  指的是注册中心的协议的格式 -->
    <dubbo:registry address="XXXXXXXX:2181" protocol="zookeeper"/>
    <!-- 告诉注册中心我需要什么 -->
    <dubbo:reference interface="top.free.dubboservice.TestDubboService" id="serviceImpl"></dubbo:reference>

</beans>

(4)在主启动类上加:@ImportResource(locations = "classpath:consumer.xml")

package top.free;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource(locations = "classpath:consumer.xml")
public class DubbowebApplication 
    public static void main(String[] args) 
        SpringApplication.run(DubbowebApplication.class, args);
    

 (5)在application.properties文件中加上启动的端口号:server.port=8081

 (6)、第一种xml方式配置完成;

(7)、首先在本地安装这三个项目:

技术图片

 (8)、安装完成后就可以起动dubboserviceimpl与dubboweb两个项目,并测试:

技术图片

 4、第二种使用配置类方式(API):pom.xml文件不修改,application.properties文件不做修改(只配置了端口号)

  4.1、服务提供者(项目dubboserviceimpl):配置类DubboProviderConfig(注意与主程序类XXXApplication的位置)

  技术图片

  (1)、配置类代码:

package top.free.config;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DubboProviderConfig 
    /*相当于xml中服务提供者的别名:<dubbo:application name="provider" />*/
    @Bean
    public ApplicationConfig myApplicationConfig()
        ApplicationConfig ac = new ApplicationConfig();
        ac.setName("provider3");
        return ac;
    
    /*相当于注册中心配置:<dubbo:registry address="XXXXXXXX:2181" protocol="zookeeper"/>*/
    @Bean
    public RegistryConfig myregistryConfig()
        RegistryConfig rc = new RegistryConfig();
        rc.setAddress("XXXXXXXX:2181");
        rc.setProtocol("zookeeper");
        return rc;
    
 /*相当于暴露服务的协议以及端口:<dubbo:protocol name="dubbo" port="20881"></dubbo:protocol>*/
    @Bean
    public ProtocolConfig myProtocolConfig()
        ProtocolConfig pc = new ProtocolConfig();
        pc.setName("dubbo");
        pc.setPort(20888);
        return pc;
    
    /*在实现类上加注解来代替:暴露的服务<dubbo:service interface="top.free.dubboservice.TestDubboService" ref="serviceImpl" timeout="60000"></dubbo:service>*/

(2)、实现类:注意这里使用的@Service注解是Dubbo的service注解,标志这个类时提供服务的类

技术图片

(3)、主程序类上加入@EnableDubbo扫描所有包下使用dubbo提供的注解类(或者@EnableDubbo(scanBasePackages = "top.free.dubboserviceimpl")只扫描特定包下有没有使用dubbo提供的注解),注意:注释掉第一种方式加载的xml文件;

技术图片

4.2、配置消费者(dubboweb项目):配置类DubboConsumerConfig

技术图片

(1)、配置类代码:

技术图片
package top.free.config;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DubboConsumerConfig 
    /*相当于consumer.xml中的:<dubbo:application name="consumer"/>*/
    @Bean
    public ApplicationConfig myapplicationConfig()
        ApplicationConfig ac = new ApplicationConfig();
        ac.setName("consumer3");
        return ac;
    
    /*相当于:<dubbo:registry address="39.108.125.227:2181" protocol="zookeeper"/>*/
    @Bean
    public RegistryConfig myregistryConfig()
        RegistryConfig rc = new RegistryConfig();
        rc.setAddress("39.108.125.227:2181");
        rc.setProtocol("zookeeper");
        return rc;
    
/*使用注解方式来代替:<dubbo:reference interface="top.free.dubboservice.TestDubboService" id="serviceImpl"></dubbo:reference>*/
消费者配置类代码

(2)、在Controller的属性上加注解@Reference:注意,是dubbo提供的注解,用于标志需要引用的服务

技术图片

(3)、在主启动类上加:@EnableDubbo扫描使用dubbo提供的注解,注释第一种方式加载的xml(我试过,消费者好像不加@EnableDubbo也可以,提供者必须加);

技术图片

(4)、启动dubboserviceimpl和dubboweb两个程序,并测试:

技术图片

5、第三种方式:属性文件方式:

  5.1、服务提供者(dubboserviceimpl项目):

  (1)把第二种方式中,配置类文件让它不要被加载:(注释掉这个注解,不需要这个类)

技术图片

  (2)实现类不变:如下图:使用@Service来标志提供的服务

  技术图片

  (3)主程序类不变,与第二种方式一致,如下:

  技术图片

  (4)在application.properties文件中加入如下:

#别名
dubbo.application.name=prodiver2
#注册中心zookeeper地址
dubbo.registry.address=XXXXXXXX:2181
dubbo.registry.protocol=zookeeper
#暴露的服务端口与协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

server.port=8080

 

5.2、消费者(dubboweb项目):

(1)把第二种方式中,配置类文件让它不要被加载:(注释掉这个注解,不需要这个类)

技术图片

(2)、Controller服务调用与第二种方式一致,如下:使用@Reference来表明需要引用服务的属性

技术图片

(3)主配置类不变(与第二种方式一致),如下:

技术图片

(4)application.properties属性文件中:

#消费者别名
dubbo.application.name=consumer
#注册中心zookeeper地址与协议
dubbo.registry.address=zookeeper://39.108.125.227:2181
dubbo.registry.protocol=zookeeper

server.port=8081

 (5)启动测试:

技术图片

6、至此三种方式整合完成;

springboot与dubbo整合的三种方式

...服务,使用@Reference来引用服务。具体可参考 Dubbo整合SpringBoot,这里截取部分代码方便理解。属性在application.properties中配置服务提供方使用@Service注 查看详情

dubbo从入门到精通与springboot集成的三种方式(十一)(代码片段)

1 方式一(注解方式)导入dubbo-starter,在application.properties配置属性,使用@Service【暴露服务】使用Reference【引用服务】新版本的dubbo 是@DubboService 和@DubboReference然后在启动类上面 标 @EnableDubbo 开启基于注解的du... 查看详情

springboot整合dubbo的第三种方式——xml配置+@importresource

...官方文档2.三个工程2.1公共接口工程参考这篇文章:SpringBoot整合Dubbo的第一种方式2.2服务提供者首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)。spring.application.name=boot-user-service-provider#dubb... 查看详情

springboot整合dubbo的第三种方式——xml配置+@importresource(代码片段)

...官方文档2.三个工程2.1公共接口工程参考这篇文章:SpringBoot整合Dubbo的第一种方式2.2服务提供者首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)。spring.application.name=boot-user-service-provider#dubb... 查看详情

dubbo入门学习-----dubbo整合springboot(代码片段)

springboot节省了大量的精力去配置各种bean,因此通过一个简单的demo来整合springboot与dubbo一、创建boot-user-service-provider本篇博文基于上篇中的dubbo项目,整体工程如下:1、pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven... 查看详情

手把手教你dubbo与springboot常用两种方式整合

一、Dubbo整合SpringBoot的方式(1) 1)直奔主题,方式一:  pom.xml中引入dubbo-starter依赖,在application.properties配置属性,使用@Service【暴露服务】使用@Reference【引用服务】,选取的是application.properties+部分注解的方式来完成。 ... 查看详情

一springboot整合dubbo光速入门

0、docker启动zkdocker-compose.ymlversion:'3'services:zoo1:image:zookeeperrestart:alwayshostname:zoo1ports:-2181:2181docker-composeup-d1、创建父pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns= 查看详情

dubbo远程调用(rpc)-->快速入门+管理控制台+整合springboot开发(代码片段)

...制台1.jar包部署管理平台2.war包部署管理平台四、Dubbo开发SpringBoot1.Dubbo文档查询2.架构模型3.代码实现五、Du 查看详情

springboot与dubbo整合

1.添加依赖 <!--SpringBootDubbo依赖--> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>$dubbo 查看详情

springboot整合dubbo注解方式

工程结构:主pom<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/ 查看详情

springboot与dubbo整合遇到的坑

整合环境:dubbo2.6.2springboot2.1.5遇到的问题:服务一直无法注册到zookeeper注册中心项目结构:使用application.properties文件:配置都没问题,启动的时候也没有明显的错误;然后就去百度看到大部分都是这种配置,之后在一篇博客中... 查看详情

springboot整合dubbo

通过三个工程演示整合过程工程一:API工程:服务端与客户端共同需要引入的工程  pom:无特殊依赖,下边内容供服务端与客户端引用此工程使用<groupId>com.boot.dubbo.demo</groupId><artifactId>dubbo-api</artifactId><v... 查看详情

springboot整合dubbo的第二种方式——api(自定义configuration配置类)

...官方文档2.三个工程2.1公共接口工程参考这篇文章:SpringBoot整合Dubbo的第一种方式2.2服务提供者首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)。spring.application.name=boot-user-service-provider#dubb... 查看详情

springboot整合dubbo

SpringBoot整合Dubbo一、Dubbo  Dubbo是一款高性能、轻量级的开源JavaRPC框架,  它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。    关键点介绍:  1.注册与发现  ... 查看详情

springboot整合dubbo的第二种方式——api(自定义configuration配置类)(代码片段)

...官方文档2.三个工程2.1公共接口工程参考这篇文章:SpringBoot整合Dubbo的第一种方式2.2服务提供者首先我们注释掉配置文件中的相关内容,只留下应用名(不留也可以)。spring.application.name=boot-user-service-provider#dubb... 查看详情

springboot开发案例之整合dubbo分布式服务

前言在SpringBoot很火热的时候,阿里巴巴的分布式框架Dubbo不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本Dubbox,整合方式也是使用的xml配置方式。改造前之前在SpringBoot中使用D... 查看详情

springboot开发案例之整合dubbo分布式服务

前言在SpringBoot很火热的时候,阿里巴巴的分布式框架Dubbo不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本Dubbox,整合方式也是使用的xml配置方式。改造前之前在SpringBoot中使用D... 查看详情

springboot开发案例之整合dubbo分布式服务

前言在SpringBoot很火热的时候,阿里巴巴的分布式框架Dubbo不知是处于什么考虑,在停更N年之后终于进行维护了。在之前的微服务中,使用的是当当维护的版本Dubbox,整合方式也是使用的xml配置方式。改造前之前在SpringBoot中使用D... 查看详情