LindDotNetCore~Ocelot实现微服务网关

回到目录

网关在硬件里有自己的定义,而在软件架构里也有自己的解释,它就是所有请求的入口,请求打到网关上,经过处理和加工,再返回给客户端,这个处理过程中当然就是网关的核心,也是Ocelot的核心,我们可以把用户授权,校验,缓存,认证等很多关注点在网关中实现!

善友大哥收录的:http://www.csharpkit.com/2018-01-06_69695.html

原文地址:http://www.cnblogs.com/axzxs2001/p/8005041.html

Github地址:https://github.com/TomPallister/Ocelot

定义

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。

例如:手机和WEB网站都需要调用API接口,它们直接与网关进行通讯,而不用关心具体的服务是A还是B

 

 项目Demo

安装Ocelot包:Install-Package Ocelot

建立两个项目,网关主项目,DemoA和DemoB,这样A和B两个项目都会指定网关项目,通过访问网关就可以访问这两个项目了.

Gateway网关项目,端口是5000

DemoA项目,端口是5001

DemoB项目,端口是5002

在Gateway项目添加配置文件configuration.json,将它复制到输出目录,右键-属性-始终复制

复制代码
{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/polly",
      "DownstreamScheme": "http",
      "DownstreamPort": 5001,
      "DownstreamHost": "localhost",
      "UpstreamPathTemplate": "/api/polly",
      "UpstreamHttpMethod": [ "Get" ],
      "QoSOptions": {
        "ExceptionsAllowedBeforeBreaking": 3,
        "DurationOfBreak": 10,
        "TimeoutValue": 5000
      },
      "HttpHandlerOptions": {
        "AllowAutoRedirect": false,
        "UseCookieContainer": false
      },
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "",
        "AllowedScopes": []
      }
    }
  ]
}
复制代码

现时在网关里配置子服务时,也支持路由规则,如控制器,Action时,如果你希望匹配以某个字符作为前缀的Restful标准的,可以通过下面代码进行配置

   {
      "DownstreamPathTemplate": "/api/{controller}",
      "DownstreamScheme": "http",
      "DownstreamPort": 5001,
      "DownstreamHost": "localhost",
      "UpstreamPathTemplate": "/api/{controller}",
      "UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
    },

在网关的启动时,把配置文件注入

复制代码
        public static IWebHost BuildWebHost(string[] args)
        {
            IWebHostBuilder builder = new WebHostBuilder();

            //注入WebHostBuilder

            return builder.ConfigureServices(service =>
             {
                 service.AddSingleton(builder);
             }).ConfigureAppConfiguration(conbuilder =>
             {
                 conbuilder.AddJsonFile("configuration.json");
             }).UseKestrel()
               .UseUrls("http://*:5000")
               .UseStartup<Startup>()
               .Build();
        }
复制代码

添加ocelot的中间件和服务

services.AddOcelot(Configuration as ConfigurationRoot);

app.UseOcelot().Wait();

调试多个项目,这时我们的 5000和5001端口都会被监听,我们输入之间配置的api/polly路径,然后就可以看到它会自己绑定到5001这个子站上!

 

这样,我们的网关就算是跑起来了,所有项目有自己的路由模版,根据路由来查找服务!所有服务在外面看上去都像一个网站!

回到目录

 

posted @   张占岭  阅读(1333)  评论(4编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2013-01-31 EF架构~系列目录
2013-01-31 EF架构~为EF DbContext生成的实体添加Display特性
2013-01-31 基础才是重中之重~隐藏应该隐藏的对象
2012-01-31 根据特殊实体业务,实现自定义排序
点击右上角即可分享
微信分享提示