前言
公司改名了对技术上有哪些影响?就问你一句:好奇不?
假如公司改名了,只是单纯的改名字。
- 团队人员没变
- 使用的技术栈也没变
如果站在开发人员的角度,会给我们带来哪些影响呢?
本次修改涉及到的主要内容如下:
1 配置文件
如果公司名称或域名有修改,大家可能第一个想到的可能是去改配置文件。
1.1 关键字替换
对于公司名称和域名的修改,只需把apollo的配置复制出来,全文替换一下,然后复制进去保存,一键发布即可。
1.2 公共配置
有些人可能觉得公司名称,在项目中不一定用得到。但是域名我想很多项目都在用,比如需要调用oss或obs服务上传文件时,一般需要配置一个域名。
如果只是一个项目还好,但如果有十几个、几十个、甚至上百个项目,都使用了域名,难道要每个项目都改一遍?
显然像公司名称和域名这种公共配置,应该放在类似于parent的配置中,而在业务项目中只需通过namespace引入parent即可。
后面如果公共配置变了,只用改一个地方,更方便管理和维护。
app.id=susan-api
apollo.meta=http://apollo-susan.com:8082,http://apollo-susan-2.com:8082
apollo.cluster=default
apollo.bootstrap.namespaces=application,common,eureka.client,datasource,redis,rocketmq
apollo.bootstrap.enabled = true
apollo.bootstrap.eagerLoad.enabled = true提取公共配置,看起来非常简单。但是真正执行起来却一点都不容易,不是说提取一次就完事了,它是一个持续不断的过程。考验的不仅仅是技术层面的,更多的是管理上的东西。
1.3 接口地址
很多时候,在我们在调用第三方接口时,需要配置接口地址。
这时有些人可能是这样配置的:
#注册接口
com.susan.registerUrl=https://www.susan.com:8080/api/register
#登录接口
com.susan.loginUrl=https://www.susan.com:8080/api/login
...在接口地址中配置了完整路径,包含:协议、域名、端口号和具体接口名称。
如果哪一天,协议或域名或端口号改了,就需要修改很多地方。
如果项目中配置了多个第三方接口地址,建议将协议、域名和端口号单独做成一个公共的配置,例如:
com.susan.baseUrl=https://www.susan.com:8080
com.susan.registerUrl=${com.susan.baseUrl}/api/register
com.susan.loginUrl=${com.susan.baseUrl}/api/login然后在具体接口配置中通过$符号引用这个公共配置。
这样做的好处是方便维护,后面如果协议、域名和端口号任意一个有修改,只需修改那个公共配置即可。
2 数据库
除了配置文件之外,另外一个需要重点关注的是数据库。
2.1 域名保存到数据了
有些小伙伴在保存数据时为了方便,直接将域名保存到了数据库中。
最常见的情况是附件url,比如:https://susan.oss.com/file/123123123123.png,直接保存到了数据库中。
这就需要把所有的域名,替换成新的。
第一步是要去找出哪些数据库的哪些表的哪些字段中包含了域名。
找起来非常麻烦。
如果找到了哪些具体的数据库、表和字段,接下来使用replace函数,就能实现域名的替换了,例如:
update test.t_user set url = replace(url,'susan.oss.com','susan.oss.cn'); 2.2 json字段
MySQL5.7以后支持json格式的数据。
有时候,为了数据的扩展性,我们可能会把请求参数的json数据整个都保存下来,比如商城的基础配置等。
但如果json数据中包含了域名。
找起来就更麻烦了。
如果你知道是哪些数据库的哪些表的哪些字段中包含了域名,其实也可以用replace函数,MySQL也是支持的。
虽说我们可以通过一些办法去修改数据库保存的域名,但是在数据库中保存域名并不是一种好的设计。
建议涉及到公共域名的数据库字段,不要保存绝对地址,比如:https://susan.oss.com/file/123123123123.png,而应该保存相对地址,比如:/file/123123123123.png。
3.缓存
缓存在实际项目中使用还是挺多的,缓存中也可能会保存域名。
那么,如何找出缓存中包含了域名的数据,替换成另外一个域名呢?
redis是基于key/value的非关系型数据库,没法使用like之类的关键字去查询数据。
想找到需要替换的数据很显然,这是一个让人非常头疼的问题。
我们不妨换一种思路:缓存是数据库的补充,缓存中的数据,数据库中肯定有。那么,我们把缓存删了,通过数据库重新生成一份最新的数据,不就OK了?
通常情况下,有两种方式生成缓存:
- 事先预热数据。
- 调用接口时更新。
3.1 事先预热数据
比如在商城中分类树的数据,就可以通过事先预热的方式生成缓存的数据。
其实这种场景,可以不用删除缓存数据,如果数据库中的域名修改了,使用job重新生成一次缓存覆盖已有数据即可。
3.2 调用接口时更新
很多缓存是这样用的:先从缓存中查询数据,如果缓存中有,则直接返回该数据。如果缓存中没有,则从数据库中查询数据,如果数据库中有,则将数据放到缓存中,返回数据。如果数据库中也没有,则直接返回空数据。
这种情况如果将缓存删除,万一用户并发量上来了,可能会出现缓存雪崩的问题。
我们可以对key重新设置过期时间,过期时间为最近半个小时内的一个随机数,避免一次性全部过期的情况发生。
3.3 如何删除缓存?
如果有些场景,用户并发量不大,可以用户的所有请求,可以直接访问数据库。
就可以直接删除缓存了。
那么如何删除缓存的?
- flushall:清空整个redis服务器的数据(删除所有数据库的所有key )。
- flushdb:清空当前数据库中的所有key。
如果想删除指定前缀的key,可以这样:
redis-cli --raw keys "su-*" | xargs redis-cli del由于Redis是单线程的,命令keys会阻塞正常的业务请求,如果你一次keys匹配的数量过多或者在del的时候遇到大key,都会直接导致业务的不可用,甚至造成redis宕机的风险。
那么如何解决这个问题呢?
答:Redis从2.8版本开始支持scan命令。
redis-cli --scan --pattern "su-*" | xargs -L 2000 redis-cli del其实还有ElasticSearch也可能会有保存域名的情况,如果全部替换数据的话,成本非常大。
我们在做系统设计的时候,针对ElasticSearch的相关数据,可以提供全量的job,防止数据出现异常时,能够快速的重新生成数据。
4.代码
如果公司改名了,并且域名也修改了,其实对代码也有一些影响。
4.1 包名使用了域名
不知道你注意到了没?在我们的项目中,经常会使用域名作为包的路径,比如:org.apache.common。
如果域名修改了,是不是包名称也需要相应的修改?
如果公司的项目比较少的话,我们可以改一下包名称。
但如果涉及的项目非常多,改起来会非常麻烦。
特别是我们有些项目提供的jar包,被第三方公司引用了,这种改动太大了。
因此,不太建议随便修改包名,特别是提供了jar包给外部依赖的情况下。
4.2 类名包含公司名
有些小伙伴在起类名时,可能会使用公司名称,比如:XXXConfig。
如果该类没有被第三方使用,建议还是改一下,改起来还是比较容易的。
5.其他
除此之外,还有一些额外的信息需要调整一下。
5.1 资源文件
公司改成了,logo和模板文件中的公司名称需要调整。
我们有些logo或者excel模板文件,有些人喜欢将他们放在项目的resources目录下。这种方式直接从本地获取,访问速度快。
也有些人喜欢将他们上传到oss服务器上,通过url地址访问。这种方式方便维护,特别是后面要更新的话,只需重新上传文件,配置一下url地址即可。
如果你们的公司有oss服务的话,我个人更倾向于用第二种。
5.2 导航
公司改成了官网首页的导航菜单,可能也会随着一起调整。
导航菜单建议做成apollo配置,通过一个config接口获取相关数据。
5.3 官网颜色
公司改名了,有可能连官网的颜色也会一起修改,比如之前是红色主题的,现在改成蓝色主题的。
所以建议在开发官网时,将主题颜色不要写死了,而应该做成动态可配置的。前端通过调用服务器的config接口,可以获取官网的主题颜色编码。
最后留个问题,如果Mongodb中包含了域名需要修改,该如何处理?