Apollo Dotnet Core 2

Page content

1. 使用 Apollo 管理界面

1.1. 准备工作

部署完 apollo-portal 后,在浏览器里打开,输入默认账号密码 apollo/admin 登录。

apollo-portal-signin apollo-portal-homepage

虽然可以直接用超级管理员账号创建一些项目,但我们还是按照实际,先创建一些账号吧。

点击右上角 管理员工具 -> 用户管理,可以创建新用户。

user-manage

然后我们打开数据库管理工具,在 ApolloPortalDBServerConfig 表中,修改 organizations 字段,替换为 开发组A

organizations-in-db

1.2. 创建、编辑与发布一个简单的项目配置

1.2.1. 创建项目

好了,现在我们退出管理员账号,用刚刚创建的账号登录,点击主页上的 创建项目,创建一个新项目 *app-test-1*,填写如下

app-create

app-config

这是项目 app-test-1 的管理界面,环境列表里有两个环境,DEV 是开发环境,FAT 是功能测试环境。实际上这里可以按照需要几个环境,就按照之前的方法部署几套,不过其中 apollo-portal 只需要部署一个就可以了,因为他用来管理多套环境。

左侧有关于这个项目的基本信息,其中重要的是 AppId,后面在代码中要用到,这个项目的 AppId 是 *a001*。

右边是 Namespace 列表。每个项目默认会自带一个名为 application私有且类型为 properties 的 Namespace,这相当于一个物理的配置文件 *application.properties*。

1.2.2. 编辑配置

有两种方式。

第一种,点击右上角的 新增配置,可以添加 key-value 形式的配置内容,并选择添加到哪个环境中,点击 提交

第二种,切换到 文本 视图,直接对其编辑,不过这里保存的时候会校验格式是否正确。

1.2.3. 发布配置

刚才编辑的配置并不会立刻生效,需要发布才行。我们发布这个 Namespace,就可以生效了。

default-namespace-add-kv

2. 在 .NET Core 中使用 Apollo

以 Web Api 项目为例

  • 引用 Nuget 包

    Com.Ctrip.Framework.Apollo.Configuration (v2.0.3)

  • 修改项目下的 appsettings.json

    1{
    2  "apollo": {
    3    "AppId": "a001",
    4    "MetaServer": "http://<apollo-configservice-host>:<port>"
    5  }
    6}
  • 修改 Program.cs

    1public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    2    WebHost.CreateDefaultBuilder(args)
    3    .ConfigureAppConfiguration((hostingContext, builder) =>
    4    {
    5        builder
    6        .AddApollo(builder.Build().GetSection("apollo"))
    7        .AddDefault() // 默认添加了 Namespace 为 application 的配置信息
    8    })
    9        .UseStartup<Startup>();
    
  • 在代码中使用

    1string value = configuration["Hello"]; // "world"
    

3. 进阶功能

3.1. 公共 Namespace

一个 Namespace 就相当于一个物理的配置文件,所以我们自然可以添加多个配置,点击左下角的 添加 Namespace

namespace-create

选择创建一个 Namespace,类型为私有的,并选择文件格式,比如 json。取名并返回。

注:这里的 Namespace 可以重复的,但是实际在使用中,尽量不要重复。因为后添加到程序中的 Namespace 会覆盖之前的,而且也会覆盖本地同样类型的配置文件。

那么对于一些公用的基础设施的配置(如 Redis),不想在每个项目中配置一遍,该怎么办呢?除了创建私有的 Namespace,还可以关联公共的 Namespace。

我们创建一个叫 PublicInfras 的项目,添加一个名为 devgroupA.Redis 的公共 Namespace。

注1:发现这里选不了公共 Namespace 的格式,是因为作者基于继承特性考量,properties 格式最适合。因此其他格式诸如 xml 和 yaml 暂不支持关联公共 Namespace 。 注2:但这不意味着我们不能创建公共的 xml 或其他格式的 Namespace 了,我们还是可以创建并使用,只不过不支持被其他应用关联,而且我们如果仅仅想使用一些公用 Namespace 而不覆盖其内容的话,完全没有必要做关联,直接使用这个公共的 Namespace 就可以了。

namespace-create-public-redis

并添加如下:

Host = http://localhost:6379/

[//]: # 回到 app-test-1 项目,添加一个 Namespace,现在可以关联刚刚创建的 devgroupA.Redis 公共 Namespace 了。

[//]: # namespace-association

[//]: # 然后发现我们关联的 Namespace 里什么都还没有:

[//]: # namespace-association-empty

[//]: # 是因为刚刚我们没有发布。发布刚才的公共 Namespace,回来刷新一下:

[//]: # namespace-association-linked

然后把这个 Namespace 在代码中 Add 一下,就可以获取到了。

1builder
2.AddApollo(builder.Build().GetSection("apollo"))
3.AddDefault()
4.AddNamespace("devgroupA.Redis", ConfigFileFormat.Properties);

3.2. 授权

对于一般的开发人员来说,开发环境可能我们需要频繁添加修改配置,而功能测试环境,不需要开发人员上去经常改动配置文件。所以我们需要按环境对不同的账号进行授权。

创建一个一般开发人员账号 *lisi*,然后用 zhangsan 的账号为每个 Namespace 授权。

点击右上方的 授权,把 DEV 环境的修改权、发布权授权给 lisi 这个账号。

authorization-user

lisi 账号登录,可以看到只有 DEV 环境的权限,而在 FAT 环境下,是无法查看、编辑、发布的。

authorization-permission-denied