Java教程

SpringCloud入门指南:一步步搭建微服务架构

本文主要是介绍SpringCloud入门指南:一步步搭建微服务架构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
概述

本文详细介绍SpringCloud的核心组件及其作用,包括服务注册与发现、服务调用、网关管理和集中配置管理等内容。通过逐步搭建和实践示例,读者可以快速上手并掌握SpringCloud的基本使用方法。文章涵盖了Eureka、Feign、Ribbon、SpringCloud Gateway和SpringCloud Config等多个核心组件的详细配置和使用。

SpringCloud入门指南:一步步搭建微服务架构
1. SpringCloud简介

1.1 什么是SpringCloud

SpringCloud是一个基于SpringBoot框架的微服务开发框架。它为微服务架构提供了众多组件和技术支持,简化了分布式系统基础设施的开发。SpringCloud的核心目标是简化分布式系统基础设施的开发,包括配置管理、服务发现、路由、断路器、负载均衡、微服务安全、分布式会话等。

1.2 SpringCloud的核心组件及其作用

SpringCloud的核心组件如下:

  • Eureka:服务注册与发现组件,提供服务注册、服务发现、健康检查等功能。
  • Ribbon:客户端负载均衡组件,用于服务调用时的负载均衡。
  • Feign:声明式服务调用组件,简化HTTP请求的编写。
  • Hystrix:断路器组件,用于服务容错控制,防止服务雪崩效应。
  • Zuul(已废弃,推荐使用SpringCloud Gateway):服务网关组件,提供路由、过滤、安全性等功能。
  • Config:集中式配置管理组件,用于统一管理和分发配置信息。
  • SpringCloud Stream:消息驱动的微服务开发组件,支持多种消息中间件。
  • SpringCloud Bus:事件总线组件,用于微服务之间的消息传递和事件驱动。
  • SpringCloud Sleuth:微服务链路追踪组件,用于分布式系统的跟踪。

1.3 SpringCloud的优势和应用场景

1.3.1 优势

  • 易用性:基于SpringBoot自动配置,简化开发过程。
  • 可扩展性:提供了丰富的插件和组件,可随需扩展。
  • 服务治理:具备服务注册、发现、负载均衡、断路等功能,实现微服务的高效治理。
  • 统一配置:通过SpringCloud Config实现集中式的配置管理。
  • 安全性:支持OAuth2、JWT等多种安全机制,确保微服务间的通信安全。
  • 消息驱动:通过SpringCloud Stream简化消息的发送和接收。

1.3.2 应用场景

  • 分布式系统:将大型应用拆分为多个微服务,提高系统的可维护性和可扩展性。
  • 云原生应用:构建在云平台上的微服务应用,实现应用的快速部署和弹性伸缩。
  • 服务网关:为多个应用提供统一的入口点,实现请求的路由和过滤。
  • 事件总线:通过SpringCloud Bus实现微服务间的事件驱动通信。
  • 链路追踪:通过SpringCloud Sleuth监控分布式系统的调用链路。
2. SpringCloud的安装与配置

2.1 开发环境搭建

以下是开发环境搭建的步骤:

  1. 安装Java环境:确保Java环境已安装,建议使用Java 8及以上版本。
  2. 安装Maven:Maven是一个项目管理工具,用于构建和管理项目。
  3. IDE配置:推荐使用IntelliJ IDEA或Eclipse,IDE中需安装对应的Spring Boot插件。
  4. Git安装:下载Git并配置环境变量,方便代码版本控制。

2.2 快速安装SpringBoot项目

创建一个新的Spring Boot项目,可以使用Spring Initializr或STS(Spring Tool Suite)。

2.2.1 使用Spring Initializr

  1. 访问Spring Initializr。
  2. 选择项目类型(Maven项目)、语言(Java)、Spring Boot版本。
  3. 添加依赖(例如:Spring Web、Spring Cloud Starter)。
  4. 下载并解压项目到IDE中。

示例:

<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>

2.3 SpringCloud依赖库的引入与配置

在Spring Boot项目中引入SpringCloud依赖库。

2.3.1 引入依赖

pom.xml文件中添加以下依赖:

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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2.3.2 配置文件

在项目的src/main/resources目录下添加application.yml文件:

spring:
  application:
    name: demo-service
server:
    port: 8080
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/

2.4 启动类配置

在主启动类中加入@EnableEurekaClient注解,开启Eureka客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

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

}
3. SpringCloud Eureka服务注册与发现

3.1 Eureka服务注册中心的搭建

3.1.1 创建Eureka注册中心

创建一个新的Spring Boot项目,命名为eureka-server。在pom.xml中添加以下依赖:

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

3.1.2 配置文件

在项目的application.yml文件中配置Eureka服务:

spring:
    application:
        name: eureka-server
server:
    port: 8761
eureka:
    instance:
        hostname: localhost
    client:
        registerWithEureka: false
        fetchRegistry: false
        # 设置为空地址,避免注册到其他Eureka服务器
        service-url:
            defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3.1.3 启动类配置

