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

SpringCloud Alibaba教程:新手入门到实战

标签:
Spring Cloud
概述

SpringCloud Alibaba教程介绍了微服务开发工具包的使用,包括服务注册、配置管理、服务监控等功能。文章详细讲解了Nacos、Sentinel、Seata等组件的集成与应用,帮助开发者构建高效、可靠的分布式系统。此外,还提供了实战案例,演示如何搭建一个简单的微服务系统,包括RocketMQ和Dubbo的集成示例。

SpringCloud Alibaba教程:新手入门到实战
SpringCloud Alibaba简介

SpringCloud Alibaba是什么

SpringCloud Alibaba是一套基于SpringCloud的微服务开发工具包,它包含了阿里巴巴开源的微服务生态中的多个组件,如Nacos、Sentinel、Seata等,旨在为SpringCloud开发者提供一套分布式服务框架,以简化微服务开发、测试、部署和运维。它提供了微服务所需的诸如服务注册、配置管理、服务监控、负载均衡、断路器等功能,使得开发者能够专注于业务逻辑的实现。

为什么要学习SpringCloud Alibaba

学习SpringCloud Alibaba可以帮助开发者掌握微服务架构的开发与维护,提升系统稳定性和扩展性。SpringCloud Alibaba是一套成熟的微服务解决方案,能够帮助开发者构建高效、可靠的分布式系统。掌握SpringCloud Alibaba可以增强个人的技术竞争力,提高在微服务领域的就业机会。

SpringCloud Alibaba的主要组件介绍

SpringCloud Alibaba包含多个关键组件,每个组件都针对分布式系统中的特定问题提供了解决方案:

  • Nacos:提供动态服务发现、配置管理以及元数据管理功能。
  • Sentinel:一个轻量级的、面向生产就绪的流量控制和保护组件。
  • Seata:一个开源的分布式事务解决方案,致力于提供高性能和透明化的分布式事务服务。
  • RocketMQ:一个分布式消息队列,用于异步通信和解耦。
  • Dubbo:一个高性能服务框架,用于构建分布式服务。
环境搭建

开发环境配置

开始之前,需要搭建开发环境。首先,您需要一台安装了Java和Maven的开发机器。建议安装Java 11或更高版本,Maven 3.6或更高版本。此外,还需要安装IDE,如IntelliJ IDEA或Eclipse。

以下是安装Java和Maven的步骤:

  1. 下载Java的JDK安装包并安装。
  2. 下载并安装Maven。
  3. 配置环境变量:
    • 在操作系统中设置JAVA_HOME环境变量指向Java安装目录。
    • 设置PATH环境变量包含Maven的bin目录。
  4. 验证安装是否成功:
    • 在命令行中输入java -version,应显示Java版本信息。
    • 输入mvn -v,应显示Maven版本信息。

Maven依赖配置

在使用SpringCloud Alibaba时,需要在项目中添加相应的Maven依赖。以下是一个基本的SpringBoot项目中的pom.xml配置示例:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.5</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2020.0.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

快速构建第一个SpringCloud Alibaba应用

接下来,我们将基于Spring Boot和SpringCloud Alibaba构建一个简单的服务注册与发现应用。应用将包括一个服务提供者和一个服务消费者。

服务提供者

  1. 创建一个新的Spring Boot项目,并添加SpringCloud Alibaba依赖。
  2. application.yml文件中配置服务提供者的属性:
spring:
  application:
  name: service-provider
  cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848
  1. 创建一个简单的Controller来提供REST服务:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}
  1. 通过@EnableDiscoveryClient注解开启服务注册与发现功能:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

服务消费者

  1. 创建一个新的Spring Boot项目,并添加SpringCloud Alibaba依赖。
  2. application.yml文件中配置服务消费者的属性:
spring:
  application:
  name: service-consumer
  cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848
  feign:
    enabled: true
  1. 创建一个Feign客户端来调用服务提供者的API:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("service-provider")
public interface ProviderClient {

