Springboot 整合dubbo小案例

Springboot 整合dubbo小案例

最近在看dubbo的一些案例,发现dubbo作为一个分布式的SOA服务治理框架,与普通的项目相比,优势多了很多,springboot作为快速构建微服务的王牌框架,我感觉它对于整个spring框架的封装非常好,对于快速构建一个spring程序来说,让我们更加注重于代码的编写,而框架帮你把需要的配置变成了一条龙服务,在Dubbo Spring Boot 工程中,   整合了dubbo和springboot,使dubbo和springboot的使用变得更加简单,只需要几行简单的配置,使用dubbo+springboot变得更加容易,在incubator-dubbo-spring-boot-project 发布0.2.1版本后,去官网看了一个简单的demo,然而作为踩坑的能手,终于在冲破种种阻碍之后,自己整合了dubbo+springboot的一个小demo,也算是自己第一个靠自己看官方demo而搞出来的一个技术,兴奋一下!!!!!!!!

技术选型 Springboot+Dubbo

版本选择 :

        官网的说明是springboot 和dubbo的版本是有兼容性问题的,并指出了明确的版本对应依赖

我们使用springboot 2.0.3 +incubator-dubbo-spring-boot-project  0.2.1 这个是dubbo整合springboot项目的一个模块

话不多说,上代码,我使用的编辑器是IDEA,使用Eclispe也是一样的道理,只是构建maven的界面有些不一样

父工程目录如下:

项目的父目录:pom工程没有什么实际用途,idea中一次只能编辑一个项目,使用一个空的项目,只是为了方便同时管理3个模块

api模块:jar工程,主要是提供POJO类,服务者和消费者通信使用的公共接口,整合mybatis的话可以将mapper文件放到这里,将来有其他模块的话可以提供给其他模块使用

生产者模块:jar工程  主要负责公共接口的具体业务实现,只做业务,依靠dubbo向外提供服务

消费者模块:war工程  主要负责根据客户端的具体需求,调用服务,负责接收数据,渲染数据,

建立工程步骤略....

api模块的工程pom文件:只有pojo类和公共的服务接口,所以不需要任何依赖

生产者模块的pom文件:

 <dependencies>
        <!-- Spring Boot dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-actuator</artifactId>
            <version>0.2.1-SNAPSHOT</version>
        </dependency>
<!-- 依赖api模块,消费者和生产者都需要api模块的依赖-->
        <dependency>
            <groupId>bootdubbodemo2</groupId>
            <artifactId>bootdubbodemo2-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>

    </build>

其中springboot的依赖和dubbo-spring-boot-project的依赖如果下载不下来的话,可以直接去github上把相应的版本下载下来,然后安装到本地仓库,下载地址链接:https://pan.baidu.com/s/1uY85EsOjGfsGQD1urxmj7A 密码:z1gk  注意版本是0.2.1

springboot下载不下来的话建议更改maven镜像或者是换一个网速比较好的地方,我用的maven镜像是

<mirrors>
	 <id>alimaven</id>

	 <name>aliyun maven</name>

	 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>

	 <mirrorOf>central</mirrorOf>
  </mirrors>

将dubbo-spring-boot-project下载下来之后,复制到本地仓库解压,shift+右键打开命令窗口 执行mvn install 安装到本地仓库

注:依赖的问题一定要解决好,,一定要解决好.....别问我怎么知道的,血一般的教训!!!

消费者模块的pom文件:

 <dependencies>
        <!-- Spring Boot dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.0.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-actuator</artifactId>
            <version>0.2.1-SNAPSHOT</version>
        </dependency>
<!-- 依赖的消费者模块-->
        <dependency>
            <groupId>bootdubbodemo2</groupId>
            <artifactId>bootdubbodemo2-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

pom配置文件搞定之后我们开始写代码,我们先写api模块

看一下整个api模块的目录结构

api模块是提供公共的服务接口的,我们做为演示,这里只有一个接口,接口种只有一个方法

package boot.dubbodemo.service;

public interface TestDubboService {

    String sayHello(String username);
}

有了公共的服务接口我们开始编写生产者的代码:整个生产者的目录结构如下所示:

