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

SpringCloud Alibaba学习:从入门到初级应用指南

概述

本文详细介绍了SpringCloud Alibaba学习的相关内容,包括其主要组件和服务治理能力,帮助开发者快速入门并应用于实际项目。文章还提供了具体的入门指南和实践案例,展示了如何构建一个简单的电商系统。

SpringCloud Alibaba学习:从入门到初级应用指南
SpringCloud Alibaba简介

SpringCloud Alibaba是什么

SpringCloud Alibaba是阿里巴巴开源的一个基于SpringCloud的微服务解决方案。它提供了微服务架构中常见的功能模块,如服务注册与发现、配置中心、分布式事务等,使得开发者能够更便捷地开发分布式系统。SpringCloud Alibaba为微服务架构提供了全面的支持,包括服务治理、服务监控、熔断降级等。

SpringCloud Alibaba的主要组件

SpringCloud Alibaba主要包括以下几个核心组件:

  1. Nacos:动态服务发现、配置管理和服务管理,作为SpringCloud Alibaba的服务发现与配置中心。
  2. Sentinel:一个轻量级的、高性能的分布式服务保护方案,可以快速、有效地保护微服务免受瞬时高流量和复杂连锁错误的影响。
  3. Seata:一个开源的分布式事务解决方案,旨在提供高性能和可靠性的分布式事务服务。
  4. RocketMQ:一款分布式消息中间件,用于实现系统间的异步解耦。
  5. Dubbo:阿里巴巴开源的服务治理框架,用于构建高性能的微服务架构。
  6. Alibaba Cloud Services:整合了众多阿里巴巴云服务,简化了云服务的使用。

SpringCloud Alibaba的优势和应用场景

SpringCloud Alibaba的优势在于其强大的服务治理能力和全面的微服务支持。它提供了以下几方面的优势:

  1. 服务注册与发现:通过Nacos实现服务的动态注册与发现,简化了服务间的通信。
  2. 配置管理:Nacos不仅支持服务注册与发现,还支持动态配置管理,使配置变更可实时生效。
  3. 分布式事务管理:Seata提供了基于XA和TCC的分布式事务解决方案,确保跨服务的分布式事务的一致性。
  4. 服务监控和保护:Sentinel提供了实时监控和流量控制功能,确保服务在高负载下的稳定运行。

应用场景包括电商、金融、物流等需要高并发、高性能、高可用性的分布式系统。

快速入门SpringCloud Alibaba

准备开发环境

  1. JDK环境:确保安装了JDK 1.8及以上版本。
  2. IDE:推荐使用IntelliJ IDEA或者Eclipse等。
  3. Maven:需要安装Maven 3.0及以上版本。
  4. Git:用于获取源码。
  5. Nacos服务:需要启动Nacos服务。可以从Nacos官网下载并安装。
# 启动Nacos服务
sh bin/startup.sh -m standalone

创建第一个SpringCloud Alibaba应用

创建一个简单的SpringCloud Alibaba应用,包含服务提供者和消费者。

  1. 创建父工程spring-cloud-alibaba
<groupId>com.example</groupId>
<artifactId>spring-cloud-alibaba</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>service-provider</module>
    <module>service-consumer</module>
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2021.0.2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  1. 创建服务提供者service-provider
<parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>service-provider</artifactId>

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

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello() {
            return "Hello, Nacos!";
        }
    }
}
  1. 创建服务消费者service-consumer
<parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>service-consumer</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
package com.example.serviceconsumer;

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

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}
package com.example.serviceconsumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "service-provider")
public interface ServiceProviderClient {
    @GetMapping("/hello")
    String hello();
}
package com.example.serviceconsumer;

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

@RestController
public class HelloController {
    @Autowired
    private ServiceProviderClient serviceProviderClient;

    @GetMapping("/hello")
    public String hello() {
        return serviceProviderClient.hello();
    }
}

部署和运行应用

  1. 启动Nacos服务:按照上文提到的方式启动Nacos服务。
  2. 启动服务提供者和消费者:分别在两个不同的IDE窗口或终端中启动service-providerservice-consumer应用。
# 启动服务提供者
mvn spring-boot:run -f service-provider/pom.xml

