云原生开发:从基础到优化
1. 云消息集成与实时服务
云消息提供商能为 Web 和桌面应用带来动态实时更新的用户界面,还能让运行在半连接设备上的移动应用实现全交互功能。实时消息系统是构建高可扩展、分布式且最终一致系统的关键。部分消息提供商还针对物联网提供特殊支持,能将智能设备与后端集成。
2. 云原生应用构建理念
构建微服务并非单纯学习编程语言,而是要学会构建适应弹性伸缩环境、无主机依赖且能随时启停的云原生应用。
3. 识别与修复反模式
在开发过程中,为便于学习,常使用简单示例,但实际应用中需重新审视一些设计模式。以团队监控示例为例,最初设计中事件处理器和现实服务共享数据存储(如 Redis 缓存),这违背了“不将数据库作为集成层”的原则。
使用数据库作为集成层会带来以下问题:
- 多个服务依赖特定数据结构或模式,难以独立更改底层数据存储。
- 服务可能需同步发布,无法独立发布。
- 多个服务读写相同数据可能导致性能问题或数据损坏。
为解决此问题,可重新设计架构,让事件处理器调用现实服务来写入数据,使现实服务成为数据的唯一所有者。此外,还可让现实服务维护私有数据和外部缓存,将缓存视为版本化的公共 API。
4. 复合微服务的讨论
复合服务指依赖调用其他服务来满足请求的服务,通常为同步调用。这种模式在企业应用中广泛存在,但可能导致响应时间延长和失败率上升。例如,产品服务调用库存服务获取商品库存状态,若库存服务依赖的新服务出现问题,可能引发连锁反应。
部分微服务设计纯粹主义者认为真正的微服务不应同步调用其他服务,我们需意识到同步调用的风险。
5. 电路断路器降低风险
为应对同步调用嵌套问题,可采用电路断路器模式。当调用其他服务失败次数超过阈值时,电路断路器会触发,不再尝试与故障服务通信,而是返回适当的回退值。
以下是电路断路器状态判断的伪代码:
def state
(@failure_count >= @failure_threshold) ? :open : :closed
end
Netflix 的 Hystrix 是 Java 实现的电路断路器解决方案,还有如 Polly 这样的库,提供优雅的语法来声明重试、超时、电路断路器等策略。示例代码如下:
Policy
.Handle<DivideByZeroException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1));
Action<Exception, TimeSpan> onBreak = (exception, timespan) =>
{ ... };
Action onReset = () => { ... };
CircuitBreakerPolicy breaker = Policy
.Handle<DivideByZeroException>()
.CircuitBreaker(2, TimeSpan.FromMinutes(1), onBreak, onReset);
使用电路断路器时,应先确定是否需要,而非急于选择实现方案,因为它会增加复杂性和维护成本。
6. 消除同步复合模式
对于电路断路器和复合服务,关键是判断是否真的需要。以目录服务和库存服务为例,若库存数据变化不频繁,可让库存服务更新缓存,目录服务直接查询缓存,避免同步调用。
这种方式无需实现重试逻辑和使用重量级电路断路器框架,利用异步解决方案满足消费者需求。
7. 未来展望
在云原生开发中,要不断质疑和测试所学知识,积极构建自己的服务和应用。若发现代码有改进空间,可提交拉取请求。同时,要积极分享自己的开发经验,推动云原生技术的发展。
8. 相关技术要点总结
| 技术点 | 描述 |
|---|---|
| 云消息集成 | 借助云消息提供商实现实时更新和交互 |
| 云原生应用 | 适应弹性伸缩环境的应用构建理念 |
| 反模式修复 | 避免使用数据库作为集成层 |
| 复合微服务 | 同步调用可能带来的问题 |
| 电路断路器 | 降低同步调用风险的模式 |
| 异步解决方案 | 避免复杂同步调用的方法 |
9. 团队监控架构优化流程
graph LR
A[原架构:事件处理器和现实服务共享数据存储] --> B[问题:服务耦合、数据问题]
B --> C[重新设计架构:事件处理器调用现实服务]
C --> D[现实服务成为数据唯一所有者]
D --> E[可独立更改数据存储和发布服务]
10. 同步调用与异步解决方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 同步调用 | 实时获取数据 | 响应时间长、失败率高、耦合度高 |
| 异步解决方案 | 简单、降低耦合 | 数据可能非实时 |
云原生开发:从基础到优化
11. 云原生开发的关键要素
云原生开发涉及多个关键要素,这些要素相互关联,共同构成了云原生应用的基础。以下是一些重要的要素:
-
API 优先开发
:在开发过程中,优先设计和定义 API,有助于提高系统的可维护性和可扩展性。
-
配置管理
:包括外部配置、环境变量的使用等,确保应用在不同环境下的一致性。
-
日志记录
:记录应用的运行状态和错误信息,便于排查问题和监控系统性能。
-
会话状态管理
:管理用户会话,提供一致的用户体验。
-
数据保护
:确保数据的安全性和完整性,防止数据泄露。
-
服务发现
:使服务能够相互发现和通信,实现系统的分布式部署。
-
安全认证
:使用合适的认证和授权机制,保护应用和数据的安全。
12. 部分技术的操作步骤
12.1 配置 Postgres 数据库上下文
配置 Postgres 数据库上下文的步骤如下:
1. 使用
AddDbContext
方法配置数据库上下文。
2. 使用
AddEntityFrameworkNpgsql
方法实现位置记录存储库接口。
示例代码如下:
// 配置 Postgres 数据库上下文
AddDbContext<LocationDbContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection")));
// 实现位置记录存储库接口
AddEntityFrameworkNpgsql<LocationRecordRepository>();
12.2 注册服务
注册服务的步骤如下:
1. 使用
AddDiscoveryClient
方法注册服务。
2. 使用
UseDiscoveryClient
方法启用服务发现。
示例代码如下:
// 注册服务
services.AddDiscoveryClient();
// 启用服务发现
app.UseDiscoveryClient();
13. 实时应用与服务的构建
实时应用和服务的构建涉及云消息提供商、接近监控等方面。以下是构建实时应用和服务的关键步骤:
-
使用云消息提供商
:如 PubNub,实现实时消息传递。
-
构建接近监控服务
:检测团队成员之间的接近事件,并实时通知。
-
创建实时接近监控 UI
:提供用户界面,实时显示接近事件。
14. 云原生开发的安全策略
云原生开发的安全策略至关重要,以下是一些常见的安全策略:
-
使用令牌认证
:如 JSON Web Token (JWT) 规范,确保服务的安全性。
-
使用客户端凭证
:通过客户端凭证进行身份验证,保护服务免受未经授权的访问。
-
使用 OpenID Connect (OIDC) 中间件
:提供全面的安全流程,保护微服务和 Web 应用。
以下是使用令牌认证的示例代码:
// 配置令牌认证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://your-authority.com";
options.Audience = "your-audience";
});
// 启用认证
app.UseAuthentication();
15. 云原生开发的持续集成与部署
持续集成与部署是云原生开发的重要环节,以下是一些常见的工具和步骤:
-
使用 Wercker 或 CircleCI 进行持续集成
:自动化构建、测试和部署过程。
-
使用 Docker 进行容器化部署
:确保应用在不同环境中的一致性。
-
使用 Kubernetes 进行容器编排
:管理和调度容器化应用。
16. 云原生开发的技术选型
在云原生开发中,技术选型至关重要。以下是一些常见的技术选型建议:
| 技术领域 | 推荐技术 |
| ---- | ---- |
| 数据库 | Postgres |
| 服务发现 | Netflix Eureka |
| 配置管理 | etcd、Spring Cloud Config Server |
| 电路断路器 | Hystrix、Polly |
| 实时消息传递 | PubNub |
17. 云原生开发的流程总结
graph LR
A[API 优先开发] --> B[配置管理]
B --> C[日志记录与监控]
C --> D[服务发现]
D --> E[安全认证]
E --> F[实时应用与服务构建]
F --> G[持续集成与部署]
18. 云原生开发的优化建议
- 避免使用数据库作为集成层 :减少服务之间的耦合,提高系统的可维护性和可扩展性。
- 使用异步解决方案 :降低同步调用带来的风险,提高系统的性能和稳定性。
- 合理使用缓存 :提高系统的响应速度,但要注意缓存的一致性和版本管理。
- 持续监控和优化 :定期监控系统的性能和安全状况,及时发现和解决问题。
19. 云原生开发的未来趋势
随着技术的不断发展,云原生开发将朝着更加智能化、自动化和安全化的方向发展。未来,我们可以期待以下趋势:
-
人工智能与机器学习的应用
:提高系统的智能决策能力。
-
自动化运维
:减少人工干预,提高运维效率。
-
零信任架构
:提供更高级别的安全保障。
20. 总结
云原生开发是一种适应现代云计算环境的开发理念和方法。通过掌握云原生开发的关键要素、技术选型和优化建议,我们可以构建出高效、稳定、安全的云原生应用。在开发过程中,要不断学习和实践,关注技术的发展趋势,以适应不断变化的市场需求。
超级会员免费看
1866

被折叠的 条评论
为什么被折叠?



