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

Springboot 微服务资料入门教程

慕勒3428872
关注TA
已关注
手记 228
粉丝 13
获赞 51
概述

本文介绍了Spring Boot微服务资料的入门教程,涵盖了Spring Boot的核心概念、优势和应用场景,以及快速搭建Spring Boot项目的步骤。文章还详细讲解了微服务的基础概念、优势和挑战,并提供了使用Spring Boot实现微服务开发的实践案例。文中还涉及了微服务的部署、监控、配置管理等内容。

Springboot 微服务资料入门教程
Spring Boot简介

Spring Boot的核心概念

Spring Boot 是 Spring 的一个模块,旨在简化新 Spring 应用的初始搭建以及开发过程。它通过提供一系列约定优于配置的设置,使得开发者可以快速构建独立的、基于 Spring 的生产级应用。Spring Boot 的核心概念包括以下几点:

  • 自动配置:Spring Boot 通过自动配置机制简化了 Spring 应用的开发。它会根据类路径中的 jar 依赖自动配置应用。
  • 起步依赖:通过起步依赖,可以快速添加所需的依赖项,而无需手动查找和包含每个单独的依赖项。
  • 命令行接口:Spring Boot 提供了命令行接口,可以方便地运行应用或打包应用。
  • 健康检查:内置的健康检查功能,可以帮助监控应用的运行状态。
  • 打包工具:Spring Boot 提供了打包工具,可以将应用打包成一个可执行的 jar 或 war 文件。

Spring Boot的优势和应用场景

Spring Boot 的主要优势包括:

  • 简化新应用的搭建和开发过程:通过提供默认配置和自动配置,减少了开发者的配置工作量。
  • 简化部署:Spring Boot 应用可以打包成一个独立的可执行 jar,便于部署到任何机器上。
  • 支持多种构建工具:可以方便地与 Maven、Gradle 等构建工具集成。
  • 内置健康检查和指标:可以通过 Spring Boot Actuator 进行应用监控和健康检查。
  • 快速开发:提供了丰富的起步依赖,使得开发者可以快速开始开发。

应用场景包括:

  • 快速搭建项目:适用于快速搭建中小型项目。
  • 微服务开发:适用于微服务架构下的服务开发和部署。
  • 企业应用:适用于企业级应用,如在线商城、后台管理系统等。
  • 云应用:适用于云平台上的应用部署和管理。

快速搭建Spring Boot项目

  1. 环境准备

    • Java 8 或更高版本
    • Maven 或 Gradle
    • IDE(如 IntelliJ IDEA 或 Eclipse)
  2. 创建项目

    • 使用 spring initializr 创建项目。Spring Initializr 是一个在线工具,可以帮助快速生成 Spring Boot 项目。具体步骤如下:
      • 访问 Spring Initializr
      • 选择项目基本信息,如语言(Java)、依赖(Web、Actuator 等)、构建工具(Maven 或 Gradle)等。
      • 下载并解压生成的项目文件到本地。
  3. Maven 项目示例

    <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
          http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.5.0</version>
      </parent>
      <dependencies>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
      </dependencies>
    </project>
  4. 启动类

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication {
    
      public static void main(String[] args) {
         SpringApplication.run(DemoApplication.class, args);
      }
    
    }
  5. 简单的 RESTful API

    package com.example.demo;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
       @GetMapping("/hello")
       public String hello() {
           return "Hello, World!";
       }
    
    }
  6. 运行应用
    使用 Maven 命令运行应用:
    mvn clean install
    mvn spring-boot:run
微服务基础概念

微服务架构的基本原理

微服务架构是一种设计方式,它将单个应用程序划分成一组小的服务,每个服务都在自己的进程中运行,并且服务之间通过HTTP API、消息队列、数据库等方式进行通信。微服务架构的核心特性包括:

  • 独立部署:每个服务都可以独立部署、独立扩展、独立更新。
  • 技术栈多样:不同的服务可以使用不同的编程语言和框架。
  • 松耦合:每个服务都是松散耦合的,允许各服务独立开发、测试和部署。
  • 分布式:服务可以分布在不同的机器上,提高系统的可扩展性。
  • 自动化运维:可以使用自动化工具进行配置、部署、监控和故障处理。

