.NETCore微服務探尋(一) - 閘道器
阿新 • • 發佈:2020-06-15
## 前言
一直以來對於.NETCore微服務相關的技術棧都處於一個淺嘗輒止的瞭解階段,在現實工作中也對於微服務也一直沒有使用的業務環境,所以一直也沒有整合過一個完整的基於.NETCore技術棧的微服務專案。正好由於最近剛好辭職,有了時間可以寫寫自己感興趣的東西,所以在此想把自己瞭解的微服務相關的概念和技術框架使用實現記錄在一個完整的工程中,由於本人技術有限,所以錯誤的地方希望大家指出。\
> 專案地址:https://github.com/yingpanwang/fordotnet/tree/dev
# 什麼是Api閘道器
由於微服務把具體的業務分割成單獨的服務,所以如果直接將每個服務都與呼叫者直接,那麼維護起來將相當麻煩與頭疼,Api閘道器擔任的角色就是整合請求並按照路由規則轉發至服務的例項,並且由於所有所有請求都經過閘道器,那麼閘道器還可以承擔一系列巨集觀的攔截功能,例如安全認證,日誌,熔斷
# 為什麼需要Api閘道器
因為Api閘道器可以提供安全認證,日誌,熔斷相關的巨集觀攔截的功能,也可以遮蔽多個下游服務的內部細節
# 有哪些有名的Api閘道器專案
* **Zuul** Spring Cloud 整合
* **Kong** 一款lua輕量級閘道器專案
* **Ocelot** .NETCore閘道器專案
# Ocelot使用
### 1.通過**Nuget**安裝**Ocelot**
![](https://img2020.cnblogs.com/blog/920403/202006/920403-20200615170325431-1719294932.png)
### 2.準備並編輯Ocelot配置資訊
Ocelot.json
```
{
"ReRoutes": [
// Auth
{
"UpstreamPathTemplate": "/auth/{action}", // 上游請求路徑模板
"UpstreamHttpMethod": [ "GET", "POST", "PUT", "DELETE" ], // 上游請求方法
"ServiceName": "Auth", // 服務名稱
"UseServiceDiscovery": true, // 是否使用服務發現
"DownstreamPathTemplate": "/connect/{action}", // 下游匹配路徑模板
"DownstreamScheme": "http", // 下游請求
"LoadBalancerOptions": { // 負載均衡配置
"Type": "RoundRobin"
}
//,
// 如果不採用服務發現需要指定下游host
//"DownstreamHostAndPorts": [
// {
// "Host": "10.0.1.10",
// "Port": 5000
// },
// {
// "Host": "10.0.1.11",
// "Port": 5000
// }
//]
}
],
"GlobalConfiguration": { // 全域性配置資訊
"BaseUrl": "http://localhost:5000", // 請求 baseurl
"ServiceDiscoveryProvider": { //服務發現提供者
"Host": "106.53.199.185",
"Port": 8500,
"Type": "Consul" // 使用Consul
}
}
}
```
### 3.新增Ocelot json檔案到專案中
將Config目錄下的ocelot.json新增到專案中
![](https://img2020.cnblogs.com/blog/920403/202006/920403-20200615172010816-805859803.png)
### 4.在閘道器專案中 **StartUp** **ConfigService**中新增**Ocelot**的服務,在**Configure**中新增**Ocelot**的中介軟體(由於我這裡使用了Consul作為服務發現,所以需要新增Consul的依賴的服務AddConsul,如果不需要服務發現的話可以不用新增)
![](https://img2020.cnblogs.com/blog/920403/202006/920403-20200615170539742-1188383367.png)
### 5.將需要發現的服務通過程式碼在啟動時註冊到Consul中
我這裡自己封裝了一個註冊服務的擴充套件(寫的比較隨意沒有在意細節)
![](https://img2020.cnblogs.com/blog/920403/202006/920403-20200615173500718-515600512.png)
appsettings.json 中添加註冊服務配置資訊
``` json
"ServiceOptions": {
"ServiceIP": "localhost",
"ServiceName": "Auth",
"Port": 5800,
"HealthCheckUrl": "/api/health",
"ConsulOptions": {
"Scheme": "http",
"ConsulIP": "localhost",
"Port": 8500
}
}
```
擴充套件程式碼 ConsulExtensions(注意:3.1中 IApplicationLifetime已廢棄 所以使用的是IHostApplicationLifetime 作為程式生命週期注入的方式)
``` csharp
using Consul;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
namespace ForDotNet.Common.Consul.Extensions
{
///
/// 服務配置資訊
///
public class ServiceOptions
{
///
/// 服務ip
///
public string ServiceIP { get; set; }
///
/// 服務名稱
///
public string ServiceName { get; set; }
///
/// 協議型別http or https
///
public string Scheme { get; set; } = "http";
///
/// 埠
///
public int Port { get; set; }
///
/// 健康檢查介面
///
public string HealthCheckUrl { get; set; } = "/api/values";
///
/// 健康檢查間隔時間
///
public int HealthCheckIntervalSecond { get; set; } = 10;
///
/// consul配置資訊
///
public ConsulOptions ConsulOptions { get; set; }
}
///
/// consul配置資訊
///
public class ConsulOptions
{
///
/// consul ip
///
public string ConsulIP { get; set; }
///
/// consul 埠
///
public int Port { get; set; }
///
/// 協議型別http or https
///
public string Scheme { get; set; } = "http";
}
///
/// consul註冊客戶端資訊
///
public class ConsulClientInfo
{
///
/// 註冊資訊
///
public AgentServiceRegistration RegisterInfo { get; set; }
///
/// consul客戶端
///
public ConsulClient Client { get; set; }
}
///
/// consul擴充套件(通過配置檔案配置)
///
public static class ConsulExtensions
{
private static readonly ServiceOptions serviceOptions = new ServiceOptions();
///
/// 新增consul
///
public static void AddConsulServiceDiscovery(this IServiceCollection services)
{
var config = services.BuildServiceProvider().Ge