继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringCloud微服务教程:初学者的全面指南

手掌心
关注TA
已关注
手记 274
粉丝 18
获赞 76
概述

Spring Cloud微服务教程介绍了Spring Cloud框架的基础概念,包括服务发现、配置中心和负载均衡等核心功能。文章详细阐述了如何搭建Spring Cloud环境,并通过示例展示了服务注册与发现、配置中心使用、负载均衡以及服务容错的实现方法。Spring Cloud微服务教程旨在帮助开发者快速构建高可用、可扩展的分布式应用系统。

SpringCloud微服务教程:初学者的全面指南
1. Spring Cloud简介

1.1 什么是Spring Cloud

Spring Cloud是基于Spring Boot构建的一整套微服务框架,它提供了诸如服务发现、配置中心、路由网关、负载均衡、断路器等一系列微服务解决方案。Spring Cloud旨在简化分布式系统中实现一些常见的模式和约定的开发,使得开发者可以快速构建分布式应用系统。

1.2 Spring Cloud的核心概念

  • 服务发现(Service Registry):服务发现是微服务架构中的重要概念,它允许服务实例在启动时向服务注册中心注册自身,并且能够在运行期间随时更新其状态。服务消费者则能够通过服务注册中心查找服务实例,进而进行服务调用。
  • 配置中心(Config Center):配置中心用于集中化管理应用配置,支持动态更新,可以避免每个服务实例都维护一套独立的配置文件,降低了配置维护的复杂度。
  • 路由网关(Route Gateway):路由网关作为服务前端入口,负责将外部请求路由到后端不同的服务实例上,起到统一入口的作用。
  • 断路器(Circuit Breaker):断路器是一种容错机制,用于监控和防止分布式系统中的故障扩散,它可以在服务调用失败率过高时自动切断服务调用,避免故障雪崩效应。
  • 负载均衡(Load Balancer):负载均衡将网络流量分配到不同的服务器或服务实例上,以提高整个系统的性能、响应速度和可靠性。

1.3 Spring Cloud的优势

  • 简化分布式系统开发:Spring Cloud提供了一系列组件来简化分布式系统开发,如服务发现、配置中心、负载均衡等。
  • 快速构建微服务应用:Spring Cloud能够快速实现服务的拆分和组合,从而构建出高可用、可扩展的微服务应用。
  • 全面的微服务解决方案:Spring Cloud不仅提供了服务的管理功能,还集成了很多现成的服务,如Ribbon、Hystrix、Zuul等,帮助开发者快速搭建完整的微服务架构。
  • 易于集成:Spring Cloud基于Spring Boot构建,可以方便地集成到已有的Spring Boot项目中,降低了学习曲线。
2. Spring Cloud环境搭建

2.1 开发环境准备

Spring Cloud的运行环境主要依赖于Java环境和各种开发工具,如IntelliJ IDEA或Eclipse等。此外,还需要安装Maven作为项目构建工具。

Java环境

确保已安装JDK 1.8及以上版本。

java -version

Maven环境

确保已安装Maven 3.5及以上版本。

mvn -v

2.2 创建Spring Boot项目

使用Spring Initializr或者Spring Boot CLI来创建一个新的Spring Boot项目。

使用Spring Initializr创建项目

  1. 访问Spring Initializr
  2. 选择项目的基本信息,如Spring Boot版本、Java版本、项目名、包名。
  3. 在“Dependencies”标签页中选择所需的依赖,例如Spring Web、Spring Cloud Starter Eureka。
  4. 点击“Generate”按钮生成项目文件。
  5. 下载解压项目文件,然后导入到开发工具中进行编辑。

使用Spring Boot CLI创建项目

使用Spring Boot CLI从命令行创建Spring Boot项目。

spring init --dependencies=web,cloud-eureka-client --groupId=com.example --artifactId=serviceA

2.3 集成Spring Cloud依赖

在项目中集成Spring Cloud依赖,可以在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>
3. 服务发现与注册

3.1 Eureka服务注册与发现

