网站首页 > 技术文章 正文
简介
服务网关是系统对外的唯一入口,它封装了系统内部架构,为每个客户端提供了定制的API,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。
为什么要使用服务网关?
- 单体应用
浏览器发起请求到单体应用所在的机器,应用从数据库查询数据原路返回给浏览器,对单体应用来说是可以不用网关的。
- 微服务
微服务的应用可能是部署在不同机房、不同地区、不同域名下的。此时客户端想要请求对应的服务,都需要知道机器的具体IP或域名;当微服务实例众多时,对客户端来说就难以维护。此时就有了网关,客户端相关的请求直接发送到网关,由网关根据请求标识解析判断出具体的微服务网址,再把请求发送到服务实例上。
如果由客户端直接请求各个微服务,会存在以下问题:
- 客户端多次请求不同的微服务,增加了网络的负担和客户端的复杂性
- 身份认证问题,每个微服务都需要独立身份认证
- 难以重构,随着项目的迭代,可能需要重新规划微服务
- 存在跨域请求,每个服务都要处理,非常麻烦
因此,我们需要网关介于客户端和服务端之间的中间层,所有外部请求率先经过网关,客户端只需要与网关交互,只需要知道网关地址即可,这样简化了开发,并且有以下优点:
- 易于监控,可在微服务网关收集监控数据并进行数据分析
- 易于认证,可在微服务网关上进行认证,然后再将请求转发到后端的微服务,从而无需在每个微服务中进行认证
- 减少了客户端与每个微服务之间的交互次数
- 可以在网关设置统一或个性化的服务策略,比如熔断、超时、重试、限流、舱壁等。
创建一个Web Api项目
- 提前准备:安装并启动Consul、数据库支持(SqlServer、Oracle、MySql、PostgreSql、Sqlite)、RabbitMQ(可选)
- 打开 Visual Studio 2022 并创建Web Api项目(点击查看完整示例代码1.5open in new window)
安装依赖包
安装服务注册nuget包Wing.Consul,服务网关nuget包Wing.Gateway,选择对应的数据库包,以SqlServer为例,安装Wing.SqlServer,请求日志支持本地消息队列和分布式消息队列进行异步持久化,基本上不影响网关性能。如果不想记录请求日志,可以不安装该包。如果想启用EventBus记录请求日志,需要安装RabbitMQ nuget包Wing.RabbitMQ。
dotnet add package Wing.Consul
dotnet add package Wing.Gateway
dotnet add package Wing.RabbitMQ
dotnet add package Wing.SqlServer(可选Wing.MySql/Wing.Oracle/Wing.PostgreSQL)
Program代码
using Wing;
var builder = WebApplication.CreateBuilder(args);
builder.Host.AddWing(builder => builder.AddConsul());
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddWing()
.AddPersistence()
.AddGateWay()
.AddEventBus();// 如果不想使用EventBus记录请求日志,可以删除此行代码
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
添加配置
{
// 是否启用配置中心,默认启用
"ConfigCenterEnabled": false,
"Consul": {
"Url": "http://localhost:8500",
"Service": {
//Http Grpc
"Option": "Http",
"HealthCheck": {
"Url": "http://localhost:1510/health",
//单位:秒
"Timeout": 10,
//单位:秒
"Interval": 10
},
"Name": "Wing.Demo_1.5",
"Host": "localhost",
"Port": 1510,
"LoadBalancer": {
//RoundRobin WeightRoundRobin LeastConnection
"Option": "WeightRoundRobin",
//权重
"Weight": 50
},
"Scheme": "http",
"Developer": "linguicheng"
},
//定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
"Interval": 10,
//数据中心
"DataCenter": "dc1",
//等待时间,单位:分钟
"WaitTime": 3
},
"ConnectionStrings": {
"Wing": "Data Source=192.168.56.96;User Id=sa;Password=wing123.;Initial Catalog=Wing;TrustServerCertificate=true;Pooling=true;Min Pool Size=1"
},
//自动同步实体结构到数据库
"UseAutoSyncStructure": true,
// 如果不启用EventBus,可以删除RabbitMQ配置
"RabbitMQ": {
"HostName": "192.168.56.99",
"UserName": "admin",
"Password": "admin",
"VirtualHost": "/",
"Port": 5672,
//消息过期时间,单位:毫秒,过期会自动路由到死信队列,小于或等于0则永久有效
"MessageTTL": 0,
"ExchangeName": "Sample.GateWay",
//每次投递消息数量
"PrefetchCount": 1
},
"Gateway": {
// 请求日志
"Log": {
// 是否启用网关日志记录
"IsEnabled": true,
// 是否启用事件总线(RabbitMQ)存储日志,生产环境推荐启用,可以提升程序的性能
"UseEventBus": false
}
}
}
查看运行效果
- 运行示例 1.2 并启动当前示例程序,浏览器访问
http://localhost:1510/Wing.Demo_1.2/weatherforecastopen in new window ,运行效果如下图:
- 运行示例 1.3,浏览器访问 http://localhost:1310/wing/index.html#/gateWayLogopen in new window ,可以看到网关请求日志,运行效果如下图:
本教程基于.NET微服务框架Wing, 项目地址:
gitee:
https://gitee.com/linguicheng/Wing
github:
https://github.com/linguicheng/Wing
猜你喜欢
- 2024-12-23 Kong 优雅实现微服务网关鉴权,登录场景落地实战篇
- 2024-12-23 微服务实战系列(九)-注册中心与网关高可用架构设计
- 2024-12-23 使用Kong作为微服务网关 微服务api网关
- 2024-12-23 微服务架构中API网关介绍 微服务api网关的作用
- 2024-12-23 万字长文详解微服务网关(中) 微服务网关是什么?
- 2024-12-23 微服务API聚合网关 An Aggregation API Gateway
- 2024-12-23 浅谈微服务:通信之网关 Ready 微服务架构中网关的作用
- 2024-12-23 国产微服务网关Apache APISIX 上手
- 2024-12-23 微服务网关 Gateway 进阶 - 认证鉴权
- 2024-12-23 微服务架构之API网关——在微服务项目中的技术框架和用法实践
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)