1. 程式人生 > >spring cloud+.net core搭建微服務架構:配置中心(四)

spring cloud+.net core搭建微服務架構:配置中心(四)

前言

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

介紹

現在開始介紹我們今天的主角spring cloud config,我覺得它最大的優點就是可以和git做整合,使用起來非常方便。spring cloud config包含服務端和客戶端,服務端提供配置的讀取和配置倉庫,客戶端來獲取配置。

也可以使用svn或者檔案來儲存配置檔案,我們這裡只講Git的方式

業務場景

我們模擬一個業務場景,有一個遠端配置檔案我們通過應用程式獲取它。

程式碼實現

我們需要建立2個應用程式:配置服務服務端(Java),配置服務客戶端(.Net Core)和一個Github倉庫。
使用IntelliJ IDEA建立一個spring boot專案,建立配置中心服務端,埠設定為5100

pom.xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
ConfigServerApplication.java
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
application.properties
server.port=5100
spring.application.name=config-server
#git倉庫地址
spring.cloud.config.server.git.uri=https://github.com/longxianghui/configs.git
#git使用者名稱和密碼
#spring.cloud.config.server.git.username=xxx
#spring.cloud.config.server.git.password=xxx
#git目錄下的資料夾,多個用逗號分割
#spring.cloud.config.server.git.search-paths=xxx,xxx,xxx

使用Github建立一個倉庫,並提交3個檔案,檔案內容如下(注意yml格式)

demo-dev.yml
name: mickey
age: 3
env: test
demo-test.yml
name: fiona
age: 28
env: test
demo-prod.yml
name: leo
age: 30
env: prod

配置檔案命名規則{application}-{profile}.yml
支援yml和properties格式

執行配置中心服務端
在瀏覽器輸入http://localhost:5001/demo/dev
image
再訪問http://localhost:5001/demo/test
image
再訪問http://localhost:5001/demo/prod
image
通過上面3個URL我們發現配置中心通過REST的方式將配置資訊返回。
配置服務REST規則如下:

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

下面我們再看看.NET程式如何讀取配置資訊呢?
建立一個 .net core web api程式,埠5101

nuget引用
<PackageReference Include="Steeltoe.Extensions.Configuration.ConfigServer" Version="1.1.0" />
appsettings.json
{
  "spring": {
    "application": {
      "name": "demo"//與配置檔案的名稱對應
    },
    "cloud": {
      "config": {
        "uri": "http://localhost:5100",
        "env": "dev" //與環境名稱對應
      }
    }
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
Startup.cs
public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables()
        .AddConfigServer(env);
    Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddConfigServer(Configuration);
    // Add framework services.
    services.AddMvc();
    services.Configure<Demo>(Configuration);
}
Demo.cs
public class Demo
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Env { get; set; }
}
ValuesController.cs
[Route("/")]
public class ValuesController : Controller
{
    private readonly IConfigurationRoot _config;
    private readonly IOptionsSnapshot<Demo> _configDemo;

    public ValuesController(IConfigurationRoot config, IOptionsSnapshot<Demo> configDemo)
    {
        _config = config;
        _configDemo = configDemo;
    }
    [HttpGet]
    public Demo Get()
    {
        //兩種方式獲取配置檔案的資料
        //var demo = new Demo
        //{
        //    Name = _config["name"],
        //    Age = int.Parse(_config["age"]),
        //    Env = _config["env"]
        //};
        var demo = _configDemo.Value;
        return demo;
    }
}

執行程式 瀏覽器訪問http://localhost:5101/,
image
更改配置檔案appsettings.json,"env": "test",重新啟動程式,重新整理頁面
image
再更改配置檔案appsettings.json,"env": "prod",程式啟動程式,重新整理頁面
image
這樣通過修改本地的配置檔案,就能獲取遠端上的各種配置了。
我們再試試修改遠端的配置檔案,修改demo-prod.yml的配置name: leo1,提交到github。
再訪問http://localhost:5011/,發現配置並沒有變化,這是因為配置服務並不知道git有更新,我們重啟配置服務,再次訪問,問題依舊,那麼再重啟客戶端,發現我們得到了剛才更新的配置name= leo1,配置生效了。
image

後記

通過上面的例子,我們能夠通過應用程式獲取到配置資訊,但是這有明顯的問題,總不能一有配置更新就去重啟配置服務和客戶端吧?如何做到自動通知到客戶端呢?留下這些問題,敬請期待下一章。

示例程式碼

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

傳送門

參考資料

java部分

.net部分

相關推薦

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

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

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搭建服務架構 服務消費出錯問題

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

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

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

手把手教你使用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 Alibaba+Nacos搭建服務架構

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

Spring Cloud構建服務架構 分散式配置中心高可用與動態重新整理【Dalston版】

高可用問題 傳統作法 通常在生產環境,Config Server與服務註冊中心一樣,我們也需要將其擴充套件為高可用的叢集。在之前實現的config-server基礎上來實現高可用非常簡單,不需要我們為這些服務端做任何額外的配置,只需要遵守一個配置規則:將所有的Config Server都指向同一

Spring Cloud構建服務架構 分散式配置中心加密解密

在微服務架構中,我們通常都會採用DevOps的組織方式來降低因團隊間溝通造成的巨大成本,以加速微服務應用的交付能力。這就使得原本由運維團隊控制的線上資訊將交由微服務所屬組織的成員自行維護,其中將會包括大量的敏感資訊,比如:資料庫的賬戶與密碼等。很顯然,如果我們直接將敏感資訊以明文的方式儲存於微服務應用的

Spring Cloud 開始,聊聊服務架構實踐之路

實施 swa 小時 consul 獲取 交互 大內存 二進制文件 gin 【編者的話】隨著公司業務量的飛速發展,平臺面臨的挑戰已經遠遠大於業務,需求量不斷增加,技術人員數量增加,面臨的復雜度也大大增加。在這個背景下,平臺的技術架構也完成了從傳統的單體應用到微服務化的演進。

Spring Cloud 開始,聊聊服務架構的實踐之路

使用微服務架構開發應用程式,我們實際上是針對一個個微服務進行設計、開發、測試、部署,因為每個服務之間是沒有彼此依賴的,大概的交付流程就像上圖這樣。設計階段: 架構組將產品功能拆分為若干微服務,為每個微服務設計 API 介面(例如 REST API),需要給出 API 文件,包括 API 的名稱、版本、請求引

使用Spring Cloud和Docker構建服務架構

如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些開源工具來構建一個微服務架構。本文通過使用Spring Boot、Spring Cloud和Docker構建的概念型應用示例,提供了了解常見的微服務架構模式的起點。 該程式碼可以在GitHub上(https

關於服務架構的個人理解

廣泛 直接 dubbo 消息 可控 strong 均衡 沖突 外部依賴 前言:這段時間項目組正在加班加點的進行基於現有單體應用的微服務架構改造。微服務是一種架構概念,這個概念是2012年出現的,作為加快Web和移動應用程序開發進程的一種方法,2014年開始受到各方的關

ASP.NET Core 打造一個簡單的圖書館管理系統密碼修改以及密碼重置

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

Spring Cloud 系列之 Apollo 配置中心

本篇文章為系列文章,未讀前幾集的同學請猛戳這裡: Spring Cloud 系列之 Apollo 配置中心(一)Spring Cloud 系列之 Apollo 配置中心(二)Spring Cloud 系列之 Apollo 配置中心(三) 本篇文章講解 Apollo 高可用環境搭建,灰度釋出,教大家搭建企業中

基於 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 開發部落格專案

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中提供了大量的與服務治