一、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>
版本对应:
创建基础模块
创建 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
4 创建ProductMapper接口
注意:在主启动类添加包扫描
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 启动工程测试
创建 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
4 创建OrderMapper接口
注意:在主启动类添加包扫描
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 启动工程测试
在主启动类添加Bean
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}