乐趣区

关于java:Spring-Boot-集成-Apollo-配置中心真香真强大

作者:超级小豆丁

起源:http://www.mydlq.club/article…

因为 Apollo 概念比拟多,刚开始应用比较复杂,最好先过一遍概念再入手实际尝试应用。

1、背景

随着程序性能的日益简单,程序的配置日益增多,各种性能的开关、参数的配置、服务器的地址……对程序配置的期望值也越来越高,配置批改后实时失效,灰度公布,分环境、分集群治理配置,欠缺的权限、审核机制……

在这样的大环境下,传统的通过配置文件、数据库等形式曾经越来越无奈满足开发人员对配置管理的需要。因而 Apollo 配置核心应运而生!

2、简介

Apollo(阿波罗)是携程框架部门研发的开源配置管理核心,可能集中化治理利用不同环境、不同集群的配置,配置批改后可能实时推送到利用端,并且具备标准的权限、流程治理等个性。

3、特点

  • 部署简略
  • 灰度公布
  • 版本公布治理
  • 提供开放平台 API
  • 客户端配置信息监控
  • 提供 Java 和.Net 原生客户端
  • 配置批改实时失效(热公布)
  • 权限治理、公布审核、操作审计
  • 对立治理不同环境、不同集群的配置

4、根底模型

如下即是 Apollo 的根底模型:

  • (1)、用户在配置核心对配置进行批改并公布
  • (2)、配置核心告诉 Apollo 客户端有配置更新
  • (3)、Apollo 客户端从配置核心拉取最新的配置、更新本地配置并告诉到利用

5、Apollo 的四个维度

Apollo 反对 4 个维度治理 Key-Value 格局的配置:

  • application (利用)
  • environment (环境)
  • cluster (集群)
  • namespace (命名空间)

(1)、application

  • Apollo 客户端在运行时须要晓得以后利用是谁,从而能够依据不同的利用来获取对应利用的配置。
  • 每个利用都须要有惟一的身份标识,能够在代码中配置 app.id 参数来标识以后利用,Apollo 会依据此指来分别以后利用。

(2)、environment

在理论开发中,咱们的利用常常要部署在不同的环境中,个别状况下分为开发、测试、生产等等不同环境,不同环境中的配置也是不同的,在 Apollo 中默认提供了四种环境:

  • FAT(Feature Acceptance Test):功能测试环境
  • UAT(User Acceptance Test):集成测试环境
  • DEV(Develop):开发环境
  • PRO(Produce):生产环境

在程序中如果想指定应用哪个环境,能够配置变量 env 的值为对应环境名称即可。

(3)、cluster

  • 一个利用下不同实例的分组,比方典型的能够依照数据中心分,把上海机房的利用实例分为一个集群,把北京机房的利用实例分为另一个集群。
  • 对不同的集群,同一个配置能够有不一样的值,比如说下面所指的两个北京、上海两个机房设置两个集群,两个集群中都有 mysql 配置参数,其中参数中配置的地址是不一样的。

(4)、namespace

一个利用中不同配置的分组,能够简略地把 namespace 类比为不同的配置文件,不同类型的配置寄存在不同的文件中,如数据库配置文件,RPC 配置文件,利用本身的配置文件等。

相熟 SpringBoot 的都晓得,SpringBoot 我的项目都有一个默认配置文件 application.yml,如果还想用多个配置,能够创立多个配置文件来寄存不同的配置信息,通过指定 spring.profiles.active 参数指定利用不同的配置文件。这里的 namespace 概念与其相似,将不同的配置放到不同的配置 namespace 中。

Namespace 分为两种权限,别离为:

  • public(公共的): public 权限的 Namespace,能被任何利用获取。
  • private(公有的): 只能被所属的利用获取到。一个利用尝试获取其它利用 private 的 Namespace,Apollo 会报“404”异样。

