0

0

OSS.Core基础思路

大家讲道理

大家讲道理

发布时间:2017-05-28 11:43:31

|

1458人浏览过

|

来源于php中文网

原创

  如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务以及衍生的微服务网关产品,正好最近打算写一个小开源框架oss.core,过程中有一点思考,通过这篇文章记录一下,也希望能尽量帮助大家去理解一下,大概围绕以下几个问题:

1. 微服务产生的由来2. 微服务的设计思路3. OSS.Core框架的设计和实现

  在展开讲述之前,我希望大家首先要明白传统架构和微服务架构之间不是相互独立/对立关系,微服务是在传统框架下为了应对并发维护等问题衍生出的逻辑概念,更多的是在项目不同阶段的思考和解决问题方式的转变。其次,把逻辑架构和物理架构(文件) 区分开来,多数时候逻辑架构和物理架构对应的,不过有时一个物理架构中是可以包含多个逻辑架构的。

一. 微服务产生的由来

      微服务主要是将一些大型的,复杂的应用拆解为多个服务组合,每个服务自治,以达到更加灵活,维护方便的效果。 

  为了更好的理解,我们先来看下常见三种解决并发的方式:

  1. 添加数据库主从分离,甚至多主写入或者分区等机制,在应用程序中对应修改连接串或添加访问中间件,来提高数据库的处理能力。

  2. 由于数据库资源相对紧张并且比较耗时,为了提高访问速度,这个时候一般也会通过分布式缓存等来减少对底层的访问。

  3. 负载均衡分流处理,在大量请求抵达应用程序之前,将其分散到不同的机器上,来解决单机带宽和性能瓶颈问题。

  当然解决并发还有很多其他的方式,如前端静态文件压缩,CDN加速,IP速率控制等,这里先略过。

  以上这三种方法很多朋友应该都见过,之所以这里列一下,再结合这张图可以更加容易的对比出传统整个服务到微服务之间的变化:

  在传统的整体服务框架中,模块之间存在着很大的耦合,项目内部存在互相调用,以及各种复杂聚合操作,所以在多数情况下只能整体部署,在左侧图中我们可以看到负载均衡时我们需要整体部署在多台机器上,相对数据库也是如此,而一个项目中每个模块的需求是不一样的。

  例如:产品和下单模块的访问频率和流程的复杂度上有着很大的不同,下单频率相对较小,复杂度高,我们更希望运行在预算能力高的相对少机器上,也方便更快的排查问题和维护。右图中可以看到把服务细化之后,我们可以用更小的部署单元来根据情况进行组合。

  同时,在互联网产品快速迭代的今天,一个产品需要具有快速为不同终端上线不同应用功能的能力,同时业务的调整能够快速的上线,传统的整体服务模式已经力不从心。微服务因为已经化整为零,反而因为各模块的独立能很快相互组合,并且每个模块可以根据不同的需求点采用不同特性的编程语言

  

 

二. 微服务的设计思路

  因为每个产品都有自己的标准和重点,所以设计服务单元时也各有不同,但是有最基本一点: 服务自治

  当你设计一个微服务模块时,需要保证当前服务的独立,特别是数据模块的独立,其他服务无权直接操作当前服务下的数据库模块,对外交互只能通过服务接口来完成。因为模块的独立,所以你可以选择适合的编程语言,以及对应的部署规模。达到局部的灵活优化。微服务相互独立带来以上便利的同时,它也带来了一些我们需要面对的问题:

  首先:如何如何界定当前服务的边界,如何确定当前服务治理范围。

  既然是要最小化服务单元,那就要确定服务的职责边界问题,这个问题建议结合:服务生命周期流程领域,以及预估规模 这几点综合考虑,例如用户服务,在访问量小人员少时可以把用户基础信息,余额账户放在一个服务模块下,以减少工作量减少精力分散。规模大时再分基础服务和资产服务。

  其次:跨服务数据查询问题

  例如在客户端中搜索商品,还可以搜索用户或者统计数据查询等如何处理。对于这种我给两个处理方式:

  1. API Gateway

  这种情况适合在服务单元过多,客户端需要查询使用不同的服务单元中的数据,这个时候我们可以针对性的搭建一个API服务网关(请注意和APP Gateway区分开),通过这个网关聚合多个服务,客户端只需要和当前网关交互,网关聚合转发给不同的微服务。如下图:

  2. 数据冗余或者后台数据同步