Eureka是Netflix开源的一个服务注册与发现框架,主要用于构建服务网格架构中的服务治理组件。Eureka服务端提供服务注册和发现的功能,客户端通过向服务端发送心跳来维持自己的可用性,同时从服务端获取其他服务的地址信息并进行服务调用。

创建Eureka服务端

  1. 创建一个新的Spring Boot项目。
  2. pom.xml文件中添加Eureka服务端依赖。
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
       . . .
  1. application.yml文件中配置Eureka服务端。
server:
  port: 8761
spring:
  application:
  name: eureka-service
eureka:
  instance:
  hostname: localhost
 client:
  register-with-eureka: false
  fetch-registry: false
  # 设置服务端的地址,即服务端提供发现的地址
  service-url:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  1. 创建启动类,并添加@EnableEurekaServer注解。
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);
    }
}

创建Eureka客户端

  1. 创建一个新的Spring Boot项目。
  2. pom.xml文件中添加Eureka客户端依赖。
<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>
  1. application.yml文件中配置Eureka客户端。
server:
 port: 8080
spring:
 application:
  name: serviceA
eureka:
 instance:
  hostname: localhost
 client:
  # 设置服务端的地址,即服务端提供发现的地址
  service-url:
    defaultZone: http://localhost:8761/eureka/
  1. 创建启动类,并添加@EnableDiscoveryClient注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.annotation.EnableEurekaClient;

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

3.2 使用Feign实现服务调用

Feign是一个声明式的web服务客户端,它使得编写web服务客户端变得非常容易。Feign提供了一种优雅的使用HTTP请求进行远程服务调用的模式,它还支持了Ribbon的负载均衡功能。

创建Feign客户端

  1. 在项目中添加Feign客户端依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 在主启动类上添加@EnableFeignClients注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class EurekaClientFeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientFeignApplication.class, args);
    }
}
  1. 创建Feign客户端接口。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "serviceB")
public interface ServiceBClient {
    @GetMapping("/api/hello")
    String hello();
}
  1. 在服务中使用Feign客户端。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ServiceAClientController {
    @Autowired
    private ServiceBClient serviceBClient;

    @GetMapping("/hello")
    public String hello() {
        return "Hello, " + serviceBClient.hello();
    }
}
4. 配置中心的使用

4.1 配置中心的概念

配置中心用于集中化管理应用配置,支持动态更新,可以避免每个服务实例都维护一套独立的配置文件,降低了配置维护的复杂度。通过配置中心,可以实现配置的版本管理和灰度发布。

4.2 使用Spring Cloud Config实现配置管理

Spring Cloud Config提供了集中化、外部化的配置管理方案。它可以将所有的外部配置文件放置在一个集中式的服务器中,然后各个应用可以根据自身的需求,通过配置中心获取对应的配置信息。这样不仅可以减少配置文件的维护成本,还可以方便地进行环境切换。

创建Spring Cloud Config服务器

  1. 创建一个新的Spring Boot项目。
  2. pom.xml文件中添加Spring Cloud Config服务器依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
  1. application.yml文件中配置Spring Cloud Config服务器。
server:
 port: 8888
spring:
 application:
  name: config-server
cloud:
 config:
  server:
   git:
    uri: git@github.com:username/repo.git
    search-paths: config
  1. 创建启动类,并添加@EnableConfigServer注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

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

创建Spring Cloud Config客户端

  1. 在客户端项目中添加Spring Cloud Config客户端依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. bootstrap.yml文件中配置Spring Cloud Config客户端。
spring:
 application:
  name: serviceA
cloud:
 config:
  uri: http://localhost:8888
  1. 在客户端项目中使用配置。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/config")
public class ConfigController {
    @Value("${greeting.message:Hello}")
    private String message;

    @GetMapping("/message")
    public String getMessage() {
        return message;
    }
}
  1. 创建启动类,并添加@EnableDiscoveryClient注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}
5. 负载均衡与路由

5.1 Ribbon负载均衡原理

