Blog.Core开源网关统一集成下游服务文档
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Blog.Core开源网关统一集成下游服务文档相关的知识,希望对你有一定的参考价值。
一般看到公众号更新,就是大概率要开始上班了😂
上回书咱们说到了《【Blog.Core开源】快速预览Admin界面效果》,这样我们就可以专注于后端开发,而且也能快速的实现效果的预览。那今天我们继续来往下走,说一说网关相关的内容,打算做一个网关的专题,希望可以帮助下社区吧。
先说故事背景
想必很多小伙伴都已经在工作和学习中,使用过网关了,而且在ASP.NETCore中,使用较多的就是Ocelot,当然现在的市场上也有很多其他的开源组件,这里以后再说吧,先说说Ocelot,在Blog.Core项目中,很久之前我也是用的Ocelot作为网关来搭建微服务体系架构的,只不过2021年忙着工作和写书,没有太多的精力吧网关给搞起来,今年就慢慢优化下项目吧。
Ocelot来实现网关还是比较简单的,只是简单的配置下Json文件就行,然后通过Postman来进行测试,查看效果。功能上当然还有其他的服务注册和发现,比如用Consul或者是Nacos,甚至是Azure,目前咱们还用不到。网关另一个功能就是鉴权认证和Header信息的下发,这个咱们下篇文章再说。
那剩下的就是网关接口文档了,如果一直用Postman毕竟不是很方便,肯定是要给前端一个踏踏实实的接口文档的,我个人比较喜欢用Swagger,其他的接口文档虽然很多,但是不是很习惯。那就出现了今天的问题,如何在网关的Swagger文档中,把下游的所有微服务都集中起来,通过一个文档地址,就能看到所有的接口信息呢,直接上代码。
01
PART
调整Ocelot.json
几乎大家都会写这块,我就不过多的介绍每个节点什么意思了,只是以BlogCore子服务为例,说说如何配置,如果以后增加其他服务,这里依此类推,举一反三。
"Routes": [
// blog-svc
"UpstreamPathTemplate": "/svc/blog/url",
"UpstreamHttpMethod": [ "Get", "Post", "Put", "Delete" ],
"LoadBalancerOptions":
"Type": "RoundRobin"
,
"DownstreamPathTemplate": "/svc/blog/url",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 9291
],
"AuthenticationOptions":
"AuthenticationProviderKey": "GW"
,
// blog-svc-swagger
"UpstreamPathTemplate": "/swagger/apiswg/blog-svc/swagger.json",
"UpstreamHttpMethod": [ "GET" ],
"DownstreamPathTemplate": "/swagger/V2/swagger.json",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 9291
],
"LoadBalancer": "RoundRobin"
],
"GlobalConfiguration":
"BaseUrl": "http://localhost:9000",
"ServiceDiscoveryProvider":
"Host": "localhost",
"Port": 8500,
"Type": "Consul"
核心点就是把Swagger的json地址,单独写一个路由映射配置,这样就可以把Swagger给引进来了,当然如果你把下游的SwaggerJson地址给手动改成和接口类似的模板,这样写一个就行,就不用把api和swagger单独分开写两个了。
02
PART
渲染子服务接口文档
配置好了Json文件,下面就需要引入到网关项目里,打开Blog.Core.Gateway的Startup文件,找到Swagger的中间件配置的地方,修改显示规则:
public static void UseCustomSwaggerMildd(this IApplicationBuilder app)
if (app == null) throw new ArgumentNullException(nameof(app));
var apis = new List<string> "blog-svc" ;
app.UseSwagger();
app.UseSwaggerUI(options =>
options.SwaggerEndpoint($"/swagger/v1/swagger.json", $"Blog.Core.Gateway-v1");
apis.ForEach(m =>
options.SwaggerEndpoint($"/swagger/apiswg/m/swagger.json", m);
);
options.RoutePrefix = "";
);
我这里单独封装了一个扩展方法,通过手动配置参数名,就可以循环添加到网关的swagger文档里了。
似乎到这里已经完成了,其实还不行,因为咱们的BlogCore子服务的路由还是api开头的,这样在网关的swagger中访问接口的话,是404的:
当然网关这里我们可以做些优化,比如说统一返回数据格式,友好提醒啥的,这个大家自己根据项目需要来处理吧。
现在要解决的就是404的问题,两种方案:
1、直接用下游的路由来配置到ocelot.json里,这样就能访问了,但是这样的话,其他同样路径的微服务怎么办?
2、那就直接在子服务中修改下路径即可。√
03
PART
下游微服务修改路由
这个就很简单了,直接给下游增加一个路由前缀就行了,我们已经有这个功能了:
/// <summary>
/// 路由变量前缀配置
/// </summary>
public static class RoutePrefix
/// <summary>
/// 前缀名
/// 如果不需要,尽量留空,不要修改
/// 除非一定要在所有的 api 前统一加上特定前缀
/// </summary>
public const string Name = "/svc/blog";
这样就ok啦,绝大部分的接口已经增加上了路由前缀,这里为啥要说绝大部分呢,因为目前这个全局路由前缀还有点儿小问题,就是如果在接口的Action上写的绝对路径,还是没有增加上路由前缀的,以后我会优化掉。
请求网关接口(9000),也能很完美的实现效果,单独访问子服务的swagger(9291)也可以使用:
(网关接口文档)
(子服务接口文档)
好啦,今天的分享暂时就到这里吧,网关如何集成下游服务接口文档的,那在以后的文章中,我会给大家分享下,如何鉴权/认证和信息下发,如何实现网关文档登录访问(目前该功能在BlogCore里),如何实现处理审计日志(目前该功能在BlogCore里),如何连接服务注册中心等等,这是一个网关的专题,希望大家喜欢。
以上是关于Blog.Core开源网关统一集成下游服务文档的主要内容,如果未能解决你的问题,请参考以下文章
如果下游服务响应 401,如何在 Zuul API 网关中触发 OAuth2 身份验证
如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?
使用带有 abp 的 ocelot 时如何将租户 ID 发送到下游服务
关于Spring Cloud Gateway与下游服务器的连接分析