何为Ocelot
在上一篇文章中,我搭建了一个基础的微服务框架,里面包含了三个服务,用户服务,商品服务和订单服务,而在客户端Vue中,我在不同的页面需要调用不同服务的接口,这就给客户端增加的很多的工作量,那么能不能客户端只调用一个地址,就可以获得想要的数据呢,Ocelot就是做这个事的。
在上面的图中,我们可以看到,有三个服务,且每一个服务都是一个单独的进程,没有Ocelot的话,客户端的接口调用会变的非常复杂,随着服务的增多,前端需要维护的地址也会越来越多,加上Ocelot之后,前端的调用就变得简单需要,前端只需要维护一个 localhost:44335即可,所有的请求都是去调用这一个地址。
开始实战
明白 Ocelot作用之后,接下来就要写代码了,其实Ocelot的使用还是非常简单的,里面没有什么需要写业务逻辑的地方,只需要去配置一个json文件即可。
首先在EasyShop.ApiGateway项目中引入Ocelot的nuget包。
<PackageReference Include="Ocelot" Version="17.0.0" />
1
然后在项目文件夹下新建一个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"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在上面的配置可以看出来,网关也是一个单独的服务,其端口为44335,而里面配置的上游地址就是用户的请求地址,请求过来之后,Ocelot会把对应的请求转发到下游地址去。
举例,假设用户请求为
https://localhost:44335/User/Get?userId=1
1
请求到了网关之后,网关一匹配,找到下游地址了,于是请求就变成了
https://localhost:5050/api/User/Get?userId=1
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>();
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
这里就是引用下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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
课后总结
有了 Ocelot之后,前端的调用变的简单了,但是后端里的 Ocelot.json 的配置变得复杂了,所以接下来还需要引入服务注册发现 Consul,以及配置请求的限流,熔断中间件Polly。这些在下一篇文章中讲解.
————————————————
版权声明:本文为优快云博主「李公子lm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u012869793/article/details/115367799