1.首先新建三个.NET Core 3.1下的API项目
ApiGetWay:将作为网关使用,可以将不需要用到的Controller文件夹和实体类删掉
APIServiceOne:服务一,将做api使用
APIServiceTwo:服务二,做api使用
2.配置跨域
在三个个项目的Starup.cs中添加跨域配置,每一个都要加
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//配置跨域处理,允许所有来源:
services.AddCors(options =>
{
options.AddPolicy("all", builder =>
{
builder.AllowAnyOrigin() //允许任何来源的主机访问
.AllowAnyMethod()
.AllowAnyHeader();
});
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
#region 跨域
app.UseCors("all");
#endregion
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
3.配置网关
1.在作为网关使用的项目中,Nuget中下载ocelot15.06版本的包,版本太新可能不稳定
2.然后给这个项目加一些配置,在根目录新建一个configuration.json文件
删掉两个大括号,复制粘贴以下代码
{
"ReRoutes": [
//{
// "UpstreamPathTemplate": "/api/{controller}/{action}", //请求路径模板
// "UpstreamHttpMethod": [ "Get", "POST" ], //请求方法数组
// "DownstreamPathTemplate": "/api/{controller}/{action}", //下游请求地址模板
// "DownstreamScheme": "https", //请求协议,目前应该是支持http和https
// "DownstreamHostAndPorts": [ //下游地址和端口
// {
// "host": "localhost",
// "port": 5003
// },
// {
// "host": "localhost",
// "port": 5001
// }
// ],
// "LoadBalancerOptions": { //负载均衡 RoundRobin(轮询)/LeastConnection(最少连接数)/CookieStickySessions(相同的Sessions或Cookie发往同一个地址)/NoLoadBalancer(不使用负载)
// "Type": "RoundRobin"
// }
//},
{
//APIServiceOne服务
"DownstreamPathTemplate": "/api/{Controller}/{action}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5196
}
],
"UpstreamPathTemplate": "/One/{Controller}/{action}",
"UpstreamHttpMethod": [ "GET", "POST" ]
},
{
//APIServiceTwo服务
"DownstreamPathTemplate": "/api/{controller}/{action}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 5197
}
],
"UpstreamPathTemplate": "/Two/{controller}/{action}",
"UpstreamHttpMethod": [ "GET", "POST" ]
}
]
}
注意配置中,服务一和服务二的端口分别是5196和5197,所以需要对另外两个项目进行修改,修改ApiServiceOne和ApiServiceTwo项目中的启动端口,在launchSettings.json中
在三个项目的配置中删除了其他不必要的配置,只留下启动的配置就行了,依次配置好服务端口,然后可以配置网关项目的端口,可以任意配置,这里我就给了5195.
然后需要根据configuration.json文件中的下游路径的模板去修改两个服务的controller中的路由
3.在网关项目的Starup.cs中注册和使用Ocelot,添加以下代码即可,在添加的时候根据提示导入相应的命名空间即可
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddOcelot(new ConfigurationBuilder().AddJsonFile("configuration.json", true, true).Build());
//配置跨域处理,允许所有来源:
services.AddCors(options =>
{
options.AddPolicy("all", builder =>
{
builder.AllowAnyOrigin() //允许任何来源的主机访问
.AllowAnyMethod()
.AllowAnyHeader();
});
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
#region 跨域
app.UseCors("all");
#endregion
app.UseRouting();
app.UseOcelot();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
4.postman测试
先把三个项目全部启动
打开postman测试,注意看请求的是网关的地址端口,5195,而我之前的步骤是把网关的controller给删了的,所以测试成功,网关成功的将请求转发到了服务一,当然把地址的One换成Two也没问题,那就会转发到服务二,可自行写一个测试接口。
我分别在两个服务中加了一个测试action,再测试
好了,测试证明没有问题,文章中有涉及到不懂的知识,就需要各位自己百度了,这里就不介绍了。
原文链接:原文链接