.Net微服务实战之技术选型篇(二)

简介: .Net微服务实战之技术选型篇(二)

API网关

  

API网关主要起到了隔离内外网、身份验证、路由、限流等作用。我用一个生活的例子搭地铁比喻来描述下:过闸前我们需要经过安检保证客流的安全性,上下班高峰期还会排队进行限流,我们还可以通过看指示牌或者询问工作人员了解到应该往什么方向走,这就是路由。

  

我们团队选型了Kong和KongA作为我们的API网关,Kong是一个在Nginx运行的Lua应用程序,由lua-nginx-module实现。Kong和OpenResty一起打包发行,其中已经包含了lua-nginx-module。基本功能有路由、负载均衡、基本认证、限流、跨域、日志等功能,其他功能例如jwt认证可以通过插件进行扩展。

  

有人会问为什么不用Ocelot?回答这个问题之前,我首先声明我尊敬Ocelot项目与其开发者。

  

1.易用性。需要二次开发,虽然对.Net开发者来说能接受,但不利于运维。

  

2.性能。社区很多测试数据,据我了解就是kong 11K,Ocelot 3.5K,四舍五入3倍性能差,作为流量的入口,性能这块我还是比较注重的。

  

3.可扩展性,Kong很多功能可以通过插件式按需使用与开发。


image.png

 

服务描述

  

我们团队采用了Swagger,以此来衔接前后端开发的接口对接,省去了编写接口文档的成本,此外也支持接口调试,让开发效率提高不少。我们的服务都是以HTTP协议提供,对外API用RESTful风格,对内统一以POST的RPC风格提供。


image.png

服务注册中心

  

服务注册,服务在发布后自动把IP地址与端口注册进服务中心;服务发现,通过调用服务中心的接口获取到某服务IP地址与端口的列表。我们团队选用Consul+Consul Tamplate+nginx,Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的核心功能包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。

  

Consul作为服务注册中心的存在,但是我们服务发现只能拿到IP列表,我们使用RPC调用时还是得做负载均衡算法,于是使用了Consul Tamplate把服务列表同步到nginx的配置,那么RPC框架就无需集成负载均衡算法经过nginx路由。

  

开始选型我并没有选择Consul Tamplate,而是选择了fabio的这个中间件。fabio是一个应用于Consul的轻量级、零配置负载均衡路由器,开始用的时候部署起来很方便、很简单。后来上了Skywalking分布式链路跟踪系统,只要经过fabio路由的都无法把调用链串起来,虽然将就的用是没什么问题,但是Skywalking的调用链日志无法很好的展示出来就会影响日后的问题排查。我当时花了两天时间研究与issue提问,并没有很好的结果,所以最后另外选择了Consul Tamplate+nginx。


image.png


服务通信

  

RPC框架主要三大核心,序列化、通信细节隐藏、代理。协议支持分TCP和HTTP,当然还有两者兼容+集成MQ的。我们选择了WebApiClient做客户端,服务端仍是.Net Core WebAPI,主要考虑到WebAPIClient的轻量、易用,而且和Skywalking、Consul集成方便。我当时用的时候时.Net Core 2.2版本,gRPC并没有集成进来。

  

此外我也选择过ServiceStack,ServiceStack的技术栈很全,缺点是依赖得很深,当时试用的时候,它所以依赖的一个底层包ServiceStack.Common的某个类与WebAPI冲突了,所以对于不熟悉该框架的我断定存在依赖污染,无论我需要还是不需要都统统依赖进来了,然而我只是希望要一个简单的RPC框架。此外还需要破解。

  

Surging也作为我当时选型的目标,开始也是我抱着最大希望的,因为描述得很牛逼,什么都是全得。然而深入去用的时候,没有一个完整的文档,入门demo也不友好,说实话我驾驭不住只能放弃。


服务跟踪

  

市面上的分布式链路跟踪系统基本上都是根据谷歌的dapper论文实现的,基本上都分三大块,UI、收集器、代理(探针),原理大概是把涉及的服务链路的RequestID串起来。

  

我们团队选择了SkyWalking作为了项目的分布式链路跟踪系统,原因很简单:易用,无侵入,集成良好。

  

实施到我们项目的时候我做了点扩展,把Reqeust、Response、Header、异常给记录了下来,并过滤了部分不需要记录的路径。


image.png


分布式事务

  

只要在分布式系统,分布式事务必不可缺。

分布式事务


分类 理论 案例 中间件
强一致性 ACID 二阶段提交 msdtc
最终一致性 BASE 本地消息表 CAP

 

  

本地消息表是eBay在N年前提出的方案,而CAP以该思想实现的一门框架,原理大概是,本地业务表与消息凭据表作为一个事务持久化,通过各种补偿手段保证MQ消息的可靠性,包括MQ正常发布与消费。

  

我花了多天的时间专门测试了该框架可靠性,的确有保证。然而有个地方我认为可以优化,Retry的查询语句条件可以更加严谨点,只需要负责相应的Group进行Retry就好,没必要全部都查询出来,因为这个问题我在测试环境与本地环境共同调试时,刚好两个环境的Group不一致,导致会Retry失败的问题。


限流与熔断

  

我的架构图有两个网关:入站API网关 出站API网关

  

限流是针对外部流量的控制,保护了下游服务避免了流量冲击后雪崩,可以通过入站API网关的限流开关与策略控制。

  

熔断是保护上游服务避免因为下游的异常而且拖垮,更多是针对不可控的第三方依赖,例如微信、支付宝等。可以通过出站API网关的熔断开关与策略控制。


框架源码

  

写到这里,本篇的分享差不多要结束了,我将开源我们公司的工具库,有需要的朋友可以去使用。

  •   Sikiro.Tookits -公共基础库
  •   Sikiro.Nosql.Redis-StackExchange.Redis的基本封装
  •   Sikiro.Nosql.Mongo-mongodb驱动封装更新、排序等支持lambda
  •   Sikiro.MicroService.Extension-RPC注册,微服务框架-服务注册,终端跟踪忽略
  •   Sikiro.Chloe.Extension-支持多数据、事务封装、分页、IOC
  •   Sikiro.Chloe.Cap-把Chloe,ORM与CAP整合
  •       SkyApm.Diagnostics.AspNetCore|SkyApm.Diagnostics.HttpClient  修改了两
  • 个库的-XXXXXTracingDiagnosticProcessor的代码,主要增加request、response、header的记录。

  

额外说明下DotNetCore.CAP.MySql,这个是我从CAP源码拷贝过来然后改了MySql.Data的依赖,原本CAP.MySql是用的MySqlConnector,和我的Chloe.ORM冲突了。

  

开源项目的库使用:保证包名不修改的前提下,增加版本号引入项目就可以覆盖。

image.png

相关文章
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1574 3
|
缓存 负载均衡 监控
微服务架构下的电商API接口设计:策略、方法与实战案例
本文探讨了微服务架构下的电商API接口设计,旨在打造高效、灵活与可扩展的电商系统。通过服务拆分(如商品、订单、支付等模块)和标准化设计(RESTful或GraphQL风格),确保接口一致性与易用性。同时,采用缓存策略、负载均衡及限流技术优化性能,并借助Prometheus等工具实现监控与日志管理。微服务架构的优势在于支持敏捷开发、高并发处理和独立部署,满足电商业务快速迭代需求。未来,电商API设计将向智能化与安全化方向发展。
649 102
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
371 2
|
11月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
11月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
1511 2
Spring Boot 3.x 微服务架构实战指南
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc("likenum")`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
344 0
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
311 0
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
1086 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
950 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
1143 9