范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

小团队的微服务之路

  戳蓝字"CSDN云计算"关注我们哦!
  作者 | Dean
  文章转载自Docker
  微服务是否适合小团队是个见仁见智的问题。回归现象看本质,随着业务复杂度的提高,单体应用越来越庞大,就好像一个类的代码行越来越多,分而治之,切成多个类应该是更好的解决方法,所以一个庞大的单体应用分出多个小应用也更符合这种分治的思想。当然微服务架构不应该是一个小团队一开始就该考虑的问题,而是慢慢演化的结果,谨慎过度设计尤为重要。
  公司的背景是提供SaaS服务,对于大客户也会有定制开发以及私有化部署。经过2年不到的时间,技术架构经历了从单体到微服务再到容器化的过程。
  单体应用时代
  早期开发只有两个人,考虑微服务之类的都是多余。不过由于受前公司影响,最初就决定了前后端分离的路线,因为不需要考虑SEO的问题,索性就做成了SPA单页应用。多说一句,前后端分离也不一定就不能服务端渲染,例如电商系统或者一些匿名即可访问的系统,加一层薄薄的View层,无论是PHP还是用Thymeleaf都是不错的选择。
  部署架构上,我们使用Nginx代理前端HTML资源,在接收请求时根据路径反向代理到server的8080端口实现业务。
  接口定义
  接口按照标准的Restful来定义:
  版本,统一跟在 /api/后面,例如 /api/v2
  以资源为中心,使用复数表述,例如/api/contacts,也可以嵌套,如/api/groups/1/contacts/100
  url中尽量不使用动词,实践中发现做到这一点真的比较难,每个研发人员的思路不一致,起的名字也千奇百怪,都需要在代码Review中覆盖。
  动作支持,POST / PUT / DELELE / GET ,这里有一个坑,PUT和PATCH都是更新,但是PUT是全量更新而PATCH是部分更新,前者如果传入的字段是空(未传也视为空)那么也会被更新到数据库中。目前我们虽然是使用PUT但是忽略空字段和未传字段,本质上是一种部分更新,这也带来了一些问题,比如确有置空的业务需要特殊处理。
  接口通过swagger生成文档供前端同事使用。
  持续集成(CI)
  团队初始成员之前都有在大团队共事的经历,所以对于质量管控和流程管理都有一些共同的要求。因此在开发之初就引入了集成测试的体系,可以直接开发针对接口的测试用例,统一执行并计算覆盖率。
  一般来说代码自动执行的都是单元测试(Unit Test),我们之所以叫集成测试是因为测试用例是针对API的,并且包含了数据库的读写,MQ的操作等等,除了外部服务的依赖基本都是符合真实生产场景,相当于把Jmeter的事情直接在Java层面做掉了。这在开发初期为我们提供了非常大的便利性。但值得注意的是,由于数据库以及其他资源的引入,数据准备以及数据清理时要考虑的问题就会更多,例如如何控制并行任务之间的测试数据互不影响等等。
  为了让这一套流程可以自动化的运作起来, 引入Jenkins也是理所当然的事情了。
  开发人员提交代码进入gerrit中,Jenkins被触发开始编译代码并执行集成测试,完成后生成测试报告,测试通过再由reviewer进行代码Review。在单体应用时代这样的CI架构已经足够好用,由于有集成测试的覆盖,在保持API兼容性的前提下进行代码重构都会变得更有信心。
  微服务时代
  服务拆分原则
  从数据层面看,最简单的方式就是看数据库的表之间是否有比较少的关联。例如最容易分离的一般来说都是用户管理模块。如果从领域驱动设计(DDD)看,其实一个服务就是一个或几个相关联的领域模型,通过少量数据冗余划清服务边界。单个服务内通过领域服务完成多个领域对象协作。当然DDD比较复杂,要求领域对象设计上是充血模型而非贫血模型。从实践角度讲,充血模型对于大部分开发人员来说难度非常高,什么代码应该属于行为,什么属于领域服务,很多时候非常考验人员水平。
  服务拆分是一个大工程,往往需要几个对业务以及数据最熟悉的人一起讨论,甚至要考虑到团队结构,最终的效果是服务边界清晰, 没有环形依赖和避免双向依赖。
  框架选择
  由于之前的单体服务使用的是Spring Boot,所以框架自然而的选择了Spring Cloud。其实个人认为微服务框架不应该限制技术与语言,但生产实践中发现无论Dubbo还是Spring Cloud都具有侵入性,我们在将Node.js应用融入Spring Cloud体系时就发现了许多问题。也许未来的Service Mesh才是更合理的发展道路。
  这是典型的Spring Cloud的使用方法,该图取自纯洁的微笑公众号。
  Zuul作为Gateway,分发不同客户端的请求到具体Service
  Erueka作为注册中心,完成了服务发现和服务注册
  每个Service包括Gateway都自带了Hystrix提供的限流和熔断功能
  Service之间通过Feign和Ribbon互相调用,Feign实际上是屏蔽了Service对Erueka的操作
  上文说的一旦要融入异构语言的Service,那么服务注册,服务发现,服务调用,熔断和限流都需要自己处理。再有关于Zuul要多说几句,Spring Cloud提供的Zuul对Netflix版本的做了裁剪,去掉了动态路由功能(Groovy实现),另外一点就是Zuul的性能一般,由于采用同步编程模型,对于IO密集型等后台处理时间长的链路非常容易将servlet的线程池占满,所以如果将Zuul与主要Service放置在同一台物理机上,在流量大的情况下,Zuul的资源消耗非常大。实际测试也发现经过Zuul与直接调用Service的性能损失在30%左右,并发压力大时更为明显。现在Spring Cloud Gateway是Pivotal主推的,支持异步编程模型,后续架构优化也许会采用,或是直接使用Kong这种基于Nginx的网关来提供性能。当然同步模型也有优点,编码更简单,后文将会提到使用ThreadLocal如何建立链路跟踪。
  架构改造
  经过大半年的改造以及新需求的加入,单体服务被不断拆分,最终形成了10余个微服务,并且搭建了Spark用于BI。初步形成两大体系,微服务架构的在线业务系统(OLTP) + Spark大数据分析系统(OLAP)。数据源从只有MySQL增加到了ES和Hive。多数据源之间的数据同步也是值得一说的话题,但内容太多不在此文赘述。
  服务拆分我们采用直接割接的方式,数据表也是整体迁移。因为几次大改造的升级申请了停服,所以步骤相对简单。如果需要不停服升级,那么应该采用先双写再逐步切换的方式保证业务不受影响。
  自动化部署
  与CI比起来,持续交付(CD)实现更为复杂,在资源不足的情况我们尚未实现CD,只是实现执行了自动化部署。
  由于生产环境需要通过跳板机操作,所以我们通过Jenkins生成jar包传输到跳板机,之后再通过Ansible部署到集群。
  简单粗暴的部署方式在小规模团队开发时还是够用的,只是需要在部署前保证测试(人工测试 + 自动化测试)到位。
  链路跟踪
  开源的全链路跟踪很多,比如Spring Cloud Sleuth + Zipkin,国内有美团的CAT等等。其目的就是当一个请求经过多个服务时,可以通过一个固定值获取整条请求链路的行为日志,基于此可以再进行耗时分析等,衍生出一些性能诊断的功能。不过对于我们而言,首要目的就是trouble shooting,出了问题需要快速定位异常出现在什么服务,整个请求的链路是怎样的。
  为了让解决方案轻量,我们在日志中打印RequestId以及TraceId来标记链路。RequestId在Gateway生成表示唯一一次请求,TraceId相当于二级路径,一开始与RequestId一样,但进入线程池或者消息队列后,TraceId会增加标记来标识唯一条路径。举个例子,当一次请求会向MQ发送一个消息,那么这个消息可能会被多个消费者消费,此时每个消费线程都会自己生成一个TraceId来标记消费链路。加入TraceId的目的就是为了避免只用RequestId过滤出太多日志。实现如图所示:
  简单的说,通过ThreadLocal存放APIRequestContext串联单服务内的所有调用,当跨服务调用时,将APIRequestContext信息转化为Http Header,被调用方获取到Http Header后再次构建APIRequestContext放入ThreadLocal,重复循环保证RequestId和TraceId不丢失即可。如果进入MQ,那么APIRequestContext信息转化为Message Header即可(基于Rabbitmq实现)。
  当日志汇总到日志系统后,如果出现问题,只需要捕获发生异常的RequestId或是TraceId即可进行问题定位。
  经过一年来的使用,基本可以满足绝大多数trouble shooting的场景,一般半小时内即可定位到具体业务。
  运维监控
  在容器化之前,采用Telegraf + InfluxDB + Grafana的方案。Telegraf作为探针收集JVM,System,MySQL等资源的信息,写入InfluxDB,最终通过Grafana做数据可视化。Spring Boot Actuator可以配合Jolokia暴露JVM的Endpoint。整个方案零编码,只需要花时间配置。
  容器化时代
  架构改造
  因为在做微服务之初就计划了容器化,所以架构并未大动,只是每个服务都会建立一个Dockerfile用于创建docker image。
  涉及变化的部分包括:
  CI中多了构建docker image的步骤
  自动化测试过程中将数据库升级从应用中剥离单独做成docker image
  生产中用Kubernetes自带的Service替代了Eruka
  理由下文一一道来。
  Spring Cloud与Kubernetes的融合
  我们使用的是Redhat的OpenShift,可以认为是Kubernetes企业版,其本身就有Service的概念。一个Service下有多个Pod,Pod内即是一个可服务单元。Service之间互相调用时Kubernetes会提供默认的负载均衡控制,发起调用方只需要写被调用方的ServiceId即可。这一点和Spring Cloud Fegin使用Ribbon提供的功能如出一辙。也就是说服务治理可以通过Kubernetes来解决,那么为什么要替换呢?其实上文提到了,Spring Cloud技术栈对于异构语言的支持问题,我们有许多BFF(Backend for Frontend)是使用Node.js实现的,这些服务要想融合到Spring Cloud中,服务注册,负载均衡,心跳检查等等都要自己实现。如果以后还有其他语言架构的服务加入进来,这些轮子又要重造。基于此类原因综合考量后,决定采用OpenShift所提供的网络能力替换Eruka。
  由于本地开发和联调过程中依然依赖Eruka,所以只在生产上通过配置参数来控制:
  eureka.client.enabled设置为false,停止各服务的Eureka注册
  ribbon.eureka.enabled设置为false,让Ribbon不从Eureka获取服务列表
  以服务foo为例,foo.ribbon.listofservers 设置为 http://foo:8080,那么当一个服务需要使用服务foo的时候,就会直接调用到http://foo:8080
  CI的改造
  CI的改造主要是多了一部编译docker image并打包到Harbor的过程,部署时会直接从Harbor拉取镜像。另一个就是数据库的升级工具。之前我们使用flyway作为数据库升级工具,当应用启动时自动执行SQL脚本。随着服务实例越来越多,一个服务的多个实例同时升级的情况也时有发生,虽然flyway是通过数据库锁实现了升级过程不会有并发,但会导致被锁服务启动时间变长的问题。从实际升级过程来看,将可能发生的并发升级变为单一进程可能更靠谱。此外后期分库分表的架构也会使随应用启动自动升级数据库变的困难。综合考量,我们将升级任务做了拆分,每个服务都有自己的升级项目并会做容器化。在使用时,作为run once的工具来使用,即docker run -rm的方式。并且后续也支持了设定目标版本的功能,在私有化项目的跨版本升级中起到了非常好的效果。
  至于自动部署,由于服务之间存在上下游关系,例如Config,Eruka等属于基本服务被其他服务依赖,部署也产生了先后顺序。基于Jenkins做Pipeline可以很好的解决这个问题。
  小结
  其实以上的每一点都可以深入的写成一篇文章,微服务的架构演进涉及到开发,测试和运维,要求团队内多工种紧密合作。分治是软件行业解决大系统的不二法门,作为小团队我们并没有盲目追新,而是在发展的过程通过服务化的方式解决问题。从另一方面我们也体会到了微服务对于人的要求,以及对于团队的挑战都比过去要高要大。未来仍需探索,演进仍在路上。
  福利
  扫描添加小编微信,备注"姓名+公司职位",加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!
  2、公众号后台回复:工具,获取开源云监控工具详细资料!
  推荐阅读:一部刷爆朋友圈的5G短片,看完才知道5G多暖多重要!云评测 | 开发者最有用的开源云监控工具有哪些呢? 这7款神器总有一款适合你!中央音乐学院招音乐AI方向博士生,玩一把代码与音符齐飞?学生实名举报, "这个女教授不懂区块链"
  北京程序媛图鉴 | 程序员有话说翟天临之后,大连博士细数区块链博士圈那些事……
  50个最有价值的数据可视化图表(推荐收藏)
  喜欢就点击"好看"吧

