diff --git a/dev-protocol-springcloud/SpringCloud项目介绍.md b/dev-protocol-springcloud/SpringCloud项目介绍.md index f451c27..c31245c 100644 --- a/dev-protocol-springcloud/SpringCloud项目介绍.md +++ b/dev-protocol-springcloud/SpringCloud项目介绍.md @@ -13,10 +13,11 @@ - [dev-protocol-springcloud-hystrix](dev-protocol-springcloud-hystrix) - [dev-protocol-springcloud-hystrix-dashboard](dev-protocol-springcloud-hystrix-dashboard) - 消息驱动微服务 - (SpringCloud Stream) - - [dev-protocol-springcloud-stream](dev-protocol-springcloud-stream) - [dev-protocol-springcloud-message-study](dev-protocol-springcloud-message-study) + - [dev-protocol-springcloud-stream](dev-protocol-springcloud-stream) - 分布式事务 - (SpringCloud Alibaba Seata) - - todo + - [dev-protocol-springcloud-project-service-config](dev-protocol-springcloud-project-service-config) 通用依赖 + - [dev-protocol-springcloud-project-order-service](dev-protocol-springcloud-project-order-service) 应用服务举例 - 网关动态限流 - (SpringCloud Alibaba Sentinel) - todo - 微服务工程部署与整体可用性验证 @@ -35,5 +36,5 @@ - 商品微服务 - [dev-protocol-springcloud-project-goods-service](dev-protocol-springcloud-project-goods-service) - 订单微服务 - - + - [dev-protocol-springcloud-project-order-service](dev-protocol-springcloud-project-order-service) - 物流微服务 \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md index ac687ef..2192c05 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/NetflixHystrix.md @@ -35,6 +35,7 @@ - [NacosClientHystrixCommand.java] - [NacosClientHystrixObservableCommand.java] ### 编程方式开启 Hystrix 请求缓存 +- 先编写过滤器 [HystrixRequestContextServletFilter.java] - Hystrix 的结果缓存指的是在一次 Hystrix 的请求上下文中 - Hystrix 请求缓存的两种实现方式 - 编程(继承 HystrixCommand)方式,重写 getCacheKey 方法即可 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/controller/HystrixController.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/controller/HystrixController.java index 1f88dea..2efbbc9 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/controller/HystrixController.java +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/controller/HystrixController.java @@ -2,12 +2,12 @@ package org.example.controller; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.example.hystrix.CacheHystrixCommand; import org.example.hystrix.NacosClientHystrixCommand; import org.example.hystrix.NacosClientHystrixObservableCommand; import org.example.hystrix.UseHystrixCommandAnnotation; import org.example.hystrix.request_merge.NacosClientCollapseCommand; import org.example.service.NacosClientService4HystrixDemo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -131,6 +131,41 @@ public class HystrixController { return result.get(0); // 取一个返回 } + @GetMapping("/cache-hystrix-command") + public void cacheHystrixCommand(@RequestParam String serviceId) { + + // 使用缓存 Command, 连续发起两次请求 + CacheHystrixCommand command1 = new CacheHystrixCommand( + nacosClientService4HystrixDemo, serviceId + ); + CacheHystrixCommand command2 = new CacheHystrixCommand( + nacosClientService4HystrixDemo, serviceId + ); + + List result01 = command1.execute(); + List result02 = command2.execute(); + // 看是否只执行了一次 run 方法 + log.info("result01, result02: [{}], [{}]", + JSON.toJSONString(result01), JSON.toJSONString(result02)); + + // 清除缓存 + CacheHystrixCommand.flushRequestCache(serviceId); + + // 使用缓存 Command, 发起两次请求 + CacheHystrixCommand command3 = new CacheHystrixCommand( + nacosClientService4HystrixDemo, serviceId + ); + CacheHystrixCommand command4 = new CacheHystrixCommand( + nacosClientService4HystrixDemo, serviceId + ); + + List result03 = command3.execute(); + List result04 = command4.execute(); + // 看是否成功清除缓存 + log.info("result03, result04: [{}], [{}]", + JSON.toJSONString(result03), JSON.toJSONString(result04)); + } + /*@GetMapping("/cache-hystrix-command") public void cacheHystrixCommand(@RequestParam String serviceId) { diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/filter/HystrixRequestContextServletFilter.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/filter/HystrixRequestContextServletFilter.java index e445959..6d7ae69 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/filter/HystrixRequestContextServletFilter.java +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/filter/HystrixRequestContextServletFilter.java @@ -49,6 +49,7 @@ public class HystrixRequestContextServletFilter implements Filter { /** *

