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,我是踩坑的能手

技术选型 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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值