【Spring Cloud Alibaba 温故而知新】(十二)模拟电商 - 订单服务(Seata实践)

目录

15.1.1 订单微服务功能设计

15.1.1.1 订单微服务功能逻辑架构

  • Tips:微服务功能设计看需求、看业务设定、看个人喜好

在这里插入图片描述

15.1.1.2 结构图

在这里插入图片描述

15.1.1.3 sca-commerce-service-config 添加 OpenFegin 依赖

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

15.1.1.4 创建订单微服务

  • sca-commerce-order-service

Maven 依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>sca-commerce-service</artifactId>
        <groupId>com.edcode.commerce</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>sca-commerce-order-service</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <!-- 模块名及描述信息 -->
    <name>sca-commerce-order-service</name>
    <description>订单服务</description>

    <dependencies>
        <!-- spring cloud alibaba nacos discovery 依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- zipkin = spring-cloud-starter-sleuth + spring-cloud-sleuth-zipkin-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>2.5.0.RELEASE</version>
        </dependency>
        <!-- Java Persistence API, ORM 规范 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.12</version>
            <scope>runtime</scope>
        </dependency>
        <!-- SpringCloud Stream + Kafka -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>com.edcode.commerce</groupId>
            <artifactId>sca-commerce-service-config</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.edcode.commerce</groupId>
            <artifactId>sca-commerce-service-sdk</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 集成 hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

    <!--
        SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将
        SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
     -->
    <build>
        <finalName>${artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

bootstrap.yml

server:
  port: 8002
  servlet:
    context-path: /scacommerce-order-service

spring:
  main:
    allow-bean-definition-overriding: true  # 允许同名的 bean 出现
  application:
    name: sca-commerce-order-service
  cloud:
    stream:
      kafka:
        binder:
          brokers: ${
   KAFKA_SERVER:127.0.0.1}:${
   KAFKA_PORT:9092}
          auto-create-topics: true
      bindings:
        logisticsOutput:
          destination: e-commerce-topic   # kafka topic
          content-type: text/plain
#    alibaba:
#      seata:
#        tx-service-group: sca-ecommerce # seata 全局事务分组
    nacos:
      # 服务注册发现
      discovery:
        enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
        #server-addr: ${NACOS_ADDR:127.0.0.1}:8848
        server-addr: ${
   NACOS_ADDR_1:127.0.0.1}:8848,${
   NACOS_ADDR_2:127.0.0.1}:8858,${
   NACOS_ADDR_3:127.0.0.1}:8868 # Nacos 服务器地址
        namespace: ${
   NAMESPACE_ID:1adcfdd8-5763-4768-9a15-9c7157988950}
        metadata:
          management:
            context-path: ${
   server.servlet.context-path}/actuator
    # 基于 openfeign 实现: 开启 ribbon 重试机制, 即获取服务失败是否从另外一个节点重试
    loadbalancer:
      retry:
        enabled: true
  kafka:
    bootstrap-servers: ${
   KAFKA_SERVER:127.0.0.1}:${
   KAFKA_PORT:9092}
    producer:
      retries: 3
    consumer:
      auto-offset-reset: latest
  sleuth:
    sampler:
      probability: 1.0  # 采样比例, 1.0 表示 100%, 默认是 0.1
  zipkin:
    sender:
      type: ${
   ZIPKIN_KAFKA_SENDER:web} # 默认是 web
    base-url: http://${
   ZIPKIN_URL:127.0.0.1}:${
   ZIPKIN_PORT:9411}/
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: none
    properties:
      hibernate.show_sql: true
      hibernate.format_sql: true
    open-in-view: false
  datasource:
    # 数据源
    url: jdbc:mysql://${
   MYSQL_HOST:127.0.0.1}:${
   MYSQL_PORT:3306}/${
   MYSQL_DATABASE:sca_commerce}?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: ${
   MYSQL_USERNAME:root}
    password: ${
   MYSQL_PASSWORD:123456}
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 连接池
    hikari:
      maximum-pool-size: 8
      minimum-idle: 4
      idle-timeout: 30000
      connection-timeout: 30000
      max-lifetime: 45000
      auto-commit: true
      pool-name: ImoocEcommerceHikariCP
  redis:
    database: 0
    host: ${
   REDIS_HOST:localhost}
    port: ${
   REDIS_PORT:6379}
    timeout: 5000

# feign 相关的配置
feign:
  hystrix:
    enabled: true   # Hystrix 默认是关闭的
  client:
    config:
      default:  # 全局的
        connectTimeout: 2000  # 默认的连接超时时间是 10s
        readTimeout: 5000

# 暴露端点
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

OrderApplication

@EnableJpaAuditing     // ORM 框架之后可以审核、创建/修改时间更新
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker		// OpenFegin 开启 hystrix
public class OrderApplication {
   

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

15.2.1 数据表及ORM过程

15.2.1.1 创建 t_scacommerce_order 数据表

CREATE TABLE IF NOT EXISTS `sca_commerce`.`t_scacommerce_order` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户 id',
  `address_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户地址记录 id',
  `order_detail` text NOT NULL COMMENT '订单详情(json 存储, goodsId, count)',
  `create_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='用户订单表';

15.2.1.2 订单表对应实体类

package com.edcode.commerce.entity;

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedV
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eddie_k2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值