【Blog.Core开源】网关统一集成下游服务文档

9ee12e38c951fa78afa32c06bed8c063.png

一般看到公众号更新,就是大概率要开始上班了😂

上回书咱们说到了《【Blog.Core开源】快速预览Admin界面效果》,这样我们就可以专注于后端开发,而且也能快速的实现效果的预览。那今天我们继续来往下走,说一说网关相关的内容,打算做一个网关的专题,希望可以帮助下社区吧。

62358bd293d63b7b97a5057dbcdcdf5d.png

先说故事背景

想必很多小伙伴都已经在工作和学习中,使用过网关了,而且在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文档里了。

1bcdce075a65f6537e0d89bf549942bc.png

似乎到这里已经完成了,其实还不行,因为咱们的BlogCore子服务的路由还是api开头的,这样在网关的swagger中访问接口的话,是404的:

af915e26e6f1ab6ee04d59bdf33504f1.png

当然网关这里我们可以做些优化,比如说统一返回数据格式,友好提醒啥的,这个大家自己根据项目需要来处理吧。

现在要解决的就是404的问题,两种方案:

1、直接用下游的路由来配置到ocelot.json里,这样就能访问了,但是这样的话,其他同样路径的微服务怎么办?

2、那就直接在子服务中修改下路径即可。√

03

PART

下游微服务修改路由

这个就很简单了,直接给下游增加一个路由前缀就行了,我们已经有这个功能了:

/// <summary>
/// 路由变量前缀配置
/// </summary>
public static class RoutePrefix
{/// <summary>/// 前缀名/// 如果不需要,尽量留空,不要修改/// 除非一定要在所有的 api 前统一加上特定前缀/// </summary>public const string Name = "/svc/blog";
}

这样就ok啦,绝大部分的接口已经增加上了路由前缀,这里为啥要说绝大部分呢,因为目前这个全局路由前缀还有点儿小问题,就是如果在接口的Action上写的绝对路径,还是没有增加上路由前缀的,以后我会优化掉。

4250ea54b4d7aacddea002d98a367e7a.png

请求网关接口(9000),也能很完美的实现效果,单独访问子服务的swagger(9291)也可以使用:

2dbe718628816368692c109f9c55c8fd.png

(网关接口文档)

0f9588ffe0657d2cbac47075d79b3271.png

(子服务接口文档)

好啦,今天的分享暂时就到这里吧,网关如何集成下游服务接口文档的,那在以后的文章中,我会给大家分享下,如何鉴权/认证和信息下发,如何实现网关文档登录访问(目前该功能在BlogCore里),如何实现处理审计日志(目前该功能在BlogCore里),如何连接服务注册中心等等,这是一个网关的专题,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android4.3 截屏功能的尝试与失败分析

1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数&#xff08;同时按下电源键与音量减&#xff0c;详情http://blog.csdn.net/buptgshengod/article/details/19911909&#xff09;&#xff0c;经过一周的研究还是没有在手机上实现系统截屏功能&#xff0c;总结下尝试的…

numpy方法总结

2019独角兽企业重金招聘Python工程师标准>>> 一、数组方法 创建数组&#xff1a;arange()创建一维数组&#xff1b;array()创建一维或多维数组&#xff0c;其参数是类似于数组的对象&#xff0c;如列表等 反过来转换则可以使用numpy.ndarray.tolist()函数&#xff0…

阿里云离线数据仓库

阿里云离线数据仓库第1章 数据仓库概念第2章 项目需求及架构设计2.1 项目需求分析2.2 阿里云技术框架2.2.1 技术选型2.2.2 系统数据流程设计第3章 数据生成模块3.1 埋点数据基本格式3.2 事件日志数据3.2.1 商品列表页&#xff08;loading&#xff09;3.2.2 商品曝光&#xff08…

技术分享 | 混合云模式下SaaS端前端最佳实践

导读&#xff1a;集成开放平台采用的是混合云部署架构&#xff0c;包含两个大的组件&#xff0c;管理控制台和引擎。管理控制台是SaaS的&#xff0c;部署在公有云&#xff0c;按租户隔离。引擎部署在客户私有云。一套SaaS版的管理控制台如何适配不同客户的引擎&#xff0c;本文…

记一则Hadoop DataNode OOM故障,以及解决方案

一、故障症状最近公司一个集群跑大任务时&#xff0c;datanode日志报DataXceiveServer: Exiting due to:java.lang.OutOfMemoryError: unable to create new native thread异常&#xff0c;然后计算节点上的DataNode直接挂掉。DataNode异常日志截图如下&#xff1a;2014-03-06 …

阿里云实时数据仓库

阿里云实时数据仓库——学习笔记 课程目标 学习搭建一个实时数据仓库&#xff0c;掌握数据采集、存储、计算、输出、展示等整个业务流程。整个实时数据仓库系统是在阿里云架构上搭建&#xff0c;掌握并学会运用各个服务组件&#xff0c;及各个组件之间如何联动。前置知识要求&…

手动挡五个档位示意图_汽车档位越多越好?听听专业回答

