一、SpringCloud Alibaba简单介绍

从互联网早起到现在,系统架构大体经历了下面几个过程: 单体应用架构—>垂直应用架构—>分布式架构—>SOA架构—>微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。

  • 单体应用架构
优点:
项目架构简单,小型项目的话,开发成本低。
项目部署在一个节点上,维护方便
缺点:
全部功能集成在一个工程中,对于大型项目来讲不易开发和维护[修改代码]。
项目模块之间紧密耦合,单点容错率低。
无法针对不同模块进行针对性优化和水平扩展
  • 垂直应用架构
优点:
系统拆分实现了流量分担,解决了并发问题,可以针对不同模块进行优化和水平扩展 
一个系统的问题不会影响到其他系统,提高容错率
缺点:
系统之间相互独立, 无法进行相互调用
系统之间相互独立, 会有重复的开发任务
  • 分布式架构
优点:
抽取公共的功能为服务层,提高代码复用性
缺点:
系统间耦合度变高,调用关系错综复杂,难以维护
  • SOA架构----阿里dubbo
优点:
使用注册中心解决了服务间调用关系的自动调节 
缺点: 
服务间会有依赖关系,一旦某个环节出错会影响较大( 服务雪崩 ) 
服务关心复杂,运维、测试部署困难
  • 微服务架构
优点: 
服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于扩展 
微服务之间采用Restful等轻量级http协议相互调用 
缺点:   小型项目----微服务架构不合适。仓库系统---微服务。
微服务系统开发的技术成本高《高》(容错、分布式事务等)

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统

二、案例

案例准备:

maven:3.5.0+
数据库:MySQL 5.7 以上
持久层: Mybatis-plus
其他: SpringCloud Alibaba

创建父工程

创建一个maven工程,然后在pom.xml文件中引入依赖

<!--打包方式: jar: java工程   war:web工程  pom:父工程-->
    <packaging>pom</packaging>

    <!--继承springboot的父工程-->
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.2.RELEASE</version>
    </parent>
    <!--定义版本号-->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF- 8</project.reporting.outputEncoding>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <!--dependencyManagement:它只负责jar的管理  不负责jar的下载,如果想下载需要再子工程中引入依赖来下载。
    -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

版本对应:

spring cloud alibaba 组成 spring cloud alibaba架构_ci

创建基础模块

创建 shop-common 模块,在pom.xml中添加依赖

<!--加入依赖-->
    <dependencies>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

添加实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "shop_product")
public class Product {
    @TableId(type= IdType.AUTO)
    private Integer pid;
    private String pname;//商品名称
    private Double pprice;//商品价格
    private Integer stock;//库存
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "shop_order")
public class Order {
    @TableId(type = IdType.AUTO)
    private Long oid; //订单id
    private Integer uid;//用户id
    private String username;//用户名
    private Long pid;//商品id
    private String pname;//商品名称
    private Double pprice;//商品价格
    private Integer number;//购买数量

}

创建 shop-product 模块

1 创建一个名为 shop_product 的模块,并添加springboot依赖

<dependencies>
        <dependency>
            <groupId>com.xxx</groupId>
            <artifactId>shop-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2 创建工程的主启动类

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

3 创建配置文件application.yml

spring cloud alibaba 组成 spring cloud alibaba架构_ci_02

4 创建ProductMapper接口

spring cloud alibaba 组成 spring cloud alibaba架构_微服务_03


注意:在主启动类添加包扫描

spring cloud alibaba 组成 spring cloud alibaba架构_微服务_04


5 创建ProductService接口

public interface ProductService {

    public Product findById(Long productId);
}

6 创建ProductServiceImpl实现类

@Service
public class ProductImplement implements ProductService{
    @Resource
    private ProductMapper productMapper;
    @Override
    public Product findById(Long productId) {
        Product product = productMapper.selectById(productId);
        return product;
    }
}

7 创建ProductController类

@RestController
@RequestMapping("product")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("findById/{pid}")
    public Product findById(@PathVariable Long pid){
        return productService.findById(pid);
    }
}

8 启动工程测试

spring cloud alibaba 组成 spring cloud alibaba架构_ci_05

创建 shop-order 模块

1 创建一个名为 shop_order 的模块,并添加springboot依赖

<dependencies>
        <dependency>
            <groupId>com.xxx</groupId>
            <artifactId>shop-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

2 创建工程的主类

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

3 创建配置文件application.yml

spring cloud alibaba 组成 spring cloud alibaba架构_spring_06


4 创建OrderMapper接口

spring cloud alibaba 组成 spring cloud alibaba架构_微服务_07


注意:在主启动类添加包扫描

spring cloud alibaba 组成 spring cloud alibaba架构_ci_08

5 创建OrderService接口

public interface OrderService {
    /**
     * 保存订单信息
     * @param order
     * @return 是否保存成功
     */

    public String saveOrder(Order order);
}

6 创建OrderServiceImpl实现类

@Service
public class OrderImplement implements OrderService{
    @Resource
    private OrderMapper orderMapper;

    @Override
    public String saveOrder(Order order) {
      orderMapper.insert(order);
        return "保存成功";
    }
}

7 创建OrderController类

@RestController
@RequestMapping("order")
public class OrderController {
    @Autowired
    private OrderService orderService;
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("saveOrder")
    public String saveOrder(Long pid,Integer num) {
        Order order = new Order();
        order.setNumber(num);
        order.setUid(1);
        order.setUsername("aaaa");
        order.setPid(pid);
        //根据商品ID查询商品对应的信息----->调用远程商品类服务
        //springboot封装了一个工具,可以完成业务之间的调用
        Product product = restTemplate.getForObject("http://localhost:8081/product/findById/" + pid, Product.class);
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.saveOrder(order);
        return "下单成功";
    }
}

8 启动工程测试

spring cloud alibaba 组成 spring cloud alibaba架构_spring_09


在主启动类添加Bean

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

spring cloud alibaba 组成 spring cloud alibaba架构_ci_10