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

编译部署SpringCloudAlibaba项目实战

概述

本文详细介绍了如何编译部署SpringCloudAlibaba项目实战,包括项目搭建、组件集成、微服务设计、编译及部署等多个环节的具体操作步骤。文中提供了丰富的示例代码和配置文件,帮助开发者快速上手。此外,还介绍了如何进行微服务的集成测试以及使用SkyWalking进行服务监控。通过这些内容,读者可以全面掌握SpringCloudAlibaba项目的开发和部署流程。

引入SpringCloudAlibaba

Spring Cloud Alibaba 是一个基于 Spring Cloud 的子项目,旨在为开发者提供一套简单易用的分布式系统解决方案,包括配置中心、服务网关、服务注册与发现、服务熔断、服务追踪、链路监控等功能。它整合了阿里巴巴开源的多个中间件产品,如 Nacos、Sentinel、Seata、Dubbo 和 RocketMQ,使得开发者能够更加方便地构建微服务架构的应用。

项目搭建前的准备工作

在开始使用 Spring Cloud Alibaba 之前,需要确保开发环境已经配置好 Java 和 Maven 或 Gradle。此外,还需要安装并配置好相关的数据库和中间件服务,例如 MySQL 数据库、Redis 缓存服务、Nacos 服务注册中心等。可以通过社区提供的 Docker 镜像快速部署这些服务,也可以通过手动方式下载安装。

创建第一个SpringCloudAlibaba项目

首先,创建一个新的 Maven 项目,命名为 spring-cloud-alibaba-example,并在 pom.xml 文件中添加 Spring Cloud Alibaba 和 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>spring-cloud-alibaba-example</artifactId>
    <version>1.0.0</version>

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

接下来,创建主启动类 SpringCloudAlibabaExampleApplication,并添加 @EnableDiscoveryClient 注解启用服务注册与发现功能。

package com.example;

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

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

最后,创建一个简单的 REST 控制器 HelloController,用于测试服务是否正常启动。

package com.example.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Cloud Alibaba!";
    }
}

至此,第一个简单的 Spring Cloud Alibaba 项目已经创建完成,可以通过启动项目并访问 http://localhost:8080/hello 来验证服务是否正常运行。

快速入门SpringCloudAlibaba组件

Nacos服务注册与发现

Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台。它提供了一组简单易用的 REST API,可以快速集成到现有的系统中。

在项目中引入 Nacos 依赖后,可以在 application.yml 配置文件中指定 Nacos 服务注册中心的地址。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

在启动项目后,可以访问 Nacos 的管理界面来查看服务注册情况。

Sentinel服务保护

Sentinel 是一个轻量级的、高性能的 Java 通用流量控制库,旨在以流量为切入点,具有高可用的流控、熔断、降级、系统负载保护及服务限流等功能。

pom.xml 中添加 Sentinel 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

application.yml 中配置 Sentinel。

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

在 Java 代码中,可以通过 Sentinel 提供的 API 对服务进行保护。例如,使用 BlockException 捕获流量超出限制的异常。

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;

@RestController
public class SentinelController {

    @SentinelResource(value = "testResource", blockHandler = "handleBlock")
    @GetMapping("/testSentinel")
    public String testSentinel() {
        return "Hello, Sentinel!";
    }

    public String handleBlock(BlockException ex) {
        return "Blocked by Sentinel!";
    }
}

Seata分布式事务

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。它通过代理模式,将事务管理器嵌入到应用服务器中,实现全局事务的管理。

pom.xml 中添加 Seata 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

application.yml 中配置 Seata。

seata:
  enabled: true
  service:
    vgroup-mapping:
      default:
        load-balance: round
        master-slave: false
        registry:
          center:
            registry-type: redis
            servers: localhost:6379
  registry:
    registry-type: redis
    servers: localhost:6379
    cluster:
      name: default
    load-balance: round
  config:
    registry-type: redis
    servers: localhost:6379

在 Java 代码中,可以通过 Seata 提供的 API 对分布式事务进行管理。例如,使用 @GlobalTransactional 注解开启全局事务。