博思AIPPT
博思AIPPT

博思AIPPT来了,海量PPT模板任选,零基础也能快速用AI制作PPT。

下载

  比如在订单信息中我需要用户的名称等少量用户字段,这个时候完全可以把这几个字段冗余到订单微服务数据模块下。又比如在统计模块下,其数据制造者和查询者完全属于不同的对象,无很高实时性,那我建议创建一个统计服务以及对应的统计数据库,其他服务通过事件消息交互,更新对应的统计数据,查询时通过统计服务自己的数据即可完成。

  再次:如何解决服务间的通信问题

  因为我们已经将服务之间相互独立,断绝直接操作不同服务数据库的可能。那么数据的一致性如何处理,在传统的服务模型中因为都糅合在一块,我们可以通过事务或者存储过程来保证数据的一致性。常见的有以下两个方式:

  1. 异步事件消息驱动

  这类解决方案适合对数据实时性要求相对不高的场景,比如上边的统计服务更新,在下单等服务的事件触发后给消息队列推送响应的消息通知,订阅此队列的服务接收更新数据。如图:

  2. 直接接口请求(HTTP,RPC)

  一般情况下不建议,以防止产生级联依赖。这类主要针对数据实时性要求较高的请求,比如在秒杀下单过程中需要立即知道库存服务扣除是否成功等。(注:.net 下对task的支持已经特别好了,http请求建议使用异步,同时前端返回TaskActionResult>,减少因IO操作造成的工作线程消耗)

  最后:客户端如何访问

  当我们封装完服务之后,这个服务如何和最后的客户端如何访问,这个需要根据实际的安全规则和要求各自决定了,一般情况下,如果服务相对较少,功能不算复杂的情况下可以直接暴露服务接口给客户端进行访问,如图:

  或者通过上边说的 API Gateway 的形式提供给客户端,当然也有很多已经成熟的微服务网关比如Azure云上的Service Fabric或者API Management,都是可以的。

 

三. OSS.Core框架的思路和实现

  OSS.Core这个项目是我最近在写的一个小开源产品,了解的朋友应该知道我在前面写了一些组件像: OSS.Social,OSS.PayCenter,OSS.Common,OSS.Http 这个项目希望能把这几个组件给串联起来,上边已经介绍了微服务的大概思考方式,我将会在这个产品的逻辑架构中尽可能的体现这一点,先把项目的物理架构图展示一下:

  这个项目中AdminSite,WebSite 放置在FrontEnds文件夹下,两个问站点分别是用户前端,和后台管理前端

  WebApi,Service,DomainMos(图中的Models和Interface)类库在 Layers 文件夹下,构成API基础

  Infrastructure(业务相关通用实体枚举辅助类) 和 Common(业务无关相关实体辅助类) 作为基础设施类库,可以在各级类库中调用

   Repositories(暂时是项目中的OSS.Core.RepDapper的Mysql实现,以后可能增加其他数据库支持),主要是Rep.. Interface的具体实现。

  Plugs是实现了Common插件下的日志,缓存,和配置接口具体实现,可以通过Common在各级直接调用。

      回到微服务的话题上,在这个产品中我不会为每个服务创建一套Layers下的类库实现,我将在这个项目通过文件夹隔离的形式来分开各个服务,你可以把WebApi当做一个API Gateway,内部的调用顺序我希望是这样的:

  现在代码结构图:

 

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

2

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

24

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

80

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

187

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

339

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

116

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

180

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

31

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

81

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号