Ribbon是一个基于客户端的负载均衡工具,它可与Eureka服务发现组件配合使用,将网络流量合理地分配到不同的服务实例上。Ribbon通过一系列策略来实现负载均衡,如轮询、随机选择、最少活跃线程数等。

使用Ribbon进行负载均衡

  1. 在项目中添加Ribbon依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  1. 在Feign客户端接口中使用Ribbon。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "serviceB", configuration = ServiceBClient.class)
public interface ServiceBClient {
    @GetMapping("/api/hello")
    String hello();
}
  1. 在Feign客户端配置类中配置Ribbon。
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.loadbalancer.RoundRobinRule;

@Configuration
public class ServiceBClientConfig {
    @Bean
    public IRule ribbonRule() {
        return new RoundRobinRule();
    }
}

5.2 Zuul路由网关的使用

Zuul是Netflix开源的一个基于Java的路由服务,主要为Spring Cloud微服务提供了路由服务,它可以将客户端请求路由到后端不同的服务实例上,起到统一入口的作用。Zuul还提供了过滤器机制,可以用来实现请求的预处理和后处理,如身份验证、请求检查、响应缓存等。

创建Zuul路由网关

  1. 创建一个新的Spring Boot项目。
  2. pom.xml文件中添加Zuul路由网关依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
  1. application.yml文件中配置Zuul路由网关。
server:
 port: 9000
spring:
 application:
  name: api-gateway
zuul:
 routes:
  service-a:
   path: /api/sa/**
   sensitive-url: false
   serviceId: serviceA
  service-b:
   path: /api/sb/**
   sensitive-url: false
   serviceId: serviceB
  1. 创建启动类,并添加@EnableZuulProxy注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulGatewayApplication.class, args);
    }
}
6. 服务容错与故障转移

6.1 Hystrix断路器的使用

Hystrix是一个延迟和容错库,可以实现线程隔离和断路器等功能。Hystrix可以通过熔断机制来拦截错误请求,防止它们对整个服务产生影响。当一个服务调用出现异常时,Hystrix会记录该异常并触发断路器动作,以防止后续的请求继续调用该服务,从而保护整个系统不受连锁故障的影响。

使用Hystrix进行服务容错

  1. 在项目中添加Hystrix依赖。
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 在Feign客户端接口中使用Hystrix。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.FeignClientConfiguration;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "serviceB", configuration = ServiceBClient.class)
public interface ServiceBClient {
    @GetMapping("/api/hello")
    String hello();
}
  1. 在Feign客户端配置类中配置Hystrix。
import org.springframework.cloud.openfeign.FeignClientConfiguration;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixThreadPoolProperties;
import com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationStrategy;
import com.netflix.hystrix.HystrixCommandProperties.ExecutionIsolationSemaphoreMaxConcurrentCount;

@Configuration
@RibbonClients(
    defaultConfiguration = ServiceBClient.class
)
public class ServiceBClientConfig extends FeignClientConfiguration {
    @Bean
    public HystrixCommandProperties.Setter setter() {
        return HystrixCommandProperties.Setter()
            .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
            .withExecutionIsolationSemaphoreMaxConcurrentCount(10);
    }
}

6.2 断路器对微服务的影响

断路器机制可以有效防止故障扩散,当某个服务不可用时,断路器会启动,拦截后续对该服务的请求,并返回失败信息,避免客户端调用方陷入等待,进而导致系统崩溃。此外,当服务恢复正常后,断路器会自动切换回正常模式,继续提供服务。

模拟服务异常情况

  1. 在服务B中模拟服务异常。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ServiceBController {
    public ServiceBController() {
        throw new RuntimeException("Service is down");
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello from serviceB";
    }
}
  1. 在服务A中调用服务B。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ServiceAClientController {
    @Autowired
    private ServiceBClient serviceBClient;

    @GetMapping("/hello")
    public String hello() {
        return "Hello, " + serviceBClient.hello();
    }
}

通过上述示例,可以看到在服务B不可用时,断路器机制能够有效地保护服务A不受影响,并且在服务B恢复正常后,服务A也能够正常地调用服务B。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP