Xlog第三天，工作日志——Apollo配置中心为啥时灵时不灵

一，工作上的事儿

在这补充一下昨天提到的李清晨先生的文章。他的文字简单但是充满力量，让人读了之后会有一种明知前路黑暗也要奋勇向前的勇气，推荐给大家。

今天其实学习了一点网络协议相关的知识，本来的博客的名字想叫：泥瓦匠学网络 ——ifconfig 到底是个啥？但是，因为今天在工作中碰到对于我这种菜鸟来说非常无解并且非常扯淡的问题，所以就改为了工作日志 ——Apollo 配置中心为啥时灵时不灵。

我是一名 Java 开发，在公司里目前负责了一个定时任务的项目，项目中用到了 Java 中的延迟队列线程池ScheduledThreadPoolExecutor来实现任务的调度 (可能会有大佬告诉我说，有那么多现成的框架，你为啥用这个？) 好吧，其实我知道，但是没办法我只会这个😂。下面简单列一下他的方法：

Copy
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);

上面这个就是他的方法，可能会有小伙伴看不懂，不过没关系。我现在要把括号里的第二个参数取出来，做成一个可以随时改的数字。所以就用到了 Apollo 这个配置中心，这个配置中心顾名思义就是可以把项目中常用的并且可能随时变动的参数放在 Apollo 上，当我们的项目在服务器运行的时候可以随时的修改这些参数而不用去频繁的启停项目。

我按照公司提供的对接文档以及官方文档成功的接入了 Apollo，也成功的读取到了配置。下面问题就来了:

我将所有的配置都发布完毕之后，项目启动可以正常读取到配置中心的所有配置，也能正常运行并且执行任务。我 **第一次** 尝试将配置中心的某些参数修改然后再次发布的，项目也能实时的获取到修改后的值。此时我只测试了一次，也就是只修改了配置中心一次，参数不限，可以是俩也可以是仨，这时候项目是正常的。

但是，当我再一次进行修改配置的时候，日志显示 Apollo 已经获取到了修改之后的值，但是项目中所获取的参数值还是原来的。比如：time 的初始值是 10s，我第一次修改为了 15s，此时项目正常运行，但是当我第二次修改为 10s 的时候，项目获取到的值还是 15s，再次进行修改，这个值还是 15s。也就是说，我只能修改一次配置。很奇怪

我在本地代码中添加了一个监听，相当于监视器，用来监视远程配置中心的变化，此时获取到的值是正确的，也就是说，我每次修改配置监视器都获取到了最新的值。但是传递到项目中的变量上时又变回了旧值。我今天没有跟 debug 一步步的调试，明天准备尝试一下。此外，我还检查了本地的 Apollo 配置的缓存文件，里面的值也是新的。这就让我仅有的一点耐心彻底丧失。自我批评一下。

这个问题我估计做 Java 开发的小伙伴可能会比我想到更多的排查方法，如果你们遇到类似的问题或者说有思路欢迎给我留言，帮助我解决这个问题。

二，ifconfig 到底是个啥？

看到这个题目估计很多人都会笑话我，这玩意你都不知道你还干什么开发啊？

说真的，对于 ifconfig 这个命令我只知道是查看电脑 IP 地址的，至少截止到今天之前是这样的。

ifconfig 是一个在 Linux/Unix 系统中用于配置与控制网络接口的命令行工具。它允许我们启用 / 禁用网络接口, 配置 IP 地址、子网掩码、广播地址等

在今天之前，我只用来查看 IP 地址，其余的四个功能从类没有用过。

简单记录一下

我们常说的网络接口通常是以 eth0,eth1 等命名的网卡接口，常用的选项有:

up/down: 启用 / 禁用网络接口。例如 ifconfig eth0 up。

ip: 配置接口的 IP 地址。例如 ifconfig eth0 192.168.1.10

netmask: 配置子网掩码。例如 ifconfig eth0 netmask 255.255.255.0。

broadcast: 设置广播地址。例如 ifconfig eth0 broadcast 192.168.1.255。

mtu: 设置 MTU 值，最大传输单元。例如 ifconfig eth0 mtu 1500。

上面涉及到了很多名词的缩写，我也查了一下它们的含义

