Dotnet微服务:使用Apollo实现统一配置管理

随着项目中的服务数据越来越多,如何管理各个服务的配置数据成为需要解决的问题,如果每个服务的配置数据都放在自身的配置文件下,无疑会带来很大的管理开销,搭建统一的配置中心成为主流。目前流行的配置中心有Springcloud config、apollo、consul等,由于springcloud config在dotnet上的支持不太好,尤其是在实时更新上比较麻烦,需要自已用rabbit做事件总线来实现热更新,所以我倾向于由携程开发出的apollo项目,开源地址

一,安装并启用apollo。

1,Centeros ,安装 jdk1.8

yum install java-1.8.0-openjdk.x86_64 

安装Mysql

wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

下载到指定位置后,就可以执行安装了

yum -y install mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server

查看mysql root账户的初始密码:grep "password" /var/log/mysqld.log

登录mysql:mysql -uroot -p

修改root密码:登录后执行alter user 'root'@'localhost' identified by 'Xxxxx@xx.com'

2,下载Apollo quick start包:下载地址

创建数据库:下载好apollo-quick-start后解压,目录内有个sql的文件夹,里面有sql模板,直接导入即可:

登录数据库后执行:

source /apollo/apollo-quick-start-1.5.0/sql/apolloconfigdb.sql。

source /apollo/apollo-quick-start-1.5.0/sql/apolloportaldb.sql。

 /apollo/apollo-quick-start-1.5.0为sql模板文件所在目录

3,启动项目

vi demo.sh,修改数据库连接信息

 

启动项目:./demo.sh start

开放端口:8080 ,8070。firewall-cmd --zone=public --add-port=8090/tcp --permanent。 其中8080为eureka服务监听地址,8070为apollo管理系统地址。

重新加载防火墙:firewall-cmd --reload

打开管理地址:http://<当前主机ip>:8070并使用用户apollo和密码admin登录

4,创建项目

 

创建项目后添加键值对并发布。这里我添加了一个key为mysql.connectString的数据。

 

 

 

,DotnetCore集成apollo

1,配置:

appsetting.json添加apollo配置信息,Appid为上面创建的项目appid,MetaServer地址为apollo项目注册到的eureka服务器地址。

 "apollo": {
    "AppId": "IdentitySerivce",
    "MetaServer": "http://192.168.137.2:8080"
  }

Program.CS中启用apollo。

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingcontext, builder) =>
            {
                builder.AddApollo(builder.Build().GetSection("apollo")).AddDefault();
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

2,读取配置中心的数据。

新建一个接口getConfig

 [Route("api/[controller]")]
    [ApiController]
    public class ConfigController : ControllerBase
    {
        IConfiguration Configuration;
        public ConfigController(IConfiguration Configuration)
        {
            this.Configuration = Configuration;
        }
        [HttpGet("GetConfig")]
        public string GetConfig(string data)
        {
            return this.Configuration[data];
        }
    }

访问该接口

 

 在apollo上修改数据后重新发布再次访问该接口。

 

  集成apollo后,修改配置文件后是即时生效的,不需要做任何操作。

3,apollo的namespace

apollo配置中心的namespace分有私有和公有,私有的namespace的数据只能相对应的appid才能访问到其数据,而公有的namespace下的数据可以被任意应用访问。

下面用实例讲讲apollo的namespace的用法

比如,多个应用要注册到eureka服务注册中心需要对这些应用做配置,其中一些内容是相同的,比如服务注册地址等。有些内容是独有的,比如注册到eureka的端口等。这时就可以用到apollo的namespace特性了,相同的配置停下写在一个共享的namespance下,独有配置信息写在私有的namespace下。

在apollo下建立一个项目,用于存放共享的配置信息。项目创建完成后点击左下角的“添加Namespace”即可创建新的namespace

 

然后在此公共namespance下建立键值对数据并发布。注意:用于DOTNETCORE项目的配置数据需要用冒号隔开。

 

 

在之前创建的“IdentityService”项目中新建独有的配置信息:

 

 

 最后,将公共命令空间配置添加到DotnetCore项目

 

  public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingcontext, builder) =>
            {
                builder.AddApollo(builder.Build().GetSection("apollo")).AddDefault().AddNamespace("TEST1.common");
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

  启动项目,发现Eureka已经收到注册信息:

 

posted @ 2020-10-17 20:45  坚持坚持  阅读(550)  评论(0编辑  收藏  举报