亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

SpringCloud項目開發入門指南

概述

本文详细介绍了Spring Cloud项目开发的相关内容,涵盖了项目搭建、服务发现与注册、服务调用与负载均衡、配置中心的使用以及常用组件的应用,帮助读者更好地理解和使用Spring Cloud进行微服务架构的开发。

1. Spring Cloud简介

1.1 什么是Spring Cloud

Spring Cloud是一系列框架的有序集合,它简化了分布式系统中常见模式的实现,例如配置管理、服务发现、断路器、路由、微服务架构、命令模式、数据分区和全局锁等。Spring Cloud并未提供新的服务,而是将现有的多种框架整合在一起,以提供简单的方式实现分布式系统。

1.2 Spring Cloud的主要组件

Spring Cloud包含了许多组件,其中一些主要的组件包括:

  • Eureka:服务注册与发现。
  • Ribbon:客户端负载均衡。
  • Feign:声明式服务调用。
  • Hystrix:服务容错。
  • Zuul:路由与API网关。
  • Spring Cloud Config:配置中心。

示例代码:

// 使用Eureka注册服务实例
@EnableEurekaClient
@SpringBootApplication
public class ServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceApplication.class, args);
    }
}

1.3 Spring Cloud的优势与应用场景

Spring Cloud的优势在于它简化了微服务架构中各种复杂问题的处理,使得开发人员能够专注于业务逻辑的实现。

  • 简化开发:提供了一套完整的服务治理解决方案,大大简化了开发过程。
  • 服务高可用:提供了服务容错和负载均衡机制,提高了系统的可用性。
  • 分布式配置:通过配置中心可以实现配置的集中化管理,并支持动态刷新配置。
  • 易于扩展:提供了丰富的插件和扩展点,方便开发者根据需求进行自定义。

应用场景包括但不限于:

  • 电商系统:提供高可用的服务,支持大规模并发访问。
  • 金融系统:保证交易的高可靠性和实时性。
  • 物流系统:实现地理位置和库存信息的实时同步。
  • 互联网应用:支持动态扩展和灵活的服务路由。

2. Spring Cloud项目搭建

2.1 准备环境与工具

要开发一个Spring Cloud项目,首先需要准备以下环境和工具:

  • JDK:建议使用JDK 1.8或更高版本。
  • IntelliJ IDEAEclipse:选择一个你熟悉的开发工具。
  • Maven:Spring Cloud项目依赖管理主要通过Maven实现。
  • Spring Boot:Spring Cloud是基于Spring Boot构建的,因此需要安装Spring Boot版本。

2.2 创建Spring Boot父工程

创建Spring Cloud项目第一步是建立一个父工程。父工程用于管理子项目的依赖和配置。以下是创建父工程的具体步骤:

  1. 创建父工程目录

    mkdir spring-cloud-parent
    cd spring-cloud-parent
  2. 初始化父工程的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-parent</artifactId>
       <version>1.0.0</version>
       <packaging>pom</packaging>
       <modules>
           <module>spring-cloud-demo</module>
       </modules>
    </project>
  3. 创建子模块
    在父工程目录下创建一个子模块,用于后续开发具体的Spring Cloud应用。
    mkdir spring-cloud-demo
    cd spring-cloud-demo

2.3 添加Spring Cloud依赖

在子模块的pom.xml文件中添加Spring Cloud相关的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>2.2.5.RELEASE</version>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR8</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

通过上述配置,完成了Spring Cloud项目的基础搭建。

3. 服务发现与注册

3.1 Eureka服务注册与发现

Eureka是Netflix公司开源的一个服务注册与发现组件。在微服务架构中,服务注册与发现是必不可少的一环。Eureka作为一个服务注册中心,允许服务实例注册、注销和查找服务。

3.2 配置与启动Eureka服务器

Eureka服务器是一个单独的微服务,用于管理其他微服务的注册与发现。以下是配置并启动Eureka服务器的步骤:

  1. 创建Eureka服务器工程

    mkdir eureka-server
    cd eureka-server
  2. 初始化Eureka服务的pom.xml文件

    <parent>
       <groupId>com.example</groupId>
       <artifactId>spring-cloud-parent</artifactId>
       <version>1.0.0</version>
    </parent>
    <artifactId>eureka-server</artifactId>
    <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
       </dependency>
    </dependencies>
  3. 配置application.yml
    配置Eureka服务器的基本设置,例如端口、服务注册地址等。

    server:
     port: 8761
    eureka:
     instance:
       hostname: localhost
     client:
       registerWithEureka: false
       fetchRegistry: false
       serviceUrl:
         defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  4. 启动Eureka服务器
    创建一个Spring Boot启动类并启动服务。

    package com.example.eurekaserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
       public static void main(String[] args) {
           SpringApplication.run(EurekaServerApplication.class, args);
       }
    }