Namespace 分为三种类型,别离为:

  • 公有类型: 公有类型的 Namespace 具备 private 权限。例如 application Namespace 为公有类型。
  • 公共类型: 公共类型的 Namespace 具备 public 权限。公共类型的 N amespace 相当于游离于利用之外的配置,且通过 Namespace 的名称去标识公共 Namespace,所以公共的 Namespace 的名称必须全局惟一。
  • 关联类型(继承类型): 关联类型又可称为继承类型,关联类型具备 private 权限。关联类型的 Namespace 继承于公共类型的 Namespace,将外面的配置全副继承,并且能够用于笼罩公共 Namespace 的某些配置。

6、本地缓存

Apollo 客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,仍然能从本地复原配置,不影响利用失常运行。

本地缓存门路默认位于以下门路,所以请确保 /opt/data 或 C:\opt\data\ 目录存在,且利用有读写权限。

  • Mac/Linux: /opt/data/{appId}/config-cache
  • Windows: C:\opt\data{appId}\config-cache

本地配置文件会以上面的文件名格局搁置于本地缓存门路下:

1{appId}+{cluster}+{namespace}.properties

7、客户端设计

上图简要形容了 Apollo 客户端的实现原理

  • 客户端和服务端放弃了一个长连贯,从而能第一工夫取得配置更新的推送。
  • 客户端还会定时从 Apollo 配置核心服务端拉取利用的最新配置。
  • 这是一个 fallback 机制,为了避免推送机制生效导致配置不更新
  • 客户端定时拉取会上报本地版本,所以个别状况下,对于定时拉取的操作,服务端都会返回 304 – Not Modified
  • 定时频率默认为每 5 分钟拉取一次,客户端也能够通过在运行时指定 apollo.refreshInterval 来笼罩,单位为分钟。
  • 客户端从 Apollo 配置核心服务端获取到利用的最新配置后,会保留在内存中。
  • 客户端会把从服务端获取到的配置在本地文件系统缓存一份 在遇到服务不可用,或网络不通的时候,仍然能从本地复原配置。
  • 应用程序从 Apollo 客户端获取最新的配置、订阅配置更新告诉。

配置更新推送实现

后面提到了 Apollo 客户端和服务端放弃了一个长连贯,从而能第一工夫取得配置更新的推送。长连贯实际上咱们是通过 Http Long Polling 实现的,具体而言:

  • 客户端发动一个 Http 申请到服务端
  • 服务端会放弃住这个连贯 60 秒
  • 如果在 60 秒内有客户端关怀的配置变动,被放弃住的客户端申请会立刻返回,并告知客户端有配置变动的 namespace 信息,客户端会据此拉取对应 namespace 的最新配置
  • 如果在 60 秒内没有客户端关怀的配置变动,那么会返回 Http 状态码 304 给客户端
  • 客户端在收到服务端申请后会立刻从新发动连贯,回到第一步
  • 思考到会有数万客户端向服务端发动长连,在服务端咱们应用了 async servlet(Spring DeferredResult) 来服务 Http Long Polling 申请。

8、总体设计

上图简要形容了 Apollo 的总体设计,咱们能够从下往上看:

  • Config Service 提供配置的读取、推送等性能,服务对象是 Apollo 客户端
  • Admin Service 提供配置的批改、公布等性能,服务对象是 Apollo Portal(治理界面)
  • Config Service 和 Admin Service 都是多实例、无状态部署,所以须要将本人注册到 Eureka 中并放弃心跳
  • 在 Eureka 之上咱们架了一层 Meta Server 用于封装 Eureka 的服务发现接口
  • Client 通过域名拜访 Meta Server 获取 Config Service 服务列表(IP+Port),而后间接通过 IP+Port 拜访服务,同时在 Client 侧会做 load balance 谬误重试
  • Portal 通过域名拜访 Meta Server 获取 Admin Service 服务列表(IP+Port),而后间接通过 IP+Port 拜访服务,同时在 Portal 侧会做 load balance、谬误重试
  • 为了简化部署,咱们实际上会把 Config Service、Eureka 和 Meta Server 三个逻辑角色部署在同一个 JVM 过程中

9、可用性思考

配置核心作为根底服务,可用性要求十分高,上面的表格形容了不同场景下 Apollo 的可用性:

场景 影响 降级 起因
某台 config service 下线 无影响 Config service 无状态,客户端重连其它 config service
所有 config service 下线 客户端无奈读取最新配置,Portal 无影响 客户端重启时, 能够读取本地缓存配置文件
某台 admin service 下线 无影响 Admin service 无状态,Portal 重连其它 admin service
所有 admin service 下线 客户端无影响,portal 无奈更新配置
某台 portal 下线 无影响 Portal 域名通过 slb 绑定多台服务器,重试后指向可用的服务器
全副 portal 下线 客户端无影响,portal 无奈更新配置
某个数据中心下线 无影响 多数据中心部署,数据齐全同步,Meta Server/Portal 域名通过 slb 主动切换到其它存活的数据中心

Apollo 配置核心创立我的项目与配置

接下来咱们将创立一个 Apollo 的客户端我的项目,援用 Apollo 来实现配置动静更新,不过在此之前咱们须要提前进入 Apollo Portal 界面,在外面提前创立一个我的项目并在其配置一个参数,不便后续客户端引入该配置参数,测试是否能动态变化。

1、登录 Apollo

我这里是部署到 Kubernetes 中,通过 NodePort 形式暴露出一个端口,关上这个地址登录 Apollo:

  • 用户名:apollo
  • 密 码:admin

2、批改与减少部门数据

在登录后创立我的项目时,抉择部门默认只能抉择 Apollo 自带的 测试部门 1 与测试部门 2 两个选项。

开始这真让人迷糊,原来 Apoloo 没有批改或新增部门信息的治理节目,只能通过批改数据库,来新增或者批改数据,这里关上 Portal 对月的数据库中的表 ApolloPortalDB 批改 keyorganizationsvalue 的 json 数据,改成本人对于的部门信息。

3、创立一个我的项目

批改完数据库部门信息后,从新登录 Apollo Portal,而后创立我的项目,这时候抉择部门能够看到曾经变成咱们本人批改后的部门信息了,抉择咱们自定义部门,而后设置利用 ID 为 apollo-test,利用名为 apollo-demo

创立实现后进入配置管理界面:

4、创立一个配置参数

创立一个配置参数,不便后续 Apollo 客户端我的项目引入该参数,进行动静配置测试。

设置 key 为 test value 为 123456 而后设置一个备注,保留。

创立实现后能够看到配置管理节目新增了一条配置。

接下来咱们将此配置通过公布按钮,进行公布。

创立 Apollo 客户端测试项目

这里创立一个 SpringBoot 我的项目,引入 Apollo 客户端来来实现与 Apollo 配置核心服务端交互。最新 Spring Boot 系列教程举荐看这个:

https://github.com/javastacks…

1、Maven 增加 Apollo 依赖

 1
 2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4    <modelVersion>4.0.0modelVersion>
 5
 6    <parent>
 7        <groupId>org.springframework.bootgroupId>
 8        <artifactId>spring-boot-starter-parentartifactId>
 9        <version>2.1.8.RELEASEversion>
10    parent>
11
12    <groupId>club.mydlqgroupId>
13    <artifactId>apollo-demoartifactId>
14    <version>0.0.1version>
15    <name>apollo-demoname>
16    <description>Apollo Demodescription>
17
18    <properties>
19        <java.version>1.8java.version>
20    properties>
21
22    <dependencies>
23        <dependency>
24            <groupId>org.springframework.bootgroupId>
25            <artifactId>spring-boot-starter-webartifactId>
26        dependency>
27        <dependency>
28            <groupId>com.ctrip.framework.apollogroupId>
29            <artifactId>apollo-clientartifactId>
30            <version>1.4.0version>
31        dependency>
32    dependencies>
33
34    <build>
35        <plugins>
36            <plugin>
37                <groupId>org.springframework.bootgroupId>
38                <artifactId>spring-boot-maven-pluginartifactId>
39            plugin>
40        plugins>
41    build>
42
43project>

