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与下游服务器的连接分析

关于Spring Cloud Gateway与下游服务器的连接分析

SpringCloud-feign客户端统一处理下游服务自定义异常(1.5.x版本下可以)