zoukankan      html  css  js  c++  java
  • netcore项目中使用 SpringCloudConfig 和apollo做配置中心

    版权所有,转载请注明出处 https://www.cnblogs.com/netqq/p/14251403.html

       

    一、使用apollo作为配置中心

      首先apollo 项目简介和安装请自行百度,本文只介绍如何使用

         坑:

      1、window10下使用脚本无法运行起apollo的项目,进入项目目录,地址栏输入cmd,使用以下命令可以运行起apollo项目,请依次各个运行

    java  -jar   apollo-xxxxxx.jar

      

      运行前的配置:

      1、确保8080,8070,8090端口未被占用,如果占用请自行修改 apollo 的运行端口

      2、修改 apolloconfigdb.serverconfig 表 eureka.service.url  的为公司的Eureka  地址

      3、修改apolloportaldb.serverconfig 表 apollo.portal.envs ,增加test,pro两个环境变量,多个值之间使用英文逗号分隔

        启动apollo项目

        

    配置aollo   

    在浏览器中分别访问8070 8080  8090端口号

      

       使用默认账号apollo/admin 登录到apollo配置中心(8070端口)

         1、点击右上角菜单,进入系统参数页面

     

        查找organizations  key,在表单中新增或者修改,1分钟后生效,此处数据在创建项目中会用到。

        2、创建一个项目

        3、在左侧选择环境,右侧添加配置键值对,作为netcore的程序员,善用json,所以,在左侧点击添加 Namespace

          选中框中的选项  ,记住  “名称”  这个选项,下问中要用到,也可以在项目中心查看

          提交后就可以存放json格式的数据了

        4、填写此namespace 下的配置项

     在netcore 中使用 apollo

       笔者使用的框架是netcore3.1

      1、配置appsetting.json ,增加apollo配置节点

     "apollo": {
        "AppId": "f664d4241996307a", // 应用id
        "MetaServer": "http://localhost:8080",   //localhost:8080 是apollo 的服务地址,如果apollo在本地这使用localhost即可
        "ConfigServer": "http://localhost:8080",
        "Env": "DEV"    //要使用的环境变量,上文数据库中有配置过环境
      },

      2、安装apollo客户端引用

    PM>Install-Package Com.Ctrip.Framework.Apollo.Configuration 

      3、修改Program.cs 中的  Host 配置项

     .ConfigureAppConfiguration((context, configBuiler) =>
                   {
                       var env = context.HostingEnvironment;
                       configBuiler.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    
                       if (env.IsDevelopment())
                       {
                           var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                           if (appAssembly != null)
                           {
                               configBuiler.AddUserSecrets(appAssembly, optional: true);
                           }
                       }
                       configBuiler.AddApollo(configBuiler.Build().GetSection("apollo"))    //apollo配置中心,加载配置中心
                              .AddNamespace("appsettings", ConfigFileFormat.Json) // 引入 namespace:appsettings  ,在apollo配置中心可查
                              .AddDefault(); // 默认 namespace: application
    
                       configBuiler.AddEnvironmentVariables();  //加载环境变量
                       configBuiler.AddConfigServer();          //加载远程配置中心
                       if (args != null)
                       {
                           configBuiler.AddCommandLine(args);   //控制台命令参数最后加载
                       }
                   })

      至此,netcore 使用 apollo作为配置中心大概做法已经完成

    扩展: apollo,此处使用的是单机配置,也可以使用slb 给apolloadmin和apolloconfig  做集群。因为笔者搜遍全网也没有找到apollo   通过Eureka 注册中心提供服务的案例,所以使用slb做集群也可以

    二、使用git作为配置中心(伪)

        安装 Steeltoe.Extensions.Configuration.ConfigServerCore 引用

        此组件依赖服务发现:Steeltoe.Discovery.ClientCore ,Steeltoe.Discovery.Eureka

       说明: 公司自己的Eureka 注册中心,公司使用git作为配置中心版本管理,有自己的配置中心项目,并且注入到Eureka中心

      由于公司使用spring全家桶,所以配置中心也在Eureka 中注册了,项目读取配置时候只需要配置 “配置中心”的服务id 这种方式,所以你需要首先运行起来一个Euraka注册中心,Spring Cloud Config 配置中心

    配置中心注册到Euraka  

      1、配置 appsetting.json ,增加spring 节点  

      

    "spring": {
        "application": {
          "name": "xxx-serverId"
        },
        "cloud": {
          "config": {
            "enabled": true,
            "env": "test",
            "password": "123456",
            "username": "user",
            "label": "master",
            "discovery": {
              "serviceId": "config-content-serverId",
              "enabled": true
            }
          }
        }
      },
      "eureka": { //eureka注册中心
        "client": { //作为client使用
          "serviceUrl": "http://xxxx.inner.com:8889/eureka/",
          "shouldFetchRegistry": true, //是否启用发现服务
          "shouldRegisterWithEureka": true //是否注册到服务中心
        },
        "instance": { //作为服务使用
          "port": 5002,
          "PreferIpAddress": true,
          "instanceId": "" //如果不填写,则使用ip:port格式,此处需要在staup 中手动实现,Steeltoe实现的是计算机名称+端口号
        }
      },

       节点说明: config节点用于获取配置中心的配置 ,eureka 用户服务注册和服务发现,config 依赖于服务发现

      2、Program.cs  中 host 增加配置

      

     Host.CreateDefaultBuilder(args)
    
                   .ConfigureAppConfiguration((context, configBuiler) =>
                   {
                       var env = context.HostingEnvironment;
                       configBuiler.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
    
                       if (env.IsDevelopment())
                       {
                           var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                           if (appAssembly != null)
                           {
                               configBuiler.AddUserSecrets(appAssembly, optional: true);
                           }
                       }
                       configBuiler.AddApollo(configBuiler.Build().GetSection("apollo"))    //加载配置中心
                              .AddNamespace("appsettings", ConfigFileFormat.Json) // 引入 TEST1.Common 命名空间
                              .AddDefault(); // 默认 namespace: application
    
                       configBuiler.AddEnvironmentVariables();  //加载环境变量
                       configBuiler.AddConfigServer();          //用于加载配置中心的配置,通过 appsetting.json  config节点的配置调用
                       if (args != null)
                       {
                           configBuiler.AddCommandLine(args);   //控制台命令参数最后加载
                       }
                   })

       3、因为要使用服务治理,所以需要将服务治理加入到ioc容器中

        在   public void  ConfigureServices(IServiceCollection services) 方法中加入如下代码

    services.AddDiscoveryClient(Configuration);
    //服务治理相关组件 services.Configure<EurekaInstanceOptions>(options => //重新设置 { if (string.IsNullOrWhiteSpace(options.InstanceId)) { options.InstanceId = options.IpAddress + ":" + options.Port; } });

       4、服务治理相关配置加入到了IOC中,但是并未启用,所以需要启用

          在 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime, IServiceProvider svp, ILoggerFactory loggerFactory)   中启用服务治理功能

      
    //使用服务治理 app.UseDiscoveryClient();

       扩展:笔者搜遍全网也未找到通过Eureka 注册中心获取配置的示例,此示例经过笔者两天查找和翻阅资料实现,希望笔者的贡献能让netcore 猿 少写一个bug,少奋斗一个小时,少掉10跟头发,希望你眼中有光,心中有向往

    参考资料: 《steeltoe》  https://docs.steeltoe.io/api/v3/configuration/config-server-provider.html

          《apollo》https://github.com/ctripcorp/apollo/releases     

          《apollo分布式部署》https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97

      

    版权所有,转载请注明出处  

  • 相关阅读:
    通过网页源代码看“饭否”的网站架构
    SD2.0课程等待时候的摘抄
    SD2.0阿里妈妈的研发过程
    转:编程8字专静谦筹悟慎透恒
    SD2.0第一天总体印象
    SD2.0《Web2.0网站性能调优实践》貌似是抄袭的文章
    SD2.02个课合成一个课
    SD2.0第2天总体印象
    variant
    [zz]C++程序员的阅读清单
  • 原文地址:https://www.cnblogs.com/netqq/p/14251403.html
Copyright © 2011-2022 走看看