微服务架构的优势和挑战

优势:

  • 快速迭代:微服务可以独立开发、测试和部署,从而加快开发周期。
  • 可扩展性:独立部署的服务可以针对不同的负载进行扩展。
  • 容错性:服务之间通过网络通信,如果某个服务失败,不会影响整个系统。
  • 技术多样性:可以使用不同的技术栈和框架来实现不同的服务。

挑战:

  • 复杂性:服务之间的交互变得更加复杂,增加了系统维护的难度。
  • 分布式事务:跨服务的事务管理变得更加复杂,需要使用如Saga模式等技术。
  • 网络延迟:服务之间通过网络通信,可能会引入额外的延迟。
  • 监控与调试:分布式系统增加了监控和调试的复杂性。

微服务与传统单体架构的区别

传统单体架构:

  • 单体应用:应用的所有模块耦合在一起,部署在一个单独的进程中。
  • 单一技术栈:通常使用一种编程语言和框架来实现整个应用。
  • 部署复杂:应用的部署和扩展复杂,整个应用作为一个整体进行部署和扩展。
  • 维护简单:因为应用的耦合性,维护起来相对简单。

微服务架构:

  • 独立服务:应用被分解成多个独立的服务,每个服务都有自己的生命周期。
  • 多种技术栈:每个服务可以使用不同的编程语言和框架。
  • 独立部署:服务可以独立部署、扩展、更新,提高部署效率。
  • 复杂维护:服务之间的松散耦合增加了维护和调试的复杂性。
Spring Boot微服务开发实践

创建微服务应用的基本步骤

  1. 创建应用

    • 使用 Spring Initializr 创建一个新的 Spring Boot 项目。具体步骤如下:
      • 访问 Spring Initializr
      • 选择项目基本信息,如语言(Java)、依赖(Web、Actuator 等)、构建工具(Maven 或 Gradle)等。
      • 下载并解压生成的项目文件到本地。
    • pom.xmlbuild.gradle 中添加所需的依赖。
    • 示例代码如下:
      <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.5.0</version>
      </parent>
      <dependencies>
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
      </dependencies>
      </project>
  2. 定义服务接口

    • 创建 RESTful API 接口,定义服务的输入输出。
    • 使用 @RestController 注解定义 REST 控制器。
    • 示例代码如下:

      package com.example.demo;
      
      import org.springframework.web.bind.annotation.GetMapping;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      public class GreetingController {
      
       @GetMapping("/hello")
       public String hello() {
           return "Hello, World!";
       }
      
      }
  3. 实现业务逻辑

    • 实现服务的业务逻辑,可以使用 Spring 提供的注解如 @Service
    • 使用 @Autowired 注解注入依赖。
    • 示例代码如下:

      package com.example.demo;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      @Service
      public class GreetingService {
      
       public String hello() {
           return "Hello, Service!";
       }
      
      }
  4. 配置数据库和外部服务

    • 通过 application.ymlapplication.properties 配置数据库连接、外部服务等。
    • 使用 @Configuration 注解定义配置类。
    • 示例代码如下:
      spring:
      datasource:
       url: jdbc:mysql://localhost:3306/mydb
       username: root
       password: root
  5. 测试服务

    • 使用单元测试和集成测试验证服务的功能。
    • 使用 @SpringBootTest 注解进行集成测试。
    • 示例代码如下:

      package com.example.demo;
      
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.test.web.servlet.MockMvc;
      
      import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
      import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
      import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
      
      @SpringBootTest
      public class GreetingControllerTest {
      
       @Autowired
       private MockMvc mockMvc;
      
       @Test
       public void shouldReturnDefaultMessage() throws Exception {
           mockMvc.perform(get("/hello"))
                   .andExpect(status().isOk())
                   .andExpect(content().string("Hello, World!"));
       }
      
      }

使用Spring Boot实现RESTful API

  • 定义控制器

    package com.example.demo;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
      private final GreetingService greetingService;
    
      @Autowired
      public GreetingController(GreetingService greetingService) {
          this.greetingService = greetingService;
      }
    
      @GetMapping("/hello")
      public String hello() {
          return greetingService.hello();
      }
    
    }
  • 实现业务逻辑

    package com.example.demo;
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class GreetingService {
    
      public String hello() {
          return "Hello, World!";
      }
    
    }
  • 注入依赖

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
      private final GreetingService greetingService;
    
      @Autowired
      public GreetingController(GreetingService greetingService) {
          this.greetingService = greetingService;
      }
    
      @GetMapping("/hello")
      public String hello() {
          return greetingService.hello();
      }
    
    }

