1. dubbo spring cloud描述
功能组件 | Spring Cloud | Dubbo Spring Cloud |
---|---|---|
分布式配置(Distributed configuration) | Git、Zookeeper、Consul、JDBC | Spring Cloud 分布式配置 + Dubbo 配置中心 |
服务注册与发现(Service registration and discovery) | Eureka、Zookeeper、Consul | Spring Cloud 原生注册中心 + Dubbo 原生注册中心 |
负载均衡(Load balancing) | Ribbon(随机、轮询等算法) | Dubbo 内建实现(随机、轮询等算法 + 权重等特性) |
服务熔断(Circuit Breakers) | Spring Cloud Hystrix | Spring Cloud Hystrix + Alibaba Sentinel 等 |
服务调用(Service-to-service calls) | Open Feign、RestTemplate | Spring Cloud 服务调用 + Dubbo @Reference |
链路跟踪(Tracing) | Spring Cloud Sleuth + Zipkin | Zipkin、opentracing 等 |
2.Dubbo Spring Cloud 主要特性
(1)面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,屏蔽了远程调用底层细节。利用Netty,TCP传输,单一、异步、长连接,适合数据量小、高并发和服务提供者远远少于消费者的场景,对比与SpringCloud的Fegin组件的短连接,就只能在并发不那么高的情况下使用,但是Fegin使用起来更加简洁
(2)智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
(3)服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
(4)高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
(5)运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
(6)可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
3.SpringCloud+Nacos+Dubbo最佳实践
(1)服务端接口契约定义
创建一个api服务,将需要远程调用的service定义在这个模块下,后续的服务提供者和消费者分别依赖此服务,dubbo的最佳实践,代码也会比较美观,维护起来也方便
pom.xml不用引用任何包。
定义服务端接口类IHelloService:
public interface IDubboService {
String sayBaga(String xiaorizi);
}
然后执行mvn install,将dubbo-sample-api添加到本地仓库,供其他项目依赖。
(2)服务端服务实现
工程依赖pom.xml如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zxy</groupId>
<artifactId>dubbo-sample-provider</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring-cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring boot -->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- 健康监控,必须包含spring-boot-starter-actuator包,不然启动会报错 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 需要实现的服务接口包 -->
<dependency>
<groupId>com.zxy</groupId>
<artifactId>dubbo-sample-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
实现Dubbo接口IHelloService,新建HelloServiceImpl类,代码如下:
package com.zxy.dubbo_sample_provider.service;
import com.zxy.dubbo_sample_api.IHelloService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService
public class DubboServiceImpl implements IDubboService {
public String sayBaga(String xaiorizi){
return "日本:"+ xaiorizi;
}
}
org.apache.dubbo.config.annotation.DubboService,千万不要引用错误。@DubboService注解仅声明该Java服务(本地)实现为Dubbo服务。旧版本的dubbo使用该包下的@Service直接,后来为了防止与spring混淆改为了@DubboService。
配置文件application.properties,定义dubbo的相关配置参数,以及注册中心地址
#Spring应用名称,用于SpringCloud服务注册和发现。该值在Dubbo Spring Cloud加持下被视作dubbo.application.name,因此,无需再显示地配置dubbo.application.name。
spring.application.name=dubbo-sample-provider
server.port=3001
#Dubbo服务实现类的扫描基准包路径
dubbo.scan.base-packages=com.zxy.dubbo_sample_provider.service
#Dubbo服务暴露的协议配置,其中子属性name为协议名称,port为协议端口(-1 表示自增端口,从 20880 开始)
#因为项目中存在多个服务提供端比如商品服务、会员服务等,这里为了方便设置为了-1
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
#Dubbo服务注册中心的配置地址,它的值spring-cloud://localhost表示挂载到Spring Cloud注册中心,不配置的话会提示没有配置注册中心的错误。
dubbo.registry.address=spring-cloud://localhost
#nacos
#spring.cloud.nacos.discovery定义Nacos服务发现与注册配置,其中子属性server-addr指定Nacos服务器主机和端口。
spring.cloud.nacos.discovery.server-addr=localhost:8848
Dubbo Spring Cloud 继承了 Dubbo Spring Boot 的外部化配置特性,也可以通过标注@DubboComponentScan来实现基准包扫描。
创建应用主类,即项目入口DubboSampleProviderApplication.java文件。如果使用SpringBoot自动创建项目该文件是自动创建的不用做任何修改。
@SpringBootApplication
public class DubboSampleProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboSampleProviderApplication.class, args);
}
}
(3)消费端(客户端)实现
创建一个SpringBoot项目dubbo-consumer,实现调用以上的服务。
工程依赖pom.xml:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zxy</groupId>
<artifactId>dubbo-consumer</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- spring-cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring boot -->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- web项目 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- 健康监控,必须包含spring-boot-starter-actuator包,不然启动会报错 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- dubbo服务接口契约包 -->
<dependency>
<groupId>com.zxy</groupId>
<artifactId>dubbo-sample-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件application.properties,定义dubbo的相关配置参数,以及注册中心地址
#服务名称
spring.application.name=dubbo-consumer
server.port=4001
#表示要订阅服务的服务名,可以配置'*'代表订阅所有服务(不推荐使用)。若需订阅多应用,使用","分割。
dubbo.cloud.subscribed-services=dubbo-sample-provider
#nacos
spring.cloud.nacos.discovery.server-addr=localhost:8848
#禁止该服务注册到Nacos服务列表中
spring.cloud.nacos.discovery.register-enabled=false
实现服务调用,新建HelloController.java类:
@RestController
public class DubboController {
@DubboReference
private IDubboService dubboService;
@GetMapping("/say")
public String sayBaga(){
return dubboService.sayHello("八嘎");
}
}
使用Dubbo原生注解@DubboReference,Dubbo调用原理是基于动态代理实现,@DubboReference作用就是将动态代理注入进来。
服务消费方启动类
@SpringBootApplication
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
测试结果,调用成功则dubbo远程调用实现成功