springboot整合feign可参考我另外一篇文章SpringBoot集成Feign
1、dubbo简介
Apache Dubbo 最初在 2008 年由 Alibaba 捐献开源,很快成为了国内开源服务框架选型的事实标准框架 ,得到了各行各业的广泛应用。在 2017 年,Dubbo 正式捐献到 Apache 软件基金会并成为 Apache 顶级项目,目前 Dubbo3 已经是一站式的微服务解决方案。可以看到自 SpringCloud Alibaba 2021.0.1.0 起,Dubbo已被移除SpringCloud Alibaba 。目前基本都是使用org.apache.dubbo
,而com.alibaba.dubbo
已被弃用。
2、dubbo解决了什么问题
分类 | dubbo的特性 |
---|---|
高性能RPC调用(主) | 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节 |
服务自动注册与发现 | 支持多种注册中心服务,服务实例上下线实时感知 |
运行期流量调度 | 内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布、同机房优先等功能 |
智能负载均衡 | 内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量 |
高度可扩展能力 | 遵循微内核+插件的设计思想,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现 |
可视化的服务治理与运维 | 提供丰富服务治理、运维工具:随时查询服务元数据、服务监控状态以及调用统计,实时下发路由策略,调整配置参数 |
3、环境准备
系统:windows
JDK:1.8
Maven:3.8.1
Nacos:2.2.0 (下载和使用介绍:【Nacos】SpringBoot集成Nacos)
项目下载模板地址:https://github.com/shengwanping/SpringBoot-dubbo-demo.git
4、项目搭建
1、首先创建一个基于Maven的工程
2、然后创建三个子项目:springboot-dubbo-provider、springboot-dubbo-interface、springboot-dubbo-consumer
,如下
3、每个子项目分别创建如下三个目录:org.dubbo.consumer; org.dubbo; org.dubbo.provider
4、父项目中添加Maven依赖
<!--dependencyManagement 依赖管理,子项目不会继承父依赖,需要重新声明-->
<dependencyManagement>
<dependencies>
<!-- spring-boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.12.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud alibaba依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--com.alibaba.cloud 2.2.7版本有个坑,需要把spring-context-support升到1.0.11才能启动项目-->
<dependencies>
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.11</version>
</dependency>
</dependencies>
5、然后在 springboot-dubbo-consumer 和 springboot-dubbo-provider 两个模块 pom.xml 中进行具体依赖的配置
<dependencies>
<!--引入 springboot-dubbo-interface 接口服务-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springboot-dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- springboot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos 服务的注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 配置中心做依赖管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- dubbo-apache -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
</dependencies>
6、定义服务接口
package org.dubbo;
public interface DemoService {
String sayHello(String name);
}
7、配置服务端yml文件
server:
port: 8010
spring:
# 应用名称(nacos会将改名称作为服务名称)
application:
name: springboot-dubbo-provider
cloud:
nacos:
server-addr: localhost:8848
# 注册中心
discovery:
namespace: public #命名空间,如prod,dev,默认public
# 配置中心
config:
server-addr: localhost:8848
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: nacos://localhost:8848
8、配置消费端yml文件
server:
port: 8011
spring:
# 应用名称(nacos会将改名称作为服务名称)
application:
name: springboot-dubbo-consumer
cloud:
nacos:
server-addr: localhost:8848
# 注册中心
discovery:
namespace: public #命名空间,如prod,dev,默认public
# 配置中心
config:
server-addr: localhost:8848
dubbo:
protocol:
name: dubbo
port: -1
registry:
address: nacos://localhost:8848
9、定义服务端的实现 和 服务端启动类
实现类:
package org.dubbo.provider;
import org.apache.dubbo.config.annotation.DubboService;
import org.dubbo.DemoService;
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
return "Hello " + name;
}
}
启动类:
package org.dubbo.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
10、定义消费端 启动类和调用类
启动类:
package org.dubbo.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
调用类:
package org.dubbo.consumer;
import java.util.Date;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dubbo.DemoService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class Task implements CommandLineRunner {
@DubboReference
private DemoService demoService;
@Override
public void run(String... args) throws Exception {
String result = demoService.sayHello("world");
System.out.println("Receive result ======> " + result);
new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
}
}).start();
}
}
11、分别先后启动 服务启动类 和 消费启动类,当消费启动类控制台看到如下信息则说明成功了。
还可在nacos中看到注入的两个服务
5、总结
简单理解在微服务中使用Dubbo实现RPC远程接口调用,只需要满足如下几个条件:
1、导入org.apache.dubbo
maven依赖。
2、配置基于dubbo的yml
配置文件
3、在启动类加上@EnableDubbo
注解
4、被调用接口实现类使用@DubboService
注解
5、调用接口时使用@DubboReference
注解
参考地址:
https://cn.dubbo.apache.org/zh-cn/overview/what/overview/
https://spring.io/projects/spring-cloud
https://blog.csdn.net/x734400146/article/details/108087926