示例代码:

// 启动Eureka服务器
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

3.3 创建服务并向Eureka注册

在实际的微服务架构中,服务需要向Eureka服务器注册自己的信息,以便其他服务能够发现和调用。以下是创建一个服务并向Eureka注册的步骤:

  1. 创建服务工程

    mkdir service-provider
    cd service-provider
  2. 初始化服务工程的pom.xml文件

    <parent>
       <groupId>com.example</groupId>
       <artifactId>spring-cloud-parent</artifactId>
       <version>1.0.0</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-netflix-eureka-client</artifactId>
       </dependency>
    </dependencies>
  3. 配置application.yml
    配置服务的端口和Eureka服务器地址。

    server:
     port: 8081
    spring:
     application:
       name: service-provider
    eureka:
     client:
       service-url:
         defaultZone: http://localhost:8761/eureka/
  4. 创建服务类并启动服务
    创建一个简单的REST服务,并启动服务。

    package com.example.serviceprovider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class ServiceProviderApplication {
       public static void main(String[] args) {
           SpringApplication.run(ServiceProviderApplication.class, args);
       }
    }
    
    @RestController
    class ProviderController {
       @GetMapping("/greet")
       public String greet() {
           return "Hello from service provider!";
       }
    }

示例代码:

// 启动服务并注册到Eureka
@EnableEurekaClient
@SpringBootApplication
public class ServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }
}

4. 服务调用与负载均衡

4.1 使用Ribbon实现客户端负载均衡

Ribbon是一个客户端负载均衡工具,可以在客户端实现服务间的负载均衡。Ribbon通过在客户端实现负载均衡逻辑,使客户端能够动态地选择服务实例。

  1. 添加Ribbon依赖
    在服务工程的pom.xml文件中添加Ribbon依赖。

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    </dependency>
  2. 配置Ribbon
    在服务工程的application.yml文件中配置Ribbon。

    spring:
     application:
       name: service-provider
    eureka:
     client:
       service-url:
         defaultZone: http://localhost:8761/eureka/
    ribbon:
     eureka:
       enabled: true
  3. 实现服务调用
    在服务消费方实现调用服务提供方的功能。

    package com.example.serviceconsumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.ribbon.RibbonClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableEurekaClient
    @RibbonClient(name = "service-provider", configuration = RibbonConfiguration.class)
    public class ServiceConsumerApplication {
       public static void main(String[] args) {
           SpringApplication.run(ServiceConsumerApplication.class, args);
       }
    
       @Bean
       public RestTemplate restTemplate() {
           return new RestTemplate();
       }
    }
    
    class RibbonConfiguration {
       // 可以自定义负载均衡策略
    }

示例代码:

// 使用Ribbon调用服务
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "service-provider")
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

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

4.2 Feign声明式服务调用

Feign是一个声明式WebService客户端,它使得编写Web服务客户端变得非常简单。它支持所有Spring Cloud支持的注解,如@RequestMapping等。

  1. 添加Feign依赖
    在服务工程的pom.xml文件中添加Feign依赖。

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. 配置Feign
    在服务工程的application.yml文件中配置Feign。

    spring:
     application:
       name: service-consumer
    eureka:
     client:
       service-url:
         defaultZone: http://localhost:8761/eureka/
  3. 实现Feign客户端
    使用Feign的注解实现服务调用。

    package com.example.serviceconsumer;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient(name = "service-provider")
    public interface ProviderClient {
       @GetMapping("/greet")
       String greet();
    }
  4. 调用Feign客户端
    在服务消费类中调用Feign客户端。

    package com.example.serviceconsumer;
    
    import org.springframework.beans.factory.annotation.Autowired;
    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 {
       public static void main(String[] args) {
           SpringApplication.run(ServiceConsumerApplication.class, args);
       }
    
       @Autowired
       private ProviderClient providerClient;
    
       @RestController
       class ConsumerController {
           @GetMapping("/greet")
           public String greet() {
               return providerClient.greet();
           }
       }
    }

示例代码:

// 使用Feign调用服务
@EnableFeignClients
@SpringBootApplication
public class ServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }
}

