为了账号安全,请及时绑定邮箱和手机立即绑定

SpringCloud入门:从零开始搭建微服务项目

标签:
Spring Cloud
概述

SpringCloud入门介绍了如何从零开始搭建微服务项目,包括环境搭建、服务发现与注册、负载均衡和API网关的使用。文章详细讲解了SpringCloud的核心组件和实战案例,帮助开发者快速构建出可扩展、可维护的微服务应用程序。

SpringCloud入门:从零开始搭建微服务项目
SpringCloud简介

什么是SpringCloud

SpringCloud 是一个基于 Spring Boot 的微服务框架,它提供了快速构建分布式系统的工具,包括服务发现、配置中心、服务网关、负载均衡等。SpringCloud的核心目标是为微服务架构提供一系列通用的工具和技术,使得开发者可以更加方便地构建出可扩展、可维护的微服务应用程序。

SpringCloud的核心组件介绍

SpringCloud的核心组件包括以下几个:

  1. Eureka:服务注册与发现
  2. Ribbon:客户端负载均衡
  3. Feign:声明式的服务调用
  4. Hystrix:断路器,实现服务容错机制
  5. Zuul:路由和过滤器
  6. Config:配置中心
  7. Consul:服务注册与发现
  8. Hystrix Dashboard:断路器监控

这些组件可以单独使用,也可以组合使用,从而构建出更加复杂和灵活的微服务架构。

环境搭建

开发环境安装

在开始搭建SpringCloud项目之前,必须确保已经安装了以下环境:

  • JDK 1.8及以上版本
  • Maven 3.0及以上版本
  • IntelliJ IDEA 或 Eclipse(推荐使用IntelliJ IDEA)
  • Git(用于管理代码版本)

安装步骤如下:

  1. 下载并安装 JDK 1.8 或更高版本,配置 JAVA_HOME 系统环境变量。
  2. 下载并安装 Maven 3.0 或更高版本,配置 M2_HOME 系统环境变量。
  3. 安装 IntelliJ IDEA 或 Eclipse。
  4. 安装 Git。

快速搭建第一个SpringCloud应用

首先创建一个基本的 Spring Boot 项目,然后引入SpringCloud的依赖。

  1. 使用Spring Initializr创建一个新的SpringBoot项目。
  2. 添加依赖:spring-cloud-starter-netflix-eureka-clientspring-boot-starter-web

创建一个简单的服务提供者应用:

  1. 创建一个新的 Maven 项目,添加以下依赖到 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>
    
    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>2022.0.0</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
  2. 创建 application.properties 文件,配置服务提供者的名称和注册中心地址:

    spring.application.name=service-provider
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  3. 创建 ProviderApplication 类,作为服务启动点:

    @SpringBootApplication
    @EnableEurekaClient
    public class ProviderApplication {
       public static void main(String[] args) {
           SpringApplication.run(ProviderApplication.class, args);
       }
    }
  4. 创建 GreetingController 类,提供一个简单的 RESTful API:

    @RestController
    public class GreetingController {
    
       @GetMapping("/greeting")
       public String greeting() {
           return "Hello, this is a microservice!";
       }
    }
  5. 运行 ProviderApplication 类,启动服务提供者。
服务发现与注册

Eureka服务注册与发现

Eureka 是一个基于服务注册与发现的核心组件,它利用客户端和服务端模式,提供服务注册与发现功能。Eureka 客户端在启动后,会向 Eureka Server 发送心跳信息,通知自己的健康状态;同时,Eureka Server 会定期检查客户端的心跳,如果超过一定时间没有接收到来自客户端的心跳,则认为该客户端已经失效,并从服务列表中移除。

使用SpringCloud进行服务注册和发现的实战

