
在上面的图中,我们可以看到,有三个服务,且每一个服务都是一个单独的进程,没有Ocelot的话,客户端的接口调用会变的非常复杂,随着服务的增多,前端需要维护的地址也会越来越多,加上Ocelot之后,前端的调用就变得简单需要,前端只需要维护一个 localhost:44335即可,所有的请求都是去调用这一个地址。
首先在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();
});
}
课后总结
项目地址:https://gitee.com/limeng66/easy-shop