基于 Apollo 实现配置灰度发布

时间:2023-02-15 15:08:33

随着互联网应用的快速发展,配置灰度发布已成为了现代软件开发流程中的一个必要步骤。灰度发布可以让我们在保持线上服务稳定性的同时,对新版本进行有效的测试和验证,减少线上故障的影响范围。在本文中,我们将通过使用 Apollo 配置中心实现一个简单的灰度发布示例,以帮助读者更好地理解和应用配置灰度发布的原理和技术。

环境准备

在开始之前,您需要具备以下环境:

安装并启动 Apollo Config Service 安装并启动 Apollo Admin Service 安装并启动 Apollo Portal

配置中心准备

为了实现配置灰度发布,我们需要使用 Apollo 的命名空间特性。在 Apollo 中,一个命名空间可以包含多个配置项,我们可以为每个命名空间指定不同的应用或环境。这种设计方案非常适合我们在灰度发布时使用。

在本文中,我们将创建一个名为 "gray-config" 的命名空间,用于存储灰度发布相关的配置项。

创建命名空间

在 Apollo Portal 中创建一个名为 "gray-config" 的命名空间。具体操作如下: 在 Apollo Portal 的左侧导航栏中选择 "Namespace"。 在 "Namespace" 页面中单击 "Create" 按钮。 在 "Create Namespace" 弹出框中填写 "gray-config" 为 "Namespace Name",填写一个描述信息,选择 "Create" 按钮。

创建配置项

接下来,我们将在 "gray-config" 命名空间中创建一个配置项用于控制灰度发布。具体操作如下:

在 Apollo Portal 的左侧导航栏中选择 "Namespace"。 在 "Namespace" 页面中选择 "gray-config" 命名空间。 在 "gray-config" 命名空间页面中单击 "Release" 按钮。 在 "Release" 页面中单击 "Create Release" 按钮。 在 "Create Release" 页面中填写配置项的 Key 和 Value。Key 可以为任何字符串,例如 "gray-config.switch"。Value 可以为任何字符串,例如 "on"。 单击 "Create" 按钮提交配置项。

实现代码

现在我们已经准备好了环境和命名空间,可以开始编写灰度发布的代码了。在本文中,我们将使用 Java 作为示例语言,但是在其他编程语言中,您可以按照相同的思路进行实现。

我们将创建一个名为 "GrayConfig" 的 Java 类,该类将负责从 Apollo 配置中心获取灰度发布配置项。具体实现如下:

import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigService;

	public class GrayConfig {
	  private static final String GRAY_CONFIG_NAMESPACE = "gray-config";
	  private static final String GRAY_CONFIG_SWITCH_KEY = "gray-config.switch";
	  private static Config config = ConfigService.getConfig(GRAY_CONFIG_NAMESPACE);

	public static boolean isGrayEnabled() {
	    return "on".equals(config.getProperty(GRAY_CONFIG_SWITCH_KEY, "off"));
	}
}

在上述代码中,我们使用了 Apollo 提供的 Java 客户端 API 获取了 "gray-config" 命名空间的配置项。具体来说,我们通过调用 ConfigService.getConfig() 方法来获取 Config 对象,然后通过 getProperty() 方法获取 "gray-config.switch" 配置项的值。如果值为 "on",则表示当前灰度发布功能是开启状态。

接下来,我们将使用 Spring Boot 框架创建一个 RESTful 服务,该服务将在每次请求时检查灰度发布配置项。如果灰度发布功能开启,则返回一个特定的响应内容。否则,返回默认的响应内容。

首先,我们需要在 pom.xml 文件中添加以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.5.1</version>
</dependency>

然后,我们可以创建一个名为 "GrayController" 的 Spring MVC 控制器,该控制器将处理灰度发布相关的请求。具体实现如下:

import org.springframework.web.bind.annotation.RestController;

@RestController
public class GrayController {

    @GetMapping("/hello")
    public String sayHello() {
        if (GrayConfig.isGrayEnabled()) {
            return "Hello from Gray!";
        } else {
            return "Hello from Main!";
        }
    }
}


在上述代码中,我们创建了一个名为 "sayHello" 的 GET 请求处理器。如果灰度发布功能开启,该处理器将返回 "Hello from Gray!",否则返回 "Hello from Main!"。

最后,我们需要在应用程序的入口类中启动 Spring Boot 应用程序。具体实现如下:

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GrayApp {

    public static void main(String[] args) {
        SpringApplication.run(GrayApp.class, args);
    }
}


现在,我们已经完成了灰度发布的代码实现。接下来,我们将在 Apollo 配置中心中切换 "gray-config.switch" 配置项的值,以测试我们的代码是否能够正常工作。

测试

我们将在 Apollo Portal 中修改 "gray-config.switch" 配置项的值,将其从 "on" 切换为 "off",以测试应用程序是否正确地处理了灰度发布。具体操作如下:

  1. 在 Apollo Portal 的左侧导航栏中选择 "Namespace"。
  2. 在 "Namespace" 页面中选择 "gray-config" 命名空间。
  3. 在 "gray-config" 命名空间页面中单击 "Release" 按钮。
  4. 在 "发布" 弹出窗口中输入 "gray-config.switch=off" 并单击 "发布" 按钮。

现在,我们已经成功将 "gray-config.switch" 配置项的值从 "on" 切换为 "off",我们将测试应用程序是否正确地处理了此更改。

我们可以使用 cURL 命令来测试应用程序。具体实现如下:

  1. 打开一个终端窗口并输入以下命令:
curl http://localhost:8080/hello
  1. 由于我们已将 "gray-config.switch" 配置项的值从 "on" 切换为 "off",因此我们预计应该看到 "Hello from Main!" 的响应内容。执行命令后,应该会看到以下输出:
Hello from Main!

这表明我们的应用程序已正确地处理了灰度发布配置项的更改,并根据配置项的值提供了相应的响应内容。

结论

在本教程中,我们介绍了如何使用 Apollo 配置中心实现配置灰度发布。我们首先在 Apollo 配置中心中创建了一个名为 "gray-config" 的命名空间,并添加了一个名为 "gray-config.switch" 的配置项。然后,我们在 Java 中使用 Apollo 提供的客户端 API 检索该配置项的值,并将其用于在运行时控制应用程序的行为。最后,我们使用 Spring Boot 框架创建了一个 RESTful 服务,该服务根据 "gray-config.switch" 配置项的值提供不同的响应内容。

通过本教程,您已经了解了如何使用 Apollo 配置中心实现配置灰度发布,并已经实现了一个工作示例。您可以将此示例用作基础,并根据自己的需求进行扩展和定制。