Spring Cloud Alibaba从入门到实践一网打尽

226 阅读8分钟

什么是Spring Cloud Alibaba

这里我们不讲解Spring Cloud 和 Spring Cloud Alibaba 的关系,大家自己查看下官网就明白了!!

Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案。项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

这是官网的一句话,主要分析这句话我们可以看出来Spring Cloud Alibaba 是一种分布式的解决方案,不是框架,也不是架构,而是一种方案。方案的作用是用来解决分布式服务所遇到的问题。 比如说如果我们在做微服务之间的调用的时候,Spring Cloud Alibaba 给的解决方案是用Nacos 来做服务注册和管理,用Feign 来做服务之间的自由调用。类似的组件阿里云提供了很多, Spring Cloud Alibaba 官网

Spring Cloud Alibaba 主要组件

  • Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
  • Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
  • Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  • Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
  • Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件分为商业和非商业和 大家可以简单理解为 ,马爸爸 提供了一套基础的分布式解决方案,基础的是免费的,当然基础的组件足以满足中小型公司的对生产环境的需求。


但是,在使用相关组件的开发过程中,版本依赖这个东西有的时候是真的头疼,我记得有无数次在开发过程中出现莫名其妙的问题,最后都是从官网发现,是版本依赖的问题,然后就各种内心无数的****飞过

以下是Spring cloud ,Spring Cloud Alibaba, Spring Boot 之间的版本选择

Spring Cloud Alibaba从入门到实践一网打尽

在版本选择上大家尽量选择稳定版,也就是Release 后的3 到4个版本,这个版本是趋于稳定的版本

版本对比的官方文档 毕业版本依赖关系(推荐使用)

版本选择尽量按照官方给的文档来做 否则会出现不兼容的情况,大家谨慎选择


个人公众号:Java架构师联盟,每日更新技术好文,后台回复书籍更可以获得精美资料

下面我们来看一下搭建一个简单的springcloud都需要做哪些准备吧

其实不难,除了简单的idea配置之外,我们就是多了一个把Nacos作为配置中心

那什么是Nacos

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

这是官网上的介绍,大家一看,知道是个什么玩意就好

首先肯定是下载安装包

下载地址:nacos.io/zh-cn/docs/quick-start.html

或者从git下载

Spring Cloud Alibaba从入门到实践一网打尽

选择对应版本进行解压(注意 Nacos 解压后 是一个完整的运行包,如果用的不熟练,不要动里面的配置信息)

Spring Cloud Alibaba从入门到实践一网打尽

下载完成后解压后进入到 bin 目录 在终端运行命令

  • MAC sh startup.sh -m standalone (standalone代表着单机模式运行,后来会单独讲解集群模式的搭建和启动方法)
  • Windows cmd startup.cmd

启动成功后 默认账号密码 nacos/nacos(初始账号密码)

Spring Cloud Alibaba从入门到实践一网打尽

登录后可以看到右上角中英文切换,英语不好的同学们 可以切换到中文

Spring Cloud Alibaba从入门到实践一网打尽

  • 配置管理主要是用来做项目配置,比如配置文件等可以用nacos来管理 因为nacos不仅仅是服务中心,也是配置中心(后面有讲) 我们开发项目的配置一般有以下几种做法:1. 硬编码--作为类字段的形式存在,导致:动态修改困难,没有持久化2. 配置文件( properties、yml 文件等)--导致:配置动态变更,可能需要重启应用,让配置生效。当然,你也可以在代码中增加一个定时任务,如每个 10s 读取配置文件内容,让最新的配置能够及时在应用中生效,这样也就免 去了重启应用这个“较重”的运维操作。3. DB 配置表--导致:配置动态变更,可能需要通过暴露管理接口去解决。

