Dubbo与SpringBoot的结合

Posted 科技控的自白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo与SpringBoot的结合相关的知识,希望对你有一定的参考价值。

前言

现在java圈子内主要有两种微服务化的方向:以HTTP交互为主的Spring Cloud(听说现在Spring Cloud也走向了rpc的道路)以及以RPC远程调用的Apache Dubbo。

由于现在RPC调用为主流的方式流行且Dubbo的组件较少(对的,我就是这么肤浅),于是我就选择Dubbo为我一开始的学习方向。

准备

必需 

JAVA 环境

注册中心(我选用的是 nacos )

非必需 

Maven 

docker

idea(这个应该是必需的?当然也可以用记事本(滑稽.jpg))

正文

  1. 新建普通的 maven 项目(不勾选任何选项),手动写入 pom 文件,配置项如下
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope></dependency>

其实也可以不要 lombok ,此处只是方便调试。

  1. 新建三个module,分别命名为 api,provider,consumer
  • 模块作用
api -- 普通 maven 项目,用于定义provider以及consumer交互的接口以及规范provider -- Spring Boot 本地项目,用于为 api 中定义的服务接口创建实体类consumer -- Spring Boot web 项目,接收用户请求,调用 provider 处理请求并返回结果
  • 模块pom定义

  • 根项目新增

    <modules> <module>api</module> <module>provider</module> <module>consumer</module></modules>
  • api 新增

    <version>0.0.1-SNAPSHOT</version>
  • consumer 新增

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com</groupId> <artifactId>api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency></dependencies>
  • provider 新增

    <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com</groupId> <artifactId>api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency></dependencies>
  • 模块配置文件

  • provider 配置文件

    dubbo: registry: address: nacos://192.168.99.100:8848 application: name: dubbo-provider
  • consumer 配置文件

    spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: 192.168.99.100server: port: 8081 servlet: context-path: /textdubbo: protocol: port: -1 name: dubbo registry: address: nacos://192.168.99.100:8848 cloud: subscribed-services: dubbo-spring-cloud-provider application: name: consumer
  1. 示例搭建(Hello World)
  • 接口 HelloService 构建
package com.api;
public interface HelloService {
String say(String name);}
  • 服务提供类实现
package com.producer;
import com.api.HelloService;import org.apache.dubbo.config.annotation.Service;import org.springframework.stereotype.Component;
@Service@Componentpublic class HelloServiceImp implements HelloService {
@Override public String say(String name) { return "hello,"+name; }}

注意:@Service 注解是 dubbo 的注解,不是 Spring 的注解

  • 服务提供者启动类添加@EnableDubbo注解
@SpringBootApplication@EnableDubbopublic class DubboProducerApplication {
public static void main(String[] args) { SpringApplication.run(DubboProducerApplication.class, args); }
}
  • 消费者实现
package com.consumer;
import com.api.HelloService;import org.apache.dubbo.config.annotation.Reference;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
@RestControllerpublic class TextController { @Reference private HelloService helloService;
@GetMapping("/text") public String text(){ return helloService.say("cartoon"); } }

dubbo 的服务消费应该在消费者中的 Service 层做整合消费后返回处理结果,这里仅为演示。

  1. 运行

先运行 provider 再运行 consumer,否则 dubbo 会因无法找到服务提供者自行关闭消费者。

  • nacos 的结果
  • 插件 RestServices 的模拟调用
后记

虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。 

而个人喜欢接触新技术,nacos 在去年1月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。

以上是关于Dubbo与SpringBoot的结合的主要内容,如果未能解决你的问题,请参考以下文章

springboot下的dubbozookeeper 结合使用

SpringBoot与Dubbo整合的三种方式

springboot项目关于文件的上传与下载

ali的dubbo与springboot

带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)

Dubbo 源码解析08_Dubbo与Spring结合