一、介绍

     当我们开发基于微服务的应用程序的时候,有一个环节总是跳不过去的,那就是要创建 WebApi,然后,我们的应用程序基于 WebApi 接口去访问。在没有 Swagger 以前,我们开发好了 Web API 接口,也要写大量的接口文档。不写不行吗?当然不行,如果你不写这些文档,别人如何使用你的接口呢?难道每个接口都要和写接口的人进行沟通吗?那沟通成本就太大了,也浪费了不必要的时间。只从我们有了 Swagger 后,只需要简单的配置一下,就可以生成有关接口的详细文档,并且,可以调用执行,对于使用的人和开发的人都省去了不少力气。

    但是,我们现在有一个问题,在我们的解决方案中,有多个 WebApi 的实例程序,并且每个 API 的实例程序都配置了自己的 Swagger ,方便使用。但是这样也出现了另外一个问题,我们有多个 API 实例程序,每个实例程序都对应一个 Swagger 程序,我们要访问的时候,该怎么操作呢?很多人就会说,访问哪个就打开哪个的 Swagger 程序,当然,如果你不怕繁琐,当然可以这么做。既然这么繁琐,别人也肯定遇到过,那针对这个问题,肯定就有相应的解决方案。

    说起解决方案,其实,我们也很容易想起来。我们创建一个公共的、基于 WebAPI 的网关项目,在这个网关项目里,我们配置 Swagger,然后,通过访问网关的 Swagger 就可以访问各个 API 实例程序的 Swagger 。

二、开始我们

    废话不多说,我们就开始,我们今天的配置和演示。这个解决方案的项目数不多,有3个 WEB API 的项目,他们都是基于 Net 5.0的,可以跨平台的。在这个解决方案中,由于我们要使用到服务发现和网关的配置,需要在各个需要的项目中引入 Consul、Swashbuckle.AspNetCore、 Ocelot 和 Ocelot.Provider.Consul 等项目。具体操作如下:

    1、准备工作。

        我们在开始我们的项目之前,需要现在 Consul,我这里下载的 Windows 64 位版本的,因为这个是测试的,如果在生产环境,可以根据需要下载 Linux 版本。

        下载地址:https://www.consul.io/downloads

        微服务之十四如何在 Ocelot 网关中配置多实例 Swagger 访问-LMLPHP

        启动Consul 服务的命令也很简单,在下载目录里面,在地址栏里输入:cmd回车,打开命令窗口。然后输入命令:consul agent -dev。截图如下:

         微服务之十四如何在 Ocelot 网关中配置多实例 Swagger 访问-LMLPHP

    2、项目源码

        1】、第一个 WABAPI 实例程序。

             (1)、项目截图

                微服务之十四如何在 Ocelot 网关中配置多实例 Swagger 访问-LMLPHP

             (2)、项目源码

                由于该项目使用了 Consul 进行服务发现管理,在项目创建之初,必须通过 Nuget 安装 Consul 组件,同时也必须引入 Swashbuckle.AspNetCore ,它支持对 Swagger 的实现。

                A、创建一个 WebAPI 的项目,项目名称是:PatrickLiu.MicroService.WeiXin.UserService。

                B、通过Nuget 分别引入:Consul 和 Swashbuckle.AspNetCore 组件包。

                C、扩展 Consul 服务,在根目录下,创建一个 Utilities 文件,在该文件夹下创建一个类:ConsulManager.cs                  

                    微服务之十四如何在 Ocelot 网关中配置多实例 Swagger 访问-LMLPHP微服务之十四如何在 Ocelot 网关中配置多实例 Swagger 访问-LMLPHP
 1 using Consul;
 2 using Microsoft.AspNetCore.Builder;
 3 using Microsoft.Extensions.Configuration;
 4 using System;
 5
 6 namespace PatrickLiu.MicroService.WeiXin.UserService.Utilities
 7 {
 8     /// <summary>
 9     /// 该类型扩展了 IApplicationBuilder 类型,用于实现 Consul 的服务注册的工作。
10     /// </summary>
11     public static class ConsulManager
12     {
13         /// <summary>
14         /// 扩展方法,实现 WebApi 服务注册 Consul 中心。
15         /// </summary>
16         /// <param name="app">应用程序生成器。</param>
17         /// <param name="configuration">配置系统的访问类型。</param>
18         /// <param name="consulClient">Consul 的客户端类型。</param>
19         /// <returns></returns>
20         public static void UseConsul(this IApplicationBuilder app, IConfiguration configuration, IConsulClient consulClient)
21         {
22             RegisterConsul(configuration,consulClient);
23         }
24
25         /// <summary>
26         /// 该方法实现核心的 Consul 注册和健康检查。
27         /// </summary>
28         /// <param name="configuration">配置系统的访问类型。</param>
29         /// <param name="consulClient">Consul 的客户端类型。</param>
30         private static void RegisterConsul(IConfiguration configuration, IConsulClient consulClient)
31         {
32             var consulGroupName = configuration["ConsulGroup"];
33             var ip = configuration["IP"];
34             var port = int.Parse(configuration["Port"]);
35             var serviceID = $"{consulGroupName}_{ip}_{port}";
36
37             AgentServiceCheck checkService = new AgentServiceCheck() {
38                 HTTP = $"http://{ip}:{port}/HeartCheck",
39                 Interval=TimeSpan.FromSeconds(6),
40                 Timeout=TimeSpan.FromSeconds(2),
41                 DeregisterCriticalServiceAfter=TimeSpan.FromSeconds(2)
42             };
43
44             AgentServiceRegistration agentServiceRegistration = new AgentServiceRegistration() {
45                 Name = consulGroupName,
46                 Address = ip,
47                 Port = port,
48                 ID = serviceID,
49                 Check= checkService
50             };
51
52             consulClient.Agent.ServiceRegister(agentServiceRegistration);
53         }
54     }
55 }
11-07 20:28