Nacos 真正将配置从应用中剥离出来,统一管理,优雅地解决了配置的动态变更、持久化、运维成本等问题。应用自身既不需要去添加管理配置接口,也不需要自己去实现配置的持久化,更不需要引入“定时任务”以便降低运维成本。Nacos 提供的配置管理功能,将配置相关的所有逻辑都收拢,并且提供简单易用的 SDK,让应用的配置可以非常方便被 Nacos 管理起来不仅如此,Nacos提供 DNS-F功能, 可以与K8S、Spring Cloud和Dubbo等多个开源产品进行集成,实现服务的注册功能。

  • 服务发现使用来管理注册到nacos 上的微服务,可以实现服务下线等功能。
  • 命名空间是用来做服务环境区分,当项目需要开发,测试, 生产等多个不同的配置, 命名空间就可以做配置隔离。
  • 集群管理 后面会单独讲解

下面我们来看一下如何搭建一个简单的微服务

工程搭建

1.首先我们先用SpringBoot创建2个工程,我这里就叫:provider,consumer.

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

到这里我已经设置好一个provider服务,后我我会再搭建一个消费者服务,由于操作步骤和上面一样,我就不再重复了

Spring Cloud Alibaba从入门到实践一网打尽

Spring Cloud Alibaba从入门到实践一网打尽

到这里我已经搭建好2个服务工程,点击apply,点击ok,工程搭建完毕

Spring Cloud Alibaba从入门到实践一网打尽

服务配置

provider服务配置

1.provider代码如下和配置文件(新建的工程默认是application.properties,但是再工作中用的比较多的是yml格式,所以这里我把properties改成了yml格式)如下图

Spring Cloud Alibaba从入门到实践一网打尽

2.ProviderController代码如下:

@RestController
public class ProviderController {

    @Value("${providerName}")
    private String name;

    @GetMapping("send")
    public String send(){
        return name;
    }
} 

Spring Cloud Alibaba从入门到实践一网打尽

3.application.yml配置如下:

server:
  port: 8080
    
#自定义参数
providerName: provider 

4.provider注册到nacos

生产者注册到nacos注册中心,步骤: 添加依赖:spring-cloud-starter-alibaba-nacos-discovery及springCloud

Spring Cloud Alibaba从入门到实践一网打尽

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--整合Nacos -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.9.0.RELEASE</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement> 

在 application.yml 中配置nacos服务地址和应用名

server:
  port: 8080

spring:
  application:
  ## 应用名
    name: provider
  ## nacos服务地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

#自定义参数
providerName: provider 

启动服务,然后登陆Nacos服务查看,结果如下

Spring Cloud Alibaba从入门到实践一网打尽

consumer服务配置

1.首先按照我上面的引入maven依赖。 2.由于配置基本和上面一样我这里就把我代码部分例举出来 代码:

@RestController
public class ConsumerController {

    @GetMapping("consumer")
    public String send(){
        return "Consumer";
    }

} 

yml配置

server:
  port: 8081

spring:
  application:
    ## 应用名
    name: consumer
  ## nacos服务地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 

启动服务

Spring Cloud Alibaba从入门到实践一网打尽

整合Feign实现远程调用

1.先引入feign相关依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency> 

2.在ConsumerApplication类上添加@EnableFeignClients注解:

Spring Cloud Alibaba从入门到实践一网打尽

3.编写feignClient:

Spring Cloud Alibaba从入门到实践一网打尽

@FeignClient("provider")
public interface ProviderFeign {

    @RequestMapping("send")
     String send();
} 

在Controller中使用feignClient:

@RestController
public class ConsumerController {

    @Autowired
    private ProviderFeign providerFeign;

    @GetMapping("consumer")
    public String send(){
        String send = providerFeign.send();
        return "Consumer" + send;
    }

} 

测试访问:

Spring Cloud Alibaba从入门到实践一网打尽

总结

至此一个简单的微服务工程已经搭建完毕。其实操作很简单,大家可以动手试试。

个人公众号:Java架构师联盟,每日更新技术好文,后台回复书籍更可以获得精美资料