栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > .Net

2..NET5微服务添加Ocelot网关中间件

.Net 更新时间:发布时间: 百科书网 趣学号

何为Ocelot
在上一篇文章中,我搭建了一个基础的微服务框架,里面包含了三个服务,用户服务,商品服务和订单服务,而在客户端Vue中,我在不同的页面需要调用不同服务的接口,这就给客户端增加的很多的工作量,那么能不能客户端只调用一个地址,就可以获得想要的数据呢,Ocelot就是做这个事的。


在上面的图中,我们可以看到,有三个服务,且每一个服务都是一个单独的进程,没有Ocelot的话,客户端的接口调用会变的非常复杂,随着服务的增多,前端需要维护的地址也会越来越多,加上Ocelot之后,前端的调用就变得简单需要,前端只需要维护一个 localhost:44335即可,所有的请求都是去调用这一个地址。

开始实战
明白 Ocelot作用之后,接下来就要写代码了,其实Ocelot的使用还是非常简单的,里面没有什么需要写业务逻辑的地方,只需要去配置一个json文件即可。

首先在EasyShop.ApiGateway项目中引入Ocelot的nuget包。


然后在项目文件夹下新建一个Ocelot.json的文件,配置如下。

{
  "Routes": [
    //UserService
    {
      //下游地址
      "DownstreamPathTemplate": "/api/Get/{userId}",
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5050
        }
      ],
      //上游地址
      "UpstreamPathTemplate": "/User/Get/{userId}",
      "UpstreamHttpMethod": [ "Get" ]
    },
  ],
  //全局配置
  "GlobalConfiguration": {
    "BaseUrl": "https://localhost:44335"
  }
}

在上面的配置可以看出来,网关也是一个单独的服务,其端口为44335,而里面配置的上游地址就是用户的请求地址,请求过来之后,Ocelot会把对应的请求转发到下游地址去。
举例,假设用户请求为

https://localhost:44335/User/Get?userId=1

请求到了网关之后,网关一匹配,找到下游地址了,于是请求就变成了

https://localhost:5050/api/User/Get?userId=1

这样就实现转发的目的了,上面可以配置多个服务,多个地址,但是服务多了,地址多了,这样依然不好,我会在下一章讲Consul的时候,继续优化这个配置文件。
配置文件写好了,得引用到项目中,修改Programs.cs文件如下。

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

namespace EasyShop.ApiGateway
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context,config)=> {
                    config.AddJsonFile("Ocelot.json", optional: false, reloadOnChange: true);
                }).ConfigureWebHostDefaults(webBuilder=> {
                    webBuilder.UseUrls("https://*:44335").UseStartup();
                });
    }
}

这里就是引用下Ocelot.json这个配置文件,以及指定下项目的端口号。

接着需要修改下Startup.cs文件

 public void ConfigureServices(IServiceCollection services)
        {
            //允许跨域请求
            services.AddCors(options =>
            {
                //this defines a CORS policy called "default"
                options.AddPolicy("default", policy =>
                {
                    policy.WithOrigins("http://localhost:8088")
                        .AllowAnyHeader()
                        .AllowAnyMethod();
                });
            });
            services.AddOcelot(Configuration);
        }

8088为我的前端项目地址端口,这里需要配置下跨域请求,允许8088的请求的通过,不然会报跨域错误。

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseCors("default");
            app.UseOcelot().Wait();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }

课后总结
有了 Ocelot之后,前端的调用变的简单了,但是后端里的 Ocelot.json 的配置变得复杂了,所以接下来还需要引入服务注册发现 Consul,以及配置请求的限流,熔断中间件Polly。这些在下一篇文章中讲解.

项目地址:https://gitee.com/limeng66/easy-shop

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/955573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号