微服务通信方式:RestTemplate与Feign

  • RestTemplate

    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    @Service
    public class RemoteServiceClient {
    
      private final RestTemplate restTemplate;
    
      @Autowired
      public RemoteServiceClient(RestTemplate restTemplate) {
          this.restTemplate = restTemplate;
      }
    
      public String callRemoteService() {
          ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8080/hello", String.class);
          return response.getBody();
      }
    
    }
  • Feign

    package com.example.demo;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(value = "greeting-service")
    public interface GreetingClient {
    
      @GetMapping("/hello")
      String hello();
    
    }
    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class RemoteServiceClient {
    
      private final GreetingClient greetingClient;
    
      @Autowired
      public RemoteServiceClient(GreetingClient greetingClient) {
          this.greetingClient = greetingClient;
      }
    
      public String callRemoteService() {
          return greetingClient.hello();
      }
    
    }
微服务部署与监控

微服务部署到Docker容器

  1. 创建 Dockerfile

    FROM openjdk:8-jdk-alpine
    VOLUME /tmp
    ARG JAR_FILE=target/*.jar
    COPY ${JAR_FILE} app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
  2. 构建 Docker 镜像

    docker build -t my-spring-boot-app .
  3. 运行 Docker 容器
    docker run -d -p 8080:8080 my-spring-boot-app

使用Spring Boot Actuator监控微服务

  1. 添加 Actuator 依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. 配置 Actuator

    management:
       endpoints:
           web:
               exposure:
                   include: "*"
  3. 访问监控端点

    • 访问 /actuator 获取所有可用的监控端点。
    • 访问 /actuator/health 获取应用的健康状态。
  4. 使用 Spring Boot Actuator 的监控端点

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.actuate.endpoint.web.WebEndpointProperties;
    import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpoint;
    import org.springframework.boot.actuate.endpoint.web.annotation.RestControllerEndpoint;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestControllerEndpoint(id = "custom-endpoint", description = "Custom endpoint")
    public class DemoApplication {
    
       public static void main(String[] args) {
           SpringApplication.run(DemoApplication.class, args);
       }
    
       @ControllerEndpoint(id = "custom-endpoint", description = "Custom endpoint")
       @GetMapping("/custom")
       public String customEndpoint() {
           return "Custom endpoint called";
       }
    
    }

Spring Boot与Kubernetes集成

  1. 添加 Kubernetes 依赖

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-kubernetes</artifactId>
    </dependency>
  2. 配置 Kubernetes

    spring:
       cloud:
           kubernetes:
               service:
                   name: my-service
  3. 部署到 Kubernetes
    • 使用 Kubernetes YAML 文件部署应用。
    • 使用 Kubernetes 命令行工具部署到集群。
    • 示例 YAML 文件如下:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
      name: my-app
      spec:
      replicas: 3
      selector:
       matchLabels:
         app: my-app
      template:
       metadata:
         labels:
           app: my-app
       spec:
         containers:
         - name: my-app
           image: my-spring-boot-app:latest
           ports:
           - containerPort: 8080
      ---
      apiVersion: v1
      kind: Service
      metadata:
      name: my-app
      spec:
      selector:
       app: my-app
      ports:
      - protocol: TCP
       port: 80
       targetPort: 8080
微服务配置与管理

使用Spring Cloud Config中心化管理配置

  1. 创建配置服务器

    spring:
       cloud:
           config:
               server:
                   git:
                       uri: https://github.com/my-repo
                       cloneOnStart: true
  2. 配置客户端

    spring:
       cloud:
           config:
               name: config
               profile: dev
               label: master
               uri: http://localhost:8888
  3. 使用配置

    spring:
       application:
           name: my-app
       profiles:
           active: dev
  4. 访问配置

    • 访问 http://localhost:8888/my-app/dev 获取配置文件内容。
    • 使用 @Value 注解注入配置属性。
    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication {
    
       @Value("${app.name}")
       private String appName;
    
       public static void main(String[] args) {
           SpringApplication.run(DemoApplication.class, args);
       }
    
       @GetMapping("/name")
       public String appName() {
           return appName;
       }
    
    }

服务注册与发现:Eureka与Consul

  1. 配置 Eureka 服务注册中心

    spring:
       application:
           name: eureka-server
       cloud:
           config:
               discovery:
                   enabled: false
    eureka:
       client:
           register-with-eureka: true
           fetch-registry: true
           instance-id: ${spring.application.name}:${random.int}
       server:
           enable-self-preservation: false
  2. 配置服务提供者

    spring:
       application:
           name: my-service
       cloud:
           config:
               discovery:
                   enabled: false
    eureka:
       client:
           register-with-eureka: true
           fetch-registry: true
           serviceUrl:
               defaultZone: http://localhost:8761/eureka/
  3. 配置服务消费者

    spring:
       application:
           name: my-service-consumer
       cloud:
           config:
               discovery:
                   enabled: false
    eureka:
       client:
           register-with-eureka: true
           fetch-registry: true
           serviceUrl:
               defaultZone: http://localhost:8761/eureka/
  4. 使用 Feign 客户端

    package com.example.demo;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(name = "my-service")
    public interface MyServiceClient {
    
       @GetMapping("/hello")
       String hello();
    
    }

配置Spring Boot微服务的环境变量

  1. 配置环境变量

    • application.yml 中配置环境变量。
    • 使用 @Value 注解注入环境变量。
  2. 示例代码

    spring:
       application:
           name: my-app
       profiles:
           active: ${ENV_PROFILE:dev}
    package com.example.demo;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication {
    
       @Value("${app.name}")
       private String appName;
    
       public static void main(String[] args) {
           SpringApplication.run(DemoApplication.class, args);
       }
    
       @GetMapping("/name")
       public String appName() {
           return appName;
       }
    
    }
实战案例:构建简易Spring Boot微服务应用

设计一个简单的微服务应用

  • 项目结构

    • src/main/java/com/example/demo/DemoApplication.java:启动类
    • src/main/java/com/example/demo/controller/GreetingController.java:控制器
    • src/main/java/com/example/demo/service/GreetingService.java:服务
    • src/main/resources/application.yml:配置文件
  • 启动类

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class DemoApplication {
    
      public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
      }
    
    }
  • 控制器

    package com.example.demo.controller;
    
    import com.example.demo.service.GreetingService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class GreetingController {
    
      private final GreetingService greetingService;
    
      @Autowired
      public GreetingController(GreetingService greetingService) {
          this.greetingService = greetingService;
      }
    
      @GetMapping("/hello")
      public String hello() {
          return greetingService.hello();
      }
    
    }
  • 服务

    package com.example.demo.service;
    
    public class GreetingService {
    
      public String hello() {
          return "Hello, World!";
      }
    
    }

运行和测试微服务应用

  • 运行应用

    • 使用 Maven 命令运行应用:
      mvn clean install
      mvn spring-boot:run
  • 测试应用
    • 使用 curl 或浏览器访问 http://localhost:8080/hello
    • 访问 /hello 接口,预期返回 Hello, World!

部署并监控微服务应用

  1. 打包应用

    mvn clean package
  2. 部署到 Docker

    • 创建 Dockerfile:
      FROM openjdk:8-jdk-alpine
      VOLUME /tmp
      ARG JAR_FILE=target/*.jar
      COPY ${JAR_FILE} app.jar
      ENTRYPOINT ["java","-jar","/app.jar"]
    • 构建并运行 Docker 镜像:
      docker build -t my-spring-boot-app .
      docker run -d -p 8080:8080 my-spring-boot-app
  3. 使用 Spring Boot Actuator 监控应用
    • 添加 Actuator 依赖:
      <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
    • 配置 Actuator:
      management:
       endpoints:
           web:
               exposure:
                   include: "*"
    • 访问监控端点:
      • 访问 /actuator 获取所有可用的监控端点。
      • 访问 /actuator/health 获取应用的健康状态。

通过以上步骤,可以创建、测试、部署并监控一个简单的 Spring Boot 微服务应用。

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