import io.seata.spring.annotation.GlobalTransactional;

@Service
public class OrderService {

    @GlobalTransactional
    public void createOrder() {
        // 业务逻辑
    }
}

Dubbo服务调用

Dubbo 是一个高性能、轻量级的开源 Java RPC 框架,它提供了强大的服务治理功能。在 Spring Cloud Alibaba 中集成 Dubbo 可以轻松实现微服务间的远程调用。

pom.xml 中添加 Dubbo 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-dubbo</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

application.yml 中配置 Dubbo。

dubbo:
  registry:
    address: zookeeper://127.0.0.1:2181

在 Java 代码中,可以通过 Dubbo 提供的 API 进行服务调用。例如,使用 @DubboReference 注解引用远程服务。

import org.apache.dubbo.config.annotation.DubboReference;

@Service
public class OrderServiceImpl {

    @DubboReference
    private OrderService orderService;
}

RocketMQ消息队列

RocketMQ 是一款分布式消息中间件,具有高吞吐量、高可用性和高可靠性的特点。在 Spring Cloud Alibaba 中通过简单的配置即可集成 RocketMQ。

pom.xml 中添加 RocketMQ 依赖。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-rocketmq</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

application.yml 中配置 RocketMQ。

rocketmq:
  name-server: localhost:9876

在 Java 代码中,可以通过 RocketMQ 提供的 API 发送和接收消息。例如,创建一个简单的消息生产者和消费者。

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendCallback;

public class RocketMQProducer {

    public void sendMessage(String topic, String message) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName");
        producer.setNamesrvAddr("localhost:9876");
        producer.start();
        SendResult sendResult = producer.send(new Message(topic, message), new SendCallback() {
            @Override
            public void onSuccess(SendResult sendResult) {
                System.out.println("Message sent successfully");
            }

            @Override
            public void onException(Throwable e) {
                System.out.println("Message sending failed");
            }
        });
    }
}
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(topic = "TestTopic", consumerGroup = "TestConsumerGroup")
public class RocketMQConsumer implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

构建SpringCloudAlibaba微服务

设计微服务架构

在构建微服务应用之前,首先要设计一个合理的架构。通常的微服务架构包括服务注册与发现、服务调用、配置管理、服务保护和消息队列等组件。具体设计可以根据实际业务需求进行调整。

例如,可以设计一个订单服务和一个用户服务,它们之间通过 RPC 调用实现业务逻辑。

使用SpringBoot创建微服务

使用 Spring Boot 可以快速创建微服务应用。以订单服务为例,创建一个新的 Spring Boot 项目,并在 pom.xml 中添加必要的依赖。

<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>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-dubbo</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>

然后,创建主启动类 OrderServiceApplication

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);
    }
}

微服务的配置与启动

application.yml 中配置 Nacos 服务注册中心和 Dubbo。

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    feign:
      sentinel:
        enabled: true
dubbo:
  application:
    name: order-service
  registry:
    address: zookeeper://127.0.0.1:2181

创建一个简单的订单服务接口 OrderService

package com.example.orderservice.service;

import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

@Service
@DubboService
public class OrderService {
    public String createOrder() {
        return "Order created successfully.";
    }
}

最后,启动订单服务并通过 Nacos 查看服务是否已经注册成功。

编译SpringCloudAlibaba项目

项目依赖管理

在 Spring Cloud Alibaba 项目中,依赖管理主要通过 Maven 或 Gradle 来实现。Maven 通过 pom.xml 文件管理依赖,Gradle 通过 build.gradle 文件管理依赖。

Maven/Gradle的使用

Maven 通过在 pom.xml 文件中定义依赖和构建配置来管理项目。例如,下面是一个简单的 pom.xml 文件示例。

<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>spring-cloud-alibaba-example</artifactId>
    <version>1.0.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</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>
            <version>2.2.5.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Gradle 可以通过在 build.gradle 文件中定义依赖和构建配置来管理项目。例如,下面是一个简单的 build.gradle 文件示例。

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

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.5.RELEASE'
}

