Ocelot容許指定服務發現提供程序,如Consul或Eureka。 這二箇中間件是用來實現:服務治理或秒服務發現,服務發現查找Ocelot正在轉發請求的下游服務的主機和端口。目前Ocelot僅在GlobalConfiguration部分支持配置服務發現功能,這意味着相同的服務發現提供程序將用於爲ReRoute級別指定ServiceName的全部ReRoutes。這裏介紹下服務發現的二箇中間件:Consul與Eureka。html
1. Consul介紹java
Consul服務發現是用GO語言的開源框架,是一個分佈式, 高可用,數據中心感知的解決方案,用於跨任何運行時平臺和公共雲或私有云鏈接。Consul是服務發現和配置工具。主要功能包括:linux
(1) 服務發現 - Consul使用簡單的服務來註冊本身,並經過DNS或HTTP接口發現其餘服務。還能夠註冊外部服務,好比SaaS提供者。git
(2) 運行情況檢查 -運行情況檢查使Consul可以快速向操做員發出有關羣集中任何問題的警報, 與服務發現的集成可防止將流量路由到不健康的主機,並啓用服務級別的斷路器。github
(3) Key/Value存儲 - 靈活的Key/Value存儲能夠存儲動態配置,功能標記,協調,領導者選舉等。簡單的HTTP API使其易於在任何地方使用。web
(4) 多數據中心 - Consul能夠識別數據中心,而且能夠支持任意數量的區域而無需複雜的配置。json
(5) 服務分段 - Consul 鏈接經過自動TLS加密和基於身份的受權實現安全的服務到服務通訊。centos
使用consul示例:http://www.javashuo.com/article/p-wkcpqatg-dc.htmlapi
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受保護的接口 |
參考開源項目,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"; });
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項目代碼,在令牌服務中,使用AddDeveloperSigningCredential來添加臨時證書,在生產環境下,可使用AddSigningCredential來添加證書。客戶端基於用戶名和密碼的方式來獲取令牌GrantTypes.ResourceOwnerPassword。
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
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數據接口成功,以下所示:
參考文獻