一.概述 Ocelot允許指定服務發現提供程式,如Consul或Eureka。 這二個中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和埠。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味著相同的服務發現提供程式 ...
一.概述
Ocelot允許指定服務發現提供程式,如Consul或Eureka。 這二個中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和埠。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味著相同的服務發現提供程式將用於為ReRoute級別指定ServiceName的所有ReRoutes。這裡介紹下服務發現的二個中間件:Consul與Eureka。
1. Consul介紹
Consul服務發現是用GO語言的開源框架,是一個分散式, 高可用,數據中心感知的解決方案,用於跨任何運行時平臺和公共雲或私有雲連接。Consul是服務發現和配置工具。主要功能包括:
(1) 服務發現 - Consul使用簡單的服務來註冊自己,並通過DNS或HTTP介面發現其他服務。還可以註冊外部服務,比如SaaS提供者。
(2) 運行狀況檢查 -運行狀況檢查使Consul能夠快速向操作員發出有關群集中任何問題的警報, 與服務發現的集成可防止將流量路由到不健康的主機,並啟用服務級別的斷路器。
(3) Key/Value存儲 - 靈活的Key/Value存儲可以存儲動態配置,功能標記,協調,領導者選舉等。簡單的HTTP API使其易於在任何地方使用。
(4) 多數據中心 - Consul可以識別數據中心,並且可以支持任意數量的區域而無需複雜的配置。
(5) 服務分段 - Consul 連接通過自動TLS加密和基於身份的授權實現安全的服務到服務通信。
使用consul示例:https://www.cnblogs.com/Zhang-Xiang/p/10437488.html
2. Eureka介紹
Eureka服務發現是用java語言的開源框架,最新版本為19.9 (有報道後面2.0版本不開源)。是一種基於REST的服務,主要用於AWS雲,用於定位服務,以實現中間層伺服器的負載平衡和故障轉移。
使用Eureka示例:Service Discovery Demo With Eureka
二.演示項目介紹
本篇重點瞭解Consul的使用,下麵參考開源項目Github , 本篇在部署上 對比 參考示例 有些小改動,項目使用了Ocelot + IdentityServer4 + Consul中間件。
說明:
(1) 用到的軟體包括:centos系統, iis, fiddler。其中centos系統用於做Consul服務註冊,iis做webapi的宿主承載,fiddler用於客戶端模擬測試。
(2) 演示中 IdentityServer4服務認證和ApiGateway網關項目由vs2017 來做宿主承載,但也可以用iis承載。
項目名稱 |
Ip和埠 |
說明 |
ApiGateway |
http://localhost:38039
|
網關項目。統一訪問入口點,在生產環境下ip要在廣域網,供第三方客戶端訪問。 做好網關路由配置,將自動轉發。 |
IdentityServer4 |
http://127.0.0.1:8021 |
Is4令牌服務。ip是在區域網, 通過web api來調用令牌 |
Service A/B |
http://127.0.0.1:8010 (A) http://127.0.0.1:8011 (B) |
服務項目。ip是在區域網,由網關轉發進來訪問。 |
Consul 搭建 |
http://172.168.18.201:8500 |
服務發現。在linux中啟動Consul服務,預設是8500埠,用於監聽服務的健康狀態。 在linux中需要拼通服務ip及port, 反之一樣。可telnet命令。 配置服務註冊文件 |
fiddler客戶端模擬 |
|
調用服務A獲取IS4令牌,通過該令牌訪問服務A受保護的介面 |
三. web api服務
參考開源項目,Service A和Service B服務項目相關配置都一樣,以Service A為例:
1.項目中有三個api介面
(1) 一個必須要診斷介面api/Health
(1) 一個必須要的獲取令牌介面api/Session
(3) 一個業務測試介面api/Values。 因為業務介面是受保護的,所以該介面加了[Authorize],需要令牌來訪問
[Authorize] [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new[] { "value1", "value2" }; } }
2. 在啟動時,加了授權中間件,採用JwtBearer方案。設置了受信任的is4服務基地址,以及Audience保護的資源。
services.AddAuthentication("Bearer") .AddJwtBearer("Bearer", options => { options.Authority = "http://127.0.0.1:8021"; options.RequireHttpsMetadata = false; options.Audience = "ServiceB"; });
四. ApiGateway項目
1. 在網關項目中,配置ocelot文件
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", //客戶端通過/ServiceA來訪問ServiceA的服務 "UpstreamPathTemplate": "/ServiceA/{everything}", "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ], //服務發現Consul用到 "ServiceName": "ServiceA", "LoadBalancerOptions": { "Type": "LeastConnection" } }, { "DownstreamPathTemplate": "/api/{everything}", "DownstreamScheme": "http", "UpstreamPathTemplate": "/ServiceB/{everything}", "UpstreamHttpMethod": [ "GET", "POST", "DELETE", "PUT" ], "ServiceName": "ServiceB", "LoadBalancerOptions": { "Type": "LeastConnection" } } ], "GlobalConfiguration": { //配置Consul的信息 "ServiceDiscoveryProvider": { "Host": "172.168.18.201", "Port": 8500, "Type": "Consul" } } }
2.啟動時添加網關中間件
public static void Main(string[] args) { new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("appsettings.json", true, true) .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true) .AddJsonFile("ocelot.json") .AddEnvironmentVariables(); }) .ConfigureServices(services => { services.AddOcelot().AddConsul(); }) .ConfigureLogging((hostingContext, logging) => { //add your logging }) .UseIISIntegration() .Configure(app => { app.UseOcelot().Wait(); }) .Build() .Run(); }
五. IdentityServer令牌服務
參考開源IdentityServer項目代碼,在令牌服務中,使用AddDeveloperSigningCredential來添加臨時證書,在生產環境下,可以使用AddSigningCredential來添加證書。客戶端基於用戶名和密碼的方式來獲取令牌GrantTypes.ResourceOwnerPassword。
六 Consul搭建
1. consul安裝
--下載安裝包 [root@hsr opt]# wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip --將conusl命令移到bin目錄下,方便啟動 [root@hsr opt]# mv consul /usr/local/bin/ --測試安裝是否成功,ok [root@hsr ~]# consul Usage: consul [--version] [--help] <command> [<args>]
2.添加服務註冊放到/usr/etc/
3. 啟動客戶端agent 測試
consul agent -dev -data-dir=/usr/etc -config-dir=/usr/etc/consul.json -client 172.168.18.201
啟動成功後,會每隔10秒檢查一次服務的健康狀態,如下所示:
-dev開發模式,啟動該參數配置下,不會有任何持久化操作,即不會有任何數據寫入到磁碟
-config-file 指定服務註冊文件
-client指定當前ip,預設是127.0.0.1
-data-dir指定agent儲存狀態的數據目錄
4.關閉201防火牆, 在win系統上訪問服務發現管理界面如下:
systemctl stop firewalld.service
七.fiddler測試
1. 測試開始步驟:
(1) 兩個服務ServerA/ServerB發佈到iis上。
(2) 在vs2017中啟動ApiGateway網關項目和IS4項目。
(3) 在linux系統中啟動consul(現只是監聽服務是否健康)
2.測試ServerA服務
(1)通過用戶名和密碼,獲取要訪問ServerA服務的令牌
(2) 獲取受保護的api介面,將拿到的令牌加到headers中去請求
(3) 請求http://localhost:38039/serviceA/values數據介面成功,如下所示:
參考文獻