一次业务网关用ASP.NET Core 2.1重构的小结
前言
对于API网关,业界貌似对它进行下划分,有下面几个分类/场景。
- 面向Web App
- 面向Mobile App
- 面向Partner OpenAPI
- 面向Partner ExternalAPI
- 其他。。。
在18年8月份的时候,有幸用.NET Core 2.1重构了一个对外的业务网关项目,这个项目的作用其实就是将公司内部能提供的数据能力公开出来,可以让有需要的公司使用。
这个项目按照分类,应该是要归类到 面向Partner OpenAPI 。
这个项目刚开始是用Nancy写的,那个时候要向外提供一个新的能力的时候,都是要加这个能力的代码,发布后才能真正的对外提供,不过当时对外提供的东西比较少,负责的同事也要闪人了,所以也还是可以接受。
在18年7月份的时候,越来越多的能力要对外提供,而且每次都要改代码,受不了,就提出了重构。
这个项目目前每天大概有1500万左右的有效调用量,部署在6台4c4g的CentOS虚拟机上面(其实用不了那么多机器,每台机器的基本都是20%以下的cpu和10%左右的内存),用Jexus去托管。大入口是Nginx,所以最后的流向是:
Request -> Nginx -> Jexus -> dotnet
下面就分别来说说这个网关涉及到的一些东西。
统一鉴权
鉴权这一块用的还是很古老的做法,用的是用户名和密码的方式来处理,这个可以理解成是验签的一个过程。
这里支持两种形式,一种是参数明文传输,还有一种是参数加密传输。
其实就是有部分公司觉得我不能直接传明文的123给你,要传一个加密后的123,让你解密然后去处理。
服务限流
限流功能就是限制调用方过于频繁的调用,这个限制,根据业务场景分为秒、天、月三个层级。
不同调用方,不同数据服务都有不同的限制,这个是基于Redis来实现的。
路由转发
路由转发用的是HttpClientFactory。
刚开始的时候还是用steeltoe来处理服务注册和发现,不过发现并不好用,然后也有很多服务没有接入 Eureka, 所以最后就没有处理服务注册和发现,而是直接用域名的方式来请求。
参数重组
用户的请求参数基本上都会是透传给下游服务,当然不能排除会有一些特殊的需求。
举个简单的例子说明一下,好比只想让调用方查广州的天气,不想让他查深圳的天气,而下游服务是这两个城市都可以查的,所以要有一些特殊的参数去告诉下游服务。
这个时候,我们就需要对用户的入参进行一次重组,重新构造了一个JSON参数丢给下游服务,相当于特殊情况会有固定的参数格式给到下游服务,用的是JObject来处理。
链路跟踪
由于调用链有的时候非常复杂,为了记录调用方一个请求完整的调用链,网关这边会生成一个traceId在请求头,路由转发的时候会一起发过去。
不同服务在记录日志的时候就会把这个traceId也统一记录起来,这样所有的日志都可以通过这个traceId从日志系统中找到。
熔断降级
下游服务不一定能保证 7*24 小时的正常服务,有时可能因为数据库处理超时,网络请求超时,从而造成在一段时间内,不能正常响应。
这个时候网关就不应该每次都去真正的请求服务,而要断开一段时间,直接返回失败给调用方。
这一块是结合 HttpClientFactory 和 Polly 来实现的,省了很多麻烦。
服务计次
计次可以说是这个网关的一大核心,因为要赚钱,要收调用方的钱。钱基本就是按次数算出来的。
之前写过一篇博客,实现是类似的。
业务指标监控
需要知道最近某段时间范围内,不同调用方,不同数据服务的调用情况(成功,失败,有效,总次数等)
这里用的是prometheus,程序负责写指标数据,prometheus会去拉取这些数据,然后结合Grafana来做成不同的看板来展示。
日志记录
日志记录为分两大类,一类是程序日志,一类是调用日志。
程序日志目前是拓展NLog,把数据丢到Kafka,然后运维那边会抽数据到Elasticsearch。
为了避免Kafka抽风,所以丢数据到Kafka失败的话,会落盘到日志文件,然后由Filebeat收集,然后丢到Elasticsearch。
最后的展现形式是 graylog, 大概如下

