当前位置: 首页 > article >正文

Java Web开发实战与项目——Spring Boot与Spring Cloud微服务项目实战

企业级应用中,微服务架构已经成为一种常见的开发模式。Spring Boot与Spring Cloud提供了丰富的工具和组件,帮助开发者快速构建、管理和扩展微服务应用。本文将通过一个实际的微服务项目,展示如何使用Spring Boot与Spring Cloud构建微服务架构,处理微服务间调用、容错处理,并最终部署到Kubernetes集群中。


1. 构建微服务项目与数据库分离

在构建微服务项目时,通常会使用多个微服务来分担不同的业务功能,而每个微服务拥有自己的数据库,确保了数据的解耦。这种方式在提高系统可扩展性、可维护性的同时,也能有效减少数据访问的耦合度。

1.1 项目结构

假设我们构建一个在线商城系统,分为两个微服务:用户服务(User Service)和商品服务(Product Service)。每个服务都有自己的数据库,分别存储用户信息和商品信息。

  • user-service: 管理用户信息、登录、注册等功能。
  • product-service: 管理商品的展示、库存等功能。
spring-cloud-microservices/
├── user-service
│   ├── src/main/java/com/example/userservice
│   └── src/main/resources/application.yml
├── product-service
│   ├── src/main/java/com/example/productservice
│   └── src/main/resources/application.yml
└── pom.xml
1.2 用户服务(User Service)

user-service 使用 Spring Boot 和 Spring Data JPA 来与数据库交互,提供用户管理功能。

application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/userdb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  server:
    port: 8081

UserService.java

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User getUserById(Long id) {
        return userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
    }

    public User createUser(User user) {
        return userRepository.save(user);
    }
}

UserController.java

1.3 商品服务(Product Service)

product-service 也使用 Spring Boot 和 Spring Data JPA 来与数据库交互,管理商品信息。

application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/productdb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  server:
    port: 8082

ProductService.java

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public Product getProductById(Long id) {
        return productRepository.findById(id).orElseThrow(() -> new RuntimeException("Product not found"));
    }

    public Product createProduct(Product product) {
        return productRepository.save(product);
    }
}

ProductController.java

@RestController
@RequestMapping("/api/products")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.getProductById(id);
    }

    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        return productService.createProduct(product);
    }
}
1.4 数据库分离

如上所述,user-serviceproduct-service 使用独立的数据库来存储各自的数据。这种数据库分离的策略可以通过Spring Boot的配置文件来实现,确保每个服务拥有自己独立的数据库连接和表结构。


2. 微服务间的调用与容错处理

在微服务架构中,服务间的调用是非常常见的场景。Spring Cloud提供了丰富的工具来简化服务间的通信,如FeignRibbonHystrix等。我们将使用Feign进行服务间调用,并使用Hystrix进行容错处理。

2.1 使用Feign进行服务间调用

Feign是Spring Cloud中的一种声明式Web服务客户端。它使得微服务间的调用变得简洁、直观。

ProductServiceFeignClient.java(用户服务调用商品服务)

@FeignClient(name = "product-service", fallback = ProductServiceFallback.class)
public interface ProductServiceFeignClient {
    @GetMapping("/api/products/{id}")
    Product getProductById(@PathVariable("id") Long id);
}

ProductServiceFallback.java(商品服务降级处理)

@Component
public class ProductServiceFallback implements ProductServiceFeignClient {
    @Override
    public Product getProductById(Long id) {
        // 进行降级处理,返回默认的商品数据
        return new Product(id, "Fallback Product", 0);
    }
}
2.2 使用Hystrix进行容错处理

Hystrix是Spring Cloud的一部分,它提供了服务的容错、降级、超时控制等能力。在微服务间调用时,如果某个服务不可用,Hystrix可以触发一个回调方法(即降级逻辑),以保证系统的健壮性。

user-service中配置Hystrix:

application.yml

spring:
  cloud:
    feign:
      hystrix:
        enabled: true

UserService.java

@Component
public class ProductServiceFallback implements ProductServiceFeignClient {
    @Override
    public Product getProductById(Long id) {
        // 进行降级处理,返回默认的商品数据
        return new Product(id, "Fallback Product", 0);
    }
}

这样,当product-service不可用时,Hystrix会触发ProductServiceFallback中的方法,防止系统崩溃。


3. 部署到Kubernetes集群

Kubernetes是现代微服务架构中流行的容器编排平台,提供了高可用性、自动伸缩和负载均衡等功能。下面将演示如何将Spring Boot与Spring Cloud构建的微服务部署到Kubernetes集群。

3.1 创建Docker镜像

首先,我们需要将user-serviceproduct-service打包成Docker镜像,并推送到Docker Hub或私有镜像仓库。

Dockerfile(用户服务)

FROM openjdk:11-jre-slim
COPY target/user-service-1.0.0.jar /app/user-service.jar
ENTRYPOINT ["java", "-jar", "/app/user-service.jar"]

Dockerfile(商品服务)

FROM openjdk:11-jre-slim
COPY target/product-service-1.0.0.jar /app/product-service.jar
ENTRYPOINT ["java", "-jar", "/app/product-service.jar"]

使用以下命令构建Docker镜像并推送:

docker build -t username/user-service .
docker build -t username/product-service .
docker push username/user-service
docker push username/product-service
3.2 Kubernetes部署配置

创建Kubernetes部署配置文件来部署user-serviceproduct-service

user-service-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
        - name: user-service
          image: username/user-service:latest
          ports:
            - containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
  name: user-service
spec:
  selector:
    app: user-service
  ports:
    - port: 8081
      targetPort: 8081

product-service-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: product-service
  template:
    metadata:
      labels:
        app: product-service
    spec:
      containers:
        - name: product-service
          image: username/product-service:latest
          ports:
            - containerPort: 8082
---
apiVersion: v1
kind: Service
metadata:
  name: product-service
spec:
  selector:
    app: product-service
  ports:
    - port: 8082
      targetPort: 8082

使用以下命令部署到Kubernetes集群:

kubectl apply -f user-service-deployment.yml
kubectl apply -f product-service-deployment.yml

总结

本文展示了如何使用Spring Boot和Spring Cloud构建微服务架构,包括数据库分离、微服务间调用与容错处理,以及如何将微服务部署到Kubernetes集群中。通过实践这些步骤,你可以创建一个高度可扩展且具有容错能力的微服务应用,为生产环境的部署和维护做好准备。

关于作者:

15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我


http://www.kler.cn/a/561643.html

相关文章:

  • 总结递推与递归的区别
  • WPS计算机二级•文档的页面设置与打印
  • 实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能
  • IDEA配置JSP环境
  • 特征工程 (Feature Enginering)基础知识1
  • LeetCode 热题100 15. 三数之和
  • 全面屏手势导航栏适配
  • ‌XPath vs CSS Selector 深度对比
  • 学习Flask:Day 2:模板与表单开发
  • Grafana使用日志5--如何重置Grafana密码
  • Java包装类性能优化:深入解析Integer享元模式的源码实现
  • SSL/TLS 协议、SSL证书 和 SSH协议 的区别和联系
  • 冯诺依曼体系结构和操作系统
  • 批量将手机照片修改为一寸白底证件照的方法
  • Python Cookbook-2.12 将二进制数据发送到 Windows 的标准输出
  • Jmeter插件下载及安装
  • 第4章 4.4 EF Core数据库迁移 Add-Migration UpDate-Database
  • Hot100 Java之Acm模式 4-7(双指针)
  • 国科大——数据挖掘(0812课程)——课后作业
  • Vue进阶之AI智能助手项目(二)——项目评审与架构设计