一、介绍
当我们开发基于微服务的应用程序的时候,有一个环节总是跳不过去的,那就是要创建 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
启动Consul 服务的命令也很简单,在下载目录里面,在地址栏里输入:cmd回车,打开命令窗口。然后输入命令:consul agent -dev。截图如下:
2、项目源码
1】、第一个 WABAPI 实例程序。
(1)、项目截图
(2)、项目源码
由于该项目使用了 Consul 进行服务发现管理,在项目创建之初,必须通过 Nuget 安装 Consul 组件,同时也必须引入 Swashbuckle.AspNetCore ,它支持对 Swagger 的实现。
A、创建一个 WebAPI 的项目,项目名称是:PatrickLiu.MicroService.WeiXin.UserService。
B、通过Nuget 分别引入:Consul 和 Swashbuckle.AspNetCore 组件包。
C、扩展 Consul 服务,在根目录下,创建一个 Utilities 文件,在该文件夹下创建一个类:ConsulManager.cs
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 }