微服务架构概述 架构模式( 三 )


@ApiVersion(2) //加入接口url的版本控制,http://localhost:8888/v2/vue/API/program language/get byname?language _ name = C @ request mapping(value = "https://m.laogu.cc/program language/get by name")公共列表get by name(@ request param String language name){ List filter List = language List . stream() 。filter(s -> s.toLowerCase() 。包含(languageName.toLowerCase())) 。collect(collectors . to list());返回filterList}
IDEA启动项目后 , 浏览器访问该地址查看效果 。
访问效应
在Postman中调用微服务接口时 , 返回的Json数据经过了格式上的美化,更容易阅读 。
邮递员
不及物动词微服务拆分策略6.0微服务拆分原理
1.单一责任、高内聚、低耦合:微服务边界内的业务能力要单一 , 微服务之间的耦合度要低;2.微服务粒度适中:拆分微服务完成一个完整的业务需求,不是越细越好;(1)按业务模型切入:以业务模型中的业务活动为基本单位进行拆分,即微服务边界最大不能超过业务活动;(2)进化拆分:在实际应用过程中,根据负载情况细化微服务拆分,实现性能升级;(3)读写分离:将负责生成和维护数据的业务功能与负责查询和搜索数据的业务功能分离 。3.避免循环依赖和双向依赖:可以通过服务上移和服务下移的方式避免循环依赖,通过回调的方式避免双向依赖 。4.考虑团队架构:拆分完成一个完整的业务逻辑所需的前中后端,方便开发团队单独实现 。
6.1错误的策略
如果原有系统被完全颠覆,投入巨资启动“更大规模”的微服务系统来替代,会导致延迟(需要几年才能带来价值)和风险(超支 , 或者取消) 。
6.2正确的策略
努力改变 , 而不是颠覆 。尝试拆解一个小系统->培养能力积累经验->循序渐进在更大范围推广 。
微服务拆分的核心需求:高内聚,低耦合 , 尽可能的减少微服务间的调用,尽可能的减少分布式事务; 微服务应该足够?。?能够分配一个团队(5人左右)去实现,但也不能过细 。
6.2.1总体思路
首先是业务分解,然后是领域建模 。
6.2.1.1边界周围的净空环境 。
服务应该根据业务能力而不是技术能力来划分 。微服务应该首先通过有界的上下文边界来划分 。注意:
理想情况下,有界上下文和微服务是1:1 。
考虑到其他原则和实际约束,实际微服务的划分可以在有界上下文图的基础上进行合并 。
服务微拆分的底线是聚合不能被打破,这会破坏事务一致性和业务约束 。
6.2.1.2调整不同的服务变更率/相关性 。
微架构的目标之一是实现独立部署和发布,以便更灵活地应对业务和需求变化 。在绑定上下文的基础上,考虑不同服务的变化率,将变化率相近的服务放入一个微服务中 。注意:
绝对费率:有些业务只是在建设阶段变化频繁 , 维护期相对稳定;一些业务在可预见的未来会有持续的需求 , 变化频率很高 。它们需要区分为不同的微服务 。
相对速度:软件系统的响应性最终体现在需求的端到端交付周期上 。如果两个服务之间的相关性相对较高 , 并且更改率接近,那么当业务需求到达时,总是需要同时修改两个上下文 。需要将它们放入同一个微服务中 。
6.2.1.3考虑系统的非功能需求 。
微架构的一个优点是可以适应系统灵活伸缩的要求,更灵活地适应业务量的增长 。设计微服务边界时,需要考虑非功能性要求:
可扩展性:有些服务在容量上有很大的弹性可扩展性需求(比如spike),需要设计成独立的微服务 。
可用性:有些业务对可用性要求极高(比如交易匹配),需要设计成独立的微服务 。
安全:有些业务对(数据)安全有独立的需求,需要设计成独立的微服务 。
其他非功能性需求:微服务视角主要关注可扩展性、可用性和安全性,但其他非功能性需求在设计一个系统时也需要考虑 。
6.2.1.4的其他设计限制
复杂性微服务会在调试、部署、运维等方面带来额外的复杂性和开销 。将微服务粒度划分得太细是反模式的 。考虑要解决问题的复杂程度,组合相对简单的服务 。
该结构建议由一个独立的2 pizza团队(7+-2人)开发和维护一个端到端的微服务 。团队过大或过小有时是服务拆分粒度不合理的标志 。此外,还要考虑团队成员的能力搭配 。
异构技术一些遗留系统 , 如业务软件包(如ERP)或技术组件(如搜索引擎)形成了一个天然的服务边界 , 很难被分解为微服务 。

推荐阅读