# 启动服务消费者
mvn spring-boot:run -f service-consumer/pom.xml
  1. 访问服务:通过浏览器或Postman访问http://localhost:8081/hello,可以查看服务消费者调用服务提供者后返回的Hello, Nacos!
Nacos服务发现与配置管理

Nacos简介

Nacos是一个动态服务发现、配置管理和服务管理平台。Nacos提供了以下功能:

  1. 服务发现:Nacos支持基于DNS和基于API的服务发现,使得微服务之间可以方便地互相调用。
  2. 配置管理:Nacos可以动态地管理配置文件,支持配置的热更新,使应用在不重启的情况下可以实时获取最新的配置。
  3. 服务管理:Nacos提供了服务管理功能,可以实时查看服务状态,支持健康检查和故障转移。

使用Nacos进行服务注册与发现

使用Nacos进行服务注册与发现,需要在服务提供者和消费者中启用Nacos服务发现功能。

  1. 服务提供者的Nacos配置
spring:
  application:
   name: service-provider
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
  1. 服务消费者的Nacos配置
spring:
  application:
   name: service-consumer
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
  1. 在服务提供者中注册服务
package com.example.serviceprovider;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

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

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Nacos配置管理的基本使用

在服务提供者中使用Nacos进行配置管理。

  1. 在Nacos控制台中创建配置

在Nacos控制台中创建一个配置,例如application.properties,设置server.port=8082

  1. 在服务提供者的配置文件中引用Nacos配置
spring:
 cloud:
   nacos:
     config:
       server-addr: 127.0.0.1:8848
       file-extension: yaml
       namespace: 7b41b03c-1234-4657-9c74-9749c4021111
       auto-refresh-enabled: true
  1. 在服务提供者中读取Nacos配置
package com.example.serviceprovider;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/config")
    @RefreshScope
    public String getConfig() {
        return "Server port: " + serverPort;
    }
}
Seata分布式事务管理

Seata简介

Seata是一个开源的分布式事务解决方案,致力于提供高性能和可靠性的分布式事务服务。它支持XA和TCC两种分布式事务模型,使得开发者能够轻松地构建具有高并发、高性能和高可用性的微服务架构。

Seata的分布式事务模型

Seata支持两种分布式事务模型:

  1. XA模式:基于XA协议,实现全局事务的提交和回滚。
  2. TCC模式:Try-Confirm-Cancel模式,由业务服务自己控制事务的提交和回滚。

使用Seata进行分布式事务管理

使用Seata进行分布式事务管理,需要在服务提供者和服务消费者中引入Seata相关依赖,并配置Seata服务器地址。

  1. 引入Seata依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
  1. 配置Seata服务器地址
seata:
  server:
   # Seata服务器地址
   service:
     vgroup-mapping:
       default:
         registry:
           # Seata服务器地址
           address: 127.0.0.1:8091
  1. 使用TCC模式进行分布式事务管理
package com.example.serviceprovider;

import io.seata.core.context.RootContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TccController {
    @Autowired
    private TccService tccService;

    @GetMapping("/tcc")
    public String tcc() {
        String xid = RootContext.getXID();
        return "TCC Transaction: " + xid;
    }
}
package com.example.serviceprovider;

import io.seata.core.context.RootContext;
import org.springframework.stereotype.Component;

@Component
public class TccService {
    public void tccTransaction() {
        String xid = RootContext.getXID();
        // 执行业务逻辑
        System.out.println("TCC Transaction: " + xid);
    }
}
Dubbo微服务开发

Dubbo简介

Dubbo是阿里巴巴开源的一款分布式服务框架,它提供了高性能的RPC调用和丰富的服务治理特性,使得开发者可以轻松地构建高性能的微服务架构。

使用Dubbo构建微服务

  1. 引入Dubbo依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
  1. 配置Dubbo服务
dubbo:
  scan:
    base-packages: com.example.serviceprovider
  registry:
    address: nacos://127.0.0.1:8848
  application:
    name: service-provider
  1. 定义服务接口
package com.example.serviceprovider;

public interface DemoService {
    String sayHello(String name);
}
  1. 实现服务接口
