簡介 .net core使用ocelot 第一篇 簡單使用 .net core使用ocelot 第二篇 身份驗證使用 .net core使用ocelot 第三篇 日誌記錄 .net core使用ocelot 第四篇 限流熔斷 .net core使用ocelot 第五篇 服務質量 .net core使 ...
簡介
.net core使用ocelot---第一篇 簡單使用
.net core使用ocelot---第二篇 身份驗證使用
.net core使用ocelot---第三篇 日誌記錄
.net core使用ocelot---第四篇 限流熔斷
.net core使用ocelot---第五篇 服務質量
.net core使用ocelot---第六篇 負載均衡
本文我們介紹用Spring Cloud Eureka Server介紹Ocelot的服務發現模塊。
什麼是服務發現
服務發現是自動檢測這些設備在電腦網路上提供的設備和服務。服務發現協議(SDP)是幫助完成服務發現的網路協議。服務發現旨在減少用戶的配置工作。
在Ocelot中我們可以使用許多的服務發現,比如Consul, Eureka等等。本文我使用Eureka進行介紹。Ocelot使用Steeltoe與Eureka進行通信,Eureka是一個開源項目,使.NET開發人員能夠在雲上構建彈性微服務時能實現滿足行業標準的最佳實踐。
我將使用Ocelot的7.1.0-unstable0011版本向您展示此功能。
Step1
首先創建兩個API服務,一個是預設的ASP.NET Core Web API項目。在API網關發現我們的API服務之前,我們需要在Eureka服務上註冊。
在appsettings.json添加一些配置
1. "spring": { 2. "application": { 3. "name": "service-a" 4. } 5. }, 6. "eureka": { 7. "client": { 8. "serviceUrl": "http://192.168.0.107:8761/eureka/", 9. "shouldFetchRegistry": true, 10. "validateCertificates": false 11. }, 12. "instance": { 13. "port": 9001, 14. "instanceId": "192.168.0.103:9001", 15. "hostName": "192.168.0.103", 16. "healthCheckUrlPath": "/api/values/healthcheck", 17. "statusPageUrlPath": "/api/values/info" 18. } 19. }
註意
- Service-a 是Ocelot發現服務的重要標誌。
- ServiceUrl是Eureka Server的端點。
- 獲得更多信息,看這裡
添加服務發現必要的代碼
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDiscoveryClient(Configuration); services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseDiscoveryClient(); app.UseMvc(); } }
在這裡,我將使用三個API服務來演示,兩個API服務名稱service-a具有不同的埠(9001和9003),一個API服務名稱service-b。
Step2
新建一個APIGateway項目,添加名為ocelot.json的配置文件。
{ "ReRoutes": [ { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "UpstreamPathTemplate": "/a", "UseServiceDiscovery": true, "ServiceName": "service-a", "UpstreamHttpMethod": [ "Get" ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 3, "DurationOfBreak": 1000, "TimeoutValue": 5000 }, "FileCacheOptions": { "TtlSeconds": 15 }, "LoadBalancerOptions": { "Type": "RoundRobin" } }, { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "UpstreamPathTemplate": "/b", "UseServiceDiscovery": true, "ServiceName": "service-b", "UpstreamHttpMethod": [ "Get" ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 3, "DurationOfBreak": 1000, "TimeoutValue": 5000 }, "FileCacheOptions": { "TtlSeconds": 15 } } ], "GlobalConfiguration": { "RequestIdKey": "OcRequestId", "AdministrationPath": "/administration", "ServiceDiscoveryProvider": { "Type": "Eureka" } } }
這裡有幾點需要註意。
對於ReRoutes
- 將UseServiceDiscovery設為true。
- 將ServiceName值設為在API服務里定義的服務名稱。
- 不用指明DownstreamHostAndPorts的值。
- 將LoadBalancerOptions設成RoundRobin。
對於GlobalConfiguration
設置ServiceDiscoveryProvider的Type為Eureka。這是使用Eureka至關重要的配置。
回到Program.cs,我們需要讓Ocelot可以使用。
public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseUrls("http://*:9000") .ConfigureAppConfiguration((hostingContext, config) => { config .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath) .AddJsonFile("ocelot.json") .AddEnvironmentVariables(); }) .ConfigureServices(s => { s.AddOcelot(); }) .Configure(a => { a.UseOcelot().Wait(); }) .Build(); }
Step3
讓Eureka跑起來。
如你所見,Eureka服務啟動起來了,但是沒有可以使用的實例。
註意
為了在你的電腦上跑Eureka服務,你可以按照下麵的步驟嘗試。
- 安裝Java 8 的JDK
- 安裝Maven3.X
- 複製Spring Cloud Samples Eureka 代碼庫(https://github.com/spring-cloud-samples/eureka.git)
- 轉到eureka服務的目錄(eureka)並使用mvn spring-boot:run啟動它
Step4
我們如何註冊我們的服務?只需運行我們的項目,我們就會得到service-a實例。
當運行我們的API服務,你就會發現service-a 運行在Eureka 服務里了
好了,啟動我們的APIGateway,不幸的是,當我們運行起項目。
查看異常信息,我們忘了在APIGateway項目中配置Eureka。在appsettings.json添加下麵的配置。
"spring": { "application": { "name": "service-gw" } }, "eureka": { "client": { "serviceUrl": "http://192.168.0.107:8761/eureka/", "shouldRegisterWithEureka": false, "validateCertificates": false }, "instance": { "port": 9000, "instanceId": "192.168.0.103:9000", "hostName": "192.168.0.103" } }
重新啟動APIGateway,終於正常了。
通過APIGat訪問service-a
通過APIGateway訪問未啟動的service-b
毫無疑問我們不可能訪問service-b
啟動後
再次啟動
最後註冊另一個service-a
訪問service-a你得到的結果有時來自9001,有時來自9003 。因為我們負載均衡演算法設為RoundRobin。
當我們停止service-a的一個服務,我們依然可以訪問,但是終止的那個服務不能訪問。
源碼在此
總結
本文介紹了Ocelot使用Eureka實現服務發現的簡單示例。當讓還有consul也可以實現服務發現,下篇介紹。