0
点赞
收藏
分享

微信扫一扫

基于 JWT 的模拟登录爬取实战

辰鑫chenxin 2024-08-12 阅读 17

1. 微服务架构—SpringCloud

1.1 单体应用架构

在这里插入图片描述

1.2 微服务应用 70%

在这里插入图片描述

1.3 微服务架构的优势

1.4 微服务架构的缺点,即挑战

1.5 SpringCloud与微服务的关系

  • Springcloud为微服务思想提供了完美的解决方案

  • Springcloud是一些列框架的集合体(服务的注册与发现【注册中心】、服务间远程调用、服务降级、服务熔断、服务限流、分布式事务等)

  • springcloud就是一系列框架的集合,为了解决微服务的挑战

    springcloud有两个版本: springcloud netflix [停止更新] 和springcloud alibaba。
    

1.6 SpringCloud和SpringBoot的关系

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调、整理、治理的框架,它将SpringBoot开发的单体整合并管理起来。
  • SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系

2. 如何搭建微服务框架

  • 案例,如图示

在这里插入图片描述

2.1 创建一个父工程并引入依赖

在这里插入图片描述

  • 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>springcloud_common</module>
        <module>springcloud_product</module>
        <module>springcloud_order</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <!--修改版本-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zmq</groupId>
    <artifactId>spring_cloud_parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--只要是父工程打包方式都是pom,可以把src目录删除-->
    <!--因为父工程不负责代码编写,只负责子工程的管理-->
    <packaging>pom</packaging>
    <name>spring_cloud_parent</name>
    <description>spring_cloud_parent</description>

    <!-- 定义版本号 -->
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- springcloud的版本 -->
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <!-- 阿里巴巴的版本  springboot springcloud  springcloudalibaba 他们的版本必须对应
                https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
                 -->
        <spring-cloud-alibaba.version>2.2.8.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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

相关依赖的版本有对应要求,在下面网址可以查看对应关系——SpringCloud、SpringCloud Alibaba、SpringBoot三者之间

在这里插入图片描述

2.2 创建一个公共模块

直接在父工程下创建模块即可

  • 依赖
<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.4</version>
        </dependency>
    </dependencies>
  • 商品实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tbl_product")
public class Product {
    @TableId(type= IdType.AUTO)
    private Integer pid;
    private String pname;
    private BigDecimal price;
    private Integer stock;
}
  • 订单实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tbl_order")
public class Order {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String orderNo;
    private Integer productId;
    private BigDecimal price; //因为double存在精度丢失问题
    private String pname;
    private Integer num;

    private Integer userid;

    private Integer status;

    //订单创建时间--Date存在线程安全问题--默认按照驼峰命名
    private LocalDateTime createTime;
}

2.3 创建商品微服务

直接在父工程下创建模块即可

  • 引入依赖
 <dependencies>
         <!--公共依赖-->
         <dependency>
             <groupId>com.ykq</groupId>
             <artifactId>qy174-springcloud-common</artifactId>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
        <!--数据库的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--springboot-web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  • 创建配置文件application.properties
# 商品微服务的端口8001~8009
server.port=8001

# 起服务名
spring.application.name=product

# 数据源
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud-product?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#mysql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#mybatis映射文件
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
  • com.zmq下创建主启动类
@SpringBootApplication
@MapperScan("com.ykq.product.mapper")
public class ProductApp {
    public static void main(String[] args) {
        SpringApplication.run(ProductApp.class,args);
    }
}
  • mapper接口
public interface ProductMapper extends BaseMapper<Product> {
}
  • service接口
public interface ProductService {
    //根据商品id搜索商品
    public Product getById(Integer pid);
}
  • service接口实现类
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;
    @Override
    public Product getById(Integer pid) {
        Product product = productMapper.selectById(pid);
        return product;
    }
}
  • controller持久类
@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @GetMapping("/getById/{pid}")
    public Product getById(@PathVariable Integer pid) {
        Product product = productService.getById(pid);
        return product;
    }
}

2.4 创建订单微服务

  • 引入依赖
 <dependencies>
        <!--引入公共依赖-->
        <dependency>
            <groupId>com.zmq</groupId>
            <artifactId>springcloud_common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!--数据库的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--springboot-web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入糊涂工具,便于调用雪花算法创建唯一的订单编号-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>
    </dependencies>
  • 创建application.properties配置文件
#端口号
server.port=9001
#服务名
spring.application.name=order
#数据源
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud_order?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai

#mysql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

#mybatis映射文件
mybatis-plus.mapper-locations=classpath*:mapper/*.xml
  • com.zmq包下创建启动类
@SpringBootApplication
@MapperScan("com.zmq.mapper")
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }
}
  • mapper接口
@Repository
public interface OrderMapper extends BaseMapper<Order> {
}
  • service接口
public interface OrderService {
    //添加订单
    public Order createOrder(Order order);
}
  • service接口实现类
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Override
    public Order createOrder(Order order) {
        orderMapper.insert(order);
        return order;
    }
}
  • controller控制类
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private RestTemplate restTemplate;

    @PostMapping("/saveOrder")
    public Order saveOrder(Integer pid, Integer num) {
        Order order = new Order();
        order.setOrderNo(IdUtil.getSnowflakeNextIdStr());//订单编号: 时间戳+随机数  雪花算法: 生成一个唯一的id
        order.setNum(num);
        order.setStatus(0);
        order.setCreateTime(LocalDateTime.now());
        order.setUserid(1);

        order.setProductId(pid);
        //根据商品id查询商品信息---远程调用商品微服务的接口。
        // 基于Http协议调用。[1]可以自己封装HttpClient工具类【适合所有场景】 [2] spring框架提高了一个HttpClient的工具类【适合spring工程】RestTemplate。
        //String url, Class<T> responseType, Object... uriVariables
        Product product = restTemplate.getForObject("http://localhost:8001/product/getById/" + pid, Product.class);
        if(product==null||product.getStock()<num){
            throw new RuntimeException("商品不存在或库存不足");
        }
        order.setPname(product.getPname());
        order.setPrice(product.getPrice());
        Order order1 = orderService.createOrder(order);

        return order1;
    }
}
  • config配置类
@Configuration
public class RestConfig {

    @Bean  //把方法的返回对象交于spring容器管理
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
举报

相关推荐

0 条评论