2、配置文件增加参数

在 application.yml 配置文件中增加上面参数,这里简略介绍下 Apollo 参数作用:

  • apollo.meta: Apollo 配置核心地址。
  • apollo.cluster: 指定应用某个集群下的配置。
  • apollo.bootstrap.enabled: 是否开启 Apollo。
  • apollo.bootstrap.namespaces: 指定应用哪个 Namespace 的配置,默认 application。
  • apollo.cacheDir=/opt/data/some-cache-dir: 为了避免配置核心无奈连贯等问题,Apollo 会主动将配置本地缓存一份。
  • apollo.autoUpdateInjectedSpringProperties: Spring 利用通常会应用 Placeholder 来注入配置,如 ${someKey:someDefaultValue},冒号后面的是 key,冒号前面的是默认值。如果想敞开 placeholder 在运行时自动更新性能,能够设置为 false。
  • apollo.bootstrap.eagerLoad.enabled: 将 Apollo 加载提到初始化日志零碎之前,如果设置为 false,那么将打印出 Apollo 的日志信息,然而因为打印 Apollo 日志信息须要日志先启动,启动后无奈对日志配置进行批改,所以 Apollo 不能治理利用的日志配置,如果设置为 true,那么 Apollo 能够治理日志的配置,然而不能打印出 Apollo 的日志信息。
 1# 利用配置
 2server:
 3  port: 8080
 4spring:
 5  application:
 6    name: apollo-demo
 7
 8#Apollo 配置
 9app:
10  id: apollo-test                            #利用 ID
11apollo:
12  cacheDir: /opt/data/                       #配置本地配置缓存目录
13  cluster: default                           #指定应用哪个集群的配置
14  meta: http://192.168.2.11:30002            #DEV 环境配置核心地址
15  autoUpdateInjectedSpringProperties: true   #是否开启 Spring 参数自动更新
16  bootstrap:                                
17    enabled: true                            #是否开启 Apollo
18    namespaces: application                  #设置 Namespace
19    eagerLoad:
20      enabled: false                         #将 Apollo 加载提到初始化日志零碎之前 

3、创立测试 Controller 类

写一个 Controller 类来输入 test 变量的值,应用了 Spring@Value 注解,用于读取配置文件中的变量的值,这里来测试该值,我的项目启动后读取到的变量的值是设置在 application 配置文件中的默认值,还是近程 Apollo 中的值,如果是 Apollo 中配置的值,那么再测试在 Apollo 配置核心中扭转该变量的值后,这里是否会产生变动。

 1import org.springframework.beans.factory.annotation.Value;
 2import org.springframework.web.bind.annotation.GetMapping;
 3import org.springframework.web.bind.annotation.RestController;
 4
 5@RestController
 6public class TestController {
 7
 8    @Value("${test: 默认值}")
 9    private String test;
10
11    @GetMapping("/test")
12    public String test(){
13        return "test 的值为:" + test;
14    }
15}

4、创立启动类

SpringBoot 我的项目启动类。

 1import org.springframework.boot.SpringApplication;
 2import org.springframework.boot.autoconfigure.SpringBootApplication;
 3
 4@SpringBootApplication
 5public class Application {
 6
 7    public static void main(String[] args) {8        SpringApplication.run(Application.class, args);
 9    }
10
11}

5、JVM 启动参数增加启动参数

因为自己的 Apollo 是部署在 Kubernetes 环境中的,JVM 参数中必须增加两个变量:

  • env: 利用应用 Apollo 哪个环境,例如设置为 DEV 就是指定应用开发环境,如果设置为 PRO 就是制订应用生产环境。
  • apollo.configService: 指定配置核心的地址,跳过 meta 的配置,在测试时指定 meta 地址无成果。如果 Apollo 是部署在 Kubernetes 中,则必须设置该参数为配置核心地址,如果 Apollo 不是在 Kubernetes 环境中,能够不设置此参数,只设置 meta 参数即可。个别状况下,configService 和 meta 值统一。