eth0，eth1：eth0,eth1 是 Linux 系统中网卡接口的命名方式。eth 是 Ethernet 的缩写，0,1 是接口编号。所以 eth0 和 eth1 均代表一块以太网网卡，只是编号不同以作区分。

IP ：（Internet Protocol）翻译过来就是互联网协议，它就是用来描述在互联网上的数据应该按照什么规则传输。IP 地址则是用来定位设备在网络中的位置，让数据包可以正确的发送到目标设备上。

IP 协议中定义了两种类型的地址:

IPv4:32 位地址，通常写成 4 个 0 到 255 之间的数字，以点分隔，例如 192.168.1.1。

IPv6:128 位地址，通常写成 8 组 16 进制数字，以冒号分隔，例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。

netmask：子网掩码。是用来与 IP 地址配合用以划分 IP 地址中的网络位置和主机位置的。是由 32 位的四段数字组成，与 IP 地址一起用于确定主机是否在同一网络中。子网掩码通过将 IP 地址进行与运算，可以提取出网络地址。例如 (网上找的栗子🌰)：

1.IP 地址：192.168.1.1
2. 子网掩码：255.255.255.0

192.168.1.1 与 255.255.255.0 进行与运算:

192.168.1.1
255.255.255.0
---------------------
192.168.1.0

从运算结果可以看出，这两个地址的网络地址部分相同，都是 192.168.1.0。所以 192.168.1.1 和子网掩码 255.255.255.0 在同一个子网中。

broadcast：（Broadcast Address）广播地址，是网络中所有主机都可以接收到的数据报文的目标地址。它允许发送端将信息一次性发送给网络中的所有主机。我在网上查了资料，这个广播地址是怎么算出来的，还没有看明白。暂时不写了。他的作用是：

允许网络中的所有主机接收同一数据报文，实现广播通信。

用于 ARP 协议，将 IP 地址解析为 MAC 地址。当一台主机要发送 ARP 请求时，会将请求的目标地址设为广播地址，这样网络中所有机器都可以接收到该 ARP 请求。

ARP 协议：ARP (Address Resolution Protocol) 即地址解析协议。它的作用是将 IP 地址解析为 MAC 地址，用于网络通信。

MAC 地址：(Media Access Control Address) 是一个网卡的物理地址，就相当于我们人类的身份证。

DHCP 协议使用广播地址向所有客户端分配 IP 地址等网络参数。

可以用于网络的诊断与故障排除。通过发送 ICMP 广播 Ping 报文，检查子网中的所有主机。

mtu:（Maximum Transmission Unit) 最大传输单元，它指定了网络接口可以接受的最大数据包大小 (以字节为单位)。

MTU 的值取决于接口类型和网络 medium, 常见的值有:

以太网接口常用 1500 字节。
- DSL 网络接口常用 1492 字节。
- PPP 链路常用 1472 字节。
- IPSEC VPN 通道 MTU 常用 1436 字节。

关于 MTU 还有一个知识：无论数据的接收方的 MTU 有多大，发送方都不能发出超出自己 MTU 的数据包。也就是说发送数据包的大小时有 MTU 较小的一方决定的。

上述内容是我昨天和今天学习到的对于我来说的新知识，记录一下。

三，关于最近的新闻

我这两看了很多新闻也好像没看什么新闻。我想深入了解的看不到，只有冷冰冰的蓝底白字的通告。我不想深入了解的随便造，打不打开手机都在哪儿到处飘。

今天湖人输球了，竟然没有打过缺兵少将的灰熊，有朋友说这是菠菜和联盟的套路，就是要多打几场要不怎么挣钱呢？

我不这么认为，从今天的整场比赛看，湖人输在三方面，第一没有对上灰熊的强度，内心的轻敌让自己散漫松懈，第二，哈姆教练的临场应变能力确实值得商榷，第一场用范德彪对莫兰特起到了效果，但是第二场没有莫兰特再用范德彪就暴露范德彪攻击能力不足，身材瘦弱的缺点，被迪尔曼和小杰伦杰克逊追着打，第三，浓眉也不知道是咋回事，这么低迷。

今天话真是多。