    @GetMapping("/hello")
    String hello();
}
  1. 创建一个Controller来调用Feign客户端:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    private final ProviderClient providerClient;

    public ConsumerController(ProviderClient providerClient) {
        this.providerClient = providerClient;
    }

    @GetMapping("/hello")
    public String hello() {
        return providerClient.hello();
    }
}
  1. 启动服务消费者:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}

通过上述配置,服务提供者和消费者已经集成了SpringCloud Alibaba,可以通过Nacos进行服务注册与发现。

RocketMQ消息队列集成示例

服务提供者配置RocketMQ

  1. pom.xml中添加RocketMQ的依赖:
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.1</version>
</dependency>
  1. application.yml中配置RocketMQ:
rocketmq:
  name-server: 127.0.0.1:9876
  producer:
    group: producer-group
  1. 创建一个简单的生产者发送消息:
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendMessage(String message) {
        rocketMQTemplate.convertAndSend("test-topic", message);
    }
}

服务消费者配置RocketMQ

  1. pom.xml中添加RocketMQ的依赖(与服务提供者相同)。

  2. application.yml中配置RocketMQ(与服务提供者相同)。

  3. 创建一个简单的消费者接收消息:
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageConsumer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void consumeMessage() {
        // 消费者监听消息
        rocketMQTemplate.consumeMessage("test-topic", (message) -> {
            System.out.println("Received message: " + message);
        });
    }
}

Dubbo服务框架集成示例

服务提供者配置Dubbo

  1. pom.xml中添加Dubbo的依赖:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-dubbo</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
  1. application.yml中配置Dubbo:
dubbo:
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: zookeeper://127.0.0.1:2181
  1. 创建一个简单的服务接口:
public interface DemoService {
    String sayHello(String name);
}
  1. 创建一个服务实现:
import com.alibaba.dubbo.config.annotation.Service;

@Service
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}
  1. 启动服务提供者:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({"com.example.demo.service"})
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

服务消费者配置Dubbo

  1. pom.xml中添加Dubbo的依赖(与服务提供者相同)。

  2. application.yml中配置Dubbo(与服务提供者相同)。

  3. 创建一个简单的服务接口引用(与服务提供者相同)。

  4. 创建一个消费者应用来调用服务:
import com.alibaba.dubbo.config.annotation.Reference;
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
public class ServiceConsumerApplication {

    @Reference
    private DemoService demoService;

    @GetMapping("/hello")
    public String hello() {
        return demoService.sayHello("World");
    }

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}

通过上述配置,服务提供者和消费者已经集成了RocketMQ和Dubbo,可以实现消息通信和分布式服务调用。

Nacos服务注册与发现

Nacos简介

Nacos是一个动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构中的应用实现更简单的动态配置管理、服务发现和负载均衡。Nacos的核心功能包括:

  • 服务注册与发现:支持微服务架构下的服务动态注册和发现,提供服务的健康检查。
  • 配置管理:提供集中化的配置管理,支持动态刷新配置,适用于服务端配置和应用配置。
  • 服务管理:提供了可视化的服务管理页面,便于查看服务状态和日志。

配置与使用Nacos作为服务注册中心

使用Nacos作为服务注册中心,需要在服务提供者和服务消费者中进行相应的配置。配置文件通常位于application.yml中。

服务提供者配置

spring:
  application:
  name: service-provider
  cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848

服务消费者配置

spring:
  application:
  name: service-consumer
  cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8848
  feign:
    enabled: true

SpringCloud Alibaba中Nacos的集成示例

我们通过前面构建的服务提供者和服务消费者示例来展示如何在SpringCloud Alibaba中集成Nacos。

服务提供者示例

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

服务消费者示例

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}

通过这些配置,服务提供者和服务消费者都将注册到Nacos服务注册中心,并通过服务发现机制实现相互调用。

Sentinel服务治理

Sentinel简介