在主启动类中加入@EnableEurekaServer注解,开启Eureka服务端功能。

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

3.2 如何将服务注册到Eureka

创建一个新的Spring Boot项目,命名为demo-service。在pom.xml中添加以下依赖:

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

3.2.1 配置文件

在项目的application.yml文件中配置Eureka服务注册:

spring:
    application:
        name: demo-service
server:
    port: 8080
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/

3.2.2 启动类配置

在主启动类中加入@EnableEurekaClient注解,开启Eureka客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

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

}

3.2.3 编写服务接口

demo-service项目中编写一个简单的REST服务接口。

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

@RestController
public class DemoController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Eureka!";
    }

}

3.3 如何通过Eureka客户端发现服务

创建一个新的Spring Boot项目,命名为consumer-service。在pom.xml中添加以下依赖:

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

3.3.1 配置文件

在项目的application.yml文件中配置Eureka服务注册:

spring:
    application:
        name: consumer-service
server:
    port: 8081
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/

3.3.2 启动类配置

在主启动类中加入@EnableEurekaClient注解,开启Eureka客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {

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

}

3.3.3 通过Eureka客户端调用服务

consumer-service项目中编写一个控制器,通过Eureka客户端调用demo-service的服务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class ConsumerController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/call")
    public String callService() {
        ServiceInstance serviceInstance = discoveryClient.getInstances("demo-service").get(0);
        String serviceUrl = serviceInstance.getUri().toString();
        // 这里可以使用RestTemplate或其他工具调用服务
        return "Called service from " + serviceUrl;
    }

}
4. SpringCloud Feign与Ribbon服务调用

4.1 使用Feign进行服务调用

4.1.1 引入依赖

pom.xml文件中添加Feign依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

4.1.2 配置文件

在项目的application.yml文件中开启Feign支持:

spring:
    application:
        name: feign-consumer
server:
    port: 8082
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/

4.1.3 启动类配置

在主启动类中加入@EnableFeignClients注解,开启Feign客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignConsumerApplication {

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

}

4.1.4 编写Feign客户端

创建一个Feign客户端接口,用于调用demo-service的服务。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "demo-service")
public interface DemoServiceClient {

    @GetMapping("/hello")
    String hello();

}

4.1.5 使用Feign客户端

在控制器中使用Feign客户端调用服务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FeignController {

    @Autowired
    private DemoServiceClient demoServiceClient;

    @GetMapping("/call-feign")
    public String callService() {
        return demoServiceClient.hello();
    }

}

4.2 使用Ribbon做客户端的负载均衡

4.2.1 引入依赖

pom.xml文件中添加Ribbon依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

4.2.2 配置文件

在项目的application.yml文件中开启Ribbon配置:

spring:
    application:
        name: ribbon-consumer
server:
    port: 8083
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/
ribbon:
    eureka:
        enabled: true
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

4.2.3 编写服务调用代码

在控制器中使用Ribbon进行服务调用。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class RibbonController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call-ribbon")
    public String callService() {
        ServiceInstance serviceInstance = loadBalancerClient.choose("demo-service");
        String serviceUrl = serviceInstance.getUri().toString();
        return restTemplate.getForObject(serviceUrl + "/hello", String.class);
    }

}

4.3 Feign整合Ribbon实现动态负载均衡

4.3.1 引入依赖

确保已经引入了Feign和Ribbon的依赖。

4.3.2 配置文件

在项目的application.yml文件中开启Feign和Ribbon支持:

spring:
    application:
        name: feign-ribbon
server:
    port: 8084
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/
ribbon:
    eureka:
        enabled: true
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

4.3.3 编写Feign客户端

在Feign客户端接口中加入@FeignClient注解,并开启负载均衡。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

@FeignClient(name = "demo-service")
@RibbonClient(name = "demo-service")
public interface DemoServiceClient {

    @GetMapping("/hello")
    String hello();

}

4.3.4 使用Feign客户端

在控制器中使用Feign客户端调用服务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FeignController {

    @Autowired
    private DemoServiceClient demoServiceClient;

    @GetMapping("/call-feign-ribbon")
    public String callService() {
        return demoServiceClient.hello();
    }

}
5. SpringCloud Gateway服务网关

5.1 Gateway的基本概念

SpringCloud Gateway是一个基于SpringBoot2.0和Spring Framework 5.0的新一代API网关。它可以替代Zuul,支持动态路由、过滤器、断路器等功能。Gateway使用Spring Cloud的Filter链来处理传入的请求,可以配置路由表来指定请求应该如何被路由,还可以使用各种过滤器来改变请求和响应的行为。

5.2 Gateway的安装及简单配置

5.2.1 引入依赖

pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

5.2.2 配置文件

在项目的application.yml文件中配置Spring Cloud Gateway的基本配置:

spring:
    application:
        name: gateway-server
server:
    port: 8085
eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka/
spring:
    cloud:
        gateway:
            routes:
                - id: demo-service
                  uri: lb://demo-service
                  predicates:
                    - Path=/hello/**

5.2.3 启动类配置

在主启动类中加入@EnableDiscoveryClient注解,开启Eureka客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayServerApplication {

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

}

5.3 Gateway的过滤器与路由功能介绍

5.3.1 路由配置

路由配置可以定义请求应该如何被路由到后端服务。可以在application.yml中定义路由规则。

示例:

spring:
    cloud:
        gateway:
            routes:
                - id: demo-service
                  uri: lb://demo-service
                  predicates:
                    - Path=/hello/**

5.3.2 使用过滤器

过滤器可以改变请求和响应的行为。Spring Cloud Gateway内置了一些过滤器,也可以自定义过滤器。

5.3.2.1 内置过滤器

内置过滤器包括RetryGatewayFilter(重试)、RewritePathGatewayFilter(路径重写)等。

5.3.2.2 自定义过滤器

自定义过滤器可以通过继承GatewayFilter接口来实现。

示例:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.stereotype.Component;

@Component
public class CustomFilter extends AbstractGatewayFilterFactory {

    public CustomFilter() {
        super(CustomFilter.class);
    }

    @Override
    public GatewayFilter apply(Object config) {
        return new GatewayFilter() {
            @Override
            public GatewayFilter apply(Config config) {
                return (exchange, chain) -> {
                    // 自定义逻辑
                    System.out.println("Custom filter applied");
                    return chain.filter(exchange);
                };
            }
        };
    }

}

5.3.3 过滤器配置

application.yml文件中配置过滤器。

示例:

spring:
    cloud:
        gateway:
            routes:
                - id: demo-service
                  uri: lb://demo-service
                  predicates:
                    - Path=/hello/**
                  filters:
                    - CustomFilter
6. SpringCloud Config集中配置管理

6.1 Config Server的搭建与使用

6.1.1 引入依赖

pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

6.1.2 配置文件

在Config Server项目的application.yml文件中配置Config Server的基本配置。

示例:

spring:
    application:
        name: config-server
    cloud:
        config:
            server:
                git:
                    uri: https://github.com/your-repo/config-repo
                    username: your-username
                    password: your-password
                    default-label: master
server:
    port: 8888

6.1.3 启动类配置

在主启动类中加入@EnableConfigServer注解,开启Config Server功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

}

6.2 客户端配置的刷新与获取

6.2.1 引入依赖

在客户端项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

6.2.2 配置文件

在客户端项目的bootstrap.yml文件中配置从Config Server获取配置。

示例:

spring:
    application:
        name: config-client
    cloud:
        config:
            uri: http://localhost:8888
            username: your-username
            password: your-password
server:
    port: 8086

6.2.3 启动类配置

在主启动类中加入@EnableDiscoveryClient注解,开启Eureka客户端功能。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClientApplication {

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

}

6.3 配置文件的版本管理和环境变量支持

6.3.1 环境变量支持

客户端可以通过环境变量来获取不同的配置。

示例环境变量定义:

export SPRING_PROFILES_ACTIVE=dev

6.3.2 版本管理

Config Server可以从Git仓库中获取不同版本的配置文件。

示例配置:

spring:
    cloud:
        config:
            server:
                git:
                    uri: https://github.com/your-repo/config-repo
                    username: your-username
                    password: your-password
                    default-label: master
                    clone-on-start: true

6.3.3 示例配置文件

在Git仓库中创建不同的配置文件,例如application-dev.ymlapplication-prod.yml等。

示例配置文件:

# application-dev.yml
spring:
    application:
        name: my-app
    profiles:
        active: dev
    datasource:
        url: jdbc:mysql://localhost:3306/dev_db
        username: dev-user
        password: dev-pass
# application-prod.yml
spring:
    application:
        name: my-app
    profiles:
        active: prod
    datasource:
        url: jdbc:mysql://localhost:3306/prod_db
        username: prod-user
        password: prod-pass

6.4 代码示例

6.4.1 Config Server项目

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

}

6.4.2 Config Client项目

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigClientApplication {

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

    @RefreshScope
    public static class ConfigProperties {

        public String property;

    }

}

6.4.3 配置刷新

配置刷新可以通过发送HTTP POST请求到/actuator/refresh来实现。

示例代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class ConfigController {

    @Autowired
    private ConfigProperties configProperties;

    @GetMapping("/refresh")
    public String refresh() {
        // 执行刷新
        return "刷新成功";
    }

}
总结

本文介绍了SpringCloud的核心组件及其作用,详细讲解了如何搭建SpringCloud环境,包括Eureka服务注册与发现、Feign与Ribbon服务调用、SpringCloud Gateway服务网关以及SpringCloud Config集中配置管理。通过逐步搭建和实践示例,读者可以快速上手并掌握SpringCloud的基本使用方法。

这篇关于SpringCloud入门指南:一步步搭建微服务架构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!