技术上构建微服务应对需求的不断变更

针对现在的大部分企业,都是网站,后台服务,APP的模式。要是谁家开科技公司特么没一个APP估计才是怪事了,这时候我们一定会面临的问题就是页面和APP的需求不一致,对后台服务提供的数据要求不一致。当然还有需求不断变更这个永恒的话题, 在我们不断开发新功能的时候,却永远都要维护以前的版本功能可用,就像是腾讯的QQ一样,你至今拿起古董级别的QQ,它依旧是可用的。那么我们如何解决这样的问题呢?

我简单的就我目前工作的经验简单谈下此问题,也简单的记录下,期望今后如果创业的时候还能翻起,用于给予我部分提点。

目前的软件走的速度就是谁先上线谁得天下的时代,所以大部分的公司都会以快作为第一要素,996是常事。但是又不面因为快给后续的开发带来很多的兼容问题,就好比V1版本的结构定义的数据处理模式可能是结构{A,B,C},但是目前需求要求必须加一个字段变为{A,B,C,D},那么如何兼容以前的接口呢,可能这时候最方便的做法就是再加一个接口给新的APP或者网站使用,然后再重写一份代码。那么有什么好的解决办法呢?

理想状态应该是,一个APP或者网站,它是需要什么数据就拿什么数据的状态,而不管服务器会提供什么数据,当然提供的数据它都可以拿,但是拿多少,拿什么字段,应该是客户段决定的。这样就能很好的解决APP的兼容旧借口,旧的APP只需要ABC三个字段,那么在发布出去的时候它就拿ABC三个字段,之后的需求变更增加字段也不会影响到旧版本的APP的使用,因为它还是拿原来的三个字段,数据还是保持原来的格式。而新版本的APP,它也可以根据自己的需求多拿D字段的内容。

那么有什么好的解决方案呢?

其实呢,Facebook有一套很好的解决方案,就是graphql,可能很多人知道reset api,但是不一定知道graphql,因为我们目前的开发技术选型Go, 所以针对此类问题,我们选型在:graphql

项目地址:https://github.com/graphql-go/graphql

它属于一种模式定于语言吧,DSL, 同样支持int,bool,string,list这类基本数据类型,可以通过模式的定义形成数据结构。

它可以通过定义query 作为查询,定义Mutation用作更新数据操作,同时定义数据结构时可以加上对数据字段的描述,服务启动后会自动生成doc,这样在APP端开发时即可通过直接访问服务器便可以查看相关的字段的定义文档,免去了部分的沟通时间。

 

这样我们即可定义相关的查询接口,APP端即可通过userid 用户ID查询用户的相关信息,并且我们还可以通过不断的增加Args来扩充我们的字段,提供更多的新功能给新版本的app使用,同时依旧兼容旧版本的APP。同时通过Description 又很好的描述了字段的定义,提供了相应的开发文档。

针对变更部分

这样我们便可以定义相关的修改和更新接口,同样的参数可以不断的变更,我们通过resolve定义的方法处理用户的请求,更新用户的数据。

那么返回什么数据呢?

我们可以通过定义相应的返回结构,返回相应的数据即可,当然如果我们有新的需求,我们也可以增加相应的字段作为返回数据。

那么关键点在于graphql定义了这些模式后,它的查询语言了,无论是查询或者查询返回的数据,你都可以根据你的需求获取相应的字段用作自己的APP服务。
定义完了数据结构,我们就可以通过http的请求用语请求所有想要的业务数据
1. 可能我们某次查询只需要昵称和ID,那么我们就可以这样取我们需要的数据

2. 如果某次我们的新版APP需要更多的数据,那么我们就可以增加相应的字段,取更多APP需要的数据,而接口缺不需要做任何变更:

同理修改用户数据的接口也是一样的用法。

总结:
在增加新需求的时候,旧的接口可重用,但是又不影响旧的业务,同时支持新的业务。
在当前的业务不断变化的软件后台服务开发中,我们就可以通业务的分离,不断的形成微服务的形式,通过微服务的互相协作,应对新的需求,同时也保证旧版本的服务,支持更多的新服务和业务需求。

