Docker 启动一个 Spring Cloud 服务

引言

在当今的软件开发领域中,微服务架构已经成为一种非常流行的架构风格。它将一个应用程序拆分成多个独立的小服务,每个服务都可以独立部署、扩展和替换。而 Spring Cloud 是一个基于 Spring Boot 的开源框架,提供了一系列工具和组件,帮助开发者构建和管理分布式系统中的各个微服务。

Docker 是一个开源的容器化平台,可以将应用程序和其依赖项打包成一个独立的容器,使得应用程序能够在任何环境中运行。结合 Docker 和 Spring Cloud,可以快速、方便地启动和管理多个微服务实例,极大地简化了开发和部署的流程。

本文将介绍如何使用 Docker 启动一个基于 Spring Cloud 的微服务。我们将以一个简单的示例来演示整个过程。

准备工作

在开始之前,我们需要先准备好以下环境:

  • Docker:确保你已经安装了 Docker 并且能够正常运行。
  • JDK:确保你已经安装了 JDK,并配置好了 Java 环境变量。

示例项目

我们将创建一个简单的示例项目来演示 Docker 启动 Spring Cloud 服务的过程。该项目包含两个微服务:一个是服务注册中心,一个是服务提供者。

创建服务注册中心

首先,我们需要创建一个服务注册中心。服务注册中心使用 Eureka 来管理和注册微服务实例。在项目根目录下创建一个新的文件夹,命名为 eureka-server,并在该文件夹下创建一个新的 Spring Boot 项目。

eureka-server 项目的 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

eureka-server 项目的 application.yml 文件中添加以下配置:

server:
  port: 8761

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka/

创建一个 EurekaServerApplication 类,并添加 @EnableEurekaServer 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

至此,服务注册中心的项目创建完成。

创建服务提供者

接下来,我们需要创建一个服务提供者。服务提供者将注册到服务注册中心,并提供一个 REST 接口供其他微服务调用。在项目根目录下创建一个新的文件夹,命名为 service-provider,并在该文件夹下创建一个新的 Spring Boot 项目。

service-provider 项目的 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

service-provider 项目的 application.yml 文件中添加以下配置:

server:
  port: 8080

spring:
  application:
    name: service-provider

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

创建一个 HelloController 类,提供一个简单的 REST 接口:

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

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping
    public String hello() {
        return "Hello, Docker!";
    }
}

创建一个 ServiceProviderApplication 类,并添加 @EnableDiscoveryClient 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud