当前位置: 首页 > news >正文

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录

1、.Net Core微服务入门系列(一)——项目搭建
2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
3、.Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)
4、.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
5、.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)
6、.Net Core微服务入门全纪录(六)——EventBus-事件总线
7、.Net Core微服务入门全纪录(七)——IdentityServer4-授权认证
8、.Net Core微服务入门全纪录(八)——Docker Compose与容器网络


在这里插入图片描述

文章目录

  • 系列文章目录
  • 前言📃
  • 一、服务发现
  • 二、服务治理
    • 2.1 缓存
    • 2.2 限流
    • 2.3 超时/熔断
  • 三、总结


前言📃

关于 微服务 的概念解释网上有很多, 个人理解微服务是一种系统架构模式,它和语言无关,和框架无关,和工具无关,和服务器环境无关。

微服务思想 是将传统的单体系统按照业务拆分成多个职责单一、且可独立运行的接口服务。至于服务如何拆分,没有明确的定义。几乎任何后端语言都能做微服务开发。微服务也并不是完美无缺的,微服务架构会带来更多的问题,增加系统的复杂度,引入更多的技术栈。

上一篇【.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)】已经完成了Ocelot网关的基本搭建,实现了服务入口的统一。当然,这只是API网关的一个最基本功能,它的进阶功能还有很多很多。

一、服务发现

首先需要解决的就是服务发现的问题,服务发现的优点之前讲过,就不说了。

上一篇中我们的服务地址都是写在 ocelot.json 配置文件里,现在我们需要结合之前的 Consul来实现服务发现。

改造代码:
首先 NuGet 安装 Ocelot.Provider.Consul