如果是在 Idea 中启动,能够配置启动参数,加上:

1-Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV

如果是 java 命令启动程序,须要 JVM 加上:

1$ java -Dapollo.configService=http://192.168.2.11:30002 -Denv=DEV -jar apollo-demo.jar

留神:下面 env 指定的环境,要和 apollo.meta 指定 Config 地址的环境统一,例如 -Denv=DEV 即应用开发环境,那么 apollo.meta=http://xxx.xxx.xxx:8080 这个 url 的 Config 也是开发环境下的配置核心服务,而不能是 PRO 或者其它环境下的配置核心。

启动我的项目进行测试

1、测试是否可能获取 Apollo 中设置的值

启动下面的测试用例,而后输出地址 http://localhost:8080/test 查看:

1test 的值为:123456

能够看到应用的是 Apollo 中配置的 test 参数的值 123456,而不是默认的值。

2、测试当 Apollo 中批改参数值后客户端是否能及时刷新

批改 Apollo 配置核心参数 test 值为 666666,而后再次公布。

公布实现后再次输出地址 http://localhost:8080/test 查看:

1test 的值为:666666

能够看到示例利用中的值曾经扭转为最新的值。

3、测试当 Apollo 执行配置回滚操作时客户端是否能及时扭转

回滚实现后状态将变为未公布状态,则时候输出地址 http://localhost:8080/test 查看:

1test 的值为:123456

能够看到曾经回滚到之前的 test 配置的值了。

4、测试当不能拜访 Apollo 时客户端的变动

这里咱们将 JVM 参数中 Apollo 配置核心地址成心改错:

1-Dapollo.configService=http://192.168.2.100:30002 -Denv=DEV

而后输出地址 http://localhost:8080/test 能够看到值为:

1test 的值为:123456

能够看到显示的值并不是咱们定义的默认值,而还是 Apollo 配置核心配置的 test 参数的值。思考到因为 Apollo 会在本地将配置缓存一份,呈现下面起因,预计是缓存失效。当客户端不能连贯到 Apollo 配置核心时候,默认应用本地缓存文件中的配置。

下面咱们配置了本地缓存配置文件寄存地址为“/opt/data/”,接下来进入缓存目录,找到对应的缓存配置文件,删除缓存配置文件后,重启利用,再次输出地址查看:

1test 的值为: 默认值 

删除缓存配置文件后,能够看到输入的值为本人定义的默认值。

5、测试当 Apollo 中将参数删除后客户端的变动

这里咱们进入 Apollo 配置核心,删除之前创立的 test 参数,而后公布。

而后再次关上地址 http://localhost:8080/test 查看:

1test 的值为: 默认值 

能够看到显示的是应用程序中设置的默认值。

对 Apollo 的 Cluster、Namespace 进行探索

在 Apollo 中,配置能够依据不同的环境划分为 Dev(开发)、Prod(生产)等环境,又能依据区域划分为不同的 Cluster(集群),还能依据配置参数作用性能的不同划分为不同的 Namespace(命名空间),这里探索下,如何应用上述能力。

1、不同环境下的配置

(1)、Apollo 配置核心 PRO 环境增加参数

关上 Apollo 配置核心,环境列表点击 PRO 环境,而后新增一条配置,和之前例子中参数保持一致,都为 test 参数,创立实现后公布。

而后批改下面的示例我的项目,将配置参数指定为 PRO 环境:

(2)、示例我的项目批改 application.yml 配置文件

apollo.meta 参数改成 RPO 的配置核心地址

1......
2
3apollo:
4  meta: http://192.168.2.11:30005            #RPO 环境配置核心地址
5
6......

(3)、示例我的项目批改 JVM 参数

