从一个位置调用多个 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 视图

通过 ASP.NET Core Web API 使用存储过程从 SQL Server 返回多个行集

ASP.NET Core 中的 Angular 应用 6:多个模块匹配