如今的汽车市场百花齐放&#xff0c;汽车厂商们也不断在研发过程中寻找不同的突破口&#xff0c;其中汽车变速器的档位变化就是众多汽车品牌当做噱头的重点&#xff0c;不知从什么时候开始&#xff0c;自动变速箱档位数量变多成为了深受汽车品牌喜爱的突破点&#xff0c;渐渐的…

Android之用netcfg命令获取手机虚拟网卡tun0的信息

1、在终端输入下面命令 adb shell adb netcfg 2、展示结果 3、使用总结 我们得到手机 tun0 地址为10.1.102.11 然后在vpn后台&#xff0c;我们先找到是哪个tun&#xff0c;我们可以使用ip route命令ip route show table2 这个允许结果就是 地址 哪个tun比如我们得到是tun2 然…

C# 基于事件的异步模式

点击蓝字 关注我们开工大吉EventBasedAsyncPattern 方法使用了基于事件的异步模式。这个模式定义了一个带有 “Async” 后缀的方法。示例代码再次使用了WebClient 类。对于同步方法DownloadString&#xff0c;WebClient类提供了一个异步变体方法 DownloadStringAsync。当请求完…

Tomcat 下 Memcached 集群与 Terracotta 集群比较

总结&#xff1a;Terracotta 集群配置要比Memcached 集群简单&#xff0c;但Terracotta 集群启动的速度要比Memcached 集群慢&#xff0c;性能Terracotta 集群要比Memcached 集群好。但性能都好不过weblogic单机的性能&#xff01;&#xff01; Terracotta 集群效果图如下&…

IDEA简单配置教程

IDEA简单配置教程 ——做好前期配置工作&#xff0c;后期少走弯路。 创建模块(Module) 设置(Settings) 设置主题 窗体及菜单字体及大小 设置编辑区主题 通过插件(plugins)更换主题 设置鼠标滚轮修改字体大小 设置鼠标悬浮提示 设置自动导包功能 显示行号和方法间的分隔符 忽略…

MariaDB Spider 数据库分库分表实践 分库分表

分库分表一般来说&#xff0c;数据库分库分表&#xff0c;有以下做法&#xff1a;按哈希分片&#xff1a;根据一条数据的标识计算哈希值&#xff0c;将其分配到特定的数据库引擎中&#xff1b;按范围分片&#xff1a;根据一条数据的标识&#xff08;一般是值&#xff09;&#…

【树莓派】配置介绍

网络是个好东西&#xff0c;好多同学分享的博文&#xff0c;极大的方便我们学习&#xff0c;谢谢~ 1、初始化配置树莓派 装上新系统&#xff0c;连接到树莓派后&#xff0c;一切都是新的&#xff0c;需要配置树莓派的一些选项。 使用putty连接到树莓派后&#xff0c;输入指令su…

C语言之函数指针和函数的首地址

1、爆简单的代码 因为容易忘记&#xff0c;还是再记录一次吧。 2、展示结果 至于函数指针用法&#xff0c;一眼便知对于add和&add你应该这样理解&#xff0c;add是函数的首地址&#xff0c;它的类型是void ()&#xff0c;&add表示一个指向函数add这个对象的地址&#x…

MFC中卡拉OK字体的定时器实现,使用DC的DrawText函数实现

1 void CTextView::OnTimer(UINT_PTR nIDEvent)2 {3 m_nWidth 5; // 在构造函数中初始化为 0&#xff1b;4 5 CClientDC dc( this );6 TEXTMETRIC tm;7 dc.GetTextMetrics( &tm );8 CRect rect;9 rect.left 0; 10 rect.top 200; 11 re…

WPF 基础控件之Window样式

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。01—代码如下一、创建 Window.cs继承System.Windows.Window代码如下。在WPF自定义类库时需要注意在创…

ngModel 值不更新/显示

angular中的$scope是页面&#xff08;view&#xff09;和数据&#xff08;model&#xff09;之间的桥梁&#xff0c;它链接了页面元素和model&#xff0c;也是angular双向绑定机制的核心。 而ngModel是angular用来处理表单&#xff08;form&#xff09;的最重要的指令&#xff…

go获取项目内所有proto_gRPC学习之三:初试GO版gRPC开发

欢迎访问我的GitHubhttps://github.com/zq2599/blog_demos内容&#xff1a;所有原创文章分类和汇总&#xff0c;及配套源码&#xff0c;涉及Java、Docker、Kubernetes、DevOPS等&#xff1b;本篇概览本文《gRPC学习》系列的第三篇&#xff0c;前文已准备好gRPC开发环境&#xf…

服务端架构中的“网关服务器”

这么一个场景&#xff1a;一个要承载高并发、具有高性能的后台服务&#xff0c;往往会有多个不同的应用服务。问题来了&#xff0c;你会怎样设计架构呢&#xff1f;如下图所示&#xff0c;为了共用一个稳定高效的网络处理功能&#xff0c;把所有服务写在一个进程里。接下来悲剧…

一起来庆祝 .NET 20 周年!

你知道吗&#xff1f;.NET 将要迎来 20 周年, 在 20 年前的 2002 年, 微软公布了下一代的软件、服务的愿景和路线&#xff0c;2 月 13 日&#xff0c;Visual Studio .NET 推出&#xff0c;.NET 开发平台的第一个版本正式向世界发布。而现在, .NET 6 成为统一的开发平台&#xf…