目录
- 基于Spring Boot 3.1.0的Dubbo代码实现(以Redis作为注册中心)
- 一 简介
- 二 前言
- 三 文档查阅
- 四 依赖项
- 1 注意事项
- 2 版本
- 3 dependencyManagement依赖
- 4 dependency依赖
- 五 配置文件
- 1 注意事项
- 2 代码
- 六 yml文件
基于Spring Boot 3.1.0的Dubbo代码实现(以Redis作为注册中心)
一 简介
Apache Dubbo 最初是为了解决阿里巴巴内部的微服务架构问题而设计并开发的,在十多年的时间里,它在阿里巴巴公司内部的很多业务系统的到了非常广泛的应用。最早在 2008 年,阿里巴巴就将 Dubbo 捐献到开源社区,它很快成为了国内开源服务框架选型的事实标准框架,得到了业界更广泛的应用。在 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目,开始了一段新的征程。
Dubbo 被证实能很好的满足企业的大规模微服务实践,并且能有效降低微服务建设的开发与管理成本,不论是阿里巴巴还是工商银行、中国平安、携程、海尔等社区用户,它们都通过多年的大规模生产环境流量对 Dubbo 的稳定性与性能进行了充分验证。后来 Dubbo 在很多大企业内部衍生出了独立版本,比如在阿里巴巴内部就基于 Dubbo 衍生出了 HSF,HSF 见证了阿里巴巴以电商业务为首的微服务系统的快速发展。自云原生概念推广以来,各大厂商都开始拥抱开源标准实现,阿里巴巴将其内部 HSF 系统与开源社区 Dubbo 相融合,与社区一同推出了云原生时代的 Dubbo3 架构,截止 2022 年双十一结束,Dubbo3 已经在阿里巴巴内部全面取代 HSF 系统,包括电商核心、阿里云等核心系统已经全面运行在 Dubbo3 之上。
二 前言
该项目是公司原有项目的扩展,而原项目作为单体式项目并没有使用Nacos或Zookeeper作为配置、注册中心。为了达成最小化项目中间件的目的,寻求以Redis作为注册中心的方式实现Dubbo服务的注册与发现。
三 文档查阅
官网文档说实话非常简陋,仅仅描述的工作原理,并未对如何代码实现作阐述,在实现该部分代码的过程中踩了非常多的小坑,虽然最终代码只有寥寥几行,却耗费了笔者一个下午的时间调试。
四 依赖项
1 注意事项
此处踩坑,如果你在Pom文件中配置了dependencyManagement用以声明Spring Boot的版本,那么Jedis依赖的引入就会变成4.3.2的版本。因为dependencyManagement的优先级是高于dependency中的version标签的,而4.3.2正是Spring Boot所需要的版本,这也是Spring Boot为何能做到开箱即用的原因之一。
2 版本
<!-- Jedis依赖版本 -->
<jedis.version>3.7.1</jedis.version>
<!-- Commons Pool2 版本 -->
<commons-pool2.version>2.11.1</commons-pool2.version>
<!-- Dubbo Redis 注册中心版本 -->
<dubbo-registry-redis.version>1.0.1</dubbo-registry-redis.version>
<!-- Dubbo 版本 -->
<dubbo.version>3.2.4</dubbo.version>
3 dependencyManagement依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
4 dependency依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo.extensions</groupId>
<artifactId>dubbo-registry-redis</artifactId>
<version>${dubbo-registry-redis.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
五 配置文件
1 注意事项
关于注册中心地址,共分为协议、用户名、密码、IP地址、端口号以及数据库六个部分。其中:
(1)协议:毫无疑问填写redis;
(2)用户名:仅在Redis6及以后的版本中支持,所以这个地方可以填任何值,但是不能为空;
(3)密码:Redis数据库密码;
(4)端口号:Redis数据库端口号;
(5)数据库:非必填,默认为0。
2 代码
package com.lhms.dubboredis.core.configurations;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 基于Redis的Dubbo配置类
*
* @author wuzijing
*/
@Configuration
public class DubboRedisConfiguration {
@Value("${spring.profiles.active:dev}")
private String active;
@Value("${spring.application.name:unknown}")
private String application;
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private String port;
@Value("${spring.data.redis.password}")
private String password;
@Value("${spring.data.redis.database}")
private String database;
@Value("${dubbo.application.qos-port}")
private Integer qosPort;
@Value("${dubbo.protocol.port}")
private Integer protocolPort;
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(application + "-" + active);
applicationConfig.setQosEnable(true);
applicationConfig.setQosAcceptForeignIp(true);
applicationConfig.setQosPort(qosPort);
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
// 注册中心地址,redis6以前的版本账号无用,但是必须要有
registryConfig.setAddress("redis://redis:" + password + "@" + host + ":" + port);
// 注册中心协议
registryConfig.setProtocol("dubbo");
// 注册中心请求超时时间
registryConfig.setTimeout(30000);
// 服务分组注册,用于环境隔离
registryConfig.setGroup(active);
registryConfig.setPort(protocolPort);
return registryConfig;
}
}
六 yml文件
dubbo:
application:
qos-port: 22000
protocol:
port: 20800
scan:
base-packages: com.catalpa.test.service
spring:
data:
redis:
host: 127.0.0.1
port: 6379
password: 123456
database: 1