package com.example.serviceprovider;

import org.springframework.stereotype.Service;

@Service
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

Dubbo服务的注册与发现

  1. 服务提供者的注册与发现配置
spring:
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
  1. 服务消费者的注册与发现配置
spring:
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
  1. 服务消费者的配置
dubbo:
  scan:
    base-packages: com.example.serviceconsumer
  registry:
    address: nacos://127.0.0.1:8848
  application:
    name: service-consumer
  1. 调用服务
package com.example.serviceconsumer;

import com.example.serviceprovider.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    @Autowired
    private DemoService demoService;

    @GetMapping("/sayHello")
    public String sayHello(@RequestParam String name) {
        return demoService.sayHello(name);
    }
}

实践案例:构建一个简单的电商系统

结合SpringCloud Alibaba构建一个简单的电商系统

构建一个简单的电商系统,包括商品服务、订单服务和支付服务。

系统架构设计

  1. 商品服务:提供商品信息的查询和更新功能。
  2. 订单服务:提供订单的创建和查询功能。
  3. 支付服务:提供支付功能,支持多种支付方式。

服务拆分与实现

商品服务

  1. 创建商品服务工程product-service
<parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>product-service</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
spring:
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
application:
   name: product-service
package com.example.productservice;

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

@SpringBootApplication
@EnableDiscoveryClient
public class ProductServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductServiceApplication.class, args);
    }
}
package com.example.productservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "product-service")
public interface ProductServiceClient {
    @GetMapping("/products")
    String getProducts();
}
package com.example.productservice;

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

@RestController
public class ProductController {
    @Autowired
    private ProductServiceClient productServiceClient;

    @GetMapping("/products")
    public String getProducts() {
        return productServiceClient.getProducts();
    }
}

订单服务

  1. 创建订单服务工程order-service
<parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>order-service</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
spring:
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
application:
   name: order-service
package com.example.orderservice;

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

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }
}
package com.example.orderservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "product-service")
public interface ProductServiceClient {
    @GetMapping("/products")
    String getProducts();
}
package com.example.orderservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "order-service")
public interface OrderServiceClient {
    @GetMapping("/orders")
    String getOrders();
}
package com.example.orderservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrderController {
    @Autowired
    private ProductServiceClient productServiceClient;
    @Autowired
    private OrderServiceClient orderServiceClient;

    @GetMapping("/orders")
    public String getOrders() {
        String products = productServiceClient.getProducts();
        String orders = orderServiceClient.getOrders();
        return "Products: " + products + ", Orders: " + orders;
    }
}

支付服务

  1. 创建支付服务工程payment-service
<parent>
    <groupId>com.example</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<artifactId>payment-service</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
spring:
 cloud:
   nacos:
     discovery:
       server-addr: 127.0.0.1:8848
application:
   name: payment-service
package com.example.paymentservice;

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

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentServiceApplication.class, args);
    }
}
package com.example.paymentservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "order-service")
public interface OrderServiceClient {
    @GetMapping("/orders")
    String getOrders();
}
package com.example.paymentservice;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {
    @Autowired
    private OrderServiceClient orderServiceClient;

    @GetMapping("/payment")
    public String pay() {
        String orders = orderServiceClient.getOrders();
        return "Payment: " + orders;
    }
}

部署和运行应用

  1. 启动Nacos服务:按照上文提到的方式启动Nacos服务。
  2. 启动商品服务、订单服务和支付服务:分别在不同的IDE窗口或终端中启动product-serviceorder-servicepayment-service应用。
# 启动商品服务
mvn spring-boot:run -f product-service/pom.xml

# 启动订单服务
mvn spring-boot:run -f order-service/pom.xml

# 启动支付服务
mvn spring-boot:run -f payment-service/pom.xml
  1. 访问服务:通过浏览器或Postman访问http://localhost:8081/payment,可以查看支付服务调用订单服务后返回的结果。

通过以上步骤,你已经成功构建了一个简单的电商系统,包括商品服务、订单服务和支付服务。这个系统展示了SpringCloud Alibaba在微服务架构中的应用,包括服务发现、服务调用和分布式事务管理等功能。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消