调用日志是和调用方结算的依据之一,所以这个的重要性还是挺高的。
目前用的是异步写入加容错。调用日志最终是落到数据库归档。
迭代更新
更新对一个程序来说是必不可免的,所以有一个好的发布流程可以减少一些困难。虽说重构后,这个项目也就更新了3次。
这里用的是Go CD来发布的,从测试到预发再到生产,流水线的操作。

总结
虽然这个项目挺小的,但是也可以用“麻雀虽小,五脏俱全”来形容。
最后问问,最近有那位大佬招小弟吗?有的话可以联系一下我哈。
一次业务网关用ASP.NET Core 2.1重构的小结的更多相关文章
- 从零搭建一个IdentityServer——集成Asp.net core Identity
前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...
- (8)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Ocelot网关(Api GateWay)
说到现在现有微服务的几点不足: 1) 对于在微服务体系中.和 Consul 通讯的微服务来讲,使用服务名即可访问.但是对于手 机.web 端等外部访问者仍然需要和 N 多服务器交互,需要记忆他们的服务 ...
- Asp.Net Core API网关Ocelot
首先,让我们简单了解下什么是API网关? API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具 ...
- Asp.Net Core基于JWT认证的数据接口网关Demo
近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...
- .net core 微服务架构-docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务(asp.net core web api)
本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构,部署的微服务主要包括统一网关(使用Ocelot开发).统一认证(IdentityServer4).应用服务(asp.net c ...
- Ocelot网关统一查看多个微服务asp.net core项目的swagger API接口
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.准备 前提需要下载安装consul,项目需要懂添加swagger 统一在网关中配置多个微服务的swagger,需要用到服务注册 ...
- ASP.NET Core模块化前后端分离快速开发框架介绍之2、快速创建一个业务模块
源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...
- ASP.NET Core搭建多层网站架构【8.3-编写角色业务的增删改】
2020/01/29, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[8.3-编写角色业务的增删改] 编写最简单的增删 ...
- ASP.NET Core on K8S学习之旅(13)Ocelot API网关接入
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 上一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使 ...
随机推荐
- 《Web Development with Go》JWT认证满意版
这个比昨晚的要满意, 认证放到中间件那里了. Mux使用的是gorilla, 中间件使用的是negroni, 启动是用的negroni.classic方法. package main import ( ...
- 菜鸟刷面试题(三、Redis篇)
目录: redis是什么?都有哪些使用场景? redis有哪些功能? redis和memecache有什么区别? redis为什么是单线程的? 什么是缓存穿透?怎么解决? redis支持的数据类型有哪 ...
- Hibernate session.save()实体类,主键增长问题
实体类如下: package com.wondersgroup.test.entity; import java.io.Serializable; import javax.persisten ...
- 剑指Offer-39.把数组排成最小的数(C++/Java)
题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 分析: 将数组 ...
- Linux中fuser命令用法详解
描述: fuser可以显示出当前哪个程序在使用磁盘上的某个文件.挂载点.甚至网络端口,并给出程序进程的详细信息. fuser显示使用指定文件或者文件系统的进程ID. 默认情况下每个文件名后面跟一个字母 ...
- IT兄弟连 HTML5教程 CSS3揭秘 小结及习题
小结 CSS3对于开发者来说,给web应用带来了更多的可能性,极大提高了开发效率.CSS3在选择器上的支持可谓是丰富多彩,使得我们能够灵活的控制样式,而不必为元素进行规范化的命名.CSS3支持的动画类 ...
- C语言结构选择语句
总结一下常用的if else与switch,其中switch中的break知识点是笔试题经常考到的内容. if else与else if 在C语言中,经常使用if else选择语句,来实现很多对应的功 ...
- 禧云Redis跨机房双向同步实践
编者荐语: 2019年4月16日跨机房Redis同步中间件(Rotter)上线,团餐率先商用: 以下文章来源于云纵达摩院 ,作者杨海波 禧云信息/研发中心/杨海波 20191115 关键词:Rot ...
- 第一章 Linux常用快捷键
1.---------------->>>常用快捷键 移动光标快捷键: Ctrl+a 光标回到命令行首* Ctrl+e 光标回到命令行尾* Ctrl+f 光标向右移动一个字符(相当于 ...
- Cypress 之 环境配置
将项目添加到cypress时,cypress.json会在项目中创建一个文件,此文件用于存储projectId,以及你提供的任何配置项. { "projectId": " ...