Swagger在网关管理所有微服务接口文档配置
一:之前一篇文章里面说过如何配置swagger管理接口文档。但是如果开发微服务,那么是不是就需要在每一个微服务里面都去注入swagger? 那后面服务如果有几十个,上百个,是不是就需要100个swagger地址? 这个做法肯定是不可取的,服务少还行,一旦多了,就会添加开发成本,维护成本。
那么是不是可以在网关统一管理?答应是肯定的。
先不说如何配置,直接上图看效果。这里我配置了2个微服务,在不同的站点下,可以看到,右上角这里的下拉框就出现了2个选项。用户api文档,跟商品api文档。那么今后开发人员需要看接口文档是不是就只需要打开网关的地址就ok。解决了上面说的那些麻烦的问题。
当选择userapi的时候,就会出现user服务下的所有接口,
当选择productapi的时候,就会出现producy服务下的所有接口。
二:上面的这个效果非常好,那么如何配置呢?
1:肯定是需要需要在nuget里面获取对应的安装包了。
在Nuget里面去搜索 Swashbuckle.AspNetCore
2:在startup里面注入swagger 并且添加中间件。
public void ConfigureServices(IServiceCollection services)
{
services.AddSwaggerGen(c =>
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Gateway api",
Version = "v1"
})
);
services.AddOcelot().AddConsul();
services.AddControllers();
}
这里跟Swagger有关的是:下面2行是 ocelot的服务注册
services.AddSwaggerGen(c =>
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Gateway api",
Version = "v1"
})
);
3:在Configure里面添加中间件
这里是整个方法的所有代码。并不是都跟swagger相关,
这里的
app.UseRouting();是路由 ,之前我们的mvc都是直接打包好放在里面,现在core是你需要用就自己注册
app.UseAuthorization();做授权验证
app.UseEndpoints 这个是终结点了,要知道core的中间件原理是 一件套一件的,套到最后需要有一个结束的返回地址,
app.UseOcelot(); 是网关
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}app.UseRouting();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/user/swagger.json", "user api");
c.SwaggerEndpoint("/product/swagger.json", "product api");
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
app.UseOcelot();
}
这里注意,我是把所有代码都贴出来,主要是担心大家看不懂,其实跟swagger相关的代码是:
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/user/swagger.json", "user api");
c.SwaggerEndpoint("/product/swagger.json", "product api");
});
这里面有配置你需要加载到网关的 服务文档,如果你需要再添加一个服务,就直接在 UseSwaggerUI里面去添加一个节点。
里面的配置地址需要注意下:/user 跟 / product 这个不是乱写的,需要根据你服务的访问路由设置的实际情况书写。
4:也是最重要的一个环节了:就是配置
我们知道网关 是第三方的工具。我们如果不获取源码,直接用nuget安装的话,就只能通过配置文件来做自己想要做的事情,代码被封装,只能修改配置文件
这里需要注意:Reroutes是总得路由节点。
DownstreamPathTemplate是下游地址。也就是服务的地址,这里不需要写全路径,因为我们加入了consul服务发现,可以做轮询或者权重,所以只需要写服务端口号之后的路由匹配原则就可以
DownstreamScheme 访问协议 一般 http 或者 https
UpstreamPathTemplate 上游地址 就是网关的地址
UpstreamHttpMethod 访问协议方式,一般都是4种常见的
ServiceName 微服务名称,这个是你在consul里面的名字叫什么?
LoadBalancerOptions 掉用服务方式。轮询 随机 权重 等等
GlobalConfiguration 是配置全局的,也就是 上面的所有配置跟这个配置都是一起使用,有效的,这里配置的是consul的
一些信息。可以访问consul的服务发现,当然consul如何使用这里没有讲,
这里每个服务有2个配置,一个配置的是swagger 的路由匹配原则。 一个是匹配api访问的地址
"ReRoutes": [
//{
// "DownstreamPathTemplate": "/{url}", //服务地址--url变量
// "DownstreamScheme": "http",
// "DownstreamHostAndPorts": [
// {
// "Host": "localhost",
// "Port": 5196 //服务端口
// } //可以多个,自行负载均衡
// ],
// "UpstreamPathTemplate": "/{url}", //网关地址--url变量 //冲突的还可以加权重Priority
// "UpstreamHttpMethod": [ "Get", "Post","Put","Delete" ]
//}
{
"DownstreamPathTemplate": "/swagger/user/swagger.json", //服务地址--url变量
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/user/swagger.json", //网关地址--url变量 //冲突的还可以加权重Priority
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
"ServiceName": "userservice",
"UseServiceDiscovery": true
},
{
"DownstreamPathTemplate": "/swagger/product/swagger.json", //服务地址--url变量
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/product/swagger.json", //网关地址--url变量 //冲突的还可以加权重Priority
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
"ServiceName": "productservice",
"UseServiceDiscovery": true
},
{
"DownstreamPathTemplate": "/user/{url}", //服务地址--url变量
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/user/{url}", //网关地址--url变量 //冲突的还可以加权重Priority
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
"ServiceName": "userservice",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UseServiceDiscovery": true
},
{
"DownstreamPathTemplate": "/product/{url}", //服务地址--url变量
"DownstreamScheme": "http",
"UpstreamPathTemplate": "/product/{url}", //网关地址--url变量 //冲突的还可以加权重Priority
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
"ServiceName": "productservice",
"LoadBalancerOptions": {
"Type": "RoundRobin"
},
"UseServiceDiscovery": true
}
],
"GlobalConfiguration": {
"BaseUrl": "http://127.0.0.1:5916",
"Host": "localhost",
"Port": "8500",
"Type": "Consul"
}
}