apollo.configService 参数改成 PRO 配置核心地址,env 参数的值改为 PRO

1-Dapollo.configService=http://192.168.2.11:30005 -Denv=PRO

(4)、启动示例我的项目察看后果

启动示例我的项目,而后接着输出地址 http://localhost:8080/test 查看信息:

1test 的值为:abcdefg

能够看到曾经改成生成环境配置,所以在理论我的项目中,如果要更换环境,须要批改 JVM 参数 env(如果 Apollo 部署在 Kubernetes 环境中,还须要批改 apollo.configService 参数),和批改 application.yml 配置文件的参数 apollo.meta 值。

2、不同集群下的配置

(1)、创立两个集群

例如在开发过程中,常常要将利用部署到不同的机房,这里别离创立 beijingshanghai 两个集群。

(2)、两个集群都配置同样的参数不同的值

在两个集群 beijingshanghai 中,都对立配置参数 test,并且设置不同的值。

(3)、示例我的项目 application.yml 批改集群配置参数, 并启动我的项目察看后果

指定集群为 beijing:

1......
2
3apollo:
4  cluster: beijing                      #指定应用 beijing 集群
5
6......

启动示例我的项目,而后接着输出地址 http://localhost:8080/test 查看信息:

1test 的值为:Cluster-BeiJing

能够看到用的是 beijing 集群的配置

指定集群为 shanghai:

1......
2
3apollo:
4  cluster: shanghai                      #指定应用 shanghai 集群
5
6......

启动示例我的项目,而后接着输出地址 http://localhost:8080/test 查看信息:

1test 的值为:Cluster-ShangHai

能够看到用的是 shanghai 集群的配置

3、不同命名空间下的配置

(1)、创立两个命名空间

命名空间有两种,一种是 public(公开),一种是 private 公有,公开命名空间所有我的项目都能读取配置信息,而公有的只能 app.id 值属于该利用的能力读取配置。

这里创立 dev-1dev-2 两个公有的命名空间,用于测试。

(2)、两个集群都配置同样的参数不同的值

在两个命名空间中,都对立配置参数 test,并且设置不同的值,设置完后公布。

(3)、示例我的项目 application.yml 批改命名空间配置参数, 并启动我的项目察看后果

指定命名空间为 dev-1:

1......
2
3apollo:
4  bootstrap:
5    namespaces: dev-1                   #设置 dev-1 命名空间
6
7......

启动示例我的项目,而后接着输出地址 http://localhost:8080/test 查看信息:

1test 的值为:dev-1 Namespace

能够看到用的是 dev-1 命名空间的配置

指定命名空间为 dev-2:

1......
2
3apollo:
4  bootstrap:
5    namespaces: dev-2                   #设置 dev-1 命名空间
6
7......

启动示例我的项目,而后接着输出地址 http://localhost:8080/test 查看信息:

1test 的值为:dev-2 Namespace

能够看到用的是 dev-2 命名空间的配置

Kubernetes 的 SpringBoot 利用应用 Apollo 配置核心

自己的 Apollo 和 SpringBoot 利用个别都是基于 Kubernetes 部署的,所以这里简略介绍下,如何在 Kubernetes 环境下部署 SpringBoot 利用且应用 Apollo 作为配置核心。

这里我的项目仍旧应用下面的示例,不过首先要将其编译成 Docker 镜像,不便后续部署到 Kubernetes 环境下。

1、构建 Docker 镜像

(1)、执行 Maven 编译

首先执行 Maven 命令,将我的项目编译成一个可执行 JAR。

1$ mvn clean install

(2)、筹备 Dockerfile

创立构建 Docker 镜像须要的 Dockerfile 文件,将 Maven 编译的 JAR 复制到镜像外部,而后设置两个变量,别离是:

  • JAVA_OPTS: Java JVM 启动参数变量,这里须要在这里加一个时区参数。
  • APP_OPTS: Spring 容器启动参数变量,不便后续操作时能通过此变量配置 Spring 参数。

