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

Springboot微服务学习:从入门到实践

概述

Spring Boot微服务学习涵盖了从Spring Boot框架的基本介绍到微服务架构的实践,包括快速搭建Spring Boot项目、配置管理、微服务部署与监控等内容。本文详细讲解了如何通过Spring Cloud实现服务注册与发现、负载均衡、容错处理以及使用API网关进行管理。

Spring Boot简介

什么是Spring Boot

Spring Boot是由Pivotal团队提供的框架,其主要目标是简化Spring应用的初始搭建以及开发过程。Spring Boot为Spring开发者提供了一种新的选择,帮助其快速搭建一个独立运行、生产级别的基于Spring的应用程序。

Spring Boot通过约定优于配置原则,使得应用开发变得更为简单。这意味着开发者不需要大量的XML或者Java配置代码,而是通过约定和默认配置来快速搭建一个运行的项目。

Spring Boot的优势

  1. 简化配置:Spring Boot通过约定优于配置的原则,减少了大量的配置文件编写。
  2. 自动配置:Spring Boot可以根据应用的依赖自动配置Spring。
  3. 内嵌Web服务器:默认情况下,Spring Boot提供了一个内嵌的Tomcat或Jetty服务器,使得应用可以直接运行。
  4. 起步依赖:通过Maven或Gradle的起步依赖,可以快速添加常用的库依赖,如Spring Data、Spring Security等。
  5. 健康检查:内置的健康检查功能,可以检查应用的健康状态。
  6. Actuator端点:提供了一系列的管理端点,以监控应用的状态和性能。
  7. 打包:Spring Boot可以将应用打包成一个独立的可执行的JAR文件,方便部署。

快速搭建一个Spring Boot项目

创建Spring Boot项目

  1. 使用Spring Initializr快速创建项目

    • 访问Spring Initializr网站:https://start.spring.io/
    • 选择项目的基本信息,如Java版本、Spring Boot版本、项目名、组名等。
    • 选择所需的依赖,例如Spring Web、Spring Data JPA等。
    • 生成项目并下载。
  2. 使用IDE工具

    • 使用IDEA或Eclipse等IDE工具,选择Spring Initializr模板进行创建。
  3. 手动创建项目
    • 通过Maven或Gradle创建一个新的Java项目。
    • 添加Spring Boot相关的依赖。

手动创建项目示例:

<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.7.5</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Gradle构建文件示例:

plugins {
    id 'org.springframework.boot' version '2.7.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

项目依赖管理

Spring Boot使用Maven或Gradle进行依赖管理,推荐使用Maven,因为它在Spring Boot项目中更为常见。

添加依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Gradle依赖管理:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
}

配置文件详解

Spring Boot使用application.propertiesapplication.yml文件来管理配置。

示例:

# application.yml
spring:
  application:
    name: demo
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: update

application.properties示例:

# application.properties
spring.application.name=demo
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update

微服务基础

微服务架构概述

微服务架构是一种将单体应用程序分解为多个小的、模块化服务的方法。每个服务运行在自己的进程中,并通过轻量级的通信机制(如HTTP REST API)进行通信。微服务架构使得应用更加灵活和可扩展,每个服务可以独立部署,独立扩展,独立升级。

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

  • 单体架构

    • 将整个应用作为一个单一的单元进行部署。
    • 部署复杂,整个应用需要重新部署。
    • 扩展困难,整个应用需要扩展。
    • 难以支持多种编程语言和技术栈。
  • 微服务架构
    • 将应用分解为多个小的、模块化的服务。
    • 每个服务可以独立部署、独立扩展。
    • 支持多种编程语言和技术栈。

微服务的优点与挑战

优点

  1. 独立部署:每个微服务可以独立部署,快速迭代。
  2. 可扩展性:每个微服务可以独立扩展,不需要为了整个应用扩展。
  3. 技术栈灵活:每个服务可以使用不同的编程语言和技术栈。
  4. 容错性:服务之间通过API进行通信,一个服务的故障不会影响整个应用。

挑战

  1. 复杂性:微服务架构使得系统更复杂,需要更多的管理工具。
  2. 服务通信:服务之间的通信需要可靠的机制,增加了复杂性。
  3. 监控与日志:需要更多的监控和日志工具来管理服务。
  4. 数据一致性:服务之间需要良好的数据一致性机制。

Spring Boot项目实践

创建Spring Boot项目

  • 使用Spring Initializr创建一个简单的Spring Boot项目。
  • 配置Maven或Gradle。

项目依赖管理

  1. 添加Spring Web依赖
    • 用于创建Web应用。
    • 示例:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Gradle示例:

implementation 'org.springframework.boot:spring-boot-starter-web'
  1. 添加Spring Data JPA依赖
    • 用于数据库操作。
    • 示例:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle示例:

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'

配置文件详解

  1. Spring Boot应用配置
    • application.propertiesapplication.yml
    • 示例:
# application.yml
spring:
  application:
    name: demo
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: update

application.properties示例:

# application.properties
spring.application.name=demo
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update

微服务实践

创建多个微服务

  • 创建多个Spring Boot项目,每个项目作为一个微服务。
  • 使用不同的端口和上下文路径。
  1. 创建第一个微服务
    • 创建一个新的Spring Boot项目。
    • 配置端口和上下文路径。
    • 示例:
server:
 port: 8081
