目录
1 前言
- github 开源项目–
paascloud-master
:https://github.com/paascloud/paascloud-master paascloud-master
可靠消息设计文档:https://github.com/paascloud/paascloud-master/wiki/可靠消息
文档备份地址:https://blog.csdn.net/liu_zhaoming/article/details/79603036
2 可靠消息服务
在博客《paascloud开源项目学习(1) – 用户邮箱注册可靠消息服务流程》阐述的一个业务流程中,说明了本项目主要是基于 RocketMQ
的可靠消息服务 解决分布式事务。
2.1 zookeeper
仔细研读上面可靠消息设计文档,设计思想即原文:
因为项目采用的是
rocketmq
,一个topic
对应一个生产者,而可靠消息采用的是中间件负责发送消息,又不能采用中间件的生产者为所有上游系统发送消息,这里引入了zookeeper
做注册中心,所以依赖可靠消息的服务,在启动项目的时候会像中间件去注册生产者,而中间件的watch
机制会及时的更新生产者和消费者状态,而中间件会为使用中间件的系统提供sdk
,使用者无需关注实现,只需要引入中间件的sdk
和对应的注解即可完成可靠消息的发送和消费。
2.1.2 功能
- 使用在可靠消息服务中,充当可靠消息服务的注册中心;
- 分布式ID协调者 角色。
根据博客 paascloud开源项目学习(2) – centos7 下安装 SpringCloud 环境 搭建好环境,运行项目后查看 zk
后,可以清楚看到上面两个功能的作用。
当某个服务启动时,该服务如何以生产者或消费者的身份注册到
zookeeper
注册中心,以便后期执行业务时生产消息或消费消息?
2.2 代码流程
我们以服务 paascloud-provider-uac
启动为例,其他服务启动时都会执行下面流程!
2.2.1 ZookeeperInitRunner.java
初始化启动类。
在用户权限服务 paascloud-provider-uac
启动过程中,实现 CommandLineRunner
的类 ZookeeperInitRunner
执行 run()
,注册…。
其他服务启动都会执行该类,根据各自服务的配置文件完成不同的初始化过程。
- 代码:
@Component
@Order
@Slf4j
public class ZookeeperInitRunner implements CommandLineRunner {
@Resource
private PaascloudProperties paascloudProperties;
@Value("${spring.application.name}")
private String applicationName;
/**
* Run.
*/
@Override
public void run(String... args) throws Exception {
String hostAddress = InetAddress.getLocalHost().getHostAddress();
log.info("###ZookeeperInitRunner,init. HostAddress={}, applicationName={}", hostAddress, applicationName);
// 1. 重点代码,进入下面代码
RegistryCenterFactory.startup(paascloudProperties, hostAddress, applicationName);
log.info("###ZookeeperInitRunner,finish<<<<<<<<<<<<<");
}
}
- 控制台
每个服务(生产者、消费者服务)的配置参数都是不同的!
[paascloud-provider-uac,,,,] 17044 --- [main] c.p.core.config.ZookeeperInitRunner: ###ZookeeperInitRunner,init. HostAddress=10.0.75.1, applicationName=paascloud-provider-uac
2.2.2 RegistryCenterFactory.java
注册中心工厂。
- 代码:
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class RegistryCenterFactory {
private static final ConcurrentHashMap<HashCode, CoordinatorRegistryCenter> REG_CENTER_REGISTRY = new ConcurrentHashMap<>();
/**
* 创建注册中心.
*
* @param zookeeperProperties the zookeeper properties
*
* @return 注册中心对象 coordinator registry center
*/
// 下面的 1 执行该类。
public static CoordinatorRegistryCenter createCoordinatorRegistryCenter(ZookeeperProperties zookeeperProperties) {
Hasher hasher = Hashing.md5().newHasher().putString(zookeeperProperties.getZkAddressList(), Charsets.UTF_8);
HashCode hashCode = hasher.hash();
CoordinatorRegistryCenter result = REG_CENTER_REGISTRY.get(hashCode);
if (null != result) {
return result;
}
result = new ZookeeperRegistryCenter(zookeeperProperties);
result.init();
REG_CENTER_REGISTRY