[RPC学习]Dubbo+nacos实现动态更新内存RTree
1.背景
服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HTTP请求,通常要求接口RT在200ms以内。目前的公司已经是分布式架构了,服务之间接口RT通常要求20ms以内。所以趁着清明节放假的时间,学一学现在开源的RPC框架Dubbo。
2.问题
之前LBS笔记写了怎么用RTree判断点在多边形内:【LBS学习笔记2】RTree判断点在多边形内-Java版本
个人学习的时候是可用的,但是在企业部署时会存在一个问题:线上服务器都是集群部署的,多台机器,如果需要更新内存RTree的数据,可以手动一台一台重启服务器,或者是一个个调更新接口去刷新。这样就很浪费人力了,我们需要的是自动化更新。所以我调研之后,发现可以用配置中心动态更新配置,使得每台机器都能pull到更新数据,根据这个特性,就能刷新所有机器的内存配置了。
3.准备
- 了解注册中心nacos的安装部署:nacos快速开始
- 了解Dubbo+SpringBoot的开发使用,可参考阿里云文档:使用spring-boot开发Dubbo
- 了解Dubbo是个啥,Dubbo简介
- (可选)了解阿里云云效自动化部署 2分钟教你部署2048小游戏到云服务器
4.具体细节
4.1 nacos注册中心部署
从GitHub上下载最新的nacos压缩包,解压后,进到bin目录下,执行startup.sh脚本,启动命令为:
sh startup.sh -m standalone(以单机模式运行)
我这里将nacos部署在华为云上的,注意部署后要将端口8848加到安全组里,然后访问nacos控制台地址:
http://[你的IP]:8848/nacos/#/login,登录名和密码都是nacos,登录后就能看到页面了

nacos不仅能作为注册中心,也能用作配置中心,支持服务配置动态更新。
4.2 服务监听配置
如上图,我新建了个配置,Data Id叫:dubbo-config:rtree.properties,配置文件里再随便写点内容。然后开始搞服务端开发,写到这我发现如果只关注配置中心的动态更新的话,不需要了解Dubbo,只关注nacos使用就可以了,囧...
点上图示例代码 按钮就能看到Java代码调用怎么写了,这里我写了一个监听配置的示例:
@PostConstruct
public String getConfig() throws NacosException, InterruptedException {
String serverAddr = "http://你的IP";
String dataId = "dubbo-config:rtree.properties";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
log.info("启动时nacos配置:{}", content);
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("动态监听配置:{}", configInfo);
//监听配置后可以做重建RTree操作了
rTreeService.rebuild();
}
@Override
public Executor getExecutor() {
return null;
}
});
return content;
}
4.3 实践
部署2个服务连接nacos配置中心,部署架构是:

然后在nacos控制台修改一下配置的值,查看服务日志,可以看到2个服务都监听到配置变更了


5.FAQ
Dubbo消费者服务启动时报错No provider available for the service?
如果你的Dubbo生产者部署在云服务器上,在注册到nacos上时,IP显示的是内网IP,就会报这个问题。具体解决并办法是修改服务器上的hosts文件,服务器名对应的IP改为公网IP,重启服务即可。

欢迎关注我的公众号:福音同学
技术文章会先在公众号上更新哦

[RPC学习]Dubbo+nacos实现动态更新内存RTree的更多相关文章
- 详解Nacos 配置中心客户端配置缓存动态更新的源码实现
Nacos 作为配置中心,当应用程序去访问Nacos动态获取配置源之后,会缓存到本地内存以及磁盘中. 由于Nacos作为动态配置中心,意味着后续配置变更之后需要让所有相关的客户端感知,并更新本地内存! ...
- spring boot 配置文件动态更新原理 以Nacos为例
配置文件的动态更新 通常获取配置文件的方式 1, @Value 2. @ConfigurationProperties(Prefix) 如果是在运行时要动态更新的话, 第一种方式要在bean上加@Re ...
- rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)
学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...
- RPC 框架 Dubbo 从理解到使用(一)
技术架构演变 单一应用架构 通俗地讲,"单体应用(monolith application)"就是将应用程序的所有功能都打包成一个独立的单元.当网站流量很小时,只需一个应用,将所有 ...
- RPC 框架 Dubbo 从理解到使用(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:RPC 框架 Dubbo 从理解到使用(一) 本篇文章讲解 Dubbo 支持的注册中心.Dubbo 负载均衡策略和 Dubbo 控制台的安装. 注册中心 ...
- RPC学习
之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...
- 微软Azure配置中心 App Configuration (三):配置的动态更新
写在前面 我在前文: <微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core>已经介绍了Asp.net Core怎么轻易的接入azure ...
- JSPatch – 动态更新iOS APP
原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
随机推荐
- 什么是 Spring Profiles?
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean.因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些 ...
- CI_CD 简单了解
- MySQL主从复制(异步复制与半同步复制)
1.MySQl主从复制 原理:将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态. 过程:从库开启一个I/O线程,向主库请求Binlog日志.主节点开启一个binlog du ...
- Tcp的Flags
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN表示建立连 ...
- 学习 Haproxy (一)
haproxy是一个开源的.高性能的基于tcp和http应用代理的HA的.LB服务软件,它支持双机热备.HA.LB.虚拟主机.图形界面查看状态信息等功能,其配置简单.维护方便,而且后端RS的healt ...
- JavaScript的取值小技巧之“中括号[]取值法”
一.简介 做下记录,今天看了一篇很有意思的文章,学到了这个取值的小技巧 正常的话我们一般都是用对象直接去'.'对应的属性名(也就是键值对的键)来获取对应的值 这里记录的是另一种取值方式,他是采用中括号 ...
- Numpy中重要的广播概念
Numpy中重要的广播概念 广播:简单理解为用于不同大小数组的二元通用函数(加.减.乘等)的一组规则 广播的规则: 如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1 如果shape ...
- Logistic 回归模型的参数估计为什么不能采用最小二乘法?
logistic回归模型的参数估计问题,是可以用最小二乘方法的思想进行求解的,但和经典的(或者说用在经典线性回归的参数估计问题)最小二乘法不同,是用的是"迭代重加权最小二乘法"(I ...
- 关于css中选择器的小归纳(一)
关于css中选择器的小归纳 一.基本选择器 基本选择器是我们平常用到的最多的也是最便捷的选择器,其中有元素选择器(类似于a,div,body,ul),类选择器(我们在HTML标签里面为其添加的clas ...
- Java/C++实现访问者模式---购物车
在我们课堂上的"购物车"的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包. 类图: Java代码: public interface Product { void ac ...