Sentinel是一个轻量级的开源服务治理组件,提供流量控制、熔断降级、系统保护等功能。它旨在帮助分布式系统构建韧性,确保系统在高并发和高流量压力下的稳定性和可用性。Sentinel的核心功能包括:

  • 流量控制:根据流量模式和规则定义来控制请求流量,防止过载。
  • 熔断降级:在系统超负荷时触发熔断,防止雪崩效应。
  • 系统保护:监控系统关键指标(如CPU、内存等),在超过阈值时进行保护。
  • 热点防护:防止热点数据导致的系统过载。

使用Sentinel进行流量控制、降级和系统保护

Sentinel通过定义资源和规则来实现流量控制、熔断降级和系统保护。资源可以是一条链路(如一个API),规则定义了如何处理该链路上的请求。

流量控制

流量控制是对入口流量进行控制,避免瞬时的大量流量涌入导致系统过载。可以通过设置阈值来控制请求速率。

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import java.util.ArrayList;
import java.util.List;

public class FlowController {

    public static void main(String[] args) {
        // 定义资源和规则
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule("service-api");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setCount(10);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);

        // 测试流量控制
        while (true) {
            try (Entry entry = SphU.entry("service-api")) {
                // 模拟业务逻辑
                System.out.println("Request processed");
            } catch (BlockException e) {
                System.out.println("Flow control triggered");
            }
        }
    }
}

熔断降级

熔断降级是在系统超负荷时触发熔断机制,防止雪崩效应。可以通过设置熔断策略来实现。

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;

import java.util.ArrayList;
import java.util.List;

public class CircuitBreaker {

    public static void main(String[] args) {
        // 定义资源和规则
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule("service-api");
        rule.setGrade(RuleConstant.FLOW_GRADE_RT);
        rule.setCount(1000);
        rule.setStatIntervalMs(1000);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);

        // 测试熔断降级
        while (true) {
            try (Entry entry = SphU.entry("service-api")) {
                // 模拟业务逻辑
                System.out.println("Request processed");
            } catch (BlockException e) {
                System.out.println("Circuit breaker triggered");
            }
        }
    }
}

系统保护

系统保护是监控系统关键指标(如CPU、内存、网络等),在超过阈值时进行保护。

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;

import java.util.ArrayList;
import java.util.List;

public class SystemProtection {

    @SentinelResource(value = "service-api")
    public void serviceApi() {
        // 模拟业务逻辑
        System.out.println("Request processed");
    }

    public static void main(String[] args) {
        // 定义系统保护规则
        List<SystemRule> rules = new ArrayList<>();
        SystemRule rule = new SystemRule();
        rule.setGrade(RuleConstant.SYSTEM_BLOCK_RULE);
        rule.setResource("service-api");
        rule.setCount(100);
        rule.setDurationInSec(1);
        rules.add(rule);
        SystemRuleManager.loadRules(rules);

        // 测试系统保护
        SystemProtection service = new SystemProtection();
        while (true) {
            service.serviceApi();
        }
    }
}

SpringCloud Alibaba中Sentinel的集成示例

在SpringCloud Alibaba项目中,可以通过@SentinelResource注解来标记需要保护的资源。以下是一个示例:

服务提供者中的资源保护

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @GetMapping("/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello, World!";
    }
}

服务消费者的资源保护

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient("service-provider")
public interface ProviderClient {

    @GetMapping("/hello")
    @SentinelResource("hello")
    String hello();
}

通过上述配置,服务提供者和服务消费者的资源都被保护起来,以应对高并发和高流量压力。

Seata分布式事务

Seata简介

Seata是一个开源的分布式事务解决方案,致力于提供高性能和透明化的分布式事务服务。它主要解决微服务架构下的分布式事务问题,包括全局事务、资源管理器、事务管理器等组件。Seata的核心功能包括:

  • 全局事务管理:支持XA模式的全局事务管理。
  • 资源管理器:通过插件方式集成到数据库,实现事务的管理和提交。
  • 事务管理器:负责协调全局事务的提交和回滚。

Seata的工作原理

