1. 微服务系统概述
微服务是一种开发软件的架构和组织方法,它将大型应用程序拆分成一系列小型、自治的服务,每个服务都有自己的独立部署、运行和维护,并通过轻量级通信机制相互协作,从而形成一个整体的系统。
微服务的优势和特征
1. 独立性和自治性
将大型应用拆分为多个小型服务,每个服务都是独立的,可以对其中的每个组件服务进行开发、部署、运营和扩展,而不影响其它服务的功能。
2. 服务单一职责
每个服务专注于解决一个特定的业务问题,具有明确的职责范围,保持服务的内举行和可维护性。
3. 服务松耦合
服务之间是松耦合的,能够独立演化和部署,而不会对整个系统造成波及。
4. 弹性和可伸缩性
微服务系统可以根据需求进行水平扩展,只需增加特定服务的实例数量,而不需要整体扩展。
5. 技术异构性
微服务系统中的每个服务都可以使用不同的技术栈和编程语言进行开发,选择最适合特定服务需求的工具和技术。
6. 专用性
微服务系统中的每项服务都是针对一组功能设计的,并专注于解决特定的问题。
7. 可组合性和可扩展性
微服务系统的每个服务都可以独立开发和部署,可以通过组合不同的服务来构建不同的应用场景和功能。
8. 容错性和可恢复性
微服务系统中的每个服务都是自治的,即使某个服务发生故障,整个系统仍然可以继续运行。
创建微服务系统的常用技术
1. 使用容器化技术(如docker、kubernetes),将每个微服务打包成独立的容器,每个容器运行一个服务。容器化技术提供了隔离性、可移植性和弹性扩展的能力,使得微服务可以独立部署和管理。
2. 每个微服务通过RESTful API暴露自己的功能,并通过HTTP或HTTPS进行通信。服务之间可以通过API进行数据交互和调用。
3. 使用消息队列系统(如Kafka、RocketMQ),实现微服务之间的异步通信。微服务可以通过发送和接收消息来进行解耦和协作,提高系统的弹性和可伸缩性。
4. 使用服务注册与发现机制,实现微服务的动态发现和调用。
5. 使用服务网关作为微服务系统的入口和流量路由器。服务网关可以提供负载均衡、安全认证、请求转发和缓存等功能,简化客户端和服务之间的通信。
6. 分布式数据库可以实现数据的分布式存储和管理。
2. 微服务系统架构
微服务架构设计的主要原则:
1. 单一职责原则
2. 隔离性原则
3. 自治性原则
4. 弹性原则
5. 可观察性原则
6. 可测试性原则
7. 可维护性原则
8. 安全性原则
9. 智能端点与简单消息传递原则
微服务系统的架构模式
1. 聚合器微服务
聚合器可以理解为一个中心化的服务,主要功能是接收来自客户端的请求,按照业务逻辑将请求分发给后端的多个服务,最终将这些数据进行处理、聚合和转换,以生成需要的数据格式,并将其返回给客户端。
2. 代理微服务
与聚合微服务的区别在于:代理仅委派请求,或者进行数据的转换工作,不会从后端服务中聚合数据,但会根据业务需求的差别调用不同的微服务。
代理微服务的一个重要功能是服务治理,管理分布式系统中的各个微服务,包括负载均衡、故障熔断、限流。
3. 链式微服务
将多个微服务连接在一起,形成一条微服务链。每个微服务负责完成特定的功能,同时将处理结果传递给下一个微服务,以实现复杂的业务逻辑。
4. 分支微服务
多个微服务将被组织在一起,形成不同的分支结构,每个分支代表一种可能的业务场景或决策路径,并通过链式调用相应请求。每个分支都是一个独立的微服务单元,它们根据输入数据和条件来确定应该采取的下一步行动。
5. 数据共享微服务
提供了一种在不同微服务之间共享数据的方法,通过将数据访问和管理集中在一个和多个微服务中,来实现不同微服务之间共享数据的目的,用于特定的业务场景。
6. 异步消息微服务
是一种基于消息传递的微服务架构,每个微服务都可以充当消息的生产者和消费者。异步意味着服务之间传递消息无需等待响应返回,可以立即执行其它任务。
通常使用消息队列作为消息传递的中介,通过事件触发的方式驱动服务的调用,事件驱动架构可以实现高度松耦合的系统设计。
3. 微服务系统开发
微服务五大核心组件、三大配件
五大核心组件【必选】
-
注册中心(Nacos)
-
配置中心(Nacos)
-
网关(gateway)
-
服务调用(OpenFeign)
-
负载均衡(LoadBalancer)
三大配件【可选】
-
流控防护(Sentinel)
-
链路追踪(很吃性能,尽量别用)
-
日志监控(elastic)
注册中心 & 配置中心 — Nacos
服务注册与发现 — Nacos
C一致性 A可用性 P分区容错性
服务网关 — Gateway
负载均衡 — LoadBalancer
服务调用 — OpenFeign
限流降级 — Sentinel
异步消息削峰填谷 — RocketMQ
分布式事务保证数据一致性 — Seata
链路追踪 — Skywalking、pingpoint
日志监控 — ELK elastic stack
服务治理8大功能
-
服务注册
-
服务续约(心跳检测)
-
服务调用
-
服务获取
-
失效剔除
-
自我保护
-
服务同步
-
服务下线
上述架构图中的OAuth2用于微服务安全与权限认证。
微服务之间的通信
根据通信类型,可以分为两种:
一. 同步通信
1)HTTP REST方式:使用http协议进行数据传递,数据格式是使用JSON格式。http rest 是属于OSI七层模型中的应用层。OpenFeign一个基于Java的声明式HTTP框架,是Spring Cloud生态系统中的一部分,OpenFeign允许开发人员通过编写接口的方式定义对远程服务的访问,然后通过注解来配置请求参数、路径等信息,OpenFeign会根据接口的定义自动生成具体的实现代码。OpenFeign主要使用HTTP协议进行通信,更加关注于RESTful风格的接口调用,适用于构建轻量级的微服务。
2)RPC远程过程调用:使用TCP协议,消息格式是采用二进制格式。RPC属于传输层,所以RPC要比http rest的效率更加高效。Dubbo是一种基于RPC(远程过程调用)的微服务框架,用于实现服务之间的同步通信。Dubbo更加底层,需要显式定义接口和实现类,并配置各种参数。
二. 异步通信
1)发布/订阅模式(Publish/Subscribe):在发布/订阅模式中,消息发布者将消息发布到一个或多个主题(Topic),订阅者可以选择订阅感兴趣的主题。当发布者发布消息时,所有订阅该主题的订阅者都会收到消息。这种模式适用于需要将消息广播给多个接收者的场景,如实时广播、事件通知等。借助一些消息中间件,比如RocketMQ、kafka等。
2)点对点模式(Point-to-Point):在点对点模式中,消息发送者将消息发送到一个特定的消息队列中,而消息接收者通过从这个队列中接收消息来消费它们。每条消息只能被一个接收者消费,一对一的关系。这种模式适用于每条消息只能被一个接收者处理的场景,如任务分发、RPC调用等。
应用间的通信
1. 裸协议:HTTP
2. 远程过程调用:RPC
-
Dubbo 底层是使用 Netty 这样的 NIO 框架,是基于 TCP 协议传输的,配合以 Hession 序列化完成 RPC 通信。
-
SpringCloud 是基于 Http 协议 +Rest 接口调用远程过程的通信,相对来说 Http 请求会有更大的报文,占的带宽也会更多。但是 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖只依靠一纸契约, 不存在代码级别的强依赖。
安全和权限
自动化构建和持续集成
4. 微服务系统测试
▪ THE END ▪