创建一个服务注册中心应用:

  1. 创建一个新的 Maven 项目,添加 Eureka Server 相关依赖到 pom.xml 文件:

    <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
       </dependency>
    </dependencies>
  2. 创建 EurekaServerApplication 类,作为服务注册中心启动点:

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
       public static void main(String[] args) {
           SpringApplication.run(EurekaServerApplication.class, args);
       }
    }
  3. 创建 application.properties 文件,配置服务注册中心的监听端口:

    server.port=8761
    
    eureka.instance.hostname=localhost
    eureka.client.registerWithEureka=false
    eureka.client.fetchRegistry=false
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
  4. 运行 EurekaServerApplication 类,启动服务注册中心。

创建一个服务消费者应用:

  1. 创建一个新的 Maven 项目,添加 Eureka Client 相关依赖到 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>
  2. 创建 ConsumerApplication 类,作为服务消费者启动点:

    @SpringBootApplication
    @EnableEurekaClient
    public class ConsumerApplication {
       public static void main(String[] args) {
           SpringApplication.run(ConsumerApplication.class, args);
       }
    }
  3. 创建 application.properties 文件,配置服务消费者的名称和注册中心地址:

    spring.application.name=service-consumer
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  4. 创建 ConsumerController 类,调用服务提供者的 API:

    @RestController
    public class ConsumerController {
    
       @Autowired
       private RestTemplate restTemplate;
    
       @GetMapping("/consumer")
       public String consumer() {
           return restTemplate.getForObject("http://service-provider/greeting", String.class);
       }
    }
  5. 创建 RibbonConfiguration 类,配置负载均衡策略:

    @Configuration
    public class RibbonConfiguration {
    
       @Bean
       public IRule ribbonRule() {
           return new RoundRobinRule();
       }
    }
  6. 运行 ConsumerApplication 类,启动服务消费者。
负载均衡

Ribbon负载均衡原理

Ribbon 是一个基于客户端的负载均衡组件,它位于服务调用的客户端,当客户端通过 HTTP 请求访问服务时,Ribbon 负载均衡器会从服务列表中选择一个服务实例并发起请求。Ribbon 支持多种负载均衡策略,包括轮询、随机、最少活跃线程数等。

实战:使用SpringCloud实现服务间的负载均衡

在服务提供者应用的基础上,通过配置实现负载均衡:

  1. ProviderApplication 类中,添加 Ribbon 相关配置:

    @SpringBootApplication
    @EnableEurekaClient
    public class ProviderApplication {
       public static void main(String[] args) {
           SpringApplication.run(ProviderApplication.class, args);
       }
    }
  2. 创建 application.properties 文件,配置服务提供者的名称和注册中心地址:

    spring.application.name=service-provider
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  3. 在服务消费者应用中,引入 Ribbon 的依赖,并通过 RestTemplate 实现负载均衡:

    <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>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
       </dependency>
    </dependencies>
  4. ConsumerController 类中,使用 RestTemplate 调用服务提供者:

    @RestController
    public class ConsumerController {
    
       @Autowired
       private RestTemplate restTemplate;
    
       @GetMapping("/consumer")
       public String consumer() {
           return restTemplate.getForObject("http://service-provider/greeting", String.class);
       }
    }
  5. 在多个服务提供者实例中,确保各自配置不同的端口,并启动它们。
服务网关

Zuul网关介绍

Zuul 是一个基于 JVM 的高性能服务网关,它提供了一组过滤器,可以对请求进行路由、过滤和监控等操作。Zuul 过滤器分为四个阶段,分别为 pre、route、post 和 error,每个阶段可以由不同的过滤器完成不同的任务。Zuul 还提供了动态路由、请求重试、请求聚合等功能,可以满足多种微服务架构下的网关需求。

实战:构建SpringCloud应用中的API网关