Seata的工作原理基于三阶段提交协议(两阶段提交协议的变种),包括:

  1. Prepare阶段:客户端向事务管理器发起准备请求,事务管理器向各个资源管理器发送准备请求。
  2. Commit/Rollback阶段:事务管理器根据Prepare阶段的结果决定提交或回滚事务,通知资源管理器执行相应的操作。
  3. Commit/Rollback阶段:资源管理器执行提交或回滚操作。

使用Seata实现分布式事务管理

使用Seata实现分布式事务管理需要在服务提供者和服务消费者中进行相应的配置和代码编写。

服务提供者的配置

在服务提供者的application.yml中添加Seata配置:

seata:
  transaction:
  service:
    enable: true
    application-id: service-provider
    tx-service-group: Default
    # 数据库驱动配置
    datasource:
      default:
        enabled: true
        # 数据库连接信息
        username: root
        password: root
        # 数据源类型
        type: mysql
        # 数据源配置
        jdbc-url: jdbc:mysql://localhost:3306/seata

服务提供者的代码示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/transfer")
    public String transfer() {
        // 开始全局事务
        GlobalTransaction tx = new DefaultGlobalTransaction();
        try {
            // 执行数据库操作
            int result = jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE user_id = 1");
            if (result > 0) {
                // 提交事务
                tx.commit();
                return "Transfer success";
            } else {
                // 回滚事务
                tx.rollback();
                return "Transfer failed";
            }
        } catch (Exception e) {
            // 回滚事务
            tx.rollback();
            return "Transfer failed: " + e.getMessage();
        }
    }
}

服务消费者的配置

在服务消费者的application.yml中添加Seata配置:

seata:
  transaction:
  service:
    enable: true
    application-id: service-consumer
    tx-service-group: Default
    # 数据库驱动配置
    datasource:
      default:
        enabled: true
        # 数据库连接信息
        username: root
        password: root
        # 数据源类型
        type: mysql
        # 数据源配置
        jdbc-url: jdbc:mysql://localhost:3306/seata

服务消费者的代码示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/refund")
    public String refund() {
        // 开始全局事务
        GlobalTransaction tx = new DefaultGlobalTransaction();
        try {
            // 执行数据库操作
            int result = jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE user_id = 2");
            if (result > 0) {
                // 提交事务
                tx.commit();
                return "Refund success";
            } else {
                // 回滚事务
                tx.rollback();
                return "Refund failed";
            }
        } catch (Exception e) {
            // 回滚事务
            tx.rollback();
            return "Refund failed: " + e.getMessage();
        }
    }
}

SpringCloud Alibaba中Seata的集成示例

在SpringCloud Alibaba项目中,可以通过配置文件和服务代码来集成Seata。

配置文件示例

application.yml中配置Seata:

seata:
  transaction:
    service:
      enable: true
      application-id: service-provider
      tx-service-group: Default
      # 数据库驱动配置
      datasource:
        default:
          enabled: true
          # 数据库连接信息
          username: root
          password: root
          # 数据源类型
          type: mysql
          # 数据源配置
          jdbc-url: jdbc:mysql://localhost:3306/seata

服务提供者示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/transfer")
    public String transfer() {
        // 开始全局事务
        GlobalTransaction tx = new DefaultGlobalTransaction();
        try {
            // 执行数据库操作
            int result = jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE user_id = 1");
            if (result > 0) {
                // 提交事务
                tx.commit();
                return "Transfer success";
            } else {
                // 回滚事务
                tx.rollback();
                return "Transfer failed";
            }
        } catch (Exception e) {
            // 回滚事务
            tx.rollback();
            return "Transfer failed: " + e.getMessage();
        }
    }
}

通过上述配置和服务代码,服务提供者和服务消费者都可以通过Seata进行分布式事务管理。

实战案例:搭建一个简单的微服务系统

实战项目需求分析

假设我们正在开发一个电商系统,该系统包括订单服务、商品服务、用户服务等多个微服务。订单服务负责处理订单相关的逻辑,商品服务负责处理商品相关的逻辑,用户服务负责处理用户相关的逻辑。我们需要一个简单的微服务系统来实现这些功能。

微服务设计与实现

我们将使用SpringCloud Alibaba构建这个简单的微服务系统。系统包括以下组件:

  • 订单服务:处理订单相关的逻辑,如创建订单、查询订单、支付订单等。
  • 商品服务:处理商品相关的逻辑,如查询商品信息、修改商品信息等。
  • 用户服务:处理用户相关的逻辑,如登录、注册、查询用户信息等。

订单服务

订单服务的核心逻辑包括创建订单和查询订单。以下是一个简单的订单服务的实现:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @PostMapping("/createOrder")
    public String createOrder(@RequestParam("userId") int userId, @RequestParam("productId") int productId) {
        // 创建订单
        jdbcTemplate.update("INSERT INTO orders (user_id, product_id) VALUES (?, ?)", userId, productId);
        return "Order created";
    }

    @GetMapping("/getOrder")
    public String getOrder(@RequestParam("orderId") int orderId) {
        // 查询订单
        String order = jdbcTemplate.queryForObject("SELECT * FROM orders WHERE id = ?", String.class, orderId);
        return order;
    }
}

商品服务

商品服务的核心逻辑包括查询商品信息和修改商品信息。以下是一个简单的商品服务的实现:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProductController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @GetMapping("/getProduct")
    public String getProduct(@RequestParam("productId") int productId) {
        // 查询商品信息
        String product = jdbcTemplate.queryForObject("SELECT * FROM products WHERE id = ?", String.class, productId);
        return product;
    }

    @PostMapping("/updateProduct")
    public String updateProduct(@RequestParam("productId") int productId, @RequestParam("name") String name) {
        // 修改商品信息
        jdbcTemplate.update("UPDATE products SET name = ? WHERE id = ?", name, productId);
        return "Product updated";
    }
}

用户服务

用户服务的核心逻辑包括登录、注册和查询用户信息。以下是一个简单的用户服务的实现:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @PostMapping("/register")
    public String register(@RequestParam("username") String username, @RequestParam("password") String password) {
        // 注册用户
        jdbcTemplate.update("INSERT INTO users (username, password) VALUES (?, ?)", username, password);
        return "User registered";
    }

    @GetMapping("/getUser")
    public String getUser(@RequestParam("userId") int userId) {
        // 查询用户信息
        String user = jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?", String.class, userId);
        return user;
    }
}

服务的部署与测试

部署和测试微服务系统时,需要确保所有服务都能正确地注册到Nacos并互相通信。可以使用Docker或Kubernetes等工具来部署这些服务。

部署到Docker

  1. 创建Dockerfile和Docker Compose文件来定义服务的镜像和运行时配置。以下是一个简单的Dockerfile示例:
FROM openjdk:11-jre-slim
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-XX:+UseG1GC","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  1. 创建Docker Compose文件来定义服务的部署配置。以下是一个示例:
version: '3'
services:
  order-service:
    build: ./order-service
    ports:
      - "8081:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_CLOUD_ALIBABA_NACOS_SERVER-ADDR=localhost:8848
  product-service:
    build: ./product-service
    ports:
      - "8082:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_CLOUD_ALIBABA_NACOS_SERVER-ADDR=localhost:8848
  user-service:
    build: ./user-service
    ports:
      - "8083:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=dev
      - SPRING_CLOUD_ALIBABA_NACOS_SERVER-ADDR=localhost:8848
  1. 使用docker-compose up命令启动服务。

测试服务

  1. 访问订单服务的创建订单和查询订单接口,确保订单创建和查询功能正常。
  2. 访问商品服务的查询商品信息和修改商品信息接口,确保商品信息查询和修改功能正常。
  3. 访问用户服务的注册用户和查询用户信息接口,确保用户注册和查询功能正常。

通过以上步骤,我们成功地搭建并测试了一个简单的微服务系统。该系统包括订单服务、商品服务和用户服务,通过SpringCloud Alibaba实现了服务注册与发现、服务治理和分布式事务管理。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消