spring:
 application:
    name: service-a
  profiles:
    active: dev
  1. 创建第二个微服务
    • 创建一个新的Spring Boot项目。
    • 配置端口和上下文路径。
    • 示例:
server:
 port: 8082
spring:
 application:
    name: service-b
  profiles:
    active: dev

Java代码示例:

@RestController
public class ServiceAController {

    @GetMapping("/service-a")
    public String getServiceA() {
        return "Service A";
    }
}

使用Spring Cloud进行服务注册与发现

  1. 添加Spring Cloud依赖
    • 添加spring-cloud-starter-netflix-eureka-serverspring-cloud-starter-netflix-eureka-client
    • 示例:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Gradle示例:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
  1. 配置Eureka服务注册中心
    • 创建一个新的Spring Boot项目作为Eureka服务注册中心。
    • 配置application.yml文件:
    • 示例:
spring:
 application:
    name: eureka-server
  profiles:
    active: dev
eureka:
 client:
    register-with-eureka: false
    fetch-registry: false
 server:
    enable-self-preservation: false
  1. 配置微服务加入Eureka注册中心
    • 在每个微服务的配置文件中添加Eureka配置。
    • 示例:
spring:
 application:
    name: service-a
  profiles:
    active: dev
eureka:
 client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
        defaultZone: http://localhost:8761/eureka/

实现服务间通信

  1. 创建REST API服务
    • 在每个微服务中创建REST API服务。
    • 示例:
@RestController
public class ServiceAController {

    @GetMapping("/service-a")
    public String getServiceA() {
        return "Service A";
    }
}
  1. 调用其他服务的API
    • 使用RestTemplateFeign客户端调用其他服务的API。
    • 示例:
@Autowired
private RestTemplate restTemplate;

@GetMapping("/call-service-b")
public String callServiceB() {
    return restTemplate.getForObject("http://service-b/service-b", String.class);
}

Java代码示例

服务间通信示例:

@RestController
public class ServiceBClient {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call-service-a")
    public String callServiceA() {
        return restTemplate.getForObject("http://service-a/service-a", String.class);
    }
}

微服务部署与监控

微服务部署策略

  • 独立部署
    • 每个微服务独立部署。
    • 使用Docker容器化部署。
  • 集中部署
    • 将多个微服务部署到一个Docker容器中。
    • 使用Kubernetes或Docker Swarm进行管理。

使用Docker部署Spring Boot微服务

  1. 创建Dockerfile
    • 配置Dockerfile文件以构建Docker镜像。
    • 示例:
FROM openjdk:11-jre-slim
VOLUME /tmp
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 构建Docker镜像
    • 使用Docker命令构建镜像。
    • 示例:
docker build -t myapp:1.0 .
  1. 运行Docker容器
    • 使用Docker命令运行容器。
    • 示例:
docker run -p 8081:8081 myapp:1.0

监控与日志管理

  1. 使用Spring Boot Actuator
    • 添加spring-boot-starter-actuator依赖。
    • 配置application.yml启用管理端点。
    • 示例:
management:
 endpoints:
    web:
      exposure:
        include: "*"
  1. 配置日志
    • 使用logback.xmllogback-spring.xml配置日志。
    • 示例:
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

Spring Boot微服务进阶

容错与负载均衡

  1. 使用Spring Cloud的负载均衡
    • 添加spring-cloud-starter-netflix-ribbon依赖。
    • 配置负载均衡策略。
    • 示例:
spring:
 application:
    name: service-a
eureka:
 client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
        defaultZone: http://localhost:8761/eureka/
ribbon:
 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule

Gradle示例:

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-ribbon'
  1. 使用服务熔断
    • 添加spring-cloud-starter-netflix-hystrix依赖。
    • 配置熔断策略。
    • 示例:
hystrix:
 command:
    default:
        execution:
            isolation:
                thread:
                    timeoutInMilliseconds: 5000

服务容错策略

  1. 使用Hystrix进行服务降级
    • 使用@HystrixCommand注解进行服务降级处理。
    • 示例:
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixThreadPoolKey;
import com.netflix.hystrix.HystrixThreadPoolProperties;
import com.netflix.hystrix.HystrixThreadPoolProperties.Setter;

public class ServiceBClient {

    public String getServiceB() {
        return HystrixCommand.builder()
                .groupKey(HystrixCommandGroupKey.Factory.asKey("ServiceBGroup"))
                .commandKey(HystrixCommandKey.Factory.asKey("ServiceBKey"))
                .threadPoolPropertiesSetter(Setter().coreSize(10))
                .executionTimeoutInMilliseconds(5000)
                .build(() -> restTemplate.getForObject("http://service-b/service-b", String.class))
                .execute();
    }
}

简单的API网关实现

  1. 使用Spring Cloud Gateway作为API网关
    • 添加spring-cloud-starter-gateway依赖。
    • 配置路由规则。
    • 示例:
spring:
 cloud:
    gateway:
      routes:
        - id: service_a
          uri: http://localhost:8081
          predicates:
            - Path=/service-a/**
        - id: service_b
          uri: http://localhost:8082
          predicates:
            - Path=/service-b/**

Gradle示例:

implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
  1. 配置服务发现
    • 使用Eureka服务发现。
    • 示例:
spring:
 cloud:
    gateway:
      discovery:
        locator:
          enabled: true

通过以上步骤,可以实现一个简单的Spring Boot微服务体系,并通过Spring Cloud进行服务注册与发现、负载均衡、容错处理以及更高级的API网关管理。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消