配置 Hystrix 的并发策略

+ * 重写的原因, 是官方不建议引用 Sleuth, 但是我们重写了下述代码 * */ public void hystrixConcurrencyStrategyConfig() { @@ -59,7 +60,7 @@ public class HystrixRequestContextServletFilter implements Filter { HystrixConcurrencyStrategy strategy = HystrixPlugins.getInstance().getConcurrencyStrategy(); if (strategy instanceof HystrixConcurrencyStrategyDefault) { - // 如果已经就是我们想要配置的 + // 如果已经就是我们想要配置的, 直接返回 return; } @@ -83,6 +84,7 @@ public class HystrixRequestContextServletFilter implements Filter { log.info("config hystrix concurrency strategy success"); } catch (Exception ex) { + // 注册失败的可能性很小, 所以用大 catch log.error("Failed to register Hystrix Concurrency Strategy: [{}]", ex.getMessage(), ex); } diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/hystrix/CacheHystrixCommand.java b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/hystrix/CacheHystrixCommand.java new file mode 100644 index 0000000..4753ad0 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-hystrix/src/main/java/org/example/hystrix/CacheHystrixCommand.java @@ -0,0 +1,75 @@ +package org.example.hystrix; + +import com.netflix.hystrix.HystrixCommand; +import com.netflix.hystrix.HystrixCommandGroupKey; +import com.netflix.hystrix.HystrixCommandKey; +import com.netflix.hystrix.HystrixRequestCache; +import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategyDefault; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.example.service.NacosClientService4HystrixDemo; +import org.springframework.cloud.client.ServiceInstance; + +import java.util.Collections; + +/** + *

带有缓存功能的 Hystrix

+ * */ +@Slf4j +public class CacheHystrixCommand extends HystrixCommand> { + + /** 需要保护的服务 */ + private final NacosClientService4HystrixDemo nacosClientService; + + /** 方法需要传递的参数 */ + private final String serviceId; + + private static final HystrixCommandKey CACHED_KEY = + HystrixCommandKey.Factory.asKey("CacheHystrixCommand"); + + public CacheHystrixCommand(NacosClientService4HystrixDemo nacosClientService, String serviceId) { + + super( + HystrixCommand.Setter + .withGroupKey(HystrixCommandGroupKey + .Factory.asKey("CacheHystrixCommandGroup")) + .andCommandKey(CACHED_KEY) + ); + + this.nacosClientService = nacosClientService; + this.serviceId = serviceId; + } + + @Override + protected List run() throws Exception { + + log.info("CacheHystrixCommand In Hystrix Command to get service instance:" + + " [{}], [{}]", this.serviceId, Thread.currentThread().getName()); + return this.nacosClientService.getNacosClientInfo(this.serviceId); + } + + @Override + protected String getCacheKey() { + // fixme 可以进行自定义, 只要保证唯一的请求返回唯一的值即可 + return serviceId; + } + + @Override + protected List getFallback() { + // todo 这里可以自己添加一些 warning 日志来进行表示 + return Collections.emptyList(); + } + + /** + *

根据缓存 key 清理在一次 Hystrix 请求上下文中的缓存

+ * */ + public static void flushRequestCache(String serviceId) { + + HystrixRequestCache.getInstance( + CACHED_KEY, + HystrixConcurrencyStrategyDefault.getInstance() + ).clear(serviceId); + log.info("flush request cache in hystrix command: [{}], [{}]", + serviceId, Thread.currentThread().getName()); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/.gitignore b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/pom.xml new file mode 100644 index 0000000..1dadf10 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/pom.xml @@ -0,0 +1,102 @@ + + + 4.0.0 + + org.example + dev-protocol + 1.0-SNAPSHOT + ../../pom.xml + + + dev-protocol-springcloud-project-order-service + 1.0-SNAPSHOT + jar + + + dev-protocol-springcloud-project-order-service + 订单服务 + + + 8 + 8 + UTF-8 + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + org.springframework.cloud + spring-cloud-starter-zipkin + + + org.springframework.kafka + spring-kafka + 2.5.0.RELEASE + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + mysql + mysql-connector-java + 8.0.12 + runtime + + + + org.springframework.cloud + spring-cloud-stream + + + org.springframework.cloud + spring-cloud-stream-binder-kafka + + + org.example + dev-protocol-springcloud-project-service-config + 1.0-SNAPSHOT + + + org.example + dev-protocol-springcloud-project-service-sdk + 1.0-SNAPSHOT + + + + org.springframework.cloud + spring-cloud-starter-netflix-hystrix + + + + + + ${artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/java/org/example/OrderApplication.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/java/org/example/OrderApplication.java new file mode 100644 index 0000000..d049e97 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/java/org/example/OrderApplication.java @@ -0,0 +1,22 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +/** + *

订单微服务启动入口

+ * */ +@EnableJpaAuditing +@SpringBootApplication +@EnableCircuitBreaker +@EnableFeignClients +@EnableDiscoveryClient +public class OrderApplication { + public static void main(String[] args) { + SpringApplication.run(OrderApplication.class, args); + } +} \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..687b265 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/bootstrap.yml @@ -0,0 +1,93 @@ +server: + port: 8002 + servlet: + context-path: /dev-protocol-springcloud-project-order-service + +spring: + main: + allow-bean-definition-overriding: true + application: + name: dev-protocol-springcloud-project-order-service + cloud: + stream: + kafka: + binder: + brokers: 127.0.0.1:9092 + auto-create-topics: true + bindings: + logisticsOutput: + destination: dev-protocol-topic # kafka topic + content-type: text/plain + alibaba: + seata: + tx-service-group: dev-protocol # seata 全局事务分组 + nacos: + discovery: + enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可 + server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址 + namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c + metadata: + management: + context-path: ${server.servlet.context-path}/actuator + # 开启 ribbon 重试机制, 即获取服务失败是否从另外一个节点重试 + loadbalancer: + retry: + enabled: true + kafka: + bootstrap-servers: 127.0.0.1:9092 + producer: + retries: 3 + consumer: + auto-offset-reset: latest + sleuth: + sampler: + probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1 + zipkin: + sender: + type: kafka # 默认是 http + base-url: http://localhost: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://127.0.0.1:3306/dev_protocol_springcloud_project?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root + 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: devProtocolSpringcloudHikariCP + +# feign 相关的配置 +feign: + hystrix: + enabled: true # Hystrix 默认是关闭的 + client: + config: + default: # 全局的 + connectTimeout: 2000 # 默认的连接超时时间是 10s + readTimeout: 5000 + +# 暴露端点 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: always diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/file.conf b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/file.conf new file mode 100644 index 0000000..4e03188 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/file.conf @@ -0,0 +1,65 @@ +## transaction log store, only used in seata-server +store { + ## store mode: file、db、redis + mode = "db" + + ## file store property + file { + ## store location dir + dir = "sessionStore" + # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions + maxBranchSessionSize = 16384 + # globe session size , if exceeded throws exceptions + maxGlobalSessionSize = 512 + # file buffer size , if exceeded allocate new buffer + fileWriteBufferCacheSize = 16384 + # when recover batch read size + sessionReloadReadSize = 100 + # async, sync + flushDiskMode = async + } + + ## database store property + db { + ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc. + datasource = "druid" + ## mysql/oracle/postgresql/h2/oceanbase etc. + dbType = "mysql" + driverClassName = "com.mysql.jdbc.Driver" + url = "jdbc:mysql://127.0.0.1:3306/seata?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false" + user = "root" + password = "root" + minConn = 5 + maxConn = 100 + globalTable = "global_table" + branchTable = "branch_table" + lockTable = "lock_table" + queryLimit = 100 + maxWait = 5000 + } + + ## redis store property + redis { + host = "127.0.0.1" + port = "6379" + password = "" + database = "0" + minConn = 1 + maxConn = 10 + maxTotal = 100 + queryLimit = 100 + } + +} + +service { + vgroupMapping.imooc-ecommerce = "default" + default.grouplist = "127.0.0.1:8091" +} +client { + async.commit.buffer.limit = 10000 + lock { + retry.internal = 10 + retry.times = 30 + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/http/order.http b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/http/order.http new file mode 100644 index 0000000..e794642 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/http/order.http @@ -0,0 +1,20 @@ +### 创建订单 +POST http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-order-service/order/create-order +Content-Type: application/json +Accept: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6ImU5OWYzYjdjLTA2YjYtNGQ1Zi1hODY3LWJlMzhjYjlkNDBmZCIsImV4cCI6MTYyODE3OTIwMH0.U9jXZoa9fdQMJQmujN4mkkbtN62cGVy26qhOq_x4QhU8qCqw_NLr2StdAOAAC_FGOF85DHpvDBHCzn9EDCeuq1tBqODjUaLLnWFtTj3oYYSpPZQTG-ZA9OLz8lG8EbcH3URxcaTMElyI8WKoIVccWIHivXTDgNDZOCs6Bir9bBvJJ1Vobgqnb1uV5S7wdHgh89e96-iBy9xCsoQovTcyEOqi8n5cH8cTjMb2XXjT83OhZC1oxhKhkNoTiDOq9VSaYOISQ_tv-XFTICEed4ondW9zfcrbAWdaHb1l8UT5o7nuQOwWkaMckDft9liuTvl6KAe8MjPN9exUqAI5tOC_fA + +{ + "userAddress": 1, + "orderItems": [ + { + "goodsId": 1, + "count": 5 + } + ] +} + +### 查询订单 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-order-service/order/order-detail?page=2 +Accept: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6ImU5OWYzYjdjLTA2YjYtNGQ1Zi1hODY3LWJlMzhjYjlkNDBmZCIsImV4cCI6MTYyODE3OTIwMH0.U9jXZoa9fdQMJQmujN4mkkbtN62cGVy26qhOq_x4QhU8qCqw_NLr2StdAOAAC_FGOF85DHpvDBHCzn9EDCeuq1tBqODjUaLLnWFtTj3oYYSpPZQTG-ZA9OLz8lG8EbcH3URxcaTMElyI8WKoIVccWIHivXTDgNDZOCs6Bir9bBvJJ1Vobgqnb1uV5S7wdHgh89e96-iBy9xCsoQovTcyEOqi8n5cH8cTjMb2XXjT83OhZC1oxhKhkNoTiDOq9VSaYOISQ_tv-XFTICEed4ondW9zfcrbAWdaHb1l8UT5o7nuQOwWkaMckDft9liuTvl6KAe8MjPN9exUqAI5tOC_fA diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/registry.conf b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/registry.conf new file mode 100644 index 0000000..f2a5df2 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/registry.conf @@ -0,0 +1,17 @@ +registry { + # file、nacos、eureka、redis、zk、consul + type = "file" + + file { + name = "file.conf" + } + +} + +config { + type = "file" + + file { + name = "file.conf" + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/t_ecommerce_order.sql b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/t_ecommerce_order.sql new file mode 100644 index 0000000..d45a7b6 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/t_ecommerce_order.sql @@ -0,0 +1,10 @@ +-- 创建 t_ecommerce_order 数据表 +CREATE TABLE IF NOT EXISTS `dev_protocol_springcloud_project`.`t_dev_protocol_cloud_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=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户订单表'; diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/undo_log.sql b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/undo_log.sql new file mode 100644 index 0000000..71fb4a1 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-order-service/src/main/resources/sql/undo_log.sql @@ -0,0 +1,13 @@ +CREATE TABLE `undo_log` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `branch_id` bigint(20) NOT NULL, + `xid` varchar(100) NOT NULL, + `context` varchar(128) NOT NULL, + `rollback_info` longblob NOT NULL, + `log_status` int(11) NOT NULL, + `log_created` datetime NOT NULL, + `log_modified` datetime NOT NULL, + `ext` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4; diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml index 0f30289..1a20987 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml @@ -46,6 +46,23 @@ swagger-bootstrap-ui 1.9.3 + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-seata + + + + com.zaxxer + HikariCP + true + \ No newline at end of file diff --git a/pom.xml b/pom.xml index fb471b6..0abec51 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,7 @@ dev-protocol-springcloud/dev-protocol-springcloud-hystrix dev-protocol-springcloud/dev-protocol-springcloud-hystrix-dashboard dev-protocol-springcloud/dev-protocol-springcloud-message-study + dev-protocol-springcloud/dev-protocol-springcloud-project-order-service diff --git a/高潜架构师傍身技能-服务治理设计.md b/高潜架构师傍身技能-服务治理设计.md new file mode 100644 index 0000000..02aaa2c --- /dev/null +++ b/高潜架构师傍身技能-服务治理设计.md @@ -0,0 +1,39 @@ + +## 1. 傍身技能-服务治理-Nacos,负载均衡 + +### 1.1 走进微服务与Spring Cloud + +### 1.2 如何实现服务治理 + +### 1.3 如何实现负载均衡 + + +## 2. 傍身技能-服务治理-链路追踪,分布式事务 + +### 2.1 如何实现跨应用的服务间调用 + + +### 2.2 如何实现跨应用的链路追踪 + + +### 2.3 如何实现分布式事务 + + +## 3. 傍身技能-服务治理-限流和容错,配置管理 + +### 3.1 如何实现服务限流和服务容错 + + +### 3.2 如何实现配置管理 + + +## 4. 傍身技能-服务治理-网关/安全/消息驱动 + + +### 4.1 如何实现轻量级的网关系统 + + +### 4.2 如何实现微服务的安全 + + +### 4.3 如何实现微服务消息驱动 diff --git a/高潜架构师内功增长-7大主流框架源码系统深研.md b/高潜架构师内功增长-7大主流框架源码系统深研.md new file mode 100644 index 0000000..4d983e1 --- /dev/null +++ b/高潜架构师内功增长-7大主流框架源码系统深研.md @@ -0,0 +1,36 @@ +## 1. SpringBoot源码/造轮子/面试 + +### 1.1 Spring源码概述 + + +### 1.2 Spring Boot架构设计解析 + + +### 1.3 Spring Boot核心源码解析 + + +### 1.4 Spring Boot应用技巧解析 + + +### 1.5 Spring Boot二次改造 + + +### 1.6 Spring Boot造轮子 + + +### 1.7 Spring Boot面试题深度解析 + + +## Spring源码/造轮子/面试 + + +## SpringCould源码/造轮子/面试 + + +## Spring Data源码/造轮子/面试 + + +## Mybatis&Tomcat源码深度解析 + + +## RocketMQ源码/造轮子/面试 diff --git a/高潜架构师技法套路-6大经典类型架构设计.md b/高潜架构师技法套路-6大经典类型架构设计.md new file mode 100644 index 0000000..ac20591 --- /dev/null +++ b/高潜架构师技法套路-6大经典类型架构设计.md @@ -0,0 +1,35 @@ +# 高潜架构师技法套路:6大经典类型架构设计 + + +## 1. 技法套路一:分布式架构设计技法 + +### 1.1 分布式系统理论 + +### 1.2 底层数据设计策略 - 分库分表,热点热数据隔离 + +### 1.3 底层数据设计策略 - 高可用数据 + +### 1.4 中间件和平台运行期监控 + +### 1.5 应用层设计 + + +## 2. 技法套路二:微服务架构设计技法 + +### 2.1 微服务与服务建模 + +### 2.2 如何统一管理配置信息 + +### 2.3 如何开展服务监控和调用链路梳理 + + +## 3. 技法套路三:Set化架构设计技法 + + +## 4. 技法套路四:服务网格架构设计技法 + + +## 5. 技法套路五:DDD领域驱动设计技法 + + +## 6. 技法套路六:响应式架构设计技法 \ No newline at end of file diff --git a/高潜架构师持续成长秘籍-管理&沟通&复盘.md b/高潜架构师持续成长秘籍-管理&沟通&复盘.md new file mode 100644 index 0000000..e41a7fc --- /dev/null +++ b/高潜架构师持续成长秘籍-管理&沟通&复盘.md @@ -0,0 +1,19 @@ +## 大厂架构师级别的项目管理,沟通和复盘秘籍 + + +### 1. 项目管理 + + + + +### 2. 沟通技能 + + + + +### 3. 复盘总结 + + + + +### 4. 面试指导 \ No newline at end of file