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))
正文
-
新建普通的 maven 项目(不勾选任何选项),手动写入 pom 文件,配置项如下
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
其实也可以不要 lombok ,此处只是方便调试。
-
新建三个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.100
server:
port: 8081
servlet:
context-path: /text
dubbo:
protocol:
port: -1
name: dubbo
registry:
address: nacos://192.168.99.100:8848
cloud:
subscribed-services: dubbo-spring-cloud-provider
application:
name: consumer
-
示例搭建(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
@Component
public class HelloServiceImp implements HelloService {
@Override
public String say(String name) {
return "hello,"+name;
}
}
注意:@Service 注解是 dubbo 的注解,不是 Spring 的注解
-
服务提供者启动类添加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public 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;
@RestController
public class TextController {
@Reference
private HelloService helloService;
@GetMapping("/text")
public String text(){
return helloService.say("cartoon");
}
}
dubbo 的服务消费应该在消费者中的 Service 层做整合消费后返回处理结果,这里仅为演示。
-
运行
先运行 provider 再运行 consumer,否则 dubbo 会因无法找到服务提供者自行关闭消费者。
-
nacos 的结果
-
插件 RestServices 的模拟调用
后记
虽然在网上已经有很多这方面的教程,但是大多是用 zookeeper 作为注册中心。
而个人喜欢接触新技术,nacos 在去年1月才由阿里开源出来。而且我比较喜欢 nacos 的界面风格,虽然 nacos 在功能上不如 zookeeper+dubboAdmin 强大,但是作为入门应该是足够的。
以上是关于Dubbo与SpringBoot的结合的主要内容,如果未能解决你的问题,请参考以下文章
springboot下的dubbozookeeper 结合使用