bootJar {
    baseName = 'spring-cloud-alibaba-example'
    version = '1.0.0'
}

编译项目及常见问题解决

编译项目时,可以通过 Maven 或 Gradle 的命令来完成。例如,使用 Maven 编译项目可以通过以下命令:

mvn clean package

使用 Gradle 编译项目可以通过以下命令:

./gradlew bootJar

如果编译过程中遇到依赖或配置问题,可以通过检查 pom.xmlbuild.gradle 文件来解决。

部署SpringCloudAlibaba项目

部署环境准备

在部署 Spring Cloud Alibaba 项目之前,需要确保部署环境已经准备好了必要的服务。例如,确保 Nacos 服务注册中心、Zookeeper 注册中心、Redis 缓存服务等已经启动并运行。

使用Docker部署微服务

可以使用 Docker 来部署微服务。首先,创建一个 Dockerfile 文件,定义镜像的构建和运行环境。

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/spring-cloud-alibaba-example.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

然后,使用以下命令构建和运行 Docker 镜像。

docker build -t spring-cloud-alibaba-example .
docker run -d -p 8080:8080 --name spring-cloud-alibaba-example spring-cloud-alibaba-example

使用Kubernetes部署微服务

可以使用 Kubernetes 来部署微服务。首先,创建一个 Deployment 和 Service 资源文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-cloud-alibaba-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-cloud-alibaba-example
  template:
    metadata:
      labels:
        app: spring-cloud-alibaba-example
    spec:
      containers:
      - name: spring-cloud-alibaba-example
        image: spring-cloud-alibaba-example
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: spring-cloud-alibaba-example
spec:
  selector:
    app: spring-cloud-alibaba-example
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
  type: LoadBalancer

然后,使用以下命令部署到 Kubernetes 集群。

kubectl apply -f deployment.yaml

测试和监控SpringCloudAlibaba项目

微服务的集成测试

在 Spring Cloud Alibaba 项目中,可以使用 Spring Boot 的集成测试功能来测试微服务。例如,可以通过以下代码创建一个简单的集成测试类 OrderServiceApplicationTests

package com.example.orderservice;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
public class OrderServiceApplicationTests {
    @Autowired
    private OrderService orderService;

    @Test
    public void contextLoads() {
        String result = orderService.createOrder();
        System.out.println(result);
    }
}

使用SkyWalking进行服务监控

SkyWalking 是一个开源的应用和服务性能监视系统,用于监视和追踪微服务架构中的服务、数据库、中间件等。可以使用 SkyWalking 来监控 Spring Cloud Alibaba 项目中的服务。

首先,在 pom.xml 中添加 SkyWalking 监控依赖。

<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-agent-core</artifactId>
    <version>8.1.0</version>
</dependency>

然后,在 application.yml 中配置 SkyWalking。

skywalking:
  endpoint: http://localhost:11800
  service:
    name: order-service
    instance:
      id: order-service-instance
      ip: 127.0.0.1
      port: 8080

在 Java 代码中,可以通过 SkyWalking 提供的 API 进行监控数据的上报。例如,使用 AgentBuilder 进行监控代理。

import org.apache.skywalking.apm.agent.core.boot.BootService;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager;

public class SkyWalkingAgentInitializer {

    public static void initialize() {
        BootService bootService = ServiceManager.INSTANCE.findService(BootService.class);
        bootService.start();
    }
}

日志管理和异常处理

日志管理和异常处理是微服务架构中不可或缺的部分。可以使用 SLF4J 和 Logback 作为日志框架,配置 logback-spring.xml 文件来管理日志输出。

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

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

在代码中通过 @ControllerAdvice 注解来集中处理全局异常。

package com.example.orderservice;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseEntity<String> handleException(Exception e) {
        return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

通过以上步骤,可以构建、测试和部署一个完整的 Spring Cloud Alibaba 微服务项目,并使用 SkyWalking 进行服务监控。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消