4.3 配置与测试服务调用

服务调用的测试可以分为两部分:服务提供方和服务消费方。

  1. 启动服务提供方
    启动之前创建的服务提供方工程。

    mvn spring-boot:run
  2. 启动服务消费方
    启动之前创建的服务消费方工程。

    mvn spring-boot:run
  3. 测试服务调用
    访问服务消费方的/greet接口,查看服务调用结果。
    http://localhost:8082/greet

示例代码:

// 测试服务调用
@RestController
class ConsumerController {
    @Autowired
    private ProviderClient providerClient;

    @GetMapping("/greet")
    public String greet() {
        return providerClient.greet();
    }
}

5. 配置中心

5.1 使用Spring Cloud Config实现配置中心

Spring Cloud Config提供了一个集中化的配置服务器,可以将配置文件存储在Git或本地文件系统中,服务端负责存储和管理配置文件,客户端则从服务端获取相应的配置信息。

5.2 配置服务端与客户端

配置中心的服务端和客户端分别完成不同的功能。

  1. 创建配置中心服务端工程

    mkdir config-server
    cd config-server
  2. 初始化服务端工程的pom.xml文件

    <parent>
       <groupId>com.example</groupId>
       <artifactId>spring-cloud-parent</artifactId>
       <version>1.0.0</version>
    </parent>
    <artifactId>config-server</artifactId>
    <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-config-server</artifactId>
       </dependency>
    </dependencies>
  3. 配置application.yml
    配置服务端的基本信息。

    server:
     port: 8888
    spring:
     cloud:
       config:
         server:
           git:
             uri: https://github.com/yourusername/yourrepo
             username: yourusername
             password: yourpassword
  4. 启动配置中心服务端
    创建一个Spring Boot启动类并启动服务。

    package com.example.configserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.config.server.EnableConfigServer;
    
    @SpringBootApplication
    @EnableConfigServer
    public class ConfigServerApplication {
       public static void main(String[] args) {
           SpringApplication.run(ConfigServerApplication.class, args);
       }
    }

示例代码:

// 启动配置中心服务端
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

5.3 动态刷新配置

Spring Cloud Config支持配置的动态刷新,可以通过请求/actuator/refresh接口来刷新配置。

  1. 添加Actuator依赖
    在服务端的pom.xml文件中添加Actuator依赖。

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  2. 配置Actuator
    在服务端的application.yml文件中开启Actuator的刷新功能。

    management:
     endpoints:
       web:
         exposure:
           include: "*"
     endpoint:
       refresh:
         enabled: true
  3. 创建配置客户端工程

    mkdir config-client
    cd config-client
  4. 初始化客户端工程的pom.xml文件

    <parent>
       <groupId>com.example</groupId>
       <artifactId>spring-cloud-parent</artifactId>
       <version>1.0.0</version>
    </parent>
    <artifactId>config-client</artifactId>
    <dependencies>
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-config</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-actuator</artifactId>
       </dependency>
    </dependencies>
  5. 配置客户端的application.yml
    配置客户端的基本信息。

    spring:
     application:
       name: config-client
     cloud:
       config:
         uri: http://localhost:8888
  6. 启动配置客户端
    创建一个Spring Boot启动类并启动服务。

    package com.example.configclient;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    
    @SpringBootApplication
    public class ConfigClientApplication {
       public static void main(String[] args) {
           SpringApplication.run(ConfigClientApplication.class, args);
       }
    
       @RefreshScope
       class ConfigClientController {
           // 配置客户端逻辑
       }
    }

示例代码:

// 启动配置客户端
@RefreshScope
@SpringBootApplication
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}
  1. 测试动态刷新配置
    当配置中心的配置发生变更时,通过请求/actuator/refresh接口刷新客户端的配置。
    curl -X POST http://localhost:8083/actuator/refresh

示例代码:

// 测试动态刷新配置
@RestController
class ConfigClientController {
    @RefreshScope
    @GetMapping("/refresh")
    public String refresh() {
        return "Config refreshed";
    }
}

6. 其他常用组件介绍

6.1 Zuul路由与API网关