创建一个网关应用:

  1. 创建一个新的 Maven 项目,添加 Zuul 相关依赖到 pom.xml 文件:

    <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
       </dependency>
    </dependencies>
  2. 创建 GatewayApplication 类,作为网关启动点:

    @SpringBootApplication
    @EnableZuulProxy
    public class GatewayApplication {
       public static void main(String[] args) {
           SpringApplication.run(GatewayApplication.class, args);
       }
    }
  3. 创建 application.properties 文件,配置网关的名称和注册中心地址:

    spring.application.name=api-gateway
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
  4. 创建 zuul.routes 配置文件,定义路由规则:

    zuul.routes.provider.path=/provider/**
    zuul.routes.provider.service-id=service-provider
  5. 运行 GatewayApplication 类,启动 API 网关。
实战案例

从零开始构建一个简单的微服务项目

创建一个简单的微服务项目,包含一个服务提供者和服务消费者。

  1. 创建一个新的 Maven 项目,命名为 microservice-sample,并创建两个子模块 service-providerservice-consumer
  2. service-provider 子模块中,添加服务提供者的相关依赖。
  3. service-consumer 子模块中,添加服务消费者的相关依赖。

项目结构

microservice-sample
├── service-provider
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com.example
│   │   │   │       └── provider
│   │   │   │           ├── GreetingController.java
│   │   │   │           └── ProviderApplication.java
│   │   │   └── resources
│   │   │       └── application.properties
│   └── pom.xml
├── service-consumer
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com.example
│   │   │   │       └── consumer
│   │   │   │           └── ConsumerController.java
│   │   │   │           └── RibbonConfiguration.java
│   │   │   └── resources
│   │   │       └── application.properties
│   └── pom.xml
└── pom.xml

服务提供者代码

  1. ProviderApplication.java 中,启动服务提供者:

    package com.example.provider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(ProviderApplication.class, args);
       }
    }
  2. GreetingController.java 中,提供一个简单的 RESTful API:

    package com.example.provider;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
       @GetMapping("/greeting")
       public String greeting() {
           return "Hello, this is a microservice!";
       }
    }
  3. application.properties 中,配置服务提供者的名称和注册中心地址:

    spring.application.name=service-provider
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

服务消费者代码

  1. ConsumerApplication.java 中,启动服务消费者:

    package com.example.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @RibbonClient(name = "service-provider", configuration = RibbonConfiguration.class)
    public class ConsumerApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(ConsumerApplication.class, args);
       }
    }
  2. ConsumerController.java 中,调用服务提供者的 API:

    package com.example.consumer;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.web.client.RestTemplate;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class ConsumerController {
    
       @Autowired
       @LoadBalanced
       private RestTemplate restTemplate;
    
       @GetMapping("/consumer")
       public String consumer() {
           return restTemplate.getForObject("http://service-provider/greeting", String.class);
       }
    }
  3. 创建 RibbonConfiguration 类,配置负载均衡策略:

    @Configuration
    public class RibbonConfiguration {
    
       @Bean
       public IRule ribbonRule() {
           return new RoundRobinRule();
       }
    }
  4. application.properties 中,配置服务消费者的名称和注册中心地址:

    spring.application.name=service-consumer
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

服务注册中心代码

  1. 创建一个新的 Maven 项目,命名为 eureka-server

  2. EurekaServerApplication.java 中,启动服务注册中心:

    package com.example.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. application.properties 中,配置服务注册中心的监听端口:

    server.port=8761
    
    eureka.instance.hostname=localhost
    eureka.client.registerWithEureka=false
    eureka.client.fetchRegistry=false
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

项目配置与部署

项目配置

  1. service-providerservice-consumer 子模块的 pom.xml 文件中,添加 SpringCloud 的依赖:

    <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>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
       </dependency>
    </dependencies>
    
    <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework.cloud</groupId>
               <artifactId>spring-cloud-dependencies</artifactId>
               <version>2022.0.0</version>
               <type>pom</type>
               <scope>import</scope>
           </dependency>
       </dependencies>
    </dependencyManagement>
  2. eureka-server 项目的 pom.xml 文件中,添加 Eureka Server 的依赖:

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

项目部署

  1. 启动 EurekaServerApplication 类,启动服务注册中心。
  2. 启动 ProviderApplication 类,启动服务提供者。
  3. 启动 ConsumerApplication 类,启动服务消费者。

此时,微服务项目已经成功搭建完成,服务提供者和消费者通过服务注册中心进行了注册与发现,实现了负载均衡和API网关的功能。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
205
获赞与收藏
1008

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消