从一个位置调用多个 ASP.Net Core 微服务
Posted
技术标签:
【中文标题】从一个位置调用多个 ASP.Net Core 微服务【英文标题】:Call Multiple ASP.Net Core MicroService from One location 【发布时间】:2017-07-30 04:32:15 【问题描述】:我是 ASP.Net Core 微服务的新手,我想知道我是否创建了多个 asp.net core WebApi 之类的项目
http://localhost:5555/CustomerService
http://localhost:6666/StoreService
http://localhost:7777/EmailService
& 除了将所有 URL 调用到 Web 应用程序之外,我可以只调用一个 HTTP URL 并将调用路由到特定 url 并将结果返回给客户端吗?
类似https://www.nginx.com/blog/building-microservices-using-an-api-gateway/
不知道如何使用 asp.net 核心创建 api 网关,任何帮助将不胜感激。
谢谢
【问题讨论】:
一个 api 网关只是另一个 api 应用程序,它具有像/customer
或 /store
这样的方法,它所做的只是将请求转发到微服务。这个想法是它是关闭/扩展的中心位置,并且微服务本身可以升级或重新路由。
服务注册表是您可以查看的另一种模式
我建议您观看 Microsoft 如何在 vs2017 中使用 docker 容器自己做到这一点:launch.visualstudio.com/keynote 进入视频 0:50:00(进入视频 50 分钟)
一种外观模式:)
【参考方案1】:
您可以使用Ocelot,这是一个 .NET API 网关,它作为 nuget 包添加到您的项目中。然后,您配置进入网关的呼叫如何路由到下游服务。这主要通过 JSON 配置文件完成,该文件映射上游和下游路径。
它支持aggregrates,这是您需要的功能。此配置的一个(未经测试的)示例是:
"ReRoutes": [
"DownstreamPathTemplate": "/CustomerService",
"UpstreamPathTemplate": "/Customer",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 5555
],
"Key": "Customer"
,
"DownstreamPathTemplate": "/StoreService",
"UpstreamPathTemplate": "/Store",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 6666
],
"Key": "Store"
,
"DownstreamPathTemplate": "/EmailService",
"UpstreamPathTemplate": "/Email",
"UpstreamHttpMethod": [
"Get"
],
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 7777
],
"Key": "Email"
],
"Aggregates": [
"ReRouteKeys": [
"Customer",
"Store",
"Email"
],
"UpstreamPathTemplate": "/",
"Aggregator": "FakeDefinedAggregator"
]
这将在您的应用程序中公开 4 条路由:
/customer
会调用 localhost:5555/CustomerService
/store
会调用 localhost:6666/StoreService
/email
会调用 localhost:7777/EmailService
/
将调用 localhost:5555/CustomerService、localhost:6666/StoreService 和 localhost:7777/EmailService 并将所有结果聚合在一起。
FakeDefinedAggregator
是一个客户聚合器,您可以使用它来生成最终结果。或者这个属性可以从配置中省略,这会将所有返回的值简单地组合到 1 个负载中。
【讨论】:
如何在组变量中从我的 azure 发布管道中替换服务 url 的值(如 HOST、PORT),这意味着服务名称和端口在 prod 环境中会有所不同,因此我需要替换值,如何我能做到吗? ocelot 配置只是一个类似于 appsettings.json 的配置源,因此您可以像对待这些配置一样对待它。例如有ocelot.environment.json
,或者在 ci/cd 管道中使用变量替换。
这正是我要问的,我如何对 ocelot.json 文件进行变量替换 bex 文件具有相同的参数,主机,端口主机,端口
对不起,我不明白你的意思。变量替换的处理方式会略有不同,具体取决于您使用的 ci/cd 应用程序(例如 azure devops 与 jenkins 等不同)。以上是关于从一个位置调用多个 ASP.Net Core 微服务的主要内容,如果未能解决你的问题,请参考以下文章
在 asp.net core 3.1+ 中使用多个中间件进行身份验证和授权
示例 AJAX 回调到 ASP.NET Core Razor 页面
从 ASP.NET Core Blazor 中的 .NET 方法调用 JavaScript 函数
覆盖 asp.net core razor 页面中的 razor 视图