Spring Cloud+.NET Core搭建微服務架構:服務註冊

編程語言 軟件 Java IDE 會技術的葛大爺 會技術的葛大爺 2017-10-29

背景

公司去年開始使用dotnet core開發項目。公司的總體架構採用的是微服務,那時候由於對微服務的理解並不是太深,加上各種組件的不成熟,只是把項目的各個功能通過業務層面拆分,然後通過nginx代理,項目最終上線。但是這遠遠沒達到微服務的要求,其中服務治理,斷路器都沒有。

我個人理解,我們談微服務實際上更多的是談服務治理這塊東西,至於各個的服務只是微服務中的應用而已。一次偶然的機會發現了java的spring cloud這套框架,而且支持dotnet core集成(Steeltoe OSS)。所以目前我們的項目架構是spring cloud搭建底層微服務框架,dotnet core來編寫業務邏輯。

Spring Cloud+.NET Core搭建微服務架構:服務註冊

Spring Cloud

Spring Cloud是java平臺提供的一套解決方案,目前市面上來說可能不是最好的微服務解決方案,但是一定是功能最齊全最全的解決方案。提供了一些微服務的基礎功能,包括服務治理、負載均衡、斷路器、配置中心、API網關等等。

服務治理

關於服務治理這塊東西,網上太多太多的資料和原理。相信大家也看了很多,但是如何應用到實際的項目場景,為什麼要這樣做呢?傳統的項目,服務與服務之間的調用都是通過URL來訪問,如果是集群那麼通過一個負載均衡地址來訪問,增加或者減少機器都是通過維護負載均衡列表的IP地址來實現。

微服務架構下,分散成了N個服務,每個服務又是一個集群,對於一個大項目來說,維護這些配置是非常頭疼的。筆者曾經在某知名互聯網公司工作過,公司最累最背鍋的就是運維團隊,基本24小時都在應付各個團隊的部署上線工作以及各種配置的維護,而且還經常出錯捱罵。

那麼服務治理就出現在這種應用場景之中,運維工程師不用再維護各個負載均衡節點,由服務中心去統一處理。舉個簡單例子,一個電商網站,分解成N個服務,其中有一個用戶服務,有一個訂單服務,用戶服務需要調用訂單服務,而訂單服務是一個集群,對於用戶中心來說他只需要知道訪問訂單中心即可,至於具體訪問訂單中心的哪臺機器由服務中心來調配。

搭建服務治理平臺

1、java開發環境和IDE使用請自行百度,筆者java開發的ide使用的intellij idea。

2、創建一個spring boot項目,項目名稱service-center,添加spring cloud的依賴

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka-server</artifactId>

</dependency>

3、添加@EnableEurekaServer註解

@EnableEurekaServer

@SpringBootApplication

public class ServiceCenterApplication {}

4、設置應用程序的端口和名稱

spring.application.name=service-center

server.port=5000

5、啟動項目,在瀏覽器輸入http://localhost:5000/

Spring Cloud+.NET Core搭建微服務架構:服務註冊

註冊服務

1、使用vs創建一個dotnet core web api程序

2、使用nuget添加Pivotal.Discovery.Client庫

<PackageReference Include="Pivotal.Discovery.Client" Version="1.1.0" />

3.Program.cs 設置一個端口

public static void Main(string[] args)

{

var host = new WebHostBuilder()

.UseKestrel()

.UseContentRoot(Directory.GetCurrentDirectory())

.UseIISIntegration()

.UseStartup<Startup>()

.UseApplicationInsights()

.UseUrls("http://*:8010")

.Build();

host.Run();

}

4、Startup.cs

public void ConfigureServices(IServiceCollection services)

{

services.AddDiscoveryClient(Configuration);

// Add framework services.

services.AddMvc();

}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

loggerFactory.AddConsole(Configuration.GetSection("Logging"));

loggerFactory.AddDebug();

app.UseMvc();

app.UseDiscoveryClient();

}

5、appsettings.json

{

"Logging": {

"IncludeScopes": false,

"LogLevel": {

"Default": "Warning"

}

},

"spring": {

"application": {

"name": "serviceone"

}

},

"eureka": {

"client": {

"serviceUrl": "http://localhost:5000/eureka/",

"shouldFetchRegistry": false,

"shouldRegisterWithEureka": true

},

"instance": {

"port": 8010

}

}

}

如果是團隊開發,"shouldRegisterWithEureka"設置成false,防止本地環境註冊到開發環境

6、啟動程序,再次訪問http://localhost:5000/發現已經註冊到服務中心了

Spring Cloud+.NET Core搭建微服務架構:服務註冊

7、同樣的方式我們再創建一個ServiceTwo的項目,修改programe.cs和appsettings.json文件,其它不變

public static void Main(string[] args)

{

var host = new WebHostBuilder()

.UseKestrel()

.UseContentRoot(Directory.GetCurrentDirectory())

.UseIISIntegration()

.UseStartup<Startup>()

.UseApplicationInsights()

.UseUrls("http://*:8011")

.Build();

host.Run();

}

{

"Logging": {

"IncludeScopes": false,

"LogLevel": {

"Default": "Warning"

}

},

"spring": {

"application": {

"name": "servicetwo"

}

},

"eureka": {

"client": {

"serviceUrl": "http://loclhost:5000/eureka/",

"shouldFetchRegistry": false,

"shouldRegisterWithEureka": true

},

"instance": {

"port": 8011

}

}

}

8、再次訪問http://localhost:5000/,發現ServiceOne和ServiceTwo都已經註冊到服務中心了

Spring Cloud+.NET Core搭建微服務架構:服務註冊

後記

這樣一個簡單的服務治理平臺就搭建出來了,我們通過spring cloud來創建了一個服務中心,然後通過dotnet core創建了2個服務註冊到了服務中心,但是這些離微服務還差的遠。

服務之間怎麼相互調用呢?集群模式怎麼處理呢?微服務的統一API網關呢?留下這些問題,且聽下回分解。

相關推薦

推薦中...