宁德时代推出换电品牌事件1月18日,宁德时代发布换电品牌乐行换电(EVOGO),以及由换电块快换站和APP三大产品共同组成的换电解决方案。乐行换电将由时代电服科技有限公司运营,该公司为宁德时代全资子公美国众议院推出新法案支持本土芯片产业,缓解供应链瓶颈路透社1月25日报道,美国众议院领袖周二公布一项法案,旨在支持美国芯片产业,其中包括为半导体制造和研究提供520亿美元补贴。据报道,拜登政府正在说服国会批准资金,以帮助促进美国的芯举张照片也能成功刷脸?人脸不应作为重要场景的唯一密码来源中国消费者报一位女性手拿一张打印的男性照片挡在自己脸前,对着某品牌人脸识别门禁打卡机打卡,居然成功地被识别为这位男员工这是中国信息通信研究院云计算与大数据研究所(以下简称信通院北汽A00级电动车车身技术路线研究前言孙逢春院士在2017年中国汽车轻量化技术研讨会指出1,汽车整备质量减少10,可以明显改善汽车动力经济性可靠耐久性环境油耗性安全性操控驾驶与舒适性,如加速性能提升0。5s,油耗降238个项目入选河北省2022年工业互联网创新发展重点培育项目我省发布2022年工业互联网创新发展重点培育项目238个项目入选总投资额超35亿元河北新闻网讯(河北日报记者米彦泽)日前,省工信厅发布2022年河北省工业互联网创新发展重点培育项目努比亚虎年伊始放大招,努比亚新音C1定义蓝牙耳机新基准前言如果说2021年,努比亚与小黄人的联名充电套装只是在外观设计上吸引用户的话,那2022年虎年伊始推出的努比亚新音C1则是把入门级蓝牙耳机的颜值和性能都提升到了一个新的档次,如果魅蓝新机入网,外观对标iPhone13,或899元起售近日,魅蓝新机亮相工信部,该机采用6。52英寸720P水滴屏幕,后置三摄,内置5000毫安电池,支持10W充电,重201克。该机预计是魅蓝10的增强版,或为魅蓝Note10,外观方日常生活中选择吸尘器还是扫地机器人?作为近年来非常具有代表性的清洁家电,吸尘器和扫地机器人的流行都在表达着近些年来消费者的收入有所提高,愿意去选择更好的小家电来服务自己的生活,将自己从那令人烦躁的日常清洁维护任务中剥换了台电热水器才知道温水量和容量有关系,但不是主要关系我家一直用着一台60L的电热水器,但总觉得热水水量不够。一个人勉强可以洗澡,但是两个人连续洗,就不够用了。前两天终于下定决心换一台热水器,到了商场里,营业员却还是推荐我选60L的。政协大会发言委员谈实体商业回味从前慢,留住故人心齐鲁晚报齐鲁壹点记者刘云鹤杜亚慧1月24日,山东省政协十二届五次会议在山东会堂举行全体会议,15位委员作大会发言,山东省政协委员姜明就如何推动实体商业发展作了发言。她表示,电子商务受电商冲击,实体店开不下去了,咋办?老牛再给大家强调一遍,不是实体店开不下去了,而是个体户无论在线下线上都遭到资本大鳄的围剿,这是一场不对称战争。所谓甚嚣尘上线下实体店败于房租只是外表皮毛,真正令整个线下实体店大规模
3299起?iPhoneSE3曝光,还有A15加持提起小屏手机,大家可能会第一时间想起苹果的iPhonemini系列,特别是最近发布的iPhone13mini,其5。4寸的全面屏设计和最新的A15处理器,不出意外的拿到了性能小钢炮他,福建初中生,域名之王,天使投资人,花7亿买币,为啥?日前,人民银行发布了一条关于防范和处置虚拟货币炒作的通知。政策的变动直接影响市场行情,相关股票纷纷下跌。接着,就有多家虚拟货币企业通知,将退出中国市场。从出售域名发家,先后投资多家python随机数问题,8个教室随机分配到3个教室importrandomlistTeacherT1,T2,T3,T4,T5,T6,T7,T8listRoom,,forlaoshiinlistTeachersum1random。r湖北加速搭建与全球英才对接平台多项创新创业赛事连轴举办21世纪经济报道记者陈红霞实习生井然武汉报道海外人才的研发创新能力是一个地区科研水平的中坚力量,湖北正通过举办各类创新赛制的创业比赛激发海外人才的创新活力。10月13日,21世纪经广东农业构建科技产业服务器近日,首届广东农业科技创新产业大会(下称科创大会)在广州召开。会上,广东省农业农村厅厅长顾幸伟宣布,十四五期间,广东农业将每年拿出1亿元资金在全国率先培育介于科技和产业间的科技产业中国移动打造全球首个5G盾构地铁项目原标题5G扬帆绽放移动(引题)中国移动打造全球首个5G盾构地铁项(主题)盾构机,被誉为最强穿山甲,开山挖洞的重器。这个庞然大物在开挖隧道时,面临的作业环境复杂多变,施工难度大,危险深度降噪告别地铁通勤杂音南卡A2主动降噪蓝牙耳机体验每天上下班地铁通勤,最为难受的除了人挤人的摧残,就是嘈杂的声音了,地铁上大声吵闹,聊天,接电话,列车的呼啸都令一天的烦躁更烦躁。最近用上了的南卡A2主动降噪蓝牙耳机,它拥有连接更稳18月国内市场5G手机总体出货量1。68亿部9月23日消息,信通院发布了2021年8月国内手机市场运行分析报告。报告显示,8月国内市场手机出货量2430。6万部,其中5G手机1768。8万部。18月国内市场手机出货量2。27三星GalaxyZFlip3入手测评折痕比较明显,重量很轻,总体满意这次听说支持5g就直接下单买了。屏幕质量不错,折痕存在但是不影响使用,出厂时候自带了一个保护膜,所以屏幕就不用贴膜了,下一代要是支持双卡就更好了。第一次使用filp,不得不说,这手国内的5G可不可以完全采用华为的标准建设?通俗点说,就是村里修路啦,高通说咱们修高速,4车道。快!华为说咱们修国道,8车道,又快又宽敞!小米说我们觉着吧,都修,修好之后大车走国道,小车走高速,这样最好!经过一番斗争和狗联想最前线苹果将推出史上最便宜5GiPhone,预计明年春季上市10月11日,台湾经济日报报道称,苹果平价机型iPhoneSE,将于2022年春季推出第三代新机iPhoneSE3,支持5G服务。苹果将其定义为史上最便宜的5GiPhone,128