1. 程式人生 > >spring cloud+.net core搭建微服務架構:服務發現(二)

spring cloud+.net core搭建微服務架構:服務發現(二)

前言

上篇文章實際上只講了服務治理中的服務註冊,服務與服務之間如何呼叫呢?傳統的方式,服務A呼叫服務B,那麼服務A訪問的是服務B的負載均衡地址,通過負載均衡來指向到服務B的真實地址,上篇文章已經說了這種方式的缺點。那麼下面講如何在spring cloud+dotnet core的應用下進行服務呼叫。

程式碼實現

假設一種場景,有一個訂單服務,有一個產品服務,其中產品服務是由兩個服務節點組成一個叢集。需求是訂單服務訪問產品服務的一個API介面。根據上一章文章的內容建立3個應用程式ServiceOne(埠8010),ServiceTwo(埠8011),ServiceThree(8012)。其中ServiceOne設定應用程式名稱為order。ServiceTwo和ServiceThree的應用程式名稱為product,做成叢集。

ServiceOne.appsettings.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "spring": {
        "application": {
            "name": "order"
        }
    },
    "eureka": {
        "client": {
            "serviceUrl": "http://localhost:5000/eureka/"
        },
        "instance": {
            "port": 8010
        }
    }
}

ServiceOne.Controllers.ValuesController.CS

private readonly DiscoveryHttpClientHandler _handler;
private const string ProductUrl = "http://product/api/values";

public ValuesController(IDiscoveryClient client, ILoggerFactory logFactory)
{
    _handler = new DiscoveryHttpClientHandler(client);
}

[HttpGet("product")]
public async Task<string> GoProductAsync()
{
    var client = new HttpClient(_handler, false);
    return await client.GetStringAsync(ProductUrl);
}

ServiceTwo.appsettings.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "spring": {
        "application": {
            "name": "product"
        }
    },
    "eureka": {
        "client": {
            "serviceUrl": "http://localhost:5000/eureka/"
        },
        "instance": {
            "port": 8011
        }
    }
}

ServiceTwo.appsettings.json

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "spring": {
        "application": {
            "name": "product"
        }
    },
    "eureka": {
        "client": {
            "serviceUrl": "http://localhost:5000/eureka/"
        },
        "instance": {
            "port": 8012
        }
    }
}

為了展現訪問的差異,設定不同的返回值。
ServiceTwo.Controllers.ValuesController.cs

[HttpGet]
public string Get()
{
    return "ServiceTwo";
}

ServiceThree.Controllers.ValuesController.cs

[HttpGet]
public string Get()
{
    return "ServiceThree";
}

同時啟動這3個專案,先看看服務中心http://localhost:5000/
image
這個3個應用程式都已經註冊到了服務中心。ServiceOne被註冊到ORDER,ServiceTwo和ServiceThree註冊到了PRODUCT。
分別訪問
http://localhost:8011/api/values 返回ServiceTwo
http://localhost:8012/api/values 返回ServiceThree
證明這兩個服務是沒有問題的。
再訪問http://localhost:8010/api/values/product,
如圖所示,分別返回了“ServiceTwo”和“ServiceThree”,多重新整理幾次,發現結果是來回變動的,這說明服務中心幫我們實現了負載均衡。

image

image

我們再做一個測試,斷開ServiceTwo這個應該程式。我們繼續訪問http://localhost:8010/api/values/product,發現一次錯誤,一次正常返回ServiceThree。30秒以後(可配置)再訪問正常返回ServiceThree,同時發現服務中心已經踢掉了埠為8011的應用程式(ServiceTwo)。

image

後記

通過上面3個例項我們模擬了分散式的呼叫場景,其中Order訪問Product叢集的時候,並沒有指定具體的地址,而是指定了服務名稱(product),服務中心自動分配了地址,並實現了負載均衡。聯絡實際應用場景,配合docker,我們可以快速的對某個服務進行新增,不再需要維護服務節點。同時某個服務節點掛掉以後,服務中心也會踢出這個服務節點(會有短暫的不可用)。結合CAP理論來說,服務中心滿足了AP。
這篇文章講解了服務之間的呼叫,我們實際的應用場景,還有各種客戶端(IOS,Andriod,Web...)來訪問,而服務一般是內網不對外暴露的,所以客戶端訪問服務的時候就需要有一個專門對外暴露的入口,那麼就引入了下篇文章的API閘道器。

示例程式碼

所有程式碼均上傳github。程式碼按照章節的順序上傳,例如第一章demo1,第二章demo2以此類推。
求推薦,你們的支援是我寫作最大的動力,我的QQ群:328438252,交流微服務。

傳送門

參考資料

java部分

.net部分

相關推薦

跟著園內spring cloud+.net core搭建服務架構 服務消費出錯問題

bubuko product xxx alt 我沒 .dll 端口 sin 無法 http://www.cnblogs.com/longxianghui/p/7561259.html 最近在跟隨著園區內的這個博客做服務發現的時候,發覺在vs 上調整了端口

spring cloud+.net core搭建服務架構服務註冊

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

spring cloud+.net core搭建服務架構Api閘道器

前言 國慶假期,一直沒有時間更新。 根據群裡面的同學的提問,強烈推薦大家先熟悉下spring cloud。文章下面有純潔大神的spring cloud系列。 上一章最後說了,因為服務是不對外暴露的,所以在外網要訪問服務必須通過API閘道器來完成,而spring cloud 提供了現成的Api閘道器元件zuul

spring cloud+.net core搭建服務架構服務發現