(有说得不到位的不对的,欢迎拍砖。如有转载,请增加原文链接,署名原作者。

简单的爬虫实验

说下背景,起因是因为公司业务上有一块,功能出现了问题,用户的设备端在去请求一个xml 文件的时候,发现从服务器总是下载出错,或者下载超级的慢,因为现有的环境是国外的客户的设备全部都链接到了国内的阿里云的服务器,然后导致下载异常的慢,所以现在想让过外的客户在下载文件的时候,可以判断如果设备端在国外,那么就重定向去新加坡的阿里云OSS 下载,否则国内的IP地址的用户就重定向到国内的阿里云OSS地址下载.

1. 首先,设备端是通过http请求来下载文件的,所以我唯一可以知道的是设备端连接过来的remoteaddr 地址.
2. 设个时候我就可以通过remoteaddr 地址去判断用户的设备到底处于国内还是国外,因为用户的设备有可能是移动的
3. 这个时候就找到了一个淘宝的IP地址库查询接口:http://ip.taobao.com/ipSearch.php
4. 就根据这个区请求查询IP地址的位置,然后做相应的地址重定向
5. 存在的问题,淘宝IP地址库的查询请求是有频率限制的,所以会存在频繁查询查询失败的情况,这个时候是默认跳新加坡的,因为我们主要的客户在国外

好了一下说正事~

淘宝的IP库,看起来就是给出了比较详细的信息:

这个时候,我就像做一个我自己的地址库,然后让别人来查,看了下,上面有的信息,这时候网上了查了下,好像可行,就开始动手了.
需要的信息:
1. 国家, 国家代码
2. 省,省代码
3. 市,市代码
4. isp
5. IP地址库
相应的地址,在代码里面有,需要的可以看代码的请求地址

去网上搜索了一下,好像这些大概都可以找到,接下来就去爬下来就好了(无奈IP地址库的信息,现在我只找到了省级以上的地址库的信息,最后也没找全.

国家代码再维基百科上爬的

个人经验要点:
1. 爬基本的信息的时候,如果遇到整页信息的,其实可以不用http 请求,特别是想国外网站的(维基百科),不科学上网还请求不下来,这个时候就直接手动复制一下,然后读入解析就好了,我维基百科就是直接辅助文件,然后解析文件的

2. 遇到二级或者三级页面的时候,可以自己手动点击一下,然后看看页面的跳转,因为大批量类似页面的时候,有时候可能只需要改变页面的一个字符就可以直接请求了

3. 关键点在解析部分,这里我用的是python + BeautifulSoup 爬的,之前我想用go爬,却发现做正则表达式匹配的时候非常困难,然后爬了一个就改为用python了
BeautifulSoup 好像可以直接过滤掉&nbsp这类的字符,然后有很多的接口可以直接调用,获取到title 之类的html 标签,很方便

4. 当爬到纯文本的时候,这个时候要读取行或者列的时候,用字符串的分隔,分成数组,来挑选其中需要的项,我觉得这样是比较方便的。

5. 注意请求头要加一下一些基本的http 请求头信息,否则有的网站会识别,然后不会回应你.

6. 封装请求html 下载页面内容的方法,再解析想要的内容,存入数据库即可。

7. 服务部分就可以直接写服务,读取相应的数据库,查询,提供服务即可。

golang reflect 测试

Intellj IDEA 配置go 开发环境

1. 下载安装版本go 1.8

2. 按照提示下一步下一步安装好 go 后,应该是在C:\Go 目录
3. 可以在cmd 命令行$go 试试看能不能答应出usag
4. mac 可以使用homebrew 安装,安装完后应该是在homebrew 下的Celler 下面
5. 配置gopath 目录指向一个你用于存放go 源码、包、可执行文件的目录,
并且go 强制要求在此目录下简历src bin pkg目录存储相关的go 源码文件和包文件
当你使用go get github.com/urlshor…..之类的包的时候就会存储在这些src 目录下了
6. 下载安装intellj IDEA , 地址:http://www.jetbrains.com/idea/
激活可以使用licenseServer 激活,server可以使用:http://idea.iteblog.com/key.php

7. 启动idea ,并在config中找到plugins ->browse repositories中输入go 安装go language
8. 新建项目 配置go sdk 选择你安装go的目录,也就是那个C:\Go 目录
9. 编写go 代码
#10. 关于包的管理,IDEA 强制包名同目录名,如果你想建立一个package在本地,然后main 包引用
那么你需要建立相应的目录在src 目录中,然后通过import “./packagename” 引入

那个谁,请收下33-2017年的目标!

前几天在订阅号读了一个三十岁妈妈写的《自律真的可以改变人生》。

文中的她坚持了两年,从2015年到2016年。列目标,列计划,坚持,坚持。最后都实现了。再看看自己,在这世上活了24年,没有自己明确的目标,很多“我想要……”都停留在了空想里,随着时间一天天逝去,最后变成了泡沫。

昨天,跟LGM聊天说起自己2017年的目标。他说,把它们全部详细地写下来,发给他,他监督。还叫我自觉点。我也了解自己—严重的拖延癌患者!

目标不止是停留在口边的,还要具体地行动!

SO,我现在列下2017年的目标:

1、稳定工作

回想起2016年,本人过得有些浑噩:纠结、辞职、找工作、纠结……各种蠢事都在2016下半年做过了。不过,也正因为这些黑暗史让我自己学会了思考,学会了面对,学会了对自己负责。

LGM说,现在准备下简历,年后可以考虑换工作的机会。

我听了回他“你居然支持我换工作了!我感动啊!你以前都不理我!”

他说,“工作,干什么都是干,有机会的时候就可以考虑了。我考虑的是什么时候该换,什么时候不该换!哪里不理你,工作的时候都在想着怎么关心下你。”

听了后心里暖暖的。(此处好想给他一个感动的大哭脸,呜呜呜呜……)

说到稳定工作,这范围有些大。工作哪有什么稳定得下来的,重要是稳定自己。之所以选择现在的工作也就是为了有更多的时间做自己的事情—看书考公务员事业单位。给自己的一次机会,做什么都得有舍。

2、考证

大学没有好好学习考些证,毕业后出来发现有些证也能成你生活的饭碗。目标:考网络工程师证、教师资格证、会计从业资格证(后两个证也不知道为什么而考,只是觉得大学时喊了那么久,现在没得到,感到遗憾。)

3、学PHP,做一个网站。

LGM说,这目标说得太大了,有些含糊,不够详细。我所想的网站主要是资讯型的网站。目前想到的这个网站放自己的东西,具体栏目功能还在思考构造中……

现在我也才刚刚起步PHP语言,离这个目标还有好远的距离。

4、读33本书

对别人来说,一年读33本书挺少的了。但是对于我这个渣渣来说,真的是好多了。因为我长这么大,一年都没好好读过一本书。之前办了区图的借书卡,现在可以用上了。33,也是自己喜欢的数字。

5、跑1000公里

南湖公园一圈大概8.37公里,一年365天中的120天去跑一圈。恩,这是说得容易,做起来也容易的一件事。对我来说,行动出发、坚持是很难的。

6、来一次说走就走的旅行

我想到的终点有:厦门、重庆至四川。

 

这是2017年的六个大目标了,那个谁,请收下!

接下来,就是行动!!!

 

 

1 2 3 19