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

何为Ocelot


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

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

开始实战


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

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

<PackageReference Include="Ocelot" Version="17.0.0" />

然后在项目文件夹下新建一个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<Startup>();
                });
    }
}

这里就是引用下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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李公子lm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值