什么是 Dubbo
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源 Java RPC 分布式服务框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。她最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo 采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
调用关系说明
- 服务容器负责启动,加载,运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供的服务
- 服务消费者在启动时,向注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
Dubbo 功能特点
- 面向接口代理的高性能 RPC 调用: 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节
- 智能负载均衡: 内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量
- 服务自动注册与发现: 支持多种注册中心服务,服务实例上下线实时感知
- 高度可扩展能力: 遵循微内核 + 插件的设计原则,所有核心能力如 Protocol、Transport、Serialization 被设计为扩展点,平等对待内置实现和第三方实现
- 运行期流量调度: 内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能
- 可视化的服务治理与运维: 提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数
1.添加dubbo依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
<version>${spring-cloud-alibaba.version}</version> <!--2021.0.1.0-->
</dependency>
1.1nacos中创建dubbo.yaml
dubbo:
application:
qos-enable: false
qos-accept-foreign-ip: false
registry:
address: spring-cloud://localhost
consumer:
# check为false,则关闭该Consumer下所有服务检查
check: false
- dubbo另一部分我这边写在了本地, nacos中的配置我是用来共享的
1.2 修改bootstrap.yml ,application.yml
- 在bootstrap.yml中最佳dubbo.yaml
- application.yml
dubbo:
protocol:
# dubbo 协议
name: dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
port: 20881
cloud:
# producer 服务名 , "" 为不加载,多个服务名用逗号分隔
subscribed-services: ""
- application.properties
spring.main.allow-circular-references=true
2.创建order-service服务
- pom
这里的service-starter-parent 是我在SpringCloudAlibaba篇(二)自定义的,可以去看一下前面的文章
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudAlibaba2022</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>order-service</artifactId>
<name>${project.artifactId}</name>
<version>${fate.project.version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>top.fate</groupId>
<artifactId>service-starter-parent</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.1创建启动类
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
2.2创建bootstrap.yml ,application.yml
- bootstrap.yml
url:
nacos: localhost:8848
spring:
application:
name: order-service #实例名
profiles:
active: dev
cloud:
nacos:
discovery:
#集群环境隔离
cluster-name: shanghai
#命名空间
namespace: ${spring.profiles.active}
#持久化实例 ture为临时实例 false为持久化实例 临时实例发生异常直接剔除, 而持久化实例等待恢复
ephemeral: true
#注册中心地址
server-addr: ${url.nacos}
config:
namespace: ${spring.profiles.active}
file-extension: yaml
#配置中心地址
server-addr: ${url.nacos}
extension-configs[0]:
data-id: mysql-user.yaml
group: DEFAULT_GROUP
refresh: false
extension-configs[1]:
data-id: sentinel.yaml
group: DEFAULT_GROUP
refresh: false
extension-configs[2]:
data-id: dubbo.yaml
group: DEFAULT_GROUP
refresh: false
- application.yml
dubbo:
protocol:
# dubbo 协议
name: dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
port: 20882
cloud:
subscribed-services: user-service
- application.properties
spring.main.allow-circular-references=true
- nacos中创建order-service.yaml
server:
port: 8082
3.创建一个service的api接口模块
- 删除src
- pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>SpringCloudAlibaba2022</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-api</artifactId>
<name>${project.artifactId}</name>
<version>${fate.project.version}</version>
<packaging>pom</packaging>
<description>SpringCloudAlibaba 微服务API集合</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.1 在service-api的基础上再创建一个user-service-api
- pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service-api</artifactId>
<groupId>top.fate</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service-api</artifactId>
<name>${project.artifactId}</name>
<version>${fate.project.version}</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
3.2 user-service-api创建 UserService
public interface UserService {
String getServiceName();
}
4.user-service添加user-service-api依赖
<dependency>
<groupId>top.fate</groupId>
<artifactId>user-service-api</artifactId>
<version>1.0.0</version>
</dependency>
4.1 user-service 创建UserServiceImpl实现UserService
@DubboService
public class UserServiceImpl implements UserService {
@Override
public String getServiceName() {
return "this is UserService";
}
}
4.2 user-service启动类中添加注解
@EnableDubbo(scanBasePackages = "top.fate.service")
5.order-service调用user-service
5.1 pom 添加依赖
<dependency>
<groupId>top.fate</groupId>
<artifactId>user-service-api</artifactId>
<version>1.0.0</version>
</dependency>
5.2 controller调用
@RestController
@RequestMapping(value = "order")
public class OrderController {
@DubboReference
private UserService userService;
@GetMapping("getUserService")
public String getUserService(){
return userService.getServiceName();
}
}
5.3 启动运行
5.4 测试
访问http://localhost:8082/order/getUserService
- 调用成功