1.背景

服务架构一般都是从 单体架构 -> 微服务架构 -> 分布式架构 的迭代,我上一家公司就是在业务发展到一定规模时,开始拆老的单体服务,按业务维度拆成多个微服务,服务之间用的是HTTP请求,通常要求接口RT在200ms以内。目前的公司已经是分布式架构了,服务之间接口RT通常要求20ms以内。所以趁着清明节放假的时间,学一学现在开源的RPC框架Dubbo。

2.问题

之前LBS笔记写了怎么用RTree判断点在多边形内:【LBS学习笔记2】RTree判断点在多边形内-Java版本

个人学习的时候是可用的,但是在企业部署时会存在一个问题:线上服务器都是集群部署的,多台机器,如果需要更新内存RTree的数据,可以手动一台一台重启服务器,或者是一个个调更新接口去刷新。这样就很浪费人力了,我们需要的是自动化更新。所以我调研之后,发现可以用配置中心动态更新配置,使得每台机器都能pull到更新数据,根据这个特性,就能刷新所有机器的内存配置了。

3.准备

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

  1. Dubbo消费者服务启动时报错No provider available for the service?

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

欢迎关注我的公众号:福音同学

技术文章会先在公众号上更新哦

[RPC学习]Dubbo+nacos实现动态更新内存RTree的更多相关文章

  1. 详解Nacos 配置中心客户端配置缓存动态更新的源码实现

    Nacos 作为配置中心,当应用程序去访问Nacos动态获取配置源之后,会缓存到本地内存以及磁盘中. 由于Nacos作为动态配置中心,意味着后续配置变更之后需要让所有相关的客户端感知,并更新本地内存! ...

  2. spring boot 配置文件动态更新原理 以Nacos为例

    配置文件的动态更新 通常获取配置文件的方式 1, @Value 2. @ConfigurationProperties(Prefix) 如果是在运行时要动态更新的话, 第一种方式要在bean上加@Re ...

  3. rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)

    学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...

  4. RPC 框架 Dubbo 从理解到使用(一)

    技术架构演变 单一应用架构 通俗地讲,"单体应用(monolith application)"就是将应用程序的所有功能都打包成一个独立的单元.当网站流量很小时,只需一个应用,将所有 ...

  5. RPC 框架 Dubbo 从理解到使用(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:RPC 框架 Dubbo 从理解到使用(一) 本篇文章讲解 Dubbo 支持的注册中心.Dubbo 负载均衡策略和 Dubbo 控制台的安装. 注册中心 ...

  6. RPC学习

    之前有一篇文章,说了RPC的内容: http://www.cnblogs.com/charlesblc/p/6214391.html 如果有一种方式能让我们像调用本地服务一样调用远程服务,而让调用者对 ...

  7. 微软Azure配置中心 App Configuration (三):配置的动态更新

    写在前面 我在前文: <微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core>已经介绍了Asp.net Core怎么轻易的接入azure ...

  8. JSPatch – 动态更新iOS APP

    原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...

  9. MyBatis学习 之 三、动态SQL语句

    目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...

随机推荐

  1. 什么是 Spring Profiles?

    Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean.因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些 ...

  2. CI_CD 简单了解

  3. MySQL主从复制(异步复制与半同步复制)

    1.MySQl主从复制 原理:将主服务器的binlog日志复制到从服务器上执行一遍,达到主从数据的一致状态. 过程:从库开启一个I/O线程,向主库请求Binlog日志.主节点开启一个binlog du ...

  4. Tcp的Flags

    在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段. 它们的含义是: SYN表示建立连 ...

  5. 学习 Haproxy (一)

    haproxy是一个开源的.高性能的基于tcp和http应用代理的HA的.LB服务软件,它支持双机热备.HA.LB.虚拟主机.图形界面查看状态信息等功能,其配置简单.维护方便,而且后端RS的healt ...

  6. JavaScript的取值小技巧之“中括号[]取值法”

    一.简介 做下记录,今天看了一篇很有意思的文章,学到了这个取值的小技巧 正常的话我们一般都是用对象直接去'.'对应的属性名(也就是键值对的键)来获取对应的值 这里记录的是另一种取值方式,他是采用中括号 ...

  7. Numpy中重要的广播概念

    Numpy中重要的广播概念 广播:简单理解为用于不同大小数组的二元通用函数(加.减.乘等)的一组规则 广播的规则: 如果两个数组的维度数dim不相同,那么小维度数组的形状将会在左边补1 如果shape ...

  8. Logistic 回归模型的参数估计为什么不能采用最小二乘法?

    logistic回归模型的参数估计问题,是可以用最小二乘方法的思想进行求解的,但和经典的(或者说用在经典线性回归的参数估计问题)最小二乘法不同,是用的是"迭代重加权最小二乘法"(I ...

  9. 关于css中选择器的小归纳(一)

    关于css中选择器的小归纳 一.基本选择器 基本选择器是我们平常用到的最多的也是最便捷的选择器,其中有元素选择器(类似于a,div,body,ul),类选择器(我们在HTML标签里面为其添加的clas ...

  10. Java/C++实现访问者模式---购物车

    在我们课堂上的"购物车"的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包. 类图: Java代码: public interface Product { void ac ...