您的位置:

深入浅出Spring Cloud Context

一、概述

Spring Cloud Context是Spring Cloud的一个重要组件,它提供了通用的上下文(Context)服务。

上下文(Context)是应用程序运行时状态的容器,是程序在运行时需要访问的所有信息和对象。

Spring Cloud Context 就相当于一个通用的存储信息的容器,预先定义好各种标准信息格式,在应用程序运行时动态更新信息,方便程序访问和使用。

二、应用场景

Spring Cloud Context 的主要应用场景可以分为三个方面:

  • 应用程序级别的上下文(Application Context):Spring Boot 应用程序中用于初始化并装载所有 Bean 的应用程序上下文(ApplicationContext)对象。
  • Cloud 级别的上下文(Cloud Context):为应用程序提供 Cloud 环境下所需的服务,例如服务发现、服务路由和 Cloud 事件等。
  • 事件体系:Spring Cloud Context 提供了一个基于事件的机制,以便应用程序可以订阅和发布云环境中各种事件的消息,用于处理处理事件回调等。

三、应用实例

1. 创建Spring Boot应用程序

首先我们先在 IDEA 中创建一个新的Spring Boot 项目。

@SpringBootApplication
public class SpringCloudDemoApplication {

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

}

2. 创建 Cloud Context Objects

Spring Cloud Context 为开发人员提供了一组 Cloud Context 对象,这些 Cloud Context 对象用于分别在本地和 Cloud 环境下管理应用程序。下面我们就来看框架都提供了哪些 Cloud Context 对象。

(1)Application Context (应用程序上下文)

应用程序上下文是 Spring Boot 应用程序装载 bean 的容器,在 Spring Boot 项目启动时自动创建的。

下面我们创建一个自定义的 Bean ,并在控制器中调用该 Bean:

@SpringBootApplication
public class SpringCloudDemoApplication {

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

    @Bean
    public String sayHello() {
        return "Hello, world!";
    }

}

@RestController
public class DemoController {

    @Autowired
    private String sayHello;

    @RequestMapping("/")
    public String home() {
        return sayHello;
    }

}

(2)Environment Context (环境上下文)

提供了再与应用程序间传递数据的统一接口;例如,配置文件,初始化参数和环境变量等。

我们可以通过在属性配置文件中设置不同的 profile 信息来模拟不同的环境。例如,我们可以在配置文件中分别定义一个“prod”和“dev”环境。

server.port=8080
spring.profiles.active=dev

dev:
  welcome.message=Hello, Development Environment!
prod:
  welcome.message=Hello, Production Environment!

然后我们可以通过 Environment 的 API 来获取不同环境下的配置文件信息。

@RestController
public class DemoController {

    @Autowired
    private Environment environment;

    @RequestMapping("/")
    public String home() {
        String message = environment.getProperty("welcome.message");
        return message;
    }

}

(3)Cloud Context (Cloud 上下文)

用于注册和使用服务发现客户端、负载均衡客户端和 Cloud 事件等的上下文。

下面我们先创建一个 Eureka 服务注册中心,并在控制器中使用 Eureka 的客户端 API 获取服务实例信息。

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudDemoApplication {

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

}

@RestController
public class DemoController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @RequestMapping("/")
    public String home() {
        List instances = discoveryClient.getInstances("EUREKA-CLIENT");
        if (instances != null && instances.size() > 0) {
            return instances.get(0).getUri().toString();
        }
        return "Service Not Available!";
    }

}

  

(4)Event Bus (事件总线)

Spring Cloud Context 提供了一个基于事件的机制,以便应用程序可以订阅和发布云环境中各种事件的消息,用于处理处理事件回调等。

下面我们来看一下如何通过 Spring Cloud Bus 发布事件消息,并在消息订阅方进行处理。

服务提供方:

@SpringBootApplication
public class SpringCloudDemoApplication {

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

    @Bean
    @RefreshScope
    public String config() {
        return "default config...";
    }

}

@RestController
public class DemoController {

    @Autowired
    private String config;

    @RequestMapping("/")
    public String home() {
        return config;
    }

}

服务订阅方:

@SpringBootApplication
@EnableEurekaClient
public class SpringCloudDemoApplication {

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

    @EventListener
    public void onMessage(RemoteApplicationEvent event) {
        if (event instanceof RefreshRemoteApplicationEvent) {
            System.out.println("config refreshed!");
        }
    }

}

四、小结

Spring Cloud Context 是 Spring Cloud 的一个重要组件,它提供了通用的上下文(Context)服务。它可以帮助我们轻松地处理不同环境下的应用程序上下文、配置信息以及 Cloud 级别上下文,还可以使用基于事件的机制帮助我们处理各种云环境中的消息和事件。Spring Cloud Context 使得开发人员可以更加专注于应用程序代码的开发,同时也方便了应用程序的部署和测试。