先看一下我们的配置文件的编写 application.properties文件

# Spring boot application
spring.application.name = dubbo-provider-demo
server.port = 9090
management.server.port = 9091

# Service version  
demo.service.version = 1.0.0

# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages  = boot.dubbodemo.service.impl

# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo

## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880

## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://140.143.15.153:2181

:

主要说明以下几个配置文件:

# Spring boot 的基本配置 生产者工程为非web工程,所以这个可选,如果出错了,就配上....
spring.application.name = dubbo-provider-demo
server.port = 9090
management.server.port = 9091

demo.service.version 这是一个我们自定义的服务版本号,可以随便写,推荐规范的书写

dubbo.scan.basePackages 这个配置只要用来扫描我们向外提供服务的实现类的包


dubbo.application.id 标识dubbo应用的id
dubbo.application.name 标识dubbo应用的name 

dubbo.protocol.id = dubbo写协议的id
dubbo.protocol.name = 标识使用dubbo协议
dubbo.protocol.port = dubbo协议的端口号默认为20880


dubbo.registry.id 注册中心的配置id
dubbo.registry.address = zookeeper://140.143.15.153:2181 注册中心的地址

具体的服务实现的代码

package boot.dubbodemo.service.impl;

import boot.dubbodemo.service.TestDubboService;
import com.alibaba.dubbo.config.annotation.Service;

@Service(
        version = "${demo.service.version}",
        application = "${dubbo.application.id}",
        protocol = "${dubbo.protocol.id}",
        registry = "${dubbo.registry.id}"
)
public class TestDubboServiceImpl implements TestDubboService {

    @Override
    public String sayHello(String username) {
        return "Hello"+username;
    }
}

注意 @Service注解是dubbo提供的,不是Springboot提供的

然后是生产者的启动类,一定要放在一个自己建的包下边,

@SpringBootApplication
public class ProviderApp {

    public static void main(String[] args) {
        new SpringApplicationBuilder(ProviderApp.class)
                .web(false) // 非 Web 应用
                .run(args);
    }
}

至此生产者模块完成!

消费者模块:整个消费者模块的目录结构如下:

消费者的application.properties文件的编写

# Spring boot application
spring.application.name = dubbo-consumer-demo
server.port = 8080

# Service Version
demo.service.version = 1.0.0

# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer-demo
dubbo.application.name = dubbo-consumer-demo

## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20881
#dubbo.protocol.register=true
dubbo.registry.address = zookeeper://140.143.15.153:2181

配置文件跟上边的差不太多,这里就不过多的说了

服务接口的调用类controller

package boot.dubbodemo.controller;
import boot.dubbodemo.service.TestDubboService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestDubboConsumerController {
    @Reference(version = "${demo.service.version}",
            application = "${dubbo.application.id}",
            url = "dubbo://localhost:20880"

            )
    private TestDubboService demoService;

    @RequestMapping("/sayHello")
    public String sayHello(@RequestParam String name) {
        return demoService.sayHello(name);
    }
}

Url是两个dubbo协议之间通信的地址,

@Reference注解可以标注diaoyo呢个该服务时的一些参数,用来调用服务者的服务,这个注解也是dubbo提供的

接下来是消费者启动类

package boostrap;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication(scanBasePackages = "boot.dubbodemo.controller")

public class TestConsumerApp {
    public static void main(String[] args) {

        SpringApplication.run(TestConsumerApp.class,args);
    }

}

scanBasePackages,标注扫描的包路径,用来发现@Reference注解的

接下来我们准备启动服务:启动之前最好把api模块安装到本地 执行api的构建命令 mvn install一下

使用idea比较方便,直接这样搞就可以

出现这个界面就说明构建成功了!

启动项目:

1 启动生产者:

2 启动消费者项目

     接下来我们访问项目的入口在浏览器地址栏输入ip+端口号

demo示例完成!以上的说明,或者是哪些地方有写的不对的,欢迎批评指正!!!!!!!!!!!!!!!!

最后附上官方demo案例的地址

https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md

猜你喜欢

转载自blog.csdn.net/qq_41354631/article/details/81610489