在这里插入图片描述
修改 Startup.cs

        public void ConfigureServices(IServiceCollection services){//添加ocelot服务services.AddOcelot().AddConsul();//添加consul支持}

修改 ocelot.json 配置:

{"Routes": [{"DownstreamPathTemplate": "/products","DownstreamScheme": "http","UpstreamPathTemplate": "/products","UpstreamHttpMethod": [ "Get" ],"ServiceName": "ProductService","LoadBalancerOptions": {"Type": "RoundRobin"}},{"DownstreamPathTemplate": "/orders","DownstreamScheme": "http","UpstreamPathTemplate": "/orders","UpstreamHttpMethod": [ "Get" ],"ServiceName": "OrderService","LoadBalancerOptions": {"Type": "RoundRobin"}}],"GlobalConfiguration": {"BaseUrl": "http://localhost:9070","ServiceDiscoveryProvider": {"Scheme": "http","Host": "localhost","Port": 8500,"Type": "Consul"}}
}

这个配置应该很好理解,就是把我们上次的 DownstreamHostAndPorts 节点去掉了,然后增加了ServiceDiscoveryProvider 服务发现相关配置。

注意,Ocelot 除了支持 Consul 服务发现以外,还有 Eureka 也可以,Eureka 也是一个类似的注册中心。

好了,代码修改就差不多了,下面运行程序测试一下:

在这里插入图片描述
在这里插入图片描述
客户端正常运行。

至此我们就实现了服务注册与发现和api网关的基本功能。接下来就要提到:服务治理

二、服务治理

其实 服务治理 也没有一个非常明确的定义。它的作用简单来说,就是帮助我们更好的管理服务,提升服务的可用性。——缓存,限流,熔断,链路追踪 等等。。。都属于常用的服务治理手段。
之前讲的负载均衡,服务发现也可以算是服务治理。

2.1 缓存

Ocelot 中启用缓存,需要 NuGet 安装一下 Ocelot.Cache.CacheManager

在这里插入图片描述
修改 Startup.cs 中的 ConfigureServices() 方法:

//添加ocelot服务
services.AddOcelot()//添加consul支持.AddConsul()//添加缓存.AddCacheManager(x =>{x.WithDictionaryHandle();});

修改 ocelot.json 配置文件:

{"Routes": [{"DownstreamPathTemplate": "/products","DownstreamScheme": "http","UpstreamPathTemplate": "/products","UpstreamHttpMethod": [ "Get" ],"ServiceName": "ProductService","LoadBalancerOptions": {"Type": "RoundRobin"},"FileCacheOptions": {"TtlSeconds": 5,"Region": "regionname"}},{"DownstreamPathTemplate": "/orders","DownstreamScheme": "http","UpstreamPathTemplate": "/orders","UpstreamHttpMethod": [ "Get" ],"ServiceName": "OrderService","LoadBalancerOptions": {"Type": "RoundRobin"},"FileCacheOptions": {"TtlSeconds": 5,"Region": "regionname"}}],"GlobalConfiguration": {"BaseUrl": "http://localhost:9070","ServiceDiscoveryProvider": {"Scheme": "http","Host": "localhost","Port": 8500,"Type": "Consul"}}
}

Routes 路由配置中增加了 FileCacheOptionsTtlSeconds 代表缓存的过期时间,Region 代表缓冲区名称,这个我们目前用不到。

好了,代码修改完需要编译重启一下网关项目,然后打开客户端网站测试一下:

在这里插入图片描述
可以看到,5秒之内的请求都是同样的缓存数据。Ocelot 也支持自定义缓存。

2.2 限流

限流就是限制客户端一定时间内的请求次数。

继续修改配置:

{"Routes": [{"DownstreamPathTemplate": "/products","DownstreamScheme": "http","UpstreamPathTemplate": "/products","UpstreamHttpMethod": [ "Get" ],"ServiceName": "ProductService","LoadBalancerOptions": {"Type": "RoundRobin"},"FileCacheOptions": {"TtlSeconds": 5,"Region": "regionname"},"RateLimitOptions": {"ClientWhitelist": [ "SuperClient" ],"EnableRateLimiting": true,"Period": "5s","PeriodTimespan": 2,"Limit": 1}},{"DownstreamPathTemplate": "/orders","DownstreamScheme": "http","UpstreamPathTemplate": "/orders","UpstreamHttpMethod": [ "Get" ],"ServiceName": "OrderService","LoadBalancerOptions": {"Type": "RoundRobin"},"FileCacheOptions": {"TtlSeconds": 5,"Region": "regionname"},"RateLimitOptions": {"ClientWhitelist": [ "SuperClient" ],"EnableRateLimiting": true,"Period": "5s","PeriodTimespan": 2,"Limit": 2}}],"GlobalConfiguration": {"BaseUrl": "http://localhost:9070","ServiceDiscoveryProvider": {"Scheme": "http","Host": "localhost","Port": 8500,"Type": "Consul"},"RateLimitOptions": {"DisableRateLimitHeaders": false,"QuotaExceededMessage": "too many requests...","HttpStatusCode": 999,"ClientIdHeader": "Test"}}
}

Routes 路由配置中增加了 RateLimitOptionsClientWhitelist 代表客户端 白名单,在白名单中的客户端可以不受限流的影响;EnableRateLimiting 代表是否限流;Period代表限流的单位时间,例如1s,5m,1h,1d等;PeriodTimespan代表客户端达到请求上限多少秒后可以重试;Limit 代表客户端在定义的时间内可以发出的最大请求数。

GlobalConfiguration 配置中也增加了 RateLimitOptions

DisableRateLimitHeaders 代表是否禁用 X-Rate-LimitRetry-After 标头(请求达到上限时 response header 中的限制数和多少秒后能重试);

QuotaExceededMessage:代表请求达到上限时返回给客户端的消息;

HttpStatusCode:代表请求达到上限时返回给客户端的HTTP状态代码。ClientIdHeader可以允许自定义用于标识客户端的标头。默认情况下为 “ClientId”

最重要的就是 Period,PeriodTimespan,Limit 这几个配置。

重新编译启动看一下效果:

在这里插入图片描述

2.3 超时/熔断

超时很好理解,就是网关请求服务时可容忍的最长响应时间。熔断的意思就是当请求某个服务的异常次数达到一定量时,那么网关在一定时间内就不再对这个服务发起请求了,直接熔断。

Ocelot 中启用 超时/熔断 需要 NuGet 安装一下 Ocelot.Provider.Polly

在这里插入图片描述
修改 Startup.cs 中的 ConfigureServices() 方法:

//添加ocelot服务
services.AddOcelot()//添加consul支持.AddConsul()//添加缓存.AddCacheManager(x =>{x.WithDictionaryHandle();})//添加Polly.AddPolly();

同样的在 ocelot.json 路由配置中增加 QoSOptions

"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 10000,"TimeoutValue": 5000}

ExceptionsAllowedBeforeBreaking 代表发生错误的次数,DurationOfBreak代表熔断时间,TimeoutValue代表超时时间。

以上的配置意思就是当服务发生3次错误时,那么就熔断10秒,期间客户端的请求直接返回错误,10秒之后恢复。

这个不太好模拟,就不演示了,应该也挺好理解的。

三、总结

关于服务治理的学问还有很多,不继续了。。。就到此为止吧。

想要更深入了解 Ocelot 的,请看官网:https://ocelot.readthedocs.io/en/latest/
或者看源码:https://github.com/ThreeMammals/Ocelot

下一篇准备说一下:事件总线。


在这里插入图片描述

相关文章:

.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙,不知不觉又是一年,这一年收获满满。接下来,将本年度对技术的感悟和洞察分析如下,希望对大家有所帮助。 在过去几十年里,嵌入式系统技术迅速发展,成为现代电子设备和智能硬件的核心组成部分。…...

python-44-嵌入式数据库SQLite和DuckDB

文章目录 1 SQLite1.1 世界上最流行的数据库1.1 SQLite简介1.2 插入语句1.3 查询数据1.4 更新数据1.5 删除数据2 DuckDB2.1 DuckDB简介2.2 DuckDB与Python结合使用2.2.1 创建表2.2.2 分析语句2.2.3 导出为parquet文件2.3 Windows中使用DuckDB3 参考附录1 SQLite Python的一个特…...

1.2.神经网络基础

目录 1.2.神经网络基础 1.2.1.Logistic回归 1.2.2 梯度下降算法 1.2.3 导数 1.2.4 向量化编程 1.2.5 正向传播与反向传播 1.2.6.练习 1.2.神经网络基础 1.2.1.Logistic回归 1.2.1.1.Logistic回归 逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x ,…...

算法题目总结-双指针

文章目录 1.滑动窗口类型1.长度最小的子数组1.答案2.思路 2.无重复字符的最长子串1.答案2.思路 2.双指针类型1.盛最多水的容器1.答案2.思路 2.三数之和1.答案2.思路 1.滑动窗口类型 1.长度最小的子数组 1.答案 package com.sunxiansheng.arithmetic.day10;/*** Description:…...

人形机器人将制造iPhone!

前言 优必选机器人和富士康通过一项突破性的合作伙伴关系,正在将先进的人形机器人(如Walker S1及其升级版Walker S2)整合到制造流程中,以改变iPhone的生产方式。这一合作旨在通过提升机器人能力、优化工作流程以及实现更智能的自动…...

redis 各个模式的安装

一、Redis单机安装 1、安装gcc依赖 Redis是C语言编写的,编译需要GCC。 Redis6.x.x版本支持了多线程,需要gcc的版本大于4.9,但是CentOS7的默认版本是4.8.5。 升级gcc版本: yum -y install centos-release-scl yum -y install d…...

《王者荣耀》皮肤爬虫源码

1.爬取网页 https://pvp.qq.com/web201605/herolist.shtml 2.python代码 import requests from bs4 import BeautifulSoup import os import threading from queue import Queuedef mul(x):if not os.path.exists(x):os.mkdir(x)print("目录创建成功")else:pass h…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证8)

为进一步测试通过请求头传递token进行身份验证,在main.htm中增加layui的数据表格组件,并调用后台服务分页显示数据,后台分页查询数据接口如下所示(测试时,直接将数据写死到代码中,没有查询数据库&#xff0…...

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件,但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别: 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…...

React的应用级框架推荐——Next、Modern、Blitz等,快速搭建React项目

在 React 企业级应用开发中,Next.js、Modern.js 和 Blitz 是三个常见的框架,它们提供了不同的特性和功能,旨在简化开发流程并提高应用的性能和扩展性。以下是它们的详解与比较: Next、Modern、Blitz 1. Next.js Next.js 是由 Ve…...

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...

Java创建对象有几种方式?

大家好,我是锋哥。今天分享关于【Java创建对象有几种方式?】面试题。希望对大家有帮助; Java创建对象有几种方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Java中,创建对象主要有以下几种方式&…...

Vue3初学之Element Plus Dialog对话框,Message组件,MessageBox组件

Dialog的使用&#xff1a; 控制弹窗的显示和隐藏 <template><div><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible"title"提示"width"30%":before-close&qu…...

基于Python机器学习的双色球数据分析与预测

python统计分析2003-2024年所有的中奖记录,通过人工智能机器学习预测双色球,个人意见,仅供参考. 声明&#xff1a;双色球具有随机性&#xff0c;任何工具无法预测。本文章仅作为技术交流&#xff0c;提供学习参考。本文所涉及的代码均为python之机器学习的代码。双色球为公益事…...

微软Win10 RP 19045.5435(KB5050081)预览版发布!

系统之家1月20日最新报道&#xff0c;微软面向Release Preview频道的Windows Insider项目成员&#xff0c;发布了适用于Windows10 22H2版本的KB5050081更新&#xff0c;更新后系统版本号将升至19045.5435。本次更新增加了对GB18030-2022标准的支持&#xff0c;同时新版日历将为…...

使用 Parcel 和 NPM 脚本进行打包

使用 Parcel 和 NPM 脚本进行打包 Parcel Parcel 是一个零配置的网页应用程序打包工具&#xff0c;主要用于快速构建现代 JavaScript 应用。 我们可以使用npm直接安装它 npm install --save-dev parcel //这将把 Parcel 添加到 devDependencies 中&#xff0c;表明它是一个…...

HTML<center>标签

HTML5不支持。 <center>标签在HTML4中用于使文本居中对齐。 用什么来代替呢&#xff1f; 例子 居中对齐文本&#xff08;使用 CSS&#xff09;&#xff1a; <html> <head> <style> h1 {text-align: center;} p {text-align: center;} div {text-a…...

LatentSync本地部署教程:基于音频精准生成唇形高度同步视频

LatentSync 是字节跳动联合北京交通大学推出的一个端到端的唇形同步框架&#xff0c;以下是对其的详细介绍&#xff1a; 一、技术基础 LatentSync 基于音频条件的潜在扩散模型&#xff0c;无需任何中间的 3D 表示或 2D 特征点。它利用了 Stable Diffusion 的强大生成能力&…...

ES使用笔记,聚合分组后再分页,探索性能优化问题

之前分享过一篇文档,也是关于聚合分组后再分页的具体实现,当时只想着怎么实现,没有去主要探索ES性能优化的问题, 这篇我会换一种方式,重新实现这个聚合分组后再分页的操作,并且指出能优化性能点,可能我们再使用的时候,并没有注意过的点,希望对你有帮助!大佬的话,请忽略! 上源码…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...