Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

1.23. 环境差异带来的困扰

工作中你是否因环境的差异带来困扰,下面我总结了一些因为环境差异给开发者造成的困扰。

环境差异带来的困扰:

  1. 在网上找到的例子,在自己的电脑上始终运行不起来
  2. 本地电脑运行一切正常,发不到测试环境就出问题
  3. 测试环境通过,发布到生产环境就出问题

问题根源出在哪里?

  1. 版本不一致
  2. 环境差异造成的
  3. 性能问题造成的
  4. 架构问题造成的

1.23.1. 版本的差异

搜索引擎、Ctrl+C、Ctrl+V 是程序员三件法宝,几乎占用了程序员的80%的工作。

但是我们常常会遇到一个问题,就是在网上找到的例子,复制到自己的开发环境,无法运行,通常有一下几个因素。

  1. 编译器的版本不匹配
  2. 依赖库不匹配
  3. 配置文件不匹配

工作中我就遇到过这样的问题,我接手了一个项目,生产环境每日救火,性能十分差,经过分析是配置没有生效。开发同事到网上找到一篇配置文章,直接照搬网上配置,也没有去做验证,那个配置是 springboot 1.x, 在 2.x 已经废弃,所以配置是不生效的。

上面的案例在很多团队中都会发生。

1.23.2. 环境的差异

1.23.2.1. 办公电脑

办公电脑跟服务器的差异是什么?

所谓服务器,并不是服务器性能比台式机高,很多服务器配置非常低,例如物联网用的。服务器更多是指她能7*24小时稳定运行,出现死机频率比较台式电脑低,为了能让服务器7*24小时工作,在硬件设计方面更考究,使用材料,设计方案,都是为了满足长时间可靠运行,所以服务器的成本会增加。

而台式机(办公电脑)通常每天工作时常不会超过16小时,也就是会关机一次,第二天在开机,任何问题重启都能解决(万能重启),重启可以掩盖很多问题。

我们现在使用的办公电脑配置都很高,轮核心数量,内存容量,并不比服务器差,性能更是秒杀云主机。台式机还有一个优势,基本都会配置显卡。

为什么在本地电脑开发完成的功能,上到测试环境就运行不了?

本地电脑 VS 测试环境

  1. 很多时候测试环境需要模拟生产环境,需要很多节点,服务器资源有限,只能压缩测试节点数量,对测试节点的硬件资源限额,也就是说测试环境的节点配置,没有你本地电脑配置高。
  2. 自在独享本地资源做开发,不会有其他服务跟你争夺硬件资源。而测试环境是共享的,上面部署不止一套系统,它们之间相互争夺硬件资源。

假如开发了一个下载 excle 数据的功能,在本地电脑上测试,从查询数据库,数据组装,生成xls文件,然后下载,几乎是鼠标一点就完成。此时发布到测试环境,你发现这个功能根本不能用,需要优化。

因为你一个人在用一台 8核心 16G 256SSD硬盘的电脑,并且只启动了一个服务;而测试环境上运行几十个服务,同时做了资源配额,分配的资源仅有4核心,4G,硬盘还是机械的。

1.23.2.2. 物理机与虚拟机

服务器资源有限,为了更合理利用服务器,通常我们会使用虚拟化技术。

1.23.2.3. 云主机与容器

因为你本地开发/测试环境使用了容器技术,所以你也想在云主机上使用容器技术。

云主机

1.23.3. 常见问题

1.23.3.1. 超时时间

本地开发环境只需在应用上配置超时时间即可,我们是直接访问应用的。

测试环境就可能涉及的网关,负载均衡等等多处设置。那么在集群环境中都会涉及那些超时时间的配置呢?

经常涉及的超时配置:

  • 负载均衡
  • Web 服务器/反向代理
  • 微服务网关
  • 微服务应用连接超时阀值,包括(tomcat、openfeign、ribbon、RestTemplate、hikari、redis、rocketmq、httpclient/okhttp 等等)
  • Redis 超时时间
  • MySQL 连接超时时间,执行超时时间

生产环境只会更复杂。

1.23.3.2. 连接数

你从公司行政领了一台电脑,搬到工位上装好开机,然后一顿操作猛如虎就把开发环境搭建起来。

然后就开始写代码了,开发、联调、测试一切顺利,冒烟通过之后,准备发到测试环境做集成测试/压力测试/性能测试……

1.23.3.3. 上传限制

1.23.3.4. 下载带宽

办公室网络通常是使用的是 1G 局域网,我们在局域网之内的各种请求几乎是瞬间响应

1.23.3.5. CPU 资源限制

1.23.3.6. 内存资源限制

容器 PodOOMKilling

1.23.3.7. 雪花算法出现重复

在容器加微服务的解决方案中使用雪花算法,很容易出现数据重复。

1.23.3.8. 注册中心

注册中心都有那些问题困扰我们?

开发中遇到的问题:

  • 本地电脑注册到测试环境,我们常常不小心,把开发自己的的开发环境注册到注册中心,导致其他微服务连接到我们的开发环境上。
  • 还有时我们注册导了测试环境,把测试环境的消息队列中的内容给消费了.
  • 与容器联调,容器pod无法跟本地电脑打通。解决方法添加路由,对于开发人员操作是分复杂。

生产中遇到的问题:

当微服务节点注册导注册中心后,通过心跳来维持节点的存活。

1.23.3.9. 负载均衡

负载均衡节点分配有多种算法,例如轮询、随机、源IP地址、HASH、Cookie、加权等等……

其中又些算法,例如轮询、随机,它是不保持与请求客户端之间的关系,当你下一次请求,节点就会发生变化。这样就你不知道那个节点执行了你的请求。

1.23.3.10. 健康检查

健康检查误判的问题