前言 上篇文章實際上只講了服務治理中的服務註冊,服務與服務之間如何呼叫呢?傳統的方式,服務A呼叫服務B,那麼服務A訪問的是服務B的負載均衡地址,通過負載均衡來指向到服務B的真實地址,上篇文章已經說了這種方式的缺點。那麼下面講如何在spring cloud+dotnet core的應用下進行服務呼叫。 程式碼實

spring cloud+.net core搭建服務架構配置中心

前言 我們專案中有很多需要配置的地方,最常見的就是各種服務URL地址,這些地址針對不同的執行環境還不一樣,不管和打包還是部署都麻煩,需要非常的小心。一般配置都是儲存到配置檔案裡面,不管多小的配置變動,都需要對應用程式進行重啟,對於分散式系統來說,這是非常不可取的。所以配置中心就在這種場景孕育出來,能夠適配不同

手把手教你使用spring cloud+dotnet core搭建服務架構 服務治理-

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

spring cloud + .net core實現服務架構

1.新建spring boot專案 2.新增spring-cloud-starter-eureka-server依賴(需提供版本資訊) <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-star

spring cloud+dotnet core搭建服務架構Api閘道器

前言 國慶假期,一直沒有時間更新。 根據群裡面的同學的提問,強烈推薦大家先熟悉下spring cloud。文章下面有純潔大神的spring cloud系列。 上一章最後說了,因為服務是不對外暴露的,所以在外網要訪問服務必須通過API閘道器來完成,而spring cloud 提供了現成的Api閘道器元件z

Spring Cloud+Vue簡單模仿博四服務提供者整合Hibernate以及設計資料庫

一、建立資料庫 暫時先建立一個使用者表 /* Navicat MySQL Data Transfer Source Server : MyDB Source Server Version : 50549 Source Host : l

ASP.NET Core 打造一個簡單的圖書館管理系統Code First 多對多關係的建立

前言: 本系列文章主要為我之前所學知識的一次微小的實踐,以我學校圖書館管理系統為雛形所作。 本系列文章主要參考資料: 微軟文件:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&ta

ASP.NET Core 打造一個簡單的圖書館管理系統Code First 多對多關系的建立

兩個 microsoft 創建 int lan rar -c bsp dem 前言: 本系列文章主要為我之前所學知識的一次微小的實踐,以我學校圖書館管理系統為雛形所作。 本系列文章主要參考資料: 微軟文檔:https://docs.microsoft.com/zh-c

.NET Core 3.0之深入原始碼理解ObjectPool

寫在前面 前文主要介紹了ObjectPool的一些理論基礎,本文主要從原始碼角度理解Microsoft.Extensions.ObjectPool是如何實現的。下圖為其三大核心元件圖: 核心元件 ObjectPool ObjectPool是一個泛型抽象類,裡面只有兩個抽象方法,Get和Return。它從底

.NET Core 3.1之深入原始碼理解HealthCheck

寫在前面前文討論了HealthCheck的理論部分,本文將討論有關HealthCheck的應用內容。可以監視記憶體、磁碟和其他物理伺服器資源的使用情況來了解是否處於正常狀態。執行狀況檢查可以測試應用的依賴項(如資料庫和外部服務終結點)以確認是否可用和正常工作。執行狀況探測可以由容器業務流程協調程式和負載均衡器

基於 abp vNext 和 .NET Core 開發部落格專案 - Blazor 實戰系列

## 系列文章 1. **[基於 abp vNext 和 .NET Core 開發部落格專案 - 使用 abp cli 搭建專案](https://www.cnblogs.com/meowv/p/12896177.html)** 2. **[基於 abp vNext 和 .NET Core 開發部落格專案

ASP.NET Core 3.x啟動時執行非同步任務

這一篇是接著前一篇在寫的。如果沒有看過前一篇文章,建議先去看一下前一篇,這兒是傳送門   一、前言 前一篇文章,我們從應用啟動時非同步執行任務開始,說到了必要性,也說到了幾種解決方法,及各自的優缺點。最後,還提出了一個比較合理的解決方法:通過在Program.cs里加入程式碼,來實現IWebHost啟動

Spring Cloud Alibaba+Nacos搭建服務架構

1. Spring Cloud Alibaba 簡介    Spring Cloud Alibaba是阿里巴巴為分散式應用提供的一站式解決方案,能夠更方便快捷地搭建分散式平臺,nacos擁有著替換eureka server ,spring cloud config等元件的目標和意圖,旨在能夠更簡便快速地去管理

Spring Cloud構建服務架構服務消費基礎

消費 ring str frame emp default class a template pom.xml 使用LoadBalancerClient在Spring Cloud Commons中提供了大量的與服務治理相關的抽象接口,包括DiscoveryClient、這裏我

Spring Cloud構建PC蛋蛋源碼下載服務架構服務消費基礎

true ota ctu temp control lan prope 源碼下載 builder PC蛋蛋源碼下載論壇:haozbbs.com Q1446595067 使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的與服務治

Spring Cloud構建服務架構服務註冊與發現 Eureka

Spring Cloud構建微服務架構:服務註冊與發現Eureka 【Dalston版】 原創   2018-04-10  宗野   Spring Cloud 已經

Spring Cloud構建服務架構服務容錯保護Hystrix服務降級

tro sco load 服務架構 延遲 正常 map ati href 動手試一試 在開始使用Spring Cloud Hystrix實現斷路器之前,我們先拿之前實現的一些內容作為基礎,其中包括: eureka-server工程:服務註冊中心,端口:1001 eurek