代码改变世界

Apollo基于K8S的部署以及接入

2020-09-14 10:59  y-z-f  阅读(1962)  评论(0编辑  收藏  举报

Apollo镜像服务

基于开源Apollo服务进行相关服务镜像打包,实际将分发apollo-adminserviceapollo-configserviceapollo-portal
这三个镜像安装包。

一、 部署安装

1. config服务

首先我们需要提供对应的配置文件并将其映射到对应的镜像的目录下,首先我们
编写对应的配置文件(application-github.properties):

spring.datasource.url = jdbc:mysql://fill-in-the-correct-server:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword

其中需要我们指定对应服务的数据库,数据库的初始化语句见根本目录sql下的apolloconfigdb.sql文件。并
需要在最终的映射中将对应文件映射到容器内的/apollo-configservice/config/application-github.properties

对应的启动脚本如下所示:

docker run -d -p 8080:8080 --name dev-configservice -v /home/apollo/application-github.properties:/apollo-configservice/config/application-github.properties harbor.vip56.cn/common/apollo-configservice:1.6.2

由于我们这里是采用Docker环境进行部署,如果开发者需要通过外部网络请求并测试需要设置EUREKA_INSTANCE_IP_ADDRESS固定注册到eurake中的
服务IP地址或采用EUREKA_INSTANCE_HOME_PAGE_URL固定注册的IP地址与端口,否则将以Docker内部的地址进行注册,客户端将无法进行连接。

2. admin服务

同config服务,我们也需要编写对应的配置文件连接到数据库(application-github.properties):

# DataSource
spring.datasource.url = jdbc:mysql://fill-in-the-correct-server:3306/ApolloConfigDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword

完成以上配置文件的编写后就需要将其映射到对应镜像的路径下
/apollo-adminservice/config/application-github.properties,最终我们启动该服务的脚本类似如下所示:

docker run -d -p 8090:8090 --name dev-adminservice -v /home/apollo/application-github.properties:/apollo-adminservice/config/application-github.properties harbor.vip56.cn/common/apollo-adminservice:1.6.2

由于config本身自带了eureka服务,所以默认的localhost只有config服务可以注册进去,而admin服务无法注册,
所以我们需要打开ApolloConfigDB.ServerConfig设置value为eureka.service.url的值为其他服务可以访问的地址。

除以上的可设置参数外,用户也可以根据实际需要调整该表的其他字段值,主要有以下几个配置:

namespace.lock.switch:是否限制只能一人修改配置一人发布;
config-service.cache.enabled:是否缓存已被读取过的配置,从而加快后续配置读取;
item.key.length.limit:限制Key最长长度,默认128;
item.value.length.limit:限制Value最长长度,默认20000;

3. portal服务

同理也需要配置对应的数据库连接地址,只是其数据库的是独立的需要单独使用
sql/apolloportaldb.sql文件进行初始化,然后对配置文件application-github.properties
进行修改即可,对应配置文件内容如下:

# DataSource
spring.datasource.url = jdbc:mysql://fill-in-the-correct-server:3306/ApolloPortalDB?characterEncoding=utf8
spring.datasource.username = FillInCorrectUser
spring.datasource.password = FillInCorrectPassword

并且依然需要映射到容器内对应的路径下/apollo-portal/config/application-github.properties
仅仅完成以上的配置还不足以,因为看板与其他adminconfig服务不一样,看板可以统一进心管理
而不需要根据环境进行独立部署,所以就需要配置对应meta服务的地址到配置文件apollo-env.properties
中,对应配置文件的内容如下:

local.meta=http://localhost:8080
dev.meta=http://fill-in-dev-meta-server:8080
fat.meta=http://fill-in-fat-meta-server:8080
uat.meta=http://fill-in-uat-meta-server:8080
lpt.meta=${lpt_meta}
pro.meta=http://fill-in-pro-meta-server:8080

用户根据自己实际需要的环境进行配置即可,完成以上配置后就可以启动服务了:

docker run -d -p 8070:8070 --name portal -v /home/apollo/application-github.properties:/apollo-portal/config/application-github.properties -v /home/apollo/apollo-env.properties:/apollo-portal/config/apollo-env.properties harbor.vip56.cn/common/apollo-portal:1.6.2

完成以上服务启动后,我们就可以进入portal进行进一步的参数设置,当然这里可以通过直接操作
数据库ApolloPortalDB.ServerConfig表也可以通过其中自带的管理员工具-系统参数进行设置:

apollo.portal.envs:可支持的环境列表,默认只有Dev,如果要开启其他的可以以逗号分隔进行设置(DEV,FAT,UAT,PRO);
apollo.portal.meta.servers:各环境的Meta服务地址,一般配置文件都已经设置,当然也可以通过这里修改;
organizations:部门列表,新建的App都需要归属具体部门,可以通过这里进行增加;
consumer.token.salt:用于开放Api的令牌盐值;
wiki.address:看板中帮助指向的地址;
role.create-application.enabled:是否开启创建项目权限控制,开启后只有拥有权限的人可以创建项目;

4. 集群架构部署

如果需要集群架构部署建议portal可以部署一个服务,然后根据实际开发的需求将其中的configmetaadmin服务各自
部署到对应环境的服务器中,当然对应的数据库也需要各自进行独立部署。对于存在更高部署要求的建议参考官网文档

为了方便开发者基于Docker进行集群开发这里将准备对应指令,首先我们需要创建3个ApolloConfigDB数据库,名字需要各自不一样。
然后我们接着进行三个独立环境的服务开发:

  • Dev环境
docker run -d -p 8080:8080 --name dev-configservice -v F://dockermap/application-github.properties:/apollo-configservice/config/application-github.properties -e EUREKA_INSTANCE_HOME_PAGE_URL=192.168.3.6:8080 harbor.vip56.cn/common/apollo-configservice:1.6.2

docker run -d -p 8090:8090 --name dev-adminservice -v F://dockermap//application-github.properties:/apollo-adminservice/config/application-github.properties harbor.vip56.cn/common/apollo-adminservice:1.6.2

docker run -d -p 18080:8080 --name fat-configservice -v F://dockermap/application-github-fat.properties:/apollo-configservice/config/application-github.properties -e EUREKA_INSTANCE_HOME_PAGE_URL=192.168.3.6:18080 harbor.vip56.cn/common/apollo-configservice:1.6.2

docker run -d -p 18090:8090 --name fat-adminservice -v F://dockermap//application-github-fat.properties:/apollo-adminservice/config/application-github.properties harbor.vip56.cn/common/apollo-adminservice:1.6.2

docker run -d -p 28080:8080 --name pro-configservice -v F://dockermap/application-github-pro.properties:/apollo-configservice/config/application-github.properties -e EUREKA_INSTANCE_HOME_PAGE_URL=192.168.3.6:28080 harbor.vip56.cn/common/apollo-configservice:1.6.2

docker run -d -p 28090:8090 --name pro-adminservice -v F://dockermap//application-github-pro.properties:/apollo-adminservice/config/application-github.properties harbor.vip56.cn/common/apollo-adminservice:1.6.2

二、 .Net Core SDK使用

1. 引用类库

Install-Package Com.Ctrip.Framework.Apollo.Configuration -Version 2.4.0

2. 配置服务地址

首先我们打开对应环境的appsettings.json文件然后输入以下配置内容:

{
  "apollo": {
    "AppId": "SampleApp",
    "Env": "DEV",
    "Meta": {
      "DEV": "http://192.168.153.156:8080/",
      "FAT": "http://192.168.153.156:18080/",
      "PRO": "http://192.168.153.156:28080/"
    }
  }
}

其中Meta可以根据实际需要的环境进行设置,具体会根据Env进行切换,从而确保能够读取
到正确环境下的参数变量。

3. 代码初始化

完成以上配置后我们就需要进行代码初始化操作,首先我们打开Program.cs文件将方法CreateWebHostBuilder
进行修改,具体修改如下:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
       .ConfigureAppConfiguration(builder => builder
           .AddApollo(builder.Build().GetSection("apollo"))
           .AddDefault(ConfigFileFormat.Json)
           .AddDefault())
        .UseStartup<Startup>();

完成以上配置后我们就可以通过注入IConfiguration接口实现读取配置信息,当然实际开发过程中
往往我们需要监听配置是否发生变化从而使对应服务进行重新注入,这里我们可以直接使用本身自带的
方式进行监听,以下是一个代码示例:

private void ChangeConfig(object x)
{
    if (x is IConfiguration subConfig)
    {
        subConfig.GetReloadToken().RegisterChangeCallback(ChangeConfig, subConfig);
    }
    Console.WriteLine("config change");
}

var config = context.RequestServices.GetRequiredService<IConfiguration>();
var reloadtoken = config.GetReloadToken();
config.GetReloadToken().RegisterChangeCallback(ChangeConfig, config);

完成以上操作之后我们就可以实现配置从Apollo中进行读取并且实现根据配置变更进行ReLoad了。

三、 Java SDK使用

尽请期待