Dockerfile:

1FROM openjdk:8u222-jre-slim
2VOLUME /tmp
3ADD target/*.jar app.jar
4RUN sh -c 'touch /app.jar'
5ENV JAVA_OPTS="-Duser.timezone=Asia/Shanghai"
6ENV APP_OPTS=""7ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar $APP_OPTS"]

(3)、构建 Docker 镜像

执行 Docker Build 命令构建 Docker 镜像。

1$ docker build -t mydlqclub/springboot-apollo:0.0.1 .

2、Kubernetes 部署示例利用

(1)、创立 SpringBoot 且应用 Apollo 配置核心的 Kubernetes 部署文件

这里创立 Kubernetes 下的 SpringBoot 部署文件 apollo-demo-example.yaml。在之前 Dockerfile 中设置了两个环境变量,JAVA_OPTSAPP_OPTS。其中 JAVA_OPTS 变量的值将会作为 JVM 启动参数,APP_OPTS 变量的值将会作为利用的配置参数。所以,这里咱们将 Apollo 配置参数搁置到变量中,这样一来就能够不便批改与保护 Apollo 的配置信息。

在上面配置的环境变量参数中,设置的配置核心地址为 http://service-apollo-config-server-dev.mydlqclub:8080,这是因为 Apollo 部署在 K8S 环境中,且能够应用域名形式拜访,service-apollo-config-server-dev 是利用的 Service 名称,mydlqcloud 是 K8S 下的 Namespace 名称。

springboot-apollo.yaml

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: springboot-apollo
 5spec:
 6  type: NodePort
 7  ports:
 8    - name: server
 9      nodePort: 31080
10      port: 8080
11      targetPort: 8080
12    - name: management
13      nodePort: 31081
14      port: 8081
15      targetPort: 8081
16  selector:
17    app: springboot-apollo
18---
19apiVersion: apps/v1
20kind: Deployment
21metadata:
22  name: springboot-apollo
23  labels:
24    app: springboot-apollo
25spec:
26  replicas: 1
27  selector:
28    matchLabels:
29      app: springboot-apollo
30  template:
31    metadata:
32      name: springboot-apollo
33      labels:
34        app: springboot-apollo
35    spec:
36      restartPolicy: Always
37      containers:
38        - name: springboot-apollo
39          image: mydlqclub/springboot-apollo:0.0.1
40          imagePullPolicy: Always
41          ports:
42            - containerPort: 8080
43              name: server
44          env:
45            - name: JAVA_OPTS
46              value: "-Denv=DEV"
47              ## 留神批改此处的 mydlqcloud 为你本人的 Namespace 名称
48            - name: APP_OPTS
49              value: "
50                     --app.id=apollo-demo
51                     --apollo.bootstrap.enabled=true
52                     --apollo.bootstrap.eagerLoad.enabled=false
53                     --apollo.cacheDir=/opt/data/
54                     --apollo.cluster=default
55                     --apollo.bootstrap.namespaces=application
56                     --apollo.autoUpdateInjectedSpringProperties=true
57                     --apollo.meta=http://service-apollo-config-server-dev.mydlqcloud:8080    
58                     "
59          resources:
60            limits:
61              memory: 1000Mi
62              cpu: 1000m
63            requests:
64              memory: 500Mi
65              cpu: 500m

(2)、部署 SpringBoot 利用到 Kubernetes

-n:创立利用到指定的 Namespace 中。

1$ kubectl apply -f springboot-apollo.yaml -n mydlqcloud

3、测试部署的利用接口

下面的利用配置了 NodePort 端口,能够通过此端口拜访 Kubernetes 集群内的利用接口,自己 Kubernetes 集群地址为 192.168.2.11 且 NodePort 端口为 31081,所以浏览器拜访地址 http://192.168.2.11:31081/test 来测试接口,显示:

1test 的值为:123456

能够看到能通过 Apollo 获取参数值,此文章到此结束。

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3. 阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版