Zuul是Netflix开源的一个路由和服务端过滤器,它负责拦截进入的请求并决定是否将请求转发到其他服务。

  1. 添加Zuul依赖
    在服务工程的pom.xml文件中添加Zuul依赖。

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
  2. 配置Zuul路由
    在服务工程的application.yml文件中配置Zuul路由。

    server:
     port: 8080
    spring:
     application:
       name: api-gateway
     cloud:
       config:
         uri: http://localhost:8888
    zuul:
     routes:
       service-provider:
         path: /provider/**
         url: http://localhost:8081
  3. 启动API网关
    创建一个Spring Boot启动类并启动服务。

    package com.example.apigateway;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableZuulProxy
    public class ApiGatewayApplication {
       public static void main(String[] args) {
           SpringApplication.run(ApiGatewayApplication.class, args);
       }
    }

示例代码:

// 启动API网关
@EnableEurekaClient
@EnableZuulProxy
@SpringBootApplication
public class ApiGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

6.2 Hystrix服务容错

Hystrix是一个用于处理延迟和容错的开源库,旨在隔离依赖的外部系统和服务的失败,防止失败扩散。Spring Cloud整合了Hystrix,提供了断路器功能。

  1. 添加Hystrix依赖
    在服务工程的pom.xml文件中添加Hystrix依赖。

    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
  2. 配置Hystrix
    在服务工程的application.yml文件中配置Hystrix。

    spring:
     application:
       name: service-provider
    eureka:
     client:
       service-url:
         defaultZone: http://localhost:8761/eureka/
    hystrix:
     command:
       default:
         execution:
           isolation:
             thread:
               timeoutInMilliseconds: 2000
  3. 实现服务容错
    在服务类中使用Hystrix命令。

    package com.example.serviceprovider;
    
    import com.netflix.hystrix.HystrixCommand;
    import com.netflix.hystrix.HystrixCommandGroupKey;
    import com.netflix.hystrix.HystrixCommandKey;
    import com.netflix.hystrix.HystrixCommandProperties;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.concurrent.ExecutionException;
    
    @RestController
    public class ProviderController {
    
       @GetMapping("/greet")
       public String greet() {
           try {
               return new HystrixCommand<String>(HystrixCommandKey.Factory.asKey("myCommand"),
                       HystrixCommandGroupKey.Factory.asKey("myGroup"),
                       HystrixCommandProperties.Setter().withExecutionTimeoutEnabled(true)) {
                   @Override
                   protected String run() throws Exception {
                       return "Hello from service provider!";
                   }
               }.execute();
           } catch (ExecutionException e) {
               return "Service unavailable";
           }
       }
    }

示例代码:

// 实现服务容错
@RestController
public class ProviderController {

    @GetMapping("/greet")
    public String greet() {
        try {
            return new HystrixCommand<String>(HystrixCommandKey.Factory.asKey("myCommand"),
                    HystrixCommandGroupKey.Factory.asKey("myGroup"),
                    HystrixCommandProperties.Setter().withExecutionTimeoutEnabled(true)) {
                @Override
                protected String run() throws Exception {
                    return "Hello from service provider!";
                }
            }.execute();
        } catch (ExecutionException e) {
            return "Service unavailable";
        }
    }
}

6.3 模块化开发与部署

Spring Cloud支持模块化开发,可以将大型的Spring Cloud应用拆分成多个独立的微服务,每个微服务可以独立部署和扩展。

  1. 创建独立的微服务模块
    每个微服务模块可以作为一个独立的子模块。

    mkdir microservice1
    cd microservice1
  2. 初始化微服务模块的pom.xml

    <parent>
       <groupId>com.example</groupId>
       <artifactId>spring-cloud-parent</artifactId>
       <version>1.0.0</version>
    </parent>
    <artifactId>microservice1</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-netflix-eureka-client</artifactId>
       </dependency>
    </dependencies>
  3. 配置并启动微服务
    创建一个Spring Boot启动类并启动服务。

    package com.example.microservice1;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class Microservice1Application {
       public static void main(String[] args) {
           SpringApplication.run(Microservice1Application.class, args);
       }
    }

示例代码:

// 启动独立微服务
@EnableEurekaClient
@SpringBootApplication
public class Microservice1Application {
    public static void main(String[] args) {
        SpringApplication.run(Microservice1Application.class, args);
    }
}

通过以上步骤,可以实现Spring Cloud项目的模块化开发与部署,使每个微服务能够独立运行和扩展。

总结

本文详细介绍了Spring Cloud的基本概念、项目搭建、服务发现与注册、服务调用与负载均衡、配置中心的使用以及常用组件如Zuul路由、Hystrix服务容错和模块化开发与部署。通过这些内容的学习,读者能够更好地理解和使用Spring Cloud开发微服务架构的应用。希望本文对您的学习有所帮助,您可以访问慕课网进行更深入的学习。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消