目录
1.技术选型
2.模块设置
3.微服务调用
4.创建父工程(springcloud-alibaba )
版本对应:编辑
5.创建基础模块
1.创建shop-common模块,
1.在pom.xml中添加依赖
2.创建实体类
2.创建商品微服务 shop-product
1.添加依赖
2.创建配置文件application.yml
3.创建ProductDao接口
4.创建ProductService接口
5.创建ProductServiceImpl实现类
6.创建ProductController类
7.创建启动类
3.创建订单微服务 shop-order
1.添加依赖
2.创建配置文件application.yml
3.创建OrderDao接口
4.创建OrderService接口
5.创建OrderServiceImpl实现类
6.创建OrderController类
7.创建启动类
maven:3.5.0+
数据库:MySQL 5.7 以上
持久层: Mybatis-plus 《Mybatis Mapper Mybatis-plus》
其他: SpringCloud Alibaba 技术栈 druid
springcloud-alibaba 父工程 ----jar的版本管理 公共jar的引入
shop-common 公共模块【实体类】 《实体类,公共依赖,工具类。》
shop-product 商品微服务 【端口: 8080~8089 】
shop-order 订单微服务 【端口: 8090~8099 】
在微服务架构中,最常见的场景就是微服务之间的相互调用。我们以电商系统中常见的用户下单为
例来演示微服务的调用:客户向订单微服务发起一个下单的请求,在进行保存订单之前需要调用商品微服务查询商品的信息。
我们一般把服务的主动调用方称为服务消费者,把服务的被调用方称为服务提供者。
在这种场景下,订单微服务就是一个服务消费者, 商品微服务就是一个服务提供者。
可以创建springboot工程,也可以使用maven工程,但spring工程里一些东西使用不到,这里使用的是springboot工程创建的父工程。然后在pom.xml文件中添加下面内容
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.12.RELEASE
com.lzl
springcloud-alibaba
0.0.1-SNAPSHOT
1.8
UTF-8
UTF- 8
Hoxton.SR8
2.2.3.RELEASE
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
maven工程
org.projectlombok
lombok
com.baomidou
mybatis-plus-boot-starter
3.5.2
mysql
mysql-connector-java
package entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName(value="shop_product")
public class Product {
@TableId(type= IdType.AUTO)
private Integer pid;
private String pname;//商品名称
private Double pprice;//商品价格
private Integer stock;//库存
}
package entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("shop_order")
public class Order {
@TableId(type = IdType.AUTO)
private Long oid; //订单id
private Integer uid;//用户id
private String username;//用户名
private Integer pid;//商品id
private String pname;//商品名称
private Double pprice;//商品价格
private Integer number;//购买数量
}
springcloud-alibaba
com.lzl
0.0.1-SNAPSHOT
4.0.0
springcloud-product
8
8
com.lzl
shop-common
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
#为了后期拓展方便商品微服务的端口设置为8080-8089之间
server.port=8081
#数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springclooud?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=lzl200038
#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
package com.lzl.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lzl.entity.Product;
import org.apache.ibatis.annotations.Mapper;
/**
* @create 2022-08-18
*/
@Mapper
public interface ProductMapper extends BaseMapper {
}
package com.lzl.service;
import com.lzl.entity.Product;
/**
* @create 2022-08-18
*/
public interface ProductService {
public Product findById(Integer pid);
}
package com.lzl.service.impl;
import com.lzl.dao.ProductMapper;
import com.lzl.entity.Product;
import com.lzl.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @create 2022-08-18
*/
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Override
public Product findById(Integer pid) {
return productMapper.selectById(pid);
}
}
package com.lzl.controller;
import com.lzl.entity.Product;
import com.lzl.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @create 2022-08-19
*/
@RestController
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("getById/{pid}")
public Product getById(@PathVariable Integer pid){
return productService.findById(pid);
}
}
package com.lzl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ShopProductApplication {
public static void main(String[] args) {
SpringApplication.run(ShopProductApplication.class, args);
}
}
springcloud-alibaba
com.lzl
0.0.1-SNAPSHOT
4.0.0
springcloud-order
8
8
com.lzl
shop-common
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
#为了后期拓展方便订单微服务的端口设置为8090-8099之间
server.port=8091
#数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springclooud?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=lzl200038
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
package com.lzl.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lzl.entity.Order;
import org.apache.ibatis.annotations.Mapper;
/**
* @create 2022-08-18
*/
@Mapper
public interface OrderMapper extends BaseMapper {
}
package com.lzl.service;
import com.lzl.entity.Order;
/**
* @create 2022-08-18
*/
public interface OrderService {
public int save(Order order);
}
package com.lzl.service.impl;
import com.lzl.dao.OrderMapper;
import com.lzl.entity.Order;
import com.lzl.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @create 2022-08-18
*/
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Override
public int save(Order order) {
return orderMapper.insert(order);
}
}
package com.lzl.controller;
import com.lzl.entity.Order;
import com.lzl.entity.Product;
import com.lzl.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* @create 2022-08-19
*/
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private OrderService orderService;
//该类默认没有交于spring管理 在启动类上添加 一个 交于spring管理
// @Bean
// public RestTemplate restTemplate(){
// return new RestTemplate();
// }
@Autowired
private RestTemplate restTemplate;
@GetMapping("buy/{pid}/{num}")
public String buy(@PathVariable Integer pid,@PathVariable Integer num){
System.out.println("购买开始===================================");
Order order = new Order();
order.setUid(1);
order.setUsername("张三");
order.setNumber(num);
order.setPid(pid);
//需要设置订单对象中商品的信息
// 商品操作都在商品微服务---订单微服务远程调用商品微服务即可拿到商品信息。远程调用:http协议的restFul风格调用适合微服务, 基于TCP协议的RPC调用适合SOA分布式
//一定采用的为http协议: (1)自己写代码完成http调用【httpclient】微信支付 ---适合调用第三方网址。 (2)spring提高了一个工具类RestTemplate,该类也是基于http协议完成的调用
Product product = restTemplate.getForObject("http://localhost:8081/product/getById/" + pid, Product.class);
System.out.println("远程查询商品的结果"+product);
order.setPname(product.getPname());
order.setPprice(product.getPprice());
orderService.save(order);
return "下单成功";
}
}
package com.lzl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @create 2022-08-19
*/
@SpringBootApplication
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class,args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}