├── docs ├── 03 │ ├── 03.md │ ├── 62.md │ ├── 59.md │ ├── 60.md │ ├── 63.md │ ├── 64.md │ ├── 61.md │ ├── 72.md │ ├── 82.md │ ├── 91.md │ ├── 112.md │ ├── images │ │ ├── 13 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ └── 04.png │ │ ├── 15 │ │ │ └── 01.png │ │ ├── 16 │ │ │ └── 01.png │ │ ├── 17 │ │ │ └── 01.png │ │ ├── 21 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 22 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 23 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 24 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ └── 03.png │ │ ├── 26 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ └── 03.png │ │ ├── 27 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 29 │ │ │ └── 01.png │ │ ├── 30 │ │ │ └── 01.png │ │ ├── 31 │ │ │ └── 01.png │ │ ├── 32 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 33 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 35 │ │ │ └── 01.png │ │ ├── 36 │ │ │ └── 01.png │ │ ├── 37 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 38 │ │ │ └── 01.png │ │ ├── 39 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 44 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ └── 04.png │ │ ├── 49 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ └── 03.png │ │ ├── 51 │ │ │ └── 01.png │ │ ├── 53 │ │ │ └── 01.png │ │ ├── 54 │ │ │ └── 01.png │ │ ├── 57 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ └── 04.png │ │ ├── 65 │ │ │ └── 01.png │ │ ├── 71 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 73 │ │ │ └── 01.png │ │ ├── 75 │ │ │ └── 01.png │ │ ├── 76 │ │ │ └── 01.png │ │ ├── 81 │ │ │ └── 01.png │ │ ├── 83 │ │ │ └── 01.png │ │ ├── 84 │ │ │ └── 01.png │ │ ├── 85 │ │ │ └── 01.png │ │ ├── 94 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 95 │ │ │ └── 01.png │ │ ├── 98 │ │ │ └── 01.png │ │ ├── 99 │ │ │ └── 01.png │ │ ├── 100 │ │ │ └── 01.png │ │ ├── 101 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 104 │ │ │ └── 01.png │ │ ├── 106 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 107 │ │ │ └── 01.png │ │ ├── 108 │ │ │ └── 01.png │ │ ├── 111 │ │ │ └── 01.png │ │ ├── 112 │ │ │ └── 01.png │ │ ├── 113 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ └── 03.png │ │ ├── 114 │ │ │ ├── 01.png │ │ │ └── 02.png │ │ ├── 115 │ │ │ └── 01.png │ │ ├── 119 │ │ │ └── 01.png │ │ ├── 120 │ │ │ └── 01.png │ │ ├── 121 │ │ │ └── 01.png │ │ ├── 122 │ │ │ └── 01.png │ │ ├── 123 │ │ │ └── 01.png │ │ ├── 124 │ │ │ └── 01.png │ │ ├── 126 │ │ │ └── 01.png │ │ ├── 128 │ │ │ └── 01.png │ │ ├── 147 │ │ │ └── 01.png │ │ ├── 148 │ │ │ └── 01.png │ │ └── juc │ │ │ └── 01_CAS.png │ ├── 47.md │ ├── 48.md │ ├── 56.md │ ├── 55.md │ ├── 18.md │ ├── 20.md │ ├── 125.md │ ├── 109.md │ ├── 115.md │ ├── 21.md │ ├── 92.md │ ├── 121.md │ ├── 37.md │ ├── 88.md │ ├── 102.md │ ├── 122.md │ ├── 06.md │ ├── 38.md │ ├── 11.md │ ├── 126.md │ ├── 35.md │ ├── 119.md │ ├── 101.md │ ├── 133.md │ ├── 01.md │ ├── 110.md │ ├── 05.md │ ├── 89.md │ ├── 19.md │ ├── 114.md │ ├── 103.md │ ├── 23.md │ ├── 68.md │ ├── 136.md │ ├── 124.md │ ├── 141.md │ ├── 04.md │ ├── 28.md │ ├── 15.md │ ├── 39.md │ ├── 75.md │ ├── 29.md │ ├── 69.md │ ├── 07.md │ ├── 130.md │ ├── 128.md │ ├── 09.md │ ├── 132.md │ ├── 144.md │ ├── 107.md │ ├── 150.md │ ├── 34.md │ ├── 108.md │ ├── 52.md │ ├── 118.md │ ├── 77.md │ ├── 78.md │ ├── 100.md │ ├── 70.md │ ├── 40.md │ ├── 43.md │ ├── 111.md │ ├── 98.md │ ├── 99.md │ ├── 142.md │ ├── 33.md │ ├── 22.md │ ├── 135.md │ ├── 104.md │ ├── 146.md │ ├── 151.md │ ├── 140.md │ ├── 96.md │ ├── 123.md │ ├── 42.md │ ├── 85.md │ ├── 131.md │ ├── 13.md │ ├── 145.md │ ├── 16.md │ ├── 87.md │ └── 97.md ├── c2c │ ├── 02_02.md │ ├── 30_5_1.md │ ├── 45.md │ ├── 24.md │ ├── 25.md │ ├── 18.md │ ├── 29.md │ ├── demo │ │ ├── 18 │ │ │ └── demo-dubbo-nacos.zip │ │ ├── 19 │ │ │ └── c2c-social-govern.zip │ │ ├── 20 │ │ │ └── c2c-social-govern.zip │ │ ├── 21 │ │ │ └── c2c-social-govern.zip │ │ ├── 22 │ │ │ └── c2c-social-govern.zip │ │ └── 69 │ │ │ └── 代码.zip │ ├── images │ │ ├── 11 │ │ │ └── 服务注册中心选型对比.png │ │ ├── 12 │ │ │ └── Nacos架构原理.png │ │ ├── 16 │ │ │ └── 几种RPC框架技术对比.png │ │ ├── 17 │ │ │ └── 几种RPC框架技术对比.png │ │ ├── 25 │ │ │ └── 开发测试流程.png │ │ ├── 61 │ │ │ └── 社会化治理平台架构设计.png │ │ ├── 30_1 │ │ │ ├── PPT.pptx │ │ │ └── 05_XA规范与2PC协议.png │ │ ├── 30_3 │ │ │ ├── PPT.pptx │ │ │ ├── 06_2PC的缺陷(1).png │ │ │ └── 07_3PC的过程和原理.png │ │ ├── 30_4 │ │ │ ├── PPT.pptx │ │ │ ├── 04_TCC方案.png │ │ │ ├── 01_单块系统里的事务.png │ │ │ ├── 03_两阶段提交方案.png │ │ │ ├── 05_本地消息表方案.png │ │ │ ├── 07_最大努力通知方案.png │ │ │ ├── 02_分布式系统里的事务.png │ │ │ └── 06_可靠消息最终一致性方案.png │ │ ├── 30_5_2 │ │ │ ├── PPT.pptx │ │ │ └── 11_CAP理论.png │ │ ├── 30_6 │ │ │ └── PPT.pptx │ │ ├── 30_7 │ │ │ ├── PPT.pptx │ │ │ └── 12_TCC方案细节.png │ │ ├── 30_8 │ │ │ └── PPT.pptx │ │ ├── 01 │ │ │ └── 单块系统开发的一些痛点.png │ │ ├── 07 │ │ │ └── 社会化治理平台架构设计.png │ │ ├── 08 │ │ │ └── 社会化治理平台架构设计.png │ │ └── 09 │ │ │ └── 社会化治理平台架构设计.png │ ├── 架构图 │ │ └── C2C电商社会化治理平台架构图.png │ ├── 57.md │ ├── 69.md │ ├── 64.md │ ├── 62.md │ ├── 63.md │ ├── 66.md │ ├── 67.md │ ├── 52.md │ ├── 58.md │ ├── 30.md │ ├── 35.md │ ├── 19.md │ ├── 20.md │ ├── 21.md │ ├── 22.md │ ├── 02_01.md │ ├── 37.md │ ├── 32.md │ ├── 38.md │ ├── 31.md │ ├── 36.md │ ├── 68.md │ ├── 53.md │ ├── 27.md │ ├── 03.md │ ├── 60.md │ ├── 59.md │ ├── 54.md │ ├── 61.md │ ├── 10.md │ ├── 39.md │ ├── 12.md │ ├── 34.md │ ├── 40.md │ ├── 05.md │ ├── 15.md │ ├── 06.md │ ├── 08.md │ ├── 47.md │ ├── 48.md │ └── 49.md ├── high-concurrency │ ├── README.md │ ├── images │ │ ├── hash.png │ │ ├── icon.png │ │ ├── mq-1.png │ │ ├── mq-10.png │ │ ├── mq-11.png │ │ ├── mq-2.png │ │ ├── mq-3.png │ │ ├── mq-4.png │ │ ├── mq-5.png │ │ ├── mq-6.png │ │ ├── mq-7.png │ │ ├── mq-8.png │ │ ├── es-write.png │ │ ├── dubbo-spi.png │ │ ├── es-cluster.png │ │ ├── hash-slot.png │ │ ├── es-cluster-0.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── kafka-after.png │ │ ├── kafka-before.png │ │ ├── redis-gossip.png │ │ ├── redis-redlock.png │ │ ├── es-write-detail.png │ │ ├── kafka-order-01.png │ │ ├── kafka-order-02.png │ │ ├── es-search-process.png │ │ ├── mysql-master-slave.png │ │ ├── rabbitmq-order-01.png │ │ ├── rabbitmq-order-02.png │ │ ├── redis-master-slave.png │ │ ├── service-invoke-road.png │ │ ├── database-shard-method-1.png │ │ ├── database-shard-method-2.png │ │ ├── database-split-horizon.png │ │ ├── rabbitmq-message-lose.png │ │ ├── redis-caching-avalanche.png │ │ ├── database-id-sequence-step.png │ │ ├── database-split-vertically.png │ │ ├── dubbo-operating-principle.png │ │ ├── dubbo-service-invoke-road.png │ │ ├── redis-caching-penetration.png │ │ ├── redis-cluster-split-brain.png │ │ ├── redis-junior-inconsistent.png │ │ ├── redis-single-thread-model.png │ │ ├── zookeeper-active-standby.png │ │ ├── consistent-hashing-algorithm.png │ │ ├── distributed-transaction-TCC.png │ │ ├── distributed-transaction-XA.png │ │ ├── simple-distributed-system-oa.png │ │ ├── zookeeper-distributed-lock.png │ │ ├── zookeeper-meta-data-manage.png │ │ ├── high-concurrency-system-design.png │ │ ├── rabbitmq-message-lose-solution.png │ │ ├── redis-master-slave-replication.png │ │ ├── zookeeper-centralized-storage.png │ │ ├── async-replication-data-lose-case.png │ │ ├── redis-caching-avalanche-solution.png │ │ ├── zookeeper-distributed-lock-demo.png │ │ ├── distributed-system-request-sequence.png │ │ ├── zookeeper-distributed-coordination.png │ │ ├── es-index-type-mapping-document-field.png │ │ ├── redis-master-slave-replication-detail.png │ │ ├── distributed-transaction-reliable-message.png │ │ ├── distributed-transaction-local-message-table.png │ │ ├── e-commerce-website-detail-page-architecture-1.png │ │ └── e-commerce-website-detail-page-architecture-2.png │ ├── redis-cas.md │ ├── how-to-ensure-high-concurrency-and-high-availability-of-redis.md │ ├── redis-production-environment.md │ └── es-production-cluster.md ├── distributed-system │ ├── README.md │ ├── register-high-availability.md │ ├── work-redis-distribute-lock.md │ ├── floor-distribute-lock.md │ ├── work-eventual-consistency.md │ ├── work-system-dilatation.md │ ├── tcc-framework-principle.md │ ├── code │ │ ├── code.zip │ │ ├── code2.zip │ │ ├── code3.zip │ │ ├── code4.zip │ │ └── rpc-demo.zip │ ├── images │ │ ├── hash.png │ │ ├── icon.png │ │ ├── dubbo-spi.png │ │ ├── hash-slot.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── distributed-lock.png │ │ ├── eureka-register.png │ │ ├── dubbo-rock-bottom.png │ │ ├── zookeeper-register.png │ │ ├── dubbo-keep-connection.png │ │ ├── redis-distribute-lock.png │ │ ├── rocketmq-transaction.png │ │ ├── serialize-deserialize.png │ │ ├── service-invoke-road.png │ │ ├── distributed-transaction-XA.png │ │ ├── dubbo-framework-principle.png │ │ ├── dubbo-not-keep-connection.png │ │ ├── dubbo-operating-principle.png │ │ ├── dubbo-service-invoke-road.png │ │ ├── gateway-high-concurrency.png │ │ ├── springCloud-study-theory.png │ │ ├── zookeeper-active-standby.png │ │ ├── zookeeper-distribute-lock.png │ │ ├── zookeeper-distributed-lock.png │ │ ├── zookeeper-meta-data-manage.png │ │ ├── consistent-hashing-algorithm.png │ │ ├── distributed-transaction-TCC.png │ │ ├── registration-center-optimize.png │ │ ├── simple-distributed-system-oa.png │ │ ├── SpringCloud-core-architecture.png │ │ ├── zookeeper-centralized-storage.png │ │ ├── zookeeper-distributed-lock-demo.png │ │ ├── async-replication-data-lose-case.png │ │ ├── distributed-system-request-sequence.png │ │ ├── zookeeper-distribute-lock-optimize.png │ │ ├── zookeeper-distributed-coordination.png │ │ ├── distributed-transaction-reliable-message.png │ │ ├── distributed-transaction-local-message-table.png │ │ ├── e-commerce-website-detail-page-architecture-1.png │ │ └── e-commerce-website-detail-page-architecture-2.png │ ├── highly-concurrent-majorization-distributed-lock.md │ ├── hitch-redis-distribute-lock.md │ ├── work-tcc-landing-scheme.md │ ├── homework │ │ └── distributed-system-homework.docx │ ├── zookeeper-distribute-lock-split-brain.md │ ├── gateway-technical.md │ ├── work-distributed-transaction.md │ ├── distributed-framework-selection.md │ ├── rocketmq-eventual-consistency.md │ ├── springCloud-and-rpc-framework.md │ ├── distributed-lock-taobao-and-jingdong.md │ ├── work-register.md │ ├── zookeeper-distribute-lock.md │ ├── registration-center-optimize.md │ ├── distributed-lock.md │ ├── zookeeper-distribute-lock-scheme.md │ ├── zookeeper-distribute-lock-optimize.md │ ├── service-register-gateway-router.md │ ├── request-retry.md │ ├── system-dilatation.md │ ├── eventual-consistency.md │ ├── Dubbo-SpringCloud-experience.md │ ├── dubbo-independent-framework.md │ ├── service-register-discovery.md │ ├── work-interface-idempotence.md │ ├── tcc-high-concurrence.md │ ├── gateway-high-concurrency.md │ ├── distributed-transaction-tcc.md │ ├── dubbo-rock-bottom.md │ ├── homework.md │ ├── highly-concurrent-distribute-lock.md │ ├── java-internet-interview-outlook.md │ ├── dubbo-augmentability.md │ ├── dynamic-route.md │ ├── redis-distribute-lock.md │ ├── register-production-optimize.md │ └── distributed-system-request-sequence.md ├── high-availability │ ├── README.md │ └── images │ │ ├── hash.png │ │ ├── icon.png │ │ ├── dubbo-spi.png │ │ ├── hash-slot.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── hystrix-process.png │ │ ├── hystrix-semphore.png │ │ ├── 220px-Internet_dog.jpg │ │ ├── bulkhead-partition.jpg │ │ ├── service-invoke-road.png │ │ ├── hystrix-request-cache.png │ │ ├── zookeeper-active-standby.png │ │ ├── distributed-transaction-TCC.png │ │ ├── distributed-transaction-XA.png │ │ ├── dubbo-operating-principle.png │ │ ├── dubbo-service-invoke-road.png │ │ ├── hystrix-thread-pool-queue.png │ │ ├── zookeeper-distributed-lock.png │ │ ├── zookeeper-meta-data-manage.png │ │ ├── consistent-hashing-algorithm.png │ │ ├── hystrix-semphore-thread-pool.png │ │ ├── hystrix-thread-pool-isolation.png │ │ ├── simple-distributed-system-oa.png │ │ ├── zookeeper-centralized-storage.png │ │ ├── async-replication-data-lose-case.png │ │ ├── zookeeper-distributed-lock-demo.png │ │ ├── zookeeper-distributed-coordination.png │ │ ├── distributed-system-request-sequence.png │ │ ├── distributed-transaction-reliable-message.png │ │ ├── distributed-transaction-local-message-table.png │ │ ├── e-commerce-website-detail-page-architecture-1.png │ │ └── e-commerce-website-detail-page-architecture-2.png └── share │ ├── ByteTCC │ ├── 使用背景.jpg │ ├── 框架底层原理.jpg │ ├── 电商项目落地方案.jpg │ └── ByteTCC.md │ └── leo │ └── leo儒猿群分享.pdf ├── .gitignore └── images ├── hash.png ├── icon.png ├── mq-1.png ├── mq-10.png ├── mq-11.png ├── mq-2.png ├── mq-3.png ├── mq-4.png ├── mq-5.png ├── mq-6.png ├── mq-7.png ├── mq-8.png ├── sketch.png ├── dubbo-spi.png ├── es-cluster.png ├── es-write.png ├── hash-slot.png ├── conways-law.png ├── es-cluster-0.png ├── kafka-after.png ├── kafka-before.png ├── redis-gossip.png ├── basic-pipeline.png ├── es-write-detail.png ├── favicon-16x16.png ├── favicon-32x32.png ├── hystrix-process.png ├── kafka-order-01.png ├── kafka-order-02.png ├── kafka-order-1.png ├── kafka-order-2.png ├── limaojishuwo.jpeg ├── redis-redlock.png ├── es-search-process.png ├── get-up-and-study.png ├── hystrix-semphore.png ├── micro-deployment.png ├── rabbitmq-order-01.png ├── rabbitmq-order-02.png ├── rabbitmq-order-1.png ├── rabbitmq-order-2.png ├── where-is-my-offer.png ├── bulkhead-partition.jpg ├── decentralised-data.png ├── mysql-master-slave.png ├── redis-master-slave.png ├── service-invoke-road.png ├── database-split-horizon.png ├── dubbo-keep-connection.png ├── hystrix-request-cache.png ├── rabbitmq-message-lose.png ├── serialize-deserialize.png ├── database-id-sequence-step.png ├── database-shard-method-1.png ├── database-shard-method-2.png ├── database-split-vertically.png ├── dubbo-not-keep-connection.png ├── dubbo-operating-principle.png ├── dubbo-service-invoke-road.png ├── hystrix-thread-pool-queue.png ├── redis-caching-avalanche.png ├── redis-caching-penetration.png ├── redis-cluster-split-brain.png ├── redis-junior-inconsistent.png ├── redis-single-thread-model.png ├── zookeeper-active-standby.png ├── distributed-transaction-TCC.png ├── distributed-transaction-XA.png ├── zookeeper-distributed-lock.png ├── zookeeper-meta-data-manage.png ├── consistent-hashing-algorithm.png ├── high-concurrency-system-design.png ├── hystrix-semphore-thread-pool.png ├── hystrix-thread-pool-isolation.png ├── rabbitmq-message-lose-solution.png ├── redis-master-slave-replication.png ├── simple-distributed-system-oa.png ├── zookeeper-centralized-storage.png ├── async-replication-data-lose-case.png ├── redis-caching-avalanche-solution.png ├── zookeeper-distributed-lock-demo.png ├── PreferFunctionalStaffOrganization.png ├── distributed-system-request-sequence.png ├── zookeeper-distributed-coordination.png ├── es-index-type-mapping-document-field.png ├── redis-master-slave-replication-detail.png ├── distributed-transaction-reliable-message.png ├── distributed-transaction-local-message-table.png ├── e-commerce-website-detail-page-architecture-1.png └── e-commerce-website-detail-page-architecture-2.png /docs/03/03.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/c2c/02_02.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/c2c/30_5_1.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea/ 2 | -------------------------------------------------------------------------------- /docs/03/62.md: -------------------------------------------------------------------------------- 1 | # 62、进程间是如何通信的?线程间又如何切换呢? -------------------------------------------------------------------------------- /docs/high-concurrency/README.md: -------------------------------------------------------------------------------- 1 | # 高并发架构 -------------------------------------------------------------------------------- /docs/distributed-system/README.md: -------------------------------------------------------------------------------- 1 | # 分布式系统 -------------------------------------------------------------------------------- /docs/high-availability/README.md: -------------------------------------------------------------------------------- 1 | # 高可用架构 -------------------------------------------------------------------------------- /docs/03/59.md: -------------------------------------------------------------------------------- 1 | # 59、你能说说MySQL数据库锁的实现原理吗?如果死锁了咋办? -------------------------------------------------------------------------------- /docs/03/60.md: -------------------------------------------------------------------------------- 1 | # 60、MySQL的SQL调优一般都有哪些手段?你们一般怎么做? -------------------------------------------------------------------------------- /docs/03/63.md: -------------------------------------------------------------------------------- 1 | # 63、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(上) -------------------------------------------------------------------------------- /docs/03/64.md: -------------------------------------------------------------------------------- 1 | # 64、你能聊聊BIO、NIO、AIO分别都是啥?有什么区别?(下) -------------------------------------------------------------------------------- /docs/c2c/45.md: -------------------------------------------------------------------------------- 1 | #《45_为什么微服务化的系统需要一个配置中心?》 2 | -------------------------------------------------------------------------------- /docs/03/61.md: -------------------------------------------------------------------------------- 1 | # 61、聊聊Socket的工作原理?Socket跟TCP IP之间是啥关系? -------------------------------------------------------------------------------- /docs/03/72.md: -------------------------------------------------------------------------------- 1 | # 72、可见性涉及的底层硬件概念:寄存器、高速缓存、写缓冲器(下) 2 | -------------------------------------------------------------------------------- /docs/03/82.md: -------------------------------------------------------------------------------- 1 | # 82、高速缓存的数据结构:拉链散列表、缓存条目以及地址解码(下) 2 | -------------------------------------------------------------------------------- /docs/c2c/24.md: -------------------------------------------------------------------------------- 1 | # 《24_如何基于Nacos实现多测试环境与生产环境的隔离?》 2 | -------------------------------------------------------------------------------- /docs/distributed-system/register-high-availability.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/03/91.md: -------------------------------------------------------------------------------- 1 | # 91、Java虚拟机对锁的优化:锁消除、锁粗化、偏向锁、自旋锁(下) 2 | -------------------------------------------------------------------------------- /docs/c2c/25.md: -------------------------------------------------------------------------------- 1 | # 《25_C2C电商社会化治理平台的多环境部署隔离》 2 | 3 | ![开发测试流程](images/25/开发测试流程.png) 4 | -------------------------------------------------------------------------------- /docs/distributed-system/work-redis-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 自己哪个业务可以用分布式锁?用什么框架?有什么生产问题? 3 | -------------------------------------------------------------------------------- /docs/03/112.md: -------------------------------------------------------------------------------- 1 | # 112、聊过两阶段提交了,那么分布式事务三阶段提交的思想能说一下吗? 2 | 3 | ![分布式事务三阶段提交](images/112/01.png) 4 | -------------------------------------------------------------------------------- /docs/c2c/18.md: -------------------------------------------------------------------------------- 1 | # 《18_Dubbo RPC框架集成Nacos注册中心》 2 | 3 | [demo](demo/18/demo-dubbo-nacos.zip) 4 | -------------------------------------------------------------------------------- /docs/c2c/29.md: -------------------------------------------------------------------------------- 1 | 29讲对应: 2 | 11_事务的基础知识筑基(一):ACID以及几种隔离级别 3 | 4 | 12_事务的基础知识筑基(二):Spring的事务支持以及传播特性 5 | -------------------------------------------------------------------------------- /images/hash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hash.png -------------------------------------------------------------------------------- /images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/icon.png -------------------------------------------------------------------------------- /images/mq-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-1.png -------------------------------------------------------------------------------- /images/mq-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-10.png -------------------------------------------------------------------------------- /images/mq-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-11.png -------------------------------------------------------------------------------- /images/mq-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-2.png -------------------------------------------------------------------------------- /images/mq-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-3.png -------------------------------------------------------------------------------- /images/mq-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-4.png -------------------------------------------------------------------------------- /images/mq-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-5.png -------------------------------------------------------------------------------- /images/mq-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-6.png -------------------------------------------------------------------------------- /images/mq-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-7.png -------------------------------------------------------------------------------- /images/mq-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mq-8.png -------------------------------------------------------------------------------- /images/sketch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/sketch.png -------------------------------------------------------------------------------- /images/dubbo-spi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/dubbo-spi.png -------------------------------------------------------------------------------- /images/es-cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-cluster.png -------------------------------------------------------------------------------- /images/es-write.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-write.png -------------------------------------------------------------------------------- /images/hash-slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hash-slot.png -------------------------------------------------------------------------------- /docs/c2c/demo/69/代码.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/69/代码.zip -------------------------------------------------------------------------------- /images/conways-law.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/conways-law.png -------------------------------------------------------------------------------- /images/es-cluster-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-cluster-0.png -------------------------------------------------------------------------------- /images/kafka-after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-after.png -------------------------------------------------------------------------------- /images/kafka-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-before.png -------------------------------------------------------------------------------- /images/redis-gossip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-gossip.png -------------------------------------------------------------------------------- /docs/03/images/100/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/100/01.png -------------------------------------------------------------------------------- /docs/03/images/101/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/101/01.png -------------------------------------------------------------------------------- /docs/03/images/101/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/101/02.png -------------------------------------------------------------------------------- /docs/03/images/104/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/104/01.png -------------------------------------------------------------------------------- /docs/03/images/106/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/106/01.png -------------------------------------------------------------------------------- /docs/03/images/106/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/106/02.png -------------------------------------------------------------------------------- /docs/03/images/107/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/107/01.png -------------------------------------------------------------------------------- /docs/03/images/108/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/108/01.png -------------------------------------------------------------------------------- /docs/03/images/111/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/111/01.png -------------------------------------------------------------------------------- /docs/03/images/112/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/112/01.png -------------------------------------------------------------------------------- /docs/03/images/113/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/113/01.png -------------------------------------------------------------------------------- /docs/03/images/113/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/113/02.png -------------------------------------------------------------------------------- /docs/03/images/113/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/113/03.png -------------------------------------------------------------------------------- /docs/03/images/114/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/114/01.png -------------------------------------------------------------------------------- /docs/03/images/114/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/114/02.png -------------------------------------------------------------------------------- /docs/03/images/115/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/115/01.png -------------------------------------------------------------------------------- /docs/03/images/119/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/119/01.png -------------------------------------------------------------------------------- /docs/03/images/120/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/120/01.png -------------------------------------------------------------------------------- /docs/03/images/121/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/121/01.png -------------------------------------------------------------------------------- /docs/03/images/122/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/122/01.png -------------------------------------------------------------------------------- /docs/03/images/123/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/123/01.png -------------------------------------------------------------------------------- /docs/03/images/124/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/124/01.png -------------------------------------------------------------------------------- /docs/03/images/126/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/126/01.png -------------------------------------------------------------------------------- /docs/03/images/128/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/128/01.png -------------------------------------------------------------------------------- /docs/03/images/13/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/13/01.png -------------------------------------------------------------------------------- /docs/03/images/13/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/13/02.png -------------------------------------------------------------------------------- /docs/03/images/13/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/13/03.png -------------------------------------------------------------------------------- /docs/03/images/13/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/13/04.png -------------------------------------------------------------------------------- /docs/03/images/147/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/147/01.png -------------------------------------------------------------------------------- /docs/03/images/148/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/148/01.png -------------------------------------------------------------------------------- /docs/03/images/15/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/15/01.png -------------------------------------------------------------------------------- /docs/03/images/16/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/16/01.png -------------------------------------------------------------------------------- /docs/03/images/17/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/17/01.png -------------------------------------------------------------------------------- /docs/03/images/21/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/21/01.png -------------------------------------------------------------------------------- /docs/03/images/21/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/21/02.png -------------------------------------------------------------------------------- /docs/03/images/22/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/22/01.png -------------------------------------------------------------------------------- /docs/03/images/22/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/22/02.png -------------------------------------------------------------------------------- /docs/03/images/23/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/23/01.png -------------------------------------------------------------------------------- /docs/03/images/23/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/23/02.png -------------------------------------------------------------------------------- /docs/03/images/24/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/24/01.png -------------------------------------------------------------------------------- /docs/03/images/24/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/24/02.png -------------------------------------------------------------------------------- /docs/03/images/24/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/24/03.png -------------------------------------------------------------------------------- /docs/03/images/26/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/26/01.png -------------------------------------------------------------------------------- /docs/03/images/26/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/26/02.png -------------------------------------------------------------------------------- /docs/03/images/26/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/26/03.png -------------------------------------------------------------------------------- /docs/03/images/27/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/27/01.png -------------------------------------------------------------------------------- /docs/03/images/27/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/27/02.png -------------------------------------------------------------------------------- /docs/03/images/29/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/29/01.png -------------------------------------------------------------------------------- /docs/03/images/30/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/30/01.png -------------------------------------------------------------------------------- /docs/03/images/31/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/31/01.png -------------------------------------------------------------------------------- /docs/03/images/32/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/32/01.png -------------------------------------------------------------------------------- /docs/03/images/32/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/32/02.png -------------------------------------------------------------------------------- /docs/03/images/33/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/33/01.png -------------------------------------------------------------------------------- /docs/03/images/33/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/33/02.png -------------------------------------------------------------------------------- /docs/03/images/35/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/35/01.png -------------------------------------------------------------------------------- /docs/03/images/36/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/36/01.png -------------------------------------------------------------------------------- /docs/03/images/37/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/37/01.png -------------------------------------------------------------------------------- /docs/03/images/37/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/37/02.png -------------------------------------------------------------------------------- /docs/03/images/38/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/38/01.png -------------------------------------------------------------------------------- /docs/03/images/39/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/39/01.png -------------------------------------------------------------------------------- /docs/03/images/39/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/39/02.png -------------------------------------------------------------------------------- /docs/03/images/44/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/44/01.png -------------------------------------------------------------------------------- /docs/03/images/44/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/44/02.png -------------------------------------------------------------------------------- /docs/03/images/44/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/44/03.png -------------------------------------------------------------------------------- /docs/03/images/44/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/44/04.png -------------------------------------------------------------------------------- /docs/03/images/49/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/49/01.png -------------------------------------------------------------------------------- /docs/03/images/49/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/49/02.png -------------------------------------------------------------------------------- /docs/03/images/49/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/49/03.png -------------------------------------------------------------------------------- /docs/03/images/51/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/51/01.png -------------------------------------------------------------------------------- /docs/03/images/53/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/53/01.png -------------------------------------------------------------------------------- /docs/03/images/54/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/54/01.png -------------------------------------------------------------------------------- /docs/03/images/57/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/57/01.png -------------------------------------------------------------------------------- /docs/03/images/57/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/57/02.png -------------------------------------------------------------------------------- /docs/03/images/57/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/57/03.png -------------------------------------------------------------------------------- /docs/03/images/57/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/57/04.png -------------------------------------------------------------------------------- /docs/03/images/65/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/65/01.png -------------------------------------------------------------------------------- /docs/03/images/71/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/71/01.png -------------------------------------------------------------------------------- /docs/03/images/71/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/71/02.png -------------------------------------------------------------------------------- /docs/03/images/73/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/73/01.png -------------------------------------------------------------------------------- /docs/03/images/75/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/75/01.png -------------------------------------------------------------------------------- /docs/03/images/76/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/76/01.png -------------------------------------------------------------------------------- /docs/03/images/81/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/81/01.png -------------------------------------------------------------------------------- /docs/03/images/83/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/83/01.png -------------------------------------------------------------------------------- /docs/03/images/84/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/84/01.png -------------------------------------------------------------------------------- /docs/03/images/85/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/85/01.png -------------------------------------------------------------------------------- /docs/03/images/94/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/94/01.png -------------------------------------------------------------------------------- /docs/03/images/94/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/94/02.png -------------------------------------------------------------------------------- /docs/03/images/95/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/95/01.png -------------------------------------------------------------------------------- /docs/03/images/98/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/98/01.png -------------------------------------------------------------------------------- /docs/03/images/99/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/99/01.png -------------------------------------------------------------------------------- /docs/distributed-system/floor-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 《亿级流量电商详情页系统实战》,部署redis和zookeeper,redisson做分布式锁,curator做分布式锁,试一试 3 | -------------------------------------------------------------------------------- /images/basic-pipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/basic-pipeline.png -------------------------------------------------------------------------------- /images/es-write-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-write-detail.png -------------------------------------------------------------------------------- /images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/favicon-16x16.png -------------------------------------------------------------------------------- /images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/favicon-32x32.png -------------------------------------------------------------------------------- /images/hystrix-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-process.png -------------------------------------------------------------------------------- /images/kafka-order-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-order-01.png -------------------------------------------------------------------------------- /images/kafka-order-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-order-02.png -------------------------------------------------------------------------------- /images/kafka-order-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-order-1.png -------------------------------------------------------------------------------- /images/kafka-order-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/kafka-order-2.png -------------------------------------------------------------------------------- /images/limaojishuwo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/limaojishuwo.jpeg -------------------------------------------------------------------------------- /images/redis-redlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-redlock.png -------------------------------------------------------------------------------- /docs/distributed-system/work-eventual-consistency.md: -------------------------------------------------------------------------------- 1 | 2 | 思路全给到位了,想想自己系统里哪个业务场景可以用这个分布式事务,基于RocketMQ自己实现一遍,自己写可靠消息服务实现一遍 3 | -------------------------------------------------------------------------------- /docs/distributed-system/work-system-dilatation.md: -------------------------------------------------------------------------------- 1 | 2 | 部署,机器配置,大概能抗多少并发;流量、QPS、性能,metrics;压测,借助一些小工具;扩容方案,横向加机器,还是说纵向提升机器的配置 3 | -------------------------------------------------------------------------------- /docs/share/ByteTCC/使用背景.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/share/ByteTCC/使用背景.jpg -------------------------------------------------------------------------------- /docs/share/leo/leo儒猿群分享.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/share/leo/leo儒猿群分享.pdf -------------------------------------------------------------------------------- /images/es-search-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-search-process.png -------------------------------------------------------------------------------- /images/get-up-and-study.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/get-up-and-study.png -------------------------------------------------------------------------------- /images/hystrix-semphore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-semphore.png -------------------------------------------------------------------------------- /images/micro-deployment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/micro-deployment.png -------------------------------------------------------------------------------- /images/rabbitmq-order-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-order-01.png -------------------------------------------------------------------------------- /images/rabbitmq-order-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-order-02.png -------------------------------------------------------------------------------- /images/rabbitmq-order-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-order-1.png -------------------------------------------------------------------------------- /images/rabbitmq-order-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-order-2.png -------------------------------------------------------------------------------- /images/where-is-my-offer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/where-is-my-offer.png -------------------------------------------------------------------------------- /docs/03/images/juc/01_CAS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/03/images/juc/01_CAS.png -------------------------------------------------------------------------------- /docs/c2c/images/25/开发测试流程.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/25/开发测试流程.png -------------------------------------------------------------------------------- /docs/c2c/images/30_1/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_1/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_3/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_3/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_4/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_5_2/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_5_2/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_6/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_6/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_7/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_7/PPT.pptx -------------------------------------------------------------------------------- /docs/c2c/images/30_8/PPT.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_8/PPT.pptx -------------------------------------------------------------------------------- /docs/distributed-system/tcc-framework-principle.md: -------------------------------------------------------------------------------- 1 | 2 | 面试突击第一季里仅仅是说了一下核心的一些思想 3 | 4 | 基于seata去跑分布式事务的,必须先独立去部署seata-server,TC 5 | -------------------------------------------------------------------------------- /docs/share/ByteTCC/框架底层原理.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/share/ByteTCC/框架底层原理.jpg -------------------------------------------------------------------------------- /docs/share/ByteTCC/电商项目落地方案.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/share/ByteTCC/电商项目落地方案.jpg -------------------------------------------------------------------------------- /images/bulkhead-partition.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/bulkhead-partition.jpg -------------------------------------------------------------------------------- /images/decentralised-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/decentralised-data.png -------------------------------------------------------------------------------- /images/mysql-master-slave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/mysql-master-slave.png -------------------------------------------------------------------------------- /images/redis-master-slave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-master-slave.png -------------------------------------------------------------------------------- /images/service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/service-invoke-road.png -------------------------------------------------------------------------------- /docs/c2c/images/11/服务注册中心选型对比.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/11/服务注册中心选型对比.png -------------------------------------------------------------------------------- /docs/c2c/images/12/Nacos架构原理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/12/Nacos架构原理.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/04_TCC方案.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/04_TCC方案.png -------------------------------------------------------------------------------- /docs/c2c/架构图/C2C电商社会化治理平台架构图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/架构图/C2C电商社会化治理平台架构图.png -------------------------------------------------------------------------------- /images/database-split-horizon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/database-split-horizon.png -------------------------------------------------------------------------------- /images/dubbo-keep-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/dubbo-keep-connection.png -------------------------------------------------------------------------------- /images/hystrix-request-cache.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-request-cache.png -------------------------------------------------------------------------------- /images/rabbitmq-message-lose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-message-lose.png -------------------------------------------------------------------------------- /images/serialize-deserialize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/serialize-deserialize.png -------------------------------------------------------------------------------- /docs/c2c/images/01/单块系统开发的一些痛点.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/01/单块系统开发的一些痛点.png -------------------------------------------------------------------------------- /docs/c2c/images/07/社会化治理平台架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/07/社会化治理平台架构设计.png -------------------------------------------------------------------------------- /docs/c2c/images/08/社会化治理平台架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/08/社会化治理平台架构设计.png -------------------------------------------------------------------------------- /docs/c2c/images/09/社会化治理平台架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/09/社会化治理平台架构设计.png -------------------------------------------------------------------------------- /docs/c2c/images/16/几种RPC框架技术对比.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/16/几种RPC框架技术对比.png -------------------------------------------------------------------------------- /docs/c2c/images/17/几种RPC框架技术对比.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/17/几种RPC框架技术对比.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/01_单块系统里的事务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/01_单块系统里的事务.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/03_两阶段提交方案.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/03_两阶段提交方案.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/05_本地消息表方案.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/05_本地消息表方案.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/07_最大努力通知方案.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/07_最大努力通知方案.png -------------------------------------------------------------------------------- /docs/c2c/images/30_5_2/11_CAP理论.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_5_2/11_CAP理论.png -------------------------------------------------------------------------------- /docs/c2c/images/30_7/12_TCC方案细节.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_7/12_TCC方案细节.png -------------------------------------------------------------------------------- /docs/c2c/images/61/社会化治理平台架构设计.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/61/社会化治理平台架构设计.png -------------------------------------------------------------------------------- /images/database-id-sequence-step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/database-id-sequence-step.png -------------------------------------------------------------------------------- /images/database-shard-method-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/database-shard-method-1.png -------------------------------------------------------------------------------- /images/database-shard-method-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/database-shard-method-2.png -------------------------------------------------------------------------------- /images/database-split-vertically.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/database-split-vertically.png -------------------------------------------------------------------------------- /images/dubbo-not-keep-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/dubbo-not-keep-connection.png -------------------------------------------------------------------------------- /images/dubbo-operating-principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/dubbo-operating-principle.png -------------------------------------------------------------------------------- /images/dubbo-service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/dubbo-service-invoke-road.png -------------------------------------------------------------------------------- /images/hystrix-thread-pool-queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-thread-pool-queue.png -------------------------------------------------------------------------------- /images/redis-caching-avalanche.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-caching-avalanche.png -------------------------------------------------------------------------------- /images/redis-caching-penetration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-caching-penetration.png -------------------------------------------------------------------------------- /images/redis-cluster-split-brain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-cluster-split-brain.png -------------------------------------------------------------------------------- /images/redis-junior-inconsistent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-junior-inconsistent.png -------------------------------------------------------------------------------- /images/redis-single-thread-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-single-thread-model.png -------------------------------------------------------------------------------- /images/zookeeper-active-standby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-active-standby.png -------------------------------------------------------------------------------- /docs/03/47.md: -------------------------------------------------------------------------------- 1 | # 47、浏览器请求www.baidu.com的全过程大概是怎么样的?(上) 2 | [面试官:浏览器请求 www.baidu.com 时,背后都干了些啥?](https://mp.weixin.qq.com/s/rqa_YoBkkavJ12GAXZHTYA) 3 | -------------------------------------------------------------------------------- /docs/03/48.md: -------------------------------------------------------------------------------- 1 | # 48、浏览器请求www.baidu.com的全过程大概是怎么样的?(下) 2 | [面试官:浏览器请求 www.baidu.com 时,背后都干了些啥?](https://mp.weixin.qq.com/s/rqa_YoBkkavJ12GAXZHTYA) 3 | -------------------------------------------------------------------------------- /docs/03/56.md: -------------------------------------------------------------------------------- 1 | # 56、聊聊MySQL的索引实现原理?各种索引你们平时都怎么用的?(下) 2 | 3 | [30K以内Java必问:一个关于MySQL索引的面试6连炮!](https://mp.weixin.qq.com/s/nfcxdFEYP7bYUzhNgJtj4g) 4 | -------------------------------------------------------------------------------- /docs/c2c/demo/18/demo-dubbo-nacos.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/18/demo-dubbo-nacos.zip -------------------------------------------------------------------------------- /docs/c2c/demo/19/c2c-social-govern.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/19/c2c-social-govern.zip -------------------------------------------------------------------------------- /docs/c2c/demo/20/c2c-social-govern.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/20/c2c-social-govern.zip -------------------------------------------------------------------------------- /docs/c2c/demo/21/c2c-social-govern.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/21/c2c-social-govern.zip -------------------------------------------------------------------------------- /docs/c2c/demo/22/c2c-social-govern.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/demo/22/c2c-social-govern.zip -------------------------------------------------------------------------------- /docs/c2c/images/30_1/05_XA规范与2PC协议.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_1/05_XA规范与2PC协议.png -------------------------------------------------------------------------------- /docs/c2c/images/30_3/06_2PC的缺陷(1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_3/06_2PC的缺陷(1).png -------------------------------------------------------------------------------- /docs/c2c/images/30_3/07_3PC的过程和原理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_3/07_3PC的过程和原理.png -------------------------------------------------------------------------------- /docs/c2c/images/30_4/02_分布式系统里的事务.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/02_分布式系统里的事务.png -------------------------------------------------------------------------------- /docs/distributed-system/code/code.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/code/code.zip -------------------------------------------------------------------------------- /docs/distributed-system/code/code2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/code/code2.zip -------------------------------------------------------------------------------- /docs/distributed-system/code/code3.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/code/code3.zip -------------------------------------------------------------------------------- /docs/distributed-system/code/code4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/code/code4.zip -------------------------------------------------------------------------------- /docs/high-availability/images/hash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hash.png -------------------------------------------------------------------------------- /docs/high-availability/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/icon.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/hash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/hash.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/icon.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-1.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-10.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-11.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-2.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-3.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-4.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-5.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-6.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-7.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mq-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mq-8.png -------------------------------------------------------------------------------- /images/distributed-transaction-TCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/distributed-transaction-TCC.png -------------------------------------------------------------------------------- /images/distributed-transaction-XA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/distributed-transaction-XA.png -------------------------------------------------------------------------------- /images/zookeeper-distributed-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-distributed-lock.png -------------------------------------------------------------------------------- /images/zookeeper-meta-data-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-meta-data-manage.png -------------------------------------------------------------------------------- /docs/03/55.md: -------------------------------------------------------------------------------- 1 | # 55、聊聊MySQL的索引实现原理?各种索引你们平时都怎么用的?(上)] 2 | 3 | [30K以内Java必问:一个关于MySQL索引的面试6连炮!](https://mp.weixin.qq.com/s/nfcxdFEYP7bYUzhNgJtj4g) 4 | -------------------------------------------------------------------------------- /docs/c2c/images/30_4/06_可靠消息最终一致性方案.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/c2c/images/30_4/06_可靠消息最终一致性方案.png -------------------------------------------------------------------------------- /docs/distributed-system/code/rpc-demo.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/code/rpc-demo.zip -------------------------------------------------------------------------------- /docs/distributed-system/images/hash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/hash.png -------------------------------------------------------------------------------- /docs/distributed-system/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/icon.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-write.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-write.png -------------------------------------------------------------------------------- /images/consistent-hashing-algorithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/consistent-hashing-algorithm.png -------------------------------------------------------------------------------- /images/high-concurrency-system-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/high-concurrency-system-design.png -------------------------------------------------------------------------------- /images/hystrix-semphore-thread-pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-semphore-thread-pool.png -------------------------------------------------------------------------------- /images/hystrix-thread-pool-isolation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/hystrix-thread-pool-isolation.png -------------------------------------------------------------------------------- /images/rabbitmq-message-lose-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/rabbitmq-message-lose-solution.png -------------------------------------------------------------------------------- /images/redis-master-slave-replication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-master-slave-replication.png -------------------------------------------------------------------------------- /images/simple-distributed-system-oa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/simple-distributed-system-oa.png -------------------------------------------------------------------------------- /images/zookeeper-centralized-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-centralized-storage.png -------------------------------------------------------------------------------- /docs/high-availability/images/dubbo-spi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/dubbo-spi.png -------------------------------------------------------------------------------- /docs/high-availability/images/hash-slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hash-slot.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/dubbo-spi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/dubbo-spi.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-cluster.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/hash-slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/hash-slot.png -------------------------------------------------------------------------------- /images/async-replication-data-lose-case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/async-replication-data-lose-case.png -------------------------------------------------------------------------------- /images/redis-caching-avalanche-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-caching-avalanche-solution.png -------------------------------------------------------------------------------- /images/zookeeper-distributed-lock-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-distributed-lock-demo.png -------------------------------------------------------------------------------- /docs/03/18.md: -------------------------------------------------------------------------------- 1 | # 《18、如果在线程池中使用无界阻塞队列会发生什么问题?》 2 | 面试题: 3 | 4 | 在远程服务异常的情况下,使用无界阻塞队列,是否会导致内存异常飙升? 5 | 6 | 7 | 8 | 调用超时,队列变得越来越大,此时会导致内存飙升起来,而且还可能会导致你会OOM,内存溢出 -------------------------------------------------------------------------------- /docs/distributed-system/highly-concurrent-majorization-distributed-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 想想自己的分布式锁用在业务系统中,有没有高并发问题,如果有,如何用分段加锁思路来解决,或者用kv存储来存放实时库存抗并发,直接在kv里扣减,避免用分布式锁 3 | -------------------------------------------------------------------------------- /docs/distributed-system/hitch-redis-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 瞬时故障问题 3 | 4 | 彻底解决这个问题,很难,除非你修改一些redis和redisson框架的源码,源码级的二次开发,加锁,必须是master和slave同时写成功,才算是加锁成功 5 | -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-spi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-spi.png -------------------------------------------------------------------------------- /docs/distributed-system/images/hash-slot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/hash-slot.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-cluster-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-cluster-0.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/favicon-16x16.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/favicon-32x32.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/kafka-after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/kafka-after.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/kafka-before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/kafka-before.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-gossip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-gossip.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-redlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-redlock.png -------------------------------------------------------------------------------- /images/PreferFunctionalStaffOrganization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/PreferFunctionalStaffOrganization.png -------------------------------------------------------------------------------- /images/distributed-system-request-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/distributed-system-request-sequence.png -------------------------------------------------------------------------------- /images/zookeeper-distributed-coordination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/zookeeper-distributed-coordination.png -------------------------------------------------------------------------------- /docs/distributed-system/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/favicon-16x16.png -------------------------------------------------------------------------------- /docs/distributed-system/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/favicon-32x32.png -------------------------------------------------------------------------------- /docs/distributed-system/work-tcc-landing-scheme.md: -------------------------------------------------------------------------------- 1 | 2 | 大家按照我提示的思路,参考人家的sample,尝试把seata分布式事务框架整合到spring cloud技术架构里去,把这个东西跑出来,如果遇到了问题之后,可以上seata github提issue,问人家怎么回事 3 | -------------------------------------------------------------------------------- /docs/high-availability/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/favicon-16x16.png -------------------------------------------------------------------------------- /docs/high-availability/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/favicon-32x32.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-write-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-write-detail.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/kafka-order-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/kafka-order-01.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/kafka-order-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/kafka-order-02.png -------------------------------------------------------------------------------- /images/es-index-type-mapping-document-field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/es-index-type-mapping-document-field.png -------------------------------------------------------------------------------- /images/redis-master-slave-replication-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/redis-master-slave-replication-detail.png -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-lock.png -------------------------------------------------------------------------------- /docs/distributed-system/images/eureka-register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/eureka-register.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-process.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-semphore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-semphore.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-search-process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-search-process.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/mysql-master-slave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/mysql-master-slave.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/rabbitmq-order-01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/rabbitmq-order-01.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/rabbitmq-order-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/rabbitmq-order-02.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-master-slave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-master-slave.png -------------------------------------------------------------------------------- /images/distributed-transaction-reliable-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/distributed-transaction-reliable-message.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-rock-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-rock-bottom.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-register.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-register.png -------------------------------------------------------------------------------- /docs/high-availability/images/220px-Internet_dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/220px-Internet_dog.jpg -------------------------------------------------------------------------------- /docs/high-availability/images/bulkhead-partition.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/bulkhead-partition.jpg -------------------------------------------------------------------------------- /docs/high-availability/images/service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/service-invoke-road.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/service-invoke-road.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-keep-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-keep-connection.png -------------------------------------------------------------------------------- /docs/distributed-system/images/redis-distribute-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/redis-distribute-lock.png -------------------------------------------------------------------------------- /docs/distributed-system/images/rocketmq-transaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/rocketmq-transaction.png -------------------------------------------------------------------------------- /docs/distributed-system/images/serialize-deserialize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/serialize-deserialize.png -------------------------------------------------------------------------------- /docs/distributed-system/images/service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/service-invoke-road.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-request-cache.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-request-cache.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/database-shard-method-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/database-shard-method-1.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/database-shard-method-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/database-shard-method-2.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/database-split-horizon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/database-split-horizon.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/rabbitmq-message-lose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/rabbitmq-message-lose.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-caching-avalanche.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-caching-avalanche.png -------------------------------------------------------------------------------- /images/distributed-transaction-local-message-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/distributed-transaction-local-message-table.png -------------------------------------------------------------------------------- /images/e-commerce-website-detail-page-architecture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/e-commerce-website-detail-page-architecture-1.png -------------------------------------------------------------------------------- /images/e-commerce-website-detail-page-architecture-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/images/e-commerce-website-detail-page-architecture-2.png -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-active-standby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-active-standby.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/database-id-sequence-step.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/database-id-sequence-step.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/database-split-vertically.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/database-split-vertically.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/dubbo-operating-principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/dubbo-operating-principle.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/dubbo-service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/dubbo-service-invoke-road.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-caching-penetration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-caching-penetration.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-cluster-split-brain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-cluster-split-brain.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-junior-inconsistent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-junior-inconsistent.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-single-thread-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-single-thread-model.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-active-standby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-active-standby.png -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-transaction-XA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-transaction-XA.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-framework-principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-framework-principle.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-not-keep-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-not-keep-connection.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-operating-principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-operating-principle.png -------------------------------------------------------------------------------- /docs/distributed-system/images/dubbo-service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/dubbo-service-invoke-road.png -------------------------------------------------------------------------------- /docs/distributed-system/images/gateway-high-concurrency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/gateway-high-concurrency.png -------------------------------------------------------------------------------- /docs/distributed-system/images/springCloud-study-theory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/springCloud-study-theory.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-active-standby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-active-standby.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-distribute-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-distribute-lock.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-distributed-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-distributed-lock.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-meta-data-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-meta-data-manage.png -------------------------------------------------------------------------------- /docs/high-availability/images/distributed-transaction-TCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/distributed-transaction-TCC.png -------------------------------------------------------------------------------- /docs/high-availability/images/distributed-transaction-XA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/distributed-transaction-XA.png -------------------------------------------------------------------------------- /docs/high-availability/images/dubbo-operating-principle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/dubbo-operating-principle.png -------------------------------------------------------------------------------- /docs/high-availability/images/dubbo-service-invoke-road.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/dubbo-service-invoke-road.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-thread-pool-queue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-thread-pool-queue.png -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-distributed-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-distributed-lock.png -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-meta-data-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-meta-data-manage.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/consistent-hashing-algorithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/consistent-hashing-algorithm.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/distributed-transaction-TCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/distributed-transaction-TCC.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/distributed-transaction-XA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/distributed-transaction-XA.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/simple-distributed-system-oa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/simple-distributed-system-oa.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-distributed-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-distributed-lock.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-meta-data-manage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-meta-data-manage.png -------------------------------------------------------------------------------- /docs/distributed-system/images/consistent-hashing-algorithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/consistent-hashing-algorithm.png -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-transaction-TCC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-transaction-TCC.png -------------------------------------------------------------------------------- /docs/distributed-system/images/registration-center-optimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/registration-center-optimize.png -------------------------------------------------------------------------------- /docs/distributed-system/images/simple-distributed-system-oa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/simple-distributed-system-oa.png -------------------------------------------------------------------------------- /docs/high-availability/images/consistent-hashing-algorithm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/consistent-hashing-algorithm.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-semphore-thread-pool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-semphore-thread-pool.png -------------------------------------------------------------------------------- /docs/high-availability/images/hystrix-thread-pool-isolation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/hystrix-thread-pool-isolation.png -------------------------------------------------------------------------------- /docs/high-availability/images/simple-distributed-system-oa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/simple-distributed-system-oa.png -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-centralized-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-centralized-storage.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/high-concurrency-system-design.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/high-concurrency-system-design.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/rabbitmq-message-lose-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/rabbitmq-message-lose-solution.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-master-slave-replication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-master-slave-replication.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-centralized-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-centralized-storage.png -------------------------------------------------------------------------------- /docs/distributed-system/homework/distributed-system-homework.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/homework/distributed-system-homework.docx -------------------------------------------------------------------------------- /docs/distributed-system/images/SpringCloud-core-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/SpringCloud-core-architecture.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-centralized-storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-centralized-storage.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-distributed-lock-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-distributed-lock-demo.png -------------------------------------------------------------------------------- /docs/high-availability/images/async-replication-data-lose-case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/async-replication-data-lose-case.png -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-distributed-lock-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-distributed-lock-demo.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/async-replication-data-lose-case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/async-replication-data-lose-case.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-caching-avalanche-solution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-caching-avalanche-solution.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-distributed-lock-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-distributed-lock-demo.png -------------------------------------------------------------------------------- /docs/share/ByteTCC/ByteTCC.md: -------------------------------------------------------------------------------- 1 | # ByteTCC 2 | 3 | ## 使用背景 4 | 5 | ![使用背景](使用背景.jpg) 6 | 7 | ## 框架底层原理 8 | 9 | ![框架底层原理](框架底层原理.jpg) 10 | 11 | ## 电商项目落地方案 12 | 13 | ![电商项目落地方案](电商项目落地方案.jpg) -------------------------------------------------------------------------------- /docs/distributed-system/images/async-replication-data-lose-case.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/async-replication-data-lose-case.png -------------------------------------------------------------------------------- /docs/distributed-system/zookeeper-distribute-lock-split-brain.md: -------------------------------------------------------------------------------- 1 | 2 | 分布式锁脑裂,重复加锁 3 | 4 | 分布式系统,主控节点有一个Master,此时因为网络故障,导致其他人以为这个Master不可用了,其他节点出现了别的Master,导致集群里有2个Master同时在运行 5 | 6 | curator框架源码,加一些协调机制 7 | -------------------------------------------------------------------------------- /docs/high-availability/images/zookeeper-distributed-coordination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/zookeeper-distributed-coordination.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/distributed-system-request-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/distributed-system-request-sequence.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/zookeeper-distributed-coordination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/zookeeper-distributed-coordination.png -------------------------------------------------------------------------------- /docs/distributed-system/gateway-technical.md: -------------------------------------------------------------------------------- 1 | 2 | 服务框架的原理和技术选型,你们公司到底是怎么选,为什么? 3 | 4 | 服务注册中心,思考,你们公司到底是怎么选的,生产环境有没有做一些优化,如果没有,哪些地方是有优化空间的? 5 | 6 | 网关系统,思考,你们公司是怎么选型的,为什么?生产环境是否对类似动态路由的功能做过优化,如果没有是否有优化空间? 7 | -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-system-request-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-system-request-sequence.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-distribute-lock-optimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-distribute-lock-optimize.png -------------------------------------------------------------------------------- /docs/distributed-system/images/zookeeper-distributed-coordination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/zookeeper-distributed-coordination.png -------------------------------------------------------------------------------- /docs/high-availability/images/distributed-system-request-sequence.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/distributed-system-request-sequence.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/es-index-type-mapping-document-field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/es-index-type-mapping-document-field.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/redis-master-slave-replication-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/redis-master-slave-replication-detail.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/distributed-transaction-reliable-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/distributed-transaction-reliable-message.png -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-transaction-reliable-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-transaction-reliable-message.png -------------------------------------------------------------------------------- /docs/distributed-system/work-distributed-transaction.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 你自己的系统,核心链路,是否存在数据不一致的问题,如果要设计分布式事务方案,如何设计,对分布式事务的技术如何选型,好好做一下,然后提交到儒猿技术窝,知识店铺,训练营里有作业本 4 | 5 | 完成作业的时候有任何疑问,可以提出来,我们每天会进行答疑 6 | 7 | 微信群,训练营的课程目录里有一个文档 8 | -------------------------------------------------------------------------------- /docs/high-availability/images/distributed-transaction-reliable-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/distributed-transaction-reliable-message.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/distributed-transaction-local-message-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/distributed-transaction-local-message-table.png -------------------------------------------------------------------------------- /docs/c2c/57.md: -------------------------------------------------------------------------------- 1 | #《57_为什么微服务化的系统需要一个日志中心?》 2 | 3 | 线上运行的系统,跑着跑着,突然有用户找客服反馈你的系统有个什么什么bug!bug可能有对应的异常报错,也可能没有报错,就是纯粹的是你的代码级别的bug,客服会找你们技术这边 4 | 5 | 快速的定位bug发生的原因,定位 -> 修复 6 | 7 | 通过查阅日志,分析bug发生时,系统是如何运行的,是否运行中有问题导致bug 8 | 9 | -------------------------------------------------------------------------------- /docs/c2c/69.md: -------------------------------------------------------------------------------- 1 | # 《65_CAT分布式链路追踪系统的生产部署实践》 2 | 3 | 监控:机器资源、JVM进程、系统(QPS、延时、异常)、请求链路 4 | 5 | 日志:异常日志、请求日志 6 | 7 | 链路 8 | 9 | 请求链路 10 | 请求1次数据库 耗时多少ms 11 | 请求1次缓存 耗时多少ms 12 | 请求2次评审员服务 耗时多少ms 13 | 请求1次奖励服务 异常 耗时1s 14 | -------------------------------------------------------------------------------- /docs/distributed-system/images/distributed-transaction-local-message-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/distributed-transaction-local-message-table.png -------------------------------------------------------------------------------- /docs/high-availability/images/distributed-transaction-local-message-table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/distributed-transaction-local-message-table.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/e-commerce-website-detail-page-architecture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/e-commerce-website-detail-page-architecture-1.png -------------------------------------------------------------------------------- /docs/high-concurrency/images/e-commerce-website-detail-page-architecture-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-concurrency/images/e-commerce-website-detail-page-architecture-2.png -------------------------------------------------------------------------------- /docs/distributed-system/images/e-commerce-website-detail-page-architecture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/e-commerce-website-detail-page-architecture-1.png -------------------------------------------------------------------------------- /docs/distributed-system/images/e-commerce-website-detail-page-architecture-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/distributed-system/images/e-commerce-website-detail-page-architecture-2.png -------------------------------------------------------------------------------- /docs/high-availability/images/e-commerce-website-detail-page-architecture-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/e-commerce-website-detail-page-architecture-1.png -------------------------------------------------------------------------------- /docs/high-availability/images/e-commerce-website-detail-page-architecture-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leelovejava/Java-Interview-Advanced/HEAD/docs/high-availability/images/e-commerce-website-detail-page-architecture-2.png -------------------------------------------------------------------------------- /docs/distributed-system/distributed-framework-selection.md: -------------------------------------------------------------------------------- 1 | **Spring Cloud**入门和使用级别的资料,建议大家自行百度,面试训练营,不是说针对每个技术详细给大家讲解的一个课程,我们会针对每个技术推出重磅的项目实战课程 2 | 3 | **自己公司如果是分布式的架构,你们当前选用的是Spring Cloud?Dubbo?自己研发的服务框架?对比一下各种服务框架的优点和缺点,技术选型,为什么?** 4 | -------------------------------------------------------------------------------- /docs/c2c/64.md: -------------------------------------------------------------------------------- 1 | #《64_CAT实现分布式链路追踪的架构原理》 2 | 3 | 监控:机器资源、JVM进程、系统(QPS、延时、异常)、请求链路 4 | 5 | 日志:异常日志、请求日志 6 | 7 | 链路 8 | 9 | 请求链路 10 | 请求1次数据库 耗时多少ms 11 | 请求1次缓存 耗时多少ms 12 | 请求2次评审员服务 耗时多少ms 13 | 请求1次奖励服务 异常 耗时1s 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/c2c/62.md: -------------------------------------------------------------------------------- 1 | #《62_为什么微服务化的系统需要进行链路追踪?》 2 | 3 | 监控:机器资源、JVM进程、系统(QPS、延时、异常)、请求链路 4 | 5 | 日志:异常日志、请求日志 6 | 7 | 链路 8 | 9 | 请求链路 10 | 请求1次数据库 耗时多少ms 11 | 请求1次缓存 耗时多少ms 12 | 请求2次评审员服务 耗时多少ms 13 | 请求1次奖励服务 异常 耗时1s 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/c2c/63.md: -------------------------------------------------------------------------------- 1 | #《63_Sleuth、Zipin、CAT的选型对比》 2 | 3 | 监控:机器资源、JVM进程、系统(QPS、延时、异常)、请求链路 4 | 5 | 日志:异常日志、请求日志 6 | 7 | 链路 8 | 9 | 请求链路 10 | 请求1次数据库 耗时多少ms 11 | 请求1次缓存 耗时多少ms 12 | 请求2次评审员服务 耗时多少ms 13 | 请求1次奖励服务 异常 耗时1s 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/c2c/66.md: -------------------------------------------------------------------------------- 1 | #《66_为什么微服务化的系统需要一个API网关?》 2 | 3 | 网关的核心功能 4 | 5 | (1)动态路由:新开发某个服务,动态把请求路径和服务的映射关系热加载到网关里去;服务增减机器,网关自动热感知 6 | (2)灰度发布 7 | (3)授权认证 8 | (4)性能监控:每个API接口的耗时、成功率、QPS 9 | (5)系统日志 10 | (6)数据缓存 11 | (7)限流熔断 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/c2c/67.md: -------------------------------------------------------------------------------- 1 | # 《67_Zuul Srping Cloud Gateway的选型对比》 2 | 3 | 监控:机器资源、JVM进程、系统(QPS、延时、异常)、请求链路 4 | 5 | 日志:异常日志、请求日志 6 | 7 | 链路 8 | 9 | 请求链路 10 | 请求1次数据库 耗时多少ms 11 | 请求1次缓存 耗时多少ms 12 | 请求2次评审员服务 耗时多少ms 13 | 请求1次奖励服务 异常 耗时1s 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/distributed-system/rocketmq-eventual-consistency.md: -------------------------------------------------------------------------------- 1 | 2 | seata,作业,参考官网示例,自己玩儿,在自己本地部署一个单机版的RocketMQ,做实验,参考示例代码,实现一下发送消息,回调接口,一个是事务消息,一个是消费者ack 3 | 4 | 面试训练营,讲究必须留作业给你自己动手 5 | 6 | 如果要看详细的项目实战类课程,参考训练营的课程目录中有一个文档,里面有我之前的课程,《亿级流量电商详情页系统实战》,一步一步带着手敲代码,可以去看看 7 | -------------------------------------------------------------------------------- /docs/distributed-system/springCloud-and-rpc-framework.md: -------------------------------------------------------------------------------- 1 | 2 | ### 1、作业1 3 | 4 | **把RPC框架如何设计,这个问题,你把整体思路去屡一下,对应的一些细节,很多可以参考之前面试突击第一季的,还有一些网络通信框架,netty,找一些资料,补充了解一些细节,包括动态代理** 5 | 6 | 序列化协议 7 | 8 | ### 2、作业2 9 | 10 | **不看资料,手画Spring Cloud底层原理,Eureka** 11 | -------------------------------------------------------------------------------- /docs/03/20.md: -------------------------------------------------------------------------------- 1 | # 《20、如果线上机器突然宕机,线程池的阻塞队列中的请求怎么办?》 2 | 3 | 必然会导致线程池里的积压的任务实际上来说都是会丢失的 4 | 5 | 6 | 7 | 如果说你要提交一个任务到线程池里去,在提交之前,麻烦你先在数据库里插入这个任务的信息,更新他的状态:未提交、已提交、已完成。提交成功之后,更新他的状态是已提交状态 8 | 9 | 10 | 11 | 系统重启,后台线程去扫描数据库里的未提交和已提交状态的任务,可以把任务的信息读取出来,重新提交到线程池里去,继续进行执行 -------------------------------------------------------------------------------- /docs/distributed-system/distributed-lock-taobao-and-jingdong.md: -------------------------------------------------------------------------------- 1 | 2 | 大公司一般有分布式kv存储,tair,redis,mongodb,高并发,每秒几万几十万都没问题,甚至每秒百万 3 | 4 | 实时库存数据放kv存储里去,先查库存再扣减库存,你在操作库存的时候,直接扣减,如果你发现扣减之后是负数的话,此时就认为库存超卖了,回滚刚才的扣减,返回提示给用户。对kv做的库存修改写MQ,异步同步落数据库,相当于异步双写,用分布式kv抗高并发,做好一致性方案 5 | 6 | 7 | -------------------------------------------------------------------------------- /docs/distributed-system/work-register.md: -------------------------------------------------------------------------------- 1 | 2 | #### Dubbo框架原理 3 | #### Spring Cloud框架原理 4 | #### 服务框架的技术选型 5 | 6 | #### 服务注册中心技术选型和核心原理 7 | #### 生产优化 8 | #### 架构优化 9 | 10 | #### 网关系统技术选型和核心原理 11 | #### 生产优化(灰度发布、动态路由) 12 | 13 | #### 生产级的分布式系统里,新服务开发如何做,老服务迭代如何做 14 | -------------------------------------------------------------------------------- /docs/c2c/52.md: -------------------------------------------------------------------------------- 1 | #《52_为什么微服务化的系统要需要一个监控中心?》 2 | 3 | 很多系统平时上线了以后,似乎就是咔咔的跑着,好像你也没有去关注他,如果没人反馈bug给你,你似乎根本就不去care他 4 | 5 | 线上系统,可能产生的三个层面的问题: 6 | 7 | * 1、机器资源的层面:cpu、内存、网络、磁盘、io,出现了负载过高的问题 8 | * 2、JVM进程的层面:jvm内部各个区域的内存使用以及gc频率 9 | * 3、代码层面:代码逻辑的内部,抛异常,出现一些不希望发生的系统异常 10 | 11 | -------------------------------------------------------------------------------- /docs/c2c/58.md: -------------------------------------------------------------------------------- 1 | #《58_Elasticsearch的整体架构原理介绍》 2 | 3 | 线上运行的系统,跑着跑着,突然有用户找客服反馈你的系统有个什么什么bug!bug可能有对应的异常报错,也可能没有报错,就是纯粹的是你的代码级别的bug,客服会找你们技术这边 4 | 5 | 快速的定位bug发生的原因,定位 -> 修复 6 | 7 | 通过查阅日志,分析bug发生时,系统是如何运行的,是否运行中有问题导致bug 8 | 9 | 如果你单个服务/系统部署的机器数量都超过5台了,此时必须要上日志中心 10 | 11 | -------------------------------------------------------------------------------- /docs/03/125.md: -------------------------------------------------------------------------------- 1 | # 125、一个关键的问题:zk到底通过什么协议在集群间进行数据一致性同步? 2 | 3 | 在整个zk的架构和工作原理中,有一个非常关键的环节,就是zk集群的数据同步是用什么协议做的?其实用的是特别设计的ZAB协议,ZooKeeper Atomic Broadcast,就是ZooKeeper原子广播协议 4 | 5 | 原子性 6 | 7 | 8 | 9 | 通过这个协议来进行zk集群间的数据同步,保证数据的强一致性 10 | 11 | 12 | 13 | zk,就说他的一致性的问题,很多同学可能不理解zk的一致性 14 | -------------------------------------------------------------------------------- /docs/distributed-system/zookeeper-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 看图说话 3 | ![distributed-lock](/docs/distributed-system/images/zookeeper-distribute-lock.png) 4 | 一般很少自己手撸,curator,基于zk实现了一整套的高级功能 5 | 6 | product_1_stock 7 | 8 | curator.lock(“product_1_stock”) 9 | 10 | /locks/product_1_stock 11 | -------------------------------------------------------------------------------- /docs/distributed-system/registration-center-optimize.md: -------------------------------------------------------------------------------- 1 | 2 | ![分布式注册中心](/docs/distributed-system/images/registration-center-optimize.png) 3 | #### eureka:peer-to-peer,每台机器都是高并发请求,有瓶颈 4 | #### zookeeper:服务上下线,全量通知其他服务,网络带宽被打满,有瓶颈 5 | 6 | #### 分布式服务注册中心,分片存储服务注册表,横向扩容,每台机器均摊高并发请求,各个服务主动拉取,避免反向通知网卡被打满 7 | -------------------------------------------------------------------------------- /docs/03/109.md: -------------------------------------------------------------------------------- 1 | # 109、一起来看一个难度升级之后的分布式架构面试连环炮 2 | 3 | 1. 你们的分布式系统是如何进行链路监控的?说说链路追踪系统架构原理? 4 | 5 | 2. 对分布式系统进行核心链路追踪的时候,链路id是怎么管理的? 6 | 7 | 3. 聊过两阶段提交了,那么分布式事务三阶段提交的思想能说一下吗? 8 | 9 | 4. 唯一id生成机制中的snowflake算法的时钟回拨问题如何解决? 10 | 11 | 5. 实施灰度发布的时候,网关是可以灰度了,可是Dubbo服务如何进行灰度呢? 12 | 13 | 6. 除了常见服务注册中心之外,你觉得Redis能作为服务注册中心吗? 14 | -------------------------------------------------------------------------------- /docs/03/115.md: -------------------------------------------------------------------------------- 1 | # 115、除了常见服务注册中心之外,你觉得Redis能作为服务注册中心吗? 2 | 3 | ![redis作为服务注册中心](images/115/01.png) 4 | 5 | redis里的hash数据结构,类似map的数据结构 6 | 7 | 8 | 9 | 约定好,你的服务注册的key都是:service_ORDER,service_PRODUCT,scan扫描指定的前缀开头的所有的key,一次性把注册表里的几十个到几百个服务都给扫描出来,获取到一个完整的注册表 10 | 11 | 12 | 13 | 基于Redis还可以做分布式服务注册中心,Redis Cluster,做一个集群 14 | -------------------------------------------------------------------------------- /docs/03/21.md: -------------------------------------------------------------------------------- 1 | # 21、谈谈你对Java内存模型的理解可以吗? 2 | 3 | ![](images/21/01.png) 4 | 5 | read、load、use、assign、store、write 6 | 7 | 8 | 9 | 后台留言,并发这块讲解的好像有的地方有点浅,面试突击第一季和第二季,面试突击第一季,扫盲的作用,对并发、mysql、网络比较基础的知识,常见的面试题,根本就不太了解,4个月的培训班里出来的 10 | 11 | 12 | 13 | 直接楞住了,说,不好意思,concurrenthashmap从来没用过,crud 14 | 15 | 16 | 17 | ![](images/21/02.png) -------------------------------------------------------------------------------- /docs/distributed-system/distributed-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 下订单的环节,支付之前,创建一个订单 3 | 4 | ![distributed-lock](/docs/distributed-system/images/distributed-lock.png) 5 | 创建一个订单,订单里会指定对哪些商品要购买多少件,此时就需要走一个流程,校验一下库存 6 | 7 | 查库存,确认库存充足,锁定库存 8 | 9 | 这个过程必须用分布式锁,锁掉这个商品的库存,对一个商品的购买同一时间只能有一个人操作 10 | 11 | redis和zookeeper实现分布式锁的原理,在之前面试突击第一季都讲过了,大家没看过的可以去看一下 12 | -------------------------------------------------------------------------------- /docs/03/92.md: -------------------------------------------------------------------------------- 1 | # 92、再来看看CAS是如何基于MESI协议在底层硬件层面实现加锁的? 2 | 3 | 无法发出指令来执行一个原子性的cas,先查出数据,比较一下,如果一样,就写数据。MESI协议有关系 4 | 5 | 6 | 7 | volatile、synchronized、CAS、ThreadLocal、ReentrantReadWriteLock、锁优化、锁生产故障 8 | 9 | 10 | 11 | 并发的核心和关键的技术都到了硬件和源码的级别,大家都应该掌握的很好了 12 | 13 | 14 | 15 | 先讲线程安全的并发包下的集合,同步器组件,线程池,并发的核心技术,并发编程设计模式完全结合我们后续的微服务注册中心的项目完善、开发和实战来演练 16 | -------------------------------------------------------------------------------- /docs/c2c/30.md: -------------------------------------------------------------------------------- 1 | 30讲对应: 2 | 3 | 26_最基础的分布式事务:XA规范以及2PC分布式事务理论介绍 4 | 5 | 27_画图来剖析一下2PC分布式事务方案的缺陷以及问题 6 | 7 | 28_针对2PC的问题引入3PC分布式事务方案的理论知识讲解 8 | 9 | 45_分布式事务的业内常见解决方案的初步介绍以及基础知识筑基 10 | 11 | 46_分布式相关的核心理论之CAP与BASE的基础知识筑基 12 | 13 | 47_各种分布式事务技术方案如何结合起来运用在流量充值中心内 14 | 15 | 48_画图说明TCC分布式事务的具体技术方案以及几种变种方案的原理 16 | 17 | 49_分析一下TCC分布式事务技术方案具体落地在项目中的一些细节 18 | -------------------------------------------------------------------------------- /docs/distributed-system/zookeeper-distribute-lock-scheme.md: -------------------------------------------------------------------------------- 1 | 2 | Redis和ZooKeeper,哪种分布式锁更好? 3 | 4 | 从分布式系统协调语义而言,是ZooKeeper做分布式锁更好一些,因为Redis本身其实是缓存,但是Redis能抗高并发,高并发场景下更好一些 5 | 6 | zookeeper本身不适合部署大规模集群,他本身适用的场景就是部署三五台机器,不是承载高并发请求的,仅仅是用作分布式系统的协调的 7 | 8 | 9 | Redis?ZooKeeper? 10 | 11 | 有redis集群,没有zookeeper集群,那你当然就选择redis了;如果你们公司两个都有,用哪种分布式锁都可以,高并发场景,redis 12 | -------------------------------------------------------------------------------- /docs/03/121.md: -------------------------------------------------------------------------------- 1 | # 121、ZooKeeper集群的三种角色:Leader、Follower、Observer 2 | 3 | ![ZooKeeper集群的三种角色](/docs/03/images/121/01.png) 4 | 5 | 通常来说ZooKeeper集群里有三种角色的机器 6 | 7 | 8 | 9 | 集群启动自动选举一个Leader出来,只有Leader是可以写的,Follower是只能同步数据和提供数据的读取,Leader挂了,Follower可以继续选举出来Leader,Observer也只能读但是Observer不参与选举 10 | 11 | 12 | 13 | Observer这个东西,再往后讲点,分析清楚了别的东西以后,Observer我们会回过头来讲解的 14 | -------------------------------------------------------------------------------- /docs/03/37.md: -------------------------------------------------------------------------------- 1 | # 37、你知道JVM是如何运行起来的吗?我们的对象是如何分配的? 2 | 3 | ![01](images/37/01.png) 4 | 5 | 一定会有线程去执行我们写的代码 6 | 7 | 比如说我们有一个类里面包含了一个main方法,你去执行这个main方法,此时会自动一个jvm进程,他会默认就会有一个main线程,这个main线程就负责执行这个main方法的代码,进而创建各种对象 8 | 9 | 10 | 11 | tomcat,类都会加载到jvm里去,spring容器而言都会对我们的类进行实例化成bean,有工作线程会来执行我们的bean实例对象里的方法和代码,进而也会创建其他的各种对象,实现业务逻辑 12 | 13 | ![02](images/37/02.png) -------------------------------------------------------------------------------- /docs/distributed-system/zookeeper-distribute-lock-optimize.md: -------------------------------------------------------------------------------- 1 | 2 | ![zookeeper-distribute-lock-optimize](/docs/distributed-system/images/zookeeper-distribute-lock-optimize.png) 3 | 也可以,羊群效应 4 | 5 | 如果几十个客户端同时争抢一个锁,此时会导致任何一个客户端释放锁的时候,zk反向通知几十个客户端,几十个客户端又要发送请求到zk去尝试创建锁,所以大家会发现,几十个人要加锁,大家乱糟糟的,无序的 6 | 7 | 羊群效应 8 | 9 | 造成很多没必要的请求和网络开销,会加重网络的负载 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/03/88.md: -------------------------------------------------------------------------------- 1 | # 88、在复杂的硬件模型之上的Java内存模型是如何大幅简化的? 2 | java内存模型是对底层的硬件模型,cpu缓存模型,做了大幅度的简化,提供一个抽象和统一的模型给java程序员易于理解,很多时候如果要理解一些技术的本质,还是要深入到底层去研究的 3 | 4 | 5 | 6 | volatile,原子性,可见性,有序性,加了一些内存屏障可以避免前后各种读写指令重排 7 | 8 | synchronized,原子性,可见性,有序性,没有提到 9 | 10 | CAS,cas指令到硬件级别,实现了一个原子性的cas操作 11 | 12 | 13 | 14 | 先把通俗易懂,简单的原理和模型给大家说一下,然后立马大量的实战,实战出真知,没感觉,整天听我讲内存屏障,枯燥死的 15 | -------------------------------------------------------------------------------- /docs/distributed-system/service-register-gateway-router.md: -------------------------------------------------------------------------------- 1 | 2 | #### 生产环境,微服务生产实践 3 | 4 | 开发了一个新的服务,线上部署,配合网关动态路由的功能,在网关里配置一下路径和新服务的映射关系,此时请求过来直接就可以走到新的服务里去 5 | 6 | 对已有服务进行迭代和开发,新版本,灰度发布,新版本部署少数几台机器,通过一个界面,开启这个服务的灰度发布,**此时zuul filter启用,按照你的规则,把少量的流量打入到新版本部署的机器上去** 7 | 8 | 观察一下少量流量在新版本的机器上运行是否正常 9 | 10 | 版本改成current,全量机器部署,关闭灰度发布功能,网关就会把流量均匀分发给那个服务了 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/03/102.md: -------------------------------------------------------------------------------- 1 | # 102、一个对技术有追求的面试官,是怎么深挖网络与IO的面试连环炮的? 2 | 3 | 1、Netty的架构原理图能画一下吗,他是如何体现Reactor架构思想的? 4 | 5 | 2、能说说你对Netty堆外内存的理解吗?什么情况下会使用堆外内存? 6 | 7 | 3、你遇到过堆外内存溢出或者堆外内存泄漏的场景吗?怎么解决的? 8 | 9 | 4、能聊聊你对零拷贝技术原理的理解吗?他到底是如何提升性能的? 10 | 11 | 5、你知道哪些开源的中间件系统用了零拷贝技术吗?为什么那些系统要使用零拷贝技术? 12 | 13 | 6、你了解过在操作系统层面,系统区内存和用户区内存的关系是什么吗? 14 | 15 | 7、说说你对序列化机制的理解,了解过Protobuf吗?他是用来干什么的知道吗? 16 | -------------------------------------------------------------------------------- /docs/03/122.md: -------------------------------------------------------------------------------- 1 | # 122、客户端与ZooKeeper之间的长连接和会话是什么? 2 | 3 | ![客户端与ZooKeeper之间的长连接和会话](/docs/03/images/122/01.png) 4 | 5 | zk集群启动之后,自己分配好角色,然后客户端就会跟zk建立连接,是TCP长连接 6 | 7 | 8 | 9 | 把我们的Java架构课程里的网络那块的东西,自研的分布式海量小文件存储系统的项目,我们手写了大量的底层的网络通信的代码 10 | 11 | 12 | 13 | 也就建立了一个会话,就是session,可以通过心跳感知到会话是否存在,有一个sessionTimeout,意思就是如果连接断开了,只要客户端在指定时间内重新连接zk一台机器,就能继续保持session,否则session就超时了 14 | -------------------------------------------------------------------------------- /docs/c2c/35.md: -------------------------------------------------------------------------------- 1 | # 《35_对DubboRPC框架与Seata分布式事务集成》 2 | 3 | 讲完了seata的一些原理之后,就要讲他的代码集成了,跟Dubbo,Spring Boot,Spring Cloud Alibaba等框架进行集成,教会大家一个办法,如果你要把某个技术集成到你自己的项目里去,最好的参考示例工程是什么呢? 4 | 5 | 官网文档里提供的示例程序,把他的示例程序给跑起来,就可以参考示例程序把技术集成到自己的项目里去就可以了 6 | 7 | 在集成的过程中,可能那个技术,比如说seata并没有考虑到跟一些框架集成时的版本兼容的问题,所以经常会出现把某个技术集成到你自己的项目去的时候出现了一些版本兼容的问题 8 | 9 | http://seata.io/ 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/c2c/19.md: -------------------------------------------------------------------------------- 1 | # 《19_基于Dubbo开发C2C电商社会化治理平台人群服务(上)》 2 | 3 | nacos+dubbo整合起来的一个demo,nacos和dubbo基本的原理,都有了一个讲解, 4 | 5 | 在demo里我集成了mybatis和druid数据源,去基于mysql做一些增删改查, 6 | 7 | 每个服务在执行业务逻辑的时候还是得对数据库做一下操作的,seata分布式事务的方案,每个服务都必须有一个自己本地的数据库的事务 8 | 9 | 社会化治理:social govern 10 | 11 | 举报:report 12 | 13 | 评审员:reviewer 14 | 15 | 奖励:reward 16 | 17 | [demo](demo/19/c2c-social-govern.zip) 18 | 19 | -------------------------------------------------------------------------------- /docs/c2c/20.md: -------------------------------------------------------------------------------- 1 | # 《20_基于Dubbo开发C2C电商社会化治理平台任务服务》 2 | 3 | nacos+dubbo整合起来的一个demo,nacos和dubbo基本的原理,都有了一个讲解, 4 | 5 | 在demo里我集成了mybatis和druid数据源,去基于mysql做一些增删改查,每个服务在执行业务逻辑的时候还是得对数据库做一下操作的, 6 | 7 | seata分布式事务的方案,每个服务都必须有一个自己本地的数据库的事务 8 | 9 | 社会化治理:social govern 10 | 11 | 举报:report 12 | 13 | 评审员:reviewer 14 | 15 | 奖励:reward 16 | 17 | [demo](demo/22/c2c-social-govern.zip) 18 | 19 | -------------------------------------------------------------------------------- /docs/c2c/21.md: -------------------------------------------------------------------------------- 1 | # 《21_基于Dubbo开发C2C电商社会化治理平台权益服务》 2 | 3 | nacos+dubbo整合起来的一个demo,nacos和dubbo基本的原理,都有了一个讲解, 4 | 5 | 在demo里我集成了mybatis和druid数据源,去基于mysql做一些增删改查,每个服务在执行业务逻辑的时候还是得对数据库做一下操作的, 6 | 7 | seata分布式事务的方案,每个服务都必须有一个自己本地的数据库的事务 8 | 9 | 社会化治理:social govern 10 | 11 | 举报:report 12 | 13 | 评审员:reviewer 14 | 15 | 奖励:reward 16 | 17 | [demo](demo/21/c2c-social-govern.zip) 18 | 19 | -------------------------------------------------------------------------------- /docs/c2c/22.md: -------------------------------------------------------------------------------- 1 | # 《22_基于Dubbo开发C2C电商社会化治理平台基础服务》 2 | 3 | nacos+dubbo整合起来的一个demo,nacos和dubbo基本的原理,都有了一个讲解, 4 | 5 | 在demo里我集成了mybatis和druid数据源,去基于mysql做一些增删改查, 6 | 7 | 每个服务在执行业务逻辑的时候还是得对数据库做一下操作的,seata分布式事务的方案,每个服务都必须有一个自己本地的数据库的事务 8 | 9 | 社会化治理:social govern 10 | 11 | 举报:report 12 | 13 | 评审员:reviewer 14 | 15 | 奖励:reward 16 | 17 | [dem0](demo/22/c2c-social-govern.zip) 18 | 19 | -------------------------------------------------------------------------------- /docs/03/06.md: -------------------------------------------------------------------------------- 1 | HashMap的深入考察,必然是面试中的一个核心的点 2 | 3 | 4 | 5 | 都是写Java代码,基于Java都是来构建各种各样的系统的,软件的,基于Java写出来一大堆的代码,可能会访问很多其他的东西,数据库,缓存,消息中间件,核心还是来写Java代码实现一些逻辑的运转 6 | 7 | 8 | 9 | 接收到一个请求,可能会创建一些数据结构,来存放一些数据,做一些循环、跳转、判断、加加减减,数据处理,逻辑,通过一大堆的逻辑就可以完成一些系统功能,或者是软件的功能 10 | 11 | 12 | 13 | HashMap,数据结构,进行一定的逻辑的处理 14 | 15 | 16 | 17 | 一句话总结:你是Java工程师,你写代码的时候必然会用到一些数据结构,其中尤为经典的就是HashMap,别人必然会考察你 -------------------------------------------------------------------------------- /docs/distributed-system/request-retry.md: -------------------------------------------------------------------------------- 1 | 2 | 订单服务 -> 创建订单 3 | 4 | -> 库存服务 -> 扣减库存 5 | -> wms服务 -> 通知发货 6 | -> 积分服务 -> 增加积分 7 | 8 | 订单服务调用库存服务的时候,因为网络抖动,请求超时了,超过了秒钟,此时订单服务会重试,再次调用一下库存服务,发送一模一样的请求过去 9 | 10 | 11 | 12 | 比如说,订单服务第一次请求库存服务,库存服务其实是把扣减库存的业务逻辑执行成功了,只不过网络问题,导致响应迟迟没有返回给订单服务,可能在1.2s之后返回了响应给订单服务 13 | 14 | 订单服务就认为请求超时了,他就再次发送了一个一模一样的请求给库存服务,库存服务可能会再次对库存进行扣减 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/distributed-system/system-dilatation.md: -------------------------------------------------------------------------------- 1 | 2 | 如果访问量扩大10倍,如何扩容? 3 | 4 | 网关直接多部署10倍的机器即可,前面的Nginx做会负载均衡,把流量均匀分发给各个网关机器 5 | 6 | 服务扩容,都很简单的,多加机器,部署启动,自动注册到注册中心里去,此时其他服务会自动感知到你的服务多加了一些机器 7 | 8 | 服务实例变多了10倍,此时几十个服务实例,几百个服务实例,对eureka机器会造成每秒几百请求,没问题,eureka机器,8核16G的配置,单机抗上千请求,很轻松 9 | 10 | 数据库本来是每秒几百请求,10倍,每秒高峰期是三四千请求,横向扩容很麻烦,此时可以考虑给单个数据库部署的机器提高配置,32核128G高配物理机,每秒钟抗几千请求问题不大 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/03/38.md: -------------------------------------------------------------------------------- 1 | # 《38、说说JVM在哪些情况下会触发垃圾回收可以吗?》 2 | 我们的jvm的内存其实是有限制的,不可能是无限的,昂贵的资源,2核4G的机器,堆内存也就2GB左右,4核8G的机器,堆内存可能也就4G左右,栈内存也需要空间,metaspace区域放类信息也需要空间 3 | 4 | 5 | 6 | 在jvm里必然是有一个内存分代模型,年轻代和老年代 7 | 8 | 9 | 10 | 比如说给年轻代一共是2GB内存,给老年代是2GB内存,默认情况下eden和2个s的比例:8:1:1,eden是1.6GB,S是0.2GB 11 | 12 | 13 | 14 | 如果说eden区域满了,此时必然触发垃圾回收,young gc,ygc,谁是可以回收的垃圾对象呢?就是没有人引用的对象就是垃圾对象 15 | 16 | ![01](images/38/01.png) 17 | -------------------------------------------------------------------------------- /docs/03/11.md: -------------------------------------------------------------------------------- 1 | # 《11、BAT面试官为什么都喜欢问并发编程的问题?》 2 | 3 | synchronized实现原理、CAS无锁化的原理、AQS是什么、Lock锁、ConcurrentHashMap的分段加锁的原理、线程池的原理、java内存模型、volatile说一下吗、对java并发包有什么了解?一连串的问题 4 | 5 | 6 | 7 | 写一些java web系统,运用一些框架和一些第三方技术,写一些类似于crud的业务逻辑,把各种技术整合一下,写一些crud而已,没什么技术含量。很多人可能写好几年的代码,都不会用到多少java并发包下面的东西 8 | 9 | 10 | 11 | 如果说你要面试一些稍微好一点的公司,技术稍微好一点,你只要去做一个技术含量稍微高一点的系统,并发包下面的东西还是很容易会用到的。尤其是BAT,中大厂,有一定规模的公司,做出来的系统还是有一定的技术含量的 -------------------------------------------------------------------------------- /docs/distributed-system/eventual-consistency.md: -------------------------------------------------------------------------------- 1 | 2 | 其实也很简单,自己写一个可靠消息服务即可,接收人家发送的half message,然后返回响应给人家,如果Producer没收到响应,则重发。然后Producer执行本地事务,接着发送commit/rollback给可靠消息服务。 3 | 4 | 可靠消息服务启动一个后台线程定时扫描本地数据库表中所有half message,超过一定时间没commit/rollback就回调Producer接口,确认本地事务是否成功,获取commit/rollback 5 | 6 | 如果消息被rollback就废弃掉,如果消息被commit就发送这个消息给下游服务,或者是发送给RabbitMQ/Kafka/ActiveMQ,都可以,然后下游服务消费了,必须回调可靠消息服务接口进行ack 7 | 8 | 如果一段时间都没收到ack,则重发消息给下游服务 9 | -------------------------------------------------------------------------------- /docs/distributed-system/Dubbo-SpringCloud-experience.md: -------------------------------------------------------------------------------- 1 | Spring Cloud来搭建了一套 2 | 3 | http://localhost:9000/order/order/create?productId=1&userId=1&count=3&totalPrice=300 4 | 5 | 刚开始几次请求会出现请求超时的问题,这个问题大家别纠结,后续要给大家讲spring cloud生产系统的优化 6 | 7 | 小小的小作业,参考一下dubbo的官方文档,搭建一个电商系统的dubbo版本的案例出来,我后面会搭建好的 8 | 9 | [代码下载点击这里哦!](https://github.com/shishan100/Java-Interview-Advanced/raw/master/docs/distributed-system/code/code.zip) 10 | -------------------------------------------------------------------------------- /docs/03/126.md: -------------------------------------------------------------------------------- 1 | # 126、ZAB的核心思想介绍:主从同步机制和崩溃恢复机制 2 | 3 | ![主从同步机制和崩溃恢复机制](/docs/03/images/126/01.png) 4 | 5 | 协议的本质而言,划分集群角色,主从架构,Leader和Follower两种角色 6 | 7 | 8 | 9 | 只有Leader可以接受写操作,Leader和Follower都可以读,Leader收到事务请求,转换为事务Proposal(提议)同步给所有的Follower,超过半数的Follower都说收到事务proposal了,Leader再给所有的Follower发一个Commit消息,让所有Follower提交一个事务 10 | 11 | 12 | 13 | 而且如果Leader崩溃了,要重新选举Leader保证继续运行 14 | 15 | 16 | 17 | 角色划分,2PC(两阶段),过半写机制 18 | -------------------------------------------------------------------------------- /docs/03/35.md: -------------------------------------------------------------------------------- 1 | # 《35、额外加餐:能画一张图说说Spring Cloud的核心架构吗?》 2 | ![SpringCloud](images/35/01.png) 3 | 4 | spring boot、spring、spring mvc、spring cloud,让你开发那种单体架构的系统,spring cloud是让你去开发分布式系统,让你把系统拆分为很多的子系统,子系统互相之间进行请求和调用 5 | 6 | 7 | 8 | 面试突击第二季,有完整的spring cloud架构原理的讲解 9 | 10 | 11 | 12 | eureka、ribbon、feign、zuul、hystrix、链路追踪、其他组件,服务于分布式系统的,hystrix主要用于服务之间调用的熔断、隔离、降级,在狸猫技术窝上,在我的课程的目录里,有一个文档,标识出来了我的一些之前的课程,csdn上去搜索,亿级流量里面带有hystrix讲解,看一下 -------------------------------------------------------------------------------- /docs/03/119.md: -------------------------------------------------------------------------------- 1 | # 119、ZooKeeper为了满足分布式系统的需求要有哪些特点? 2 | 3 | ![分布式协调和通知](/docs/03/images/119/01.png) 4 | 5 | ZooKeeper肯定是一套系统,这个系统可以存储元数据,支持Master选举,可以进行分布式协调和通知 6 | 7 | 8 | 9 | 集群部署:不可能单机版本 10 | 11 | 12 | 13 | 顺序一致性:所有请求全部有序 14 | 15 | 16 | 17 | 原子性:要么全部机器都成功,要么全部机器都别成功 18 | 19 | 20 | 21 | 数据一致性:无论连接到哪台ZK上去,看到的都是一样的数据,不能有数据不一致 22 | 23 | 24 | 25 | 高可用:如果某台机器宕机,要保证数据绝对不能丢失 26 | 27 | 28 | 29 | 实时性:一旦数据发生变更,其他人要实时感知到 30 | -------------------------------------------------------------------------------- /docs/c2c/02_01.md: -------------------------------------------------------------------------------- 1 | # 《02_国内BAT互联网大厂的微服务架构演进路线》 2 | 3 | 几乎所有技术组件都是自研,国内最早的微服务架构几乎就是一些互联网大厂自研了一大堆的组件, 4 | 5 | 来支撑拆分成N多服务的大型系统的运行和多人协作开发, 6 | 7 | 包括系统的监控和维护,等等注册中心、RPC框架、多环境隔离、自动化部署、分布式事务、限流/熔断/降级、配置中心、监控中心、链路监控、 8 | 9 | 日志中心、API网关、安全认证、服务治理后来在三五年之前,阿里开源的Dubbo比较流行, 10 | 11 | 在国内基本上把系统拆分为微服务的一些大大小小的公司,用的都是阿里开源的Dubbo,注册中心用ZooKeeper的居多, 12 | 13 | 当时dubbo+zookeeper基本就是一个最原始的微服务技术架构的雏形至于其他东西,不同的公司可能会找不同的开源项目, 14 | 15 | 但是都没太统一的标准,而且很多公司干脆压根儿就不用其他组件 -------------------------------------------------------------------------------- /docs/03/101.md: -------------------------------------------------------------------------------- 1 | # 101、在分布式架构中,Zuul网关是如何防止网络攻击的? 2 | 3 | ![zuul网关原理](images/101/01.png) 4 | XSS、CRSF、SQL注入、DDoS 5 | 6 | 7 | 8 | XSS核心是设置cookie的http only属性,过滤脚本,CRSF也是设置cookie的http only属性,根据referer请求头来过滤,设置表单随机参数,SQL注入就是过滤恶意参数,DDoS攻击主要就是限流 9 | 10 | 11 | 12 | zuul网关里加一个过滤器,过滤器里去过滤一些特殊请求的脚本,根据referer请求头过滤,对请求的随机token进行校验,甚至可以对参数进行校验,如果参数里包含SQL说明要注入,全部过滤,对ip地址可以进行基于redis的访问计数,比如说一个ip地址一秒内连续访问5次,那么就直接禁止访问 13 | 14 | ![filter代码](images/101/02.png) 15 | -------------------------------------------------------------------------------- /docs/03/133.md: -------------------------------------------------------------------------------- 1 | # 133、现在再来看看ZooKeeper的Observer节点是用来干什么的? 2 | Observer节点是不参与leader选举的,他也不参与ZAB协议同步时候的过半follower ack的那个环节,他只是单纯的接收数据,同步数据,可能数据存在一定的不一致的问题,但是是只读的 3 | 4 | 5 | 6 | leader在进行数据同步的时候,observer是不参与到过半写机制里去 7 | 8 | 9 | 10 | 所以大家思考一个问题了 11 | 12 | 13 | 14 | zk集群无论多少台机器,只能是一个leader进行写,单机写入最多每秒上万QPS,这是没法扩展的,所以zk是适合写少的场景 15 | 16 | 17 | 18 | 但是读呢?follower起码有2个或者4个,读你起码可以有每秒几万QPS,没问题,那如果读请求更多呢?此时你可以引入Observer节点,他就只是同步数据,提供读服务,可以无限的扩展机器 19 | -------------------------------------------------------------------------------- /docs/03/01.md: -------------------------------------------------------------------------------- 1 | 一般大厂怎么问? 2 | 3 | 4 | 5 | redis连环炮、mq连环炮、dubbo连环炮、分布式连环炮、elasticsearch连环炮 6 | 7 | 8 | 9 | Java并发连环炮、mysql连环炮、网络连环炮、JDK集合连环炮、jvm连环炮、spring源码连环炮、tomcat连环炮、linux连环炮、系统设计连环炮、生产实践连环炮 10 | 11 | 12 | 13 | 互联网Java工程师面试突击第一季 14 | 15 | 16 | 17 | 反过来去考虑一下,站在一个公司面试官的角度,你会怎么去考察候选人呢? 18 | 19 | 20 | 21 | 主要就是用dubbo来写的,mysql分库分表 -> 不匹配 22 | 23 | 24 | 25 | 三轮面试 -> 考察各种技术广度,技术基础 -> 考察一下技术的深度,还有项目经验 -> 看看你聊聊人生和理想,综合性的考察,技术到项目 -> HR,学历,履历,薪资 -------------------------------------------------------------------------------- /docs/03/110.md: -------------------------------------------------------------------------------- 1 | # 110、你们的分布式系统是如何进行链路监控的?都监控什么? 2 | 3 | 什么是分布式链路追踪 4 | 5 | 6 | 7 | 下订单之后,直到返回,需要几秒钟 8 | 9 | 10 | 11 | 追踪了有什么用,调用链路,链路性能监控,链路故障排查 12 | 13 | 14 | 15 | Google的Dapper,阿里的鹰眼,大众点评的CAT,Twitter的Zipkin,LINE的pinpoint,国产的skywalking,很多,国内一般用CAT和zipkin比较多 16 | 17 | 18 | 19 | 其实核心架构就是做一个框架,然后每一次服务调用都要经过这个框架,框架采集调用链路的数据存储起来,然后有可视化界面展示出来每个调用链路,性能,故障,这些东西 20 | 21 | 22 | 23 | 订单服务收到这个请求是12:00:00,商品服务收到这个请求是12:00:01,库存服务收到这个请求是12:00:10 24 | -------------------------------------------------------------------------------- /docs/03/05.md: -------------------------------------------------------------------------------- 1 | 面试,比较多的一些新的热门和行情,无法涉及到 2 | 3 | 4 | 5 | 数据结构和算法,知识付费的平台,文字专栏、视频课程,踏踏实实的找两个专栏或者课程,都学好了,出去面试 6 | 7 | 8 | 9 | 在业务这块,DDD,领域驱动进行业务模型的设计,BAT大厂,美团之类的大厂,都在用DDD做复杂业务的设计,比较难,找到好的资料 10 | 11 | 12 | 13 | 目前得益于很多的一些在线教育机构,会把spring源码作为核心去讲解,外面很多公司都会拷问你的spring源码有没有读过,把这个spring源码自己找一些书籍,去看一下,做一点积累 14 | 15 | 16 | 17 | 设计秒杀系统,大路货,网上的文章和资料太多了 18 | 19 | 20 | 21 | 紧跟行业趋势和热点走向,平时多看一些书,多做一些积累,狸猫技术窝,大白话的视频课程,文字专栏,几十篇干货文章,几千个字,大白话一些,专栏设计出来一些别的地方没有的一些实战性的内容 -------------------------------------------------------------------------------- /docs/03/89.md: -------------------------------------------------------------------------------- 1 | # 89、面试的时候如何从内存屏障、硬件层面的原理来震慑面试官 2 | volatile、synchronized 3 | 4 | 5 | 6 | 原子性这块,直接把底层的一些东西喷出来 7 | 8 | 9 | 10 | 硬件层面的原理 -> MESI协议在硬件层面运行的原理 -> 这套原理为何会导致可见性和有序性的问题 -> 各种内存屏障是如何在硬件层面解决可见性和有序性的问题 -> volatile和synchroized是如何加各种内存屏障来分别保证可见性和有序性的 11 | 12 | 13 | 14 | 行业里对并发这块知识掌握到这个层面的人,不多 15 | 16 | 17 | 18 | 很多人写并发的书,如果你把我们的课看完了,有并发的书,你去看看,XX并发实战,书里的内容很浅,你的水平可能已经超过部分写并发书籍的作者了 19 | 20 | 21 | 22 | 是个面试官,主要不是技术特别牛的,一般的人多会被你给震慑到,从硬件层面开始画图 23 | -------------------------------------------------------------------------------- /docs/distributed-system/dubbo-independent-framework.md: -------------------------------------------------------------------------------- 1 | 2 | 对**Dubbo**稍微做了一点进一步深入的讲解,但是远远是达不到精通源码的程度,只能说是相对于面试突击第一季要深入了一些,**Dubbo**一次服务请求调用,牵扯到了哪些组件,**负载均衡组件**、**注册中心**、**协议层**、**转换层**、**网络层(netty开发)**、**动态代理**,服务提供者也是类似的 3 | 4 | 网络通信的一些东西,是如何通过**NIO**的方式,**多线程**的方式,让一个服务提供者被多个服务消费者去并发的调用和请求 5 | 6 | 从整体架构原理的角度,说了一下如何进行扩展的 7 | 8 | 能说比普通的人稍微好一些,**技术深度**,那必须得是学其他的课程深入的理解他里面的源码,才能在面试的时候说,我精通一个技术的源码 9 | 10 | **Dubbo底层架构原理的图**,自己手画出来,画的足够的熟练,如果有一些什么问题的话,可以提问 11 | -------------------------------------------------------------------------------- /docs/03/19.md: -------------------------------------------------------------------------------- 1 | # 《19、你知道如果线程池的队列满了之后,会发生什么事情吗?》 2 | 有界队列,可以避免内存溢出 3 | 4 | 5 | 6 | corePoolSize: 10 7 | 8 | maximumPoolSize : 200 9 | 10 | ArrayBlockingQueue(200) 11 | 12 | 13 | 14 | 自定义一个reject策略,如果线程池无法执行更多的任务了,此时建议你可以把这个任务信息持久化写入磁盘里去,后台专门启动一个线程,后续等待你的线程池的工作负载降低了,他可以慢慢的从磁盘里读取之前持久化的任务,重新提交到线程池里去执行 15 | 16 | 17 | 18 | 你可以无限制的不停的创建额外的线程出来,一台机器上,有几千个线程,甚至是几万个线程,每个线程都有自己的栈内存,占用一定的内存资源,会导致内存资源耗尽,系统也会崩溃掉 19 | 20 | 21 | 22 | 即使内存没有崩溃,会导致你的机器的cpu load,负载,特别的高 -------------------------------------------------------------------------------- /docs/distributed-system/service-register-discovery.md: -------------------------------------------------------------------------------- 1 | 2 | **zk,一般来说还好,服务注册和发现,都是很快的** 3 | 4 | **eureka,必须优化参数** 5 | 6 | **eureka.server.responseCacheUpdateIntervalMs = 3000** 7 | **eureka.client.registryFetchIntervalSeconds = 30000** 8 | 9 | **eureka.client.leaseRenewalIntervalInSeconds = 30** 10 | **eureka.server.evictionIntervalTimerInMs = 60000** 11 | **eureka.instance.leaseExpirationDurationInSeconds = 90** 12 | 13 | **服务发现的时效性变成秒级,几秒钟可以感知服务的上线和下线** 14 | 15 | -------------------------------------------------------------------------------- /docs/distributed-system/work-interface-idempotence.md: -------------------------------------------------------------------------------- 1 | 2 | 分布式系统,考察生产实践细节,常问的面试问题 3 | 4 | 服务框架、注册中心、网关系统、部署架构、超时重试、幂等性 5 | 6 | 7 | 跟你自己的业务系统有关系了,你们的系统服务之间的调用,有没有超时和重试的配置,如果没有,如何优化配置,如果有,核心接口有没有幂等性机制,重复插入数据,重复跟新数据 8 | 9 | 如果有问题,结合你的业务,如何基于唯一索引、redis定制化防重机制 10 | 11 | 12 | 可以在评论区提问,我们会给大家答疑,儒猿技术窝,知识店铺,训练营页面里,有评论区,提问,答疑 13 | 14 | 好好的完成作业,在作业里设计自己的系统业务逻辑对应的一套幂等性机制,每天的作业,都是可以提交,你可以把作业提交到店铺里去,每天我们都会给你们提交的作业进行点评,对你们作业里的问题进行答疑 15 | 16 | 17 | 付费微信交流群,课程目录里有一个文档,入群步骤 18 | -------------------------------------------------------------------------------- /docs/03/114.md: -------------------------------------------------------------------------------- 1 | # 114、实施灰度发布的时候,网关是可以灰度了,可是Dubbo服务如何进行灰度呢? 2 | 3 | ![网关灰度发布原理](images/114/01.png) 4 | 5 | spring cloud alibaba技术栈,nacos,nacos是企业级的服务注册中心,功能还是比较强大的,灰度发布这块都是可以做到的 6 | 7 | ------------------ 8 | 个人笔记: 9 | 10 | ### nacos灰度发布 11 | 12 | ![nacos灰度发布](images/114/02.png) 13 | 14 | [Nepxion Discovery – 基于Nacos实现Spring Cloud灰度发布和路由](https://github.com/Nepxion/Discovery) 15 | 16 | [基于springcloud gateway + nacos实现灰度发布(reactive版)](https://cloud.tencent.com/developer/article/1621304) 17 | -------------------------------------------------------------------------------- /docs/03/103.md: -------------------------------------------------------------------------------- 1 | # 103、Netty的架构原理图能画一下吗,他是如何体现Reactor架构思想的? 2 | 里面的技术的点特别的多,Netty是一款非常优秀的,高性能的,一个网络通信的框架,他底层的话呢,把NIO进行了重度的封装,如果大家连NIO,BIO,区别,最好自己先去看看NIO,以及NIO的一些示例代码 3 | 4 | 5 | 6 | JDK提供了网络编程的框架,NIO这套东西 7 | 8 | 9 | 10 | netty平时常用的一些场景,主要是一些中间件系统,比如分布式存储系统,分布式消息系统,比较典型的,RocketMQ,底层做网络通信这一块就是基于Netty来的,分布式服务框架,服务之间进行远程通信,也可以基于Netty来 11 | 12 | 13 | 14 | crud的业务系统,一般是不会用netty的,比如说API网关系统,IM即时通讯系统 15 | 16 | 17 | 18 | 可以自己去网上找一个netty的入门demo示例代码,体验一下netty的入门案例,基于netty可以开发一个服务器程序,再开发一个客户端程序,两边就可以进行通讯了 19 | -------------------------------------------------------------------------------- /docs/03/23.md: -------------------------------------------------------------------------------- 1 | # 23、能聊聊volatile关键字的原理吗? 2 | 内存模型 -> 原子性、可见性、有序性 -> volatile 3 | 4 | 5 | 6 | 讲清楚volatile关键字,直接问你volatile关键字的理解,对前面的一些问题,这个时候你就应该自己去主动从内存模型开始讲起,原子性、可见性、有序性的理解,volatile关键字的原理 7 | 8 | 9 | 10 | volatile关键字是用来解决可见性和有序性,在有些罕见的条件之下,可以有限的保证原子性,他主要不是用来保证原子性的 11 | 12 | ![volatile使用代码](images/23/01.png) 13 | 14 | 可见性,概念进行了加强和深化,volatile在可见性上的作用和原理,有一个很清晰的了解 15 | 16 | 17 | 18 | 在很多的开源中间件系统的源码里,大量的使用了volatile,每一个开源中间件系统,或者是大数据系统,都多线程并发,volatile 19 | 20 | ![kafka源码使用volatile](images/23/01.png) 21 | -------------------------------------------------------------------------------- /docs/03/68.md: -------------------------------------------------------------------------------- 1 | # 68、32位Java虚拟机中的long和double变量写操作为何不是原子的? 2 | 3 | 原子性这块,特例,32位虚拟机里的long/double类型的变量的简单赋值写操作,不是原子的,long i = 30,double c = 45.0,在32位虚拟机里就不是原子的,因为long和double是64位的 4 | 5 | 6 | 7 | 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 8 | 9 | 10 | 11 | 如果多个线程同时并发的执行long i = 30,long是64位的,就会导致有的线程在修改i的高32位,有的线程在修改i的低32位,多线程并发给long类型的变量进行赋值操作,在32位的虚拟机下,是有问题的 12 | 13 | 14 | 15 | 就可能会导致多线程给long i = 30赋值之后,导致i的值不是30,可能是-3333344429,乱码一样的数字,就是因为高低32位赋值错了,就导致二进制数字转换为十进制之后是一个很奇怪的数字 16 | -------------------------------------------------------------------------------- /docs/c2c/37.md: -------------------------------------------------------------------------------- 1 | #《37_微服务化的系统是如何发生服务雪崩的?》 2 | 3 | 4 | 雪崩、熔断、限流、降级 5 | 6 | 7 | Tomcat收到的每一个HTTP请求,都会交给一个独立的工作线程去处理,独立的工作线程一般可以配置为100~500之间的数量,看的是你的CPU有几个核,支持的线程数量就越多,4核,线程数量在200~300之间 8 | 9 | 10 | spring mvc、struts2这样的mvc框架,框架一般会把自己的servlet/filter配置在tomcat里面,tomcat就会把http请求交给mvc框架的servlet/filter,mvc框架就开始执行,处理请求 11 | 12 | 13 | mvc框架往往会扫描到你加了@Controller注解的类,扫描你里面的@Mapping注解,看看这个请求的URL路径格式和@Mapping注解里的指定的URL格式来做一个匹配,会把请求交给你的类里面的方法来处理 14 | 15 | 16 | 17 | 微服务之间调用的一个线程模型了解清楚,任何请求在分布式系统里执行,每个服务里都有一个线程会去处理这个请求 18 | 19 | -------------------------------------------------------------------------------- /docs/03/136.md: -------------------------------------------------------------------------------- 1 | # 136、一个身经百战的互联网面试官的系统设计优化连环炮发问! 2 | (1)说说高并发场景下的数据库连接池应该如何进行优化? 3 | 4 | (2)如果压测的时候发现系统的TPS不达标,此时应该如何优化系统? 5 | 6 | (3)说说你对NoSQL的理解以及他的优缺点分别都是什么? 7 | 8 | (4)假设让你来负责微信朋友圈这样的社交系统,应该如何设计? 9 | 10 | (5)微信朋友圈是如何对好友显示权限进行控制的? 11 | 12 | (6)如何设计高并发的朋友圈点赞系统架构? 13 | 14 | (7)如何保证刚发的微信朋友圈被人点赞后,自己能及时的看到? 15 | 16 | (8)在你的朋友圈点赞系统,如何防止用户连续点击几次进行重复点赞? 17 | 18 | (9)设想你负责一个系统,此时某个核心服务如果挂掉,该怎么处理? 19 | 20 | (10)如果你们公司的Nginx故障挂掉了,应该如何做才能保证他的高可用性? 21 | 22 | (11)如果让你来设计12306售票系统,应该如何设计? 23 | 24 | (12)如果让你来设计一个电商场景下的秒杀系统,应该如何设计? 25 | -------------------------------------------------------------------------------- /docs/c2c/32.md: -------------------------------------------------------------------------------- 1 | # 《32_SpringCloudAlibaba之Seata分布式事务方案(1)》 2 | 3 | TCC框架,Saga框架,Seata支持好几种分布式事务方案,全面、完善的分布式事务解决方案,成熟框架 4 | 5 | 6 | TCC方案,ByteTCC,搜索一下,维护这个框架的,QQ群 7 | 8 | 你的核心接口,全部要写三套,每个接口都要拆分为3个接口,Try、Commit、Cancel,一个接口,chooseCandidate接口,tryChooseCandidate,commitChooseCandidate,cancelChooseCandidate,每个接口要写3套逻辑 9 | 10 | try里面,可以在数据库添加一批评审员,状态都设置为INVALID,无效的;commit,就可以把他们的状态设置为VALID;cancel,就可以把插入的那批评审员给删除了 11 | 12 | 13 | 分布式事务这个技术以及思想,过去在国内一直没有受到重视的,大厂还是小公司,只要你不是金融级跟钱直接相关的系统,普通的互联网系统,哪怕是订单系统,都不会上分布式事务,TCC思想,太麻烦了 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/c2c/38.md: -------------------------------------------------------------------------------- 1 | 2 | #《38_为什么微服务化的系统需要进行限流和熔断?》 3 | 4 | 5 | 雪崩、隔离、熔断、降级、限流 6 | 7 | 8 | Tomcat收到的每一个HTTP请求,都会交给一个独立的工作线程去处理,独立的工作线程一般可以配置为100~500之间的数量,看的是你的CPU有几个核,支持的线程数量就越多,4核,线程数量在200~300之间 9 | 10 | 11 | spring mvc、struts2这样的mvc框架,框架一般会把自己的servlet/filter配置在tomcat里面,tomcat就会把http请求交给mvc框架的servlet/filter,mvc框架就开始执行,处理请求 12 | 13 | 14 | mvc框架往往会扫描到你加了@Controller注解的类,扫描你里面的@Mapping注解,看看这个请求的URL路径格式和@Mapping注解里的指定的URL格式来做一个匹配,会把请求交给你的类里面的方法来处理 15 | 16 | 17 | 18 | 微服务之间调用的一个线程模型了解清楚,任何请求在分布式系统里执行,每个服务里都有一个线程会去处理这个请求 19 | 20 | -------------------------------------------------------------------------------- /docs/03/124.md: -------------------------------------------------------------------------------- 1 | # 124、ZooKeeper最核心的一个机制:Watcher监听回调 2 | 3 | ![Watcher监听回调](/docs/03/images/124/01.png) 4 | 5 | ZooKeeper最核心的机制,就是你一个客户端可以对znode进行Watcher监听,然后znode改变的时候回调通知你的这个客户端,这个是非常有用的一个功能,在分布式系统的协调中是很有必要的 6 | 7 | 8 | 9 | 支持写和查:只能实现元数据存储,Master选举,部分功能 10 | 11 | 12 | 13 | 分布式系统的协调需求:分布式架构中的系统A监听一个数据的变化,如果分布式架构中的系统B更新了那个数据/节点,zk反过来通知系统A这个数据的变化 14 | 15 | 16 | 17 | /usr/local/uid 18 | 19 | 20 | 21 | 使用zk很简单,内存数据模型(不同节点类型);写数据,主动读取数据;监听数据变化,更新数据,反向通知数据变化 22 | 23 | 24 | 25 | 实现分布式集群的集中式的元数据存储、分布式锁、Master选举、分布式协调监听 26 | -------------------------------------------------------------------------------- /docs/c2c/31.md: -------------------------------------------------------------------------------- 1 | # 《31_国内工程师开源的分布式事务框架以及Seata选型对比》 2 | 3 | 开放了一些我在架构班里讲解分布式事务时候的一点点视频,就跟我们的小案例,C2C二手电商平台的社会化治理系统,进行一个结合,为什么我们需要一个分布式事务,在具体的技术层面,我们如何来进行选型,有哪些东西可以选择 4 | 5 | 除了阿里开源的Seata之外,根本就没什么太成熟的分布式事务的框架,TCC方案 -> ByteTCC,写的还不错,LCN,写的也还不错,这些框架都是小范围的流传和使用,没有大规模的很多中大型公司都落地的案例,生产可能都有一些坑 6 | 7 | ByteTCC、LCN,一定要确保先把里面的源码先吃透,搞定,源码每个细节都能搞定,再投入自己生产去用,有坑,有问题,自己绝对可以hold住,在架构班的课程里,Atomikos的源码,ByteTCC分布式事务框架的源码,自己写类似于RocketMQ分布式事务方案的可靠消息的服务中间系统 8 | 9 | 中小型公司,如果要上分布式事务的方案,最好用成熟大厂开源的方案,阿里开源的Seata,可靠性还是有保障的,Seata的基本的原理,和使用,跟案例的整合 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/c2c/36.md: -------------------------------------------------------------------------------- 1 | 2 | # 《36_C2C电商社会化治理平台核心链路的分布式事务》 3 | 4 | 讲完了seata的一些原理之后,就要讲他的代码集成了,跟Dubbo,Spring Boot,Spring Cloud Alibaba等框架进行集成,教会大家一个办法,如果你要把某个技术集成到你自己的项目里去,最好的参考示例工程是什么呢? 5 | 6 | 官网文档里提供的示例程序,把他的示例程序给跑起来,就可以参考示例程序把技术集成到自己的项目里去就可以了 7 | 8 | 在集成的过程中,可能那个技术,比如说seata并没有考虑到跟一些框架集成时的版本兼容的问题,所以经常会出现把某个技术集成到你自己的项目去的时候出现了一些版本兼容的问题 9 | 10 | http://seata.io/ 11 | 12 | 13 | dubbo + nacos,只不过是用spring cloud alibaba提供的一些便捷方法来进行搭建,本质nacos作为服务注册中心,dubbo作为rpc框架,现在如果说你要把seata引入进去,此时你完完全全就可以参考这个示例工程 14 | 15 | ORM框架,用的是jdbcTemplate 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/03/141.md: -------------------------------------------------------------------------------- 1 | # 141、HBase作为一个NoSQL数据库,有哪些架构上的特点?(上) 2 | 3 | 《003_HBase作为一个NoSQL数据库,有哪些架构上的特点?(上)》 4 | 5 | 6 | 7 | (1)分布式架构 8 | 9 | 10 | 11 | hbase定位是分布式nosql数据库,把自己的nosql数据库的功能是通过多台机器来实现的,有多个RegionServer,分布式管理数据,分布式执行你的各种nosql数据库的操作 12 | 13 | 14 | 15 | (2)分布式数据存储和自动数据分片 16 | 17 | 18 | 19 | 这个功能是极为强大的,比如你搞一个hbase里的表,然后在表里搞很多很多的数据,这个表会分为很多的region,每个region里是一个数据分片,然后这些region数据分片就会分散在多台机器上 20 | 21 | 22 | 23 | 假设你的表里的数据太多了,此时region会自动进行分裂,分裂成更多的region,自动分散在更多的机器上,对我们使用是极为方便的 24 | 25 | 26 | 27 | (3)集成hdfs作为分布式文件存储系统 28 | 29 | -------------------------------------------------------------------------------- /docs/distributed-system/tcc-high-concurrence.md: -------------------------------------------------------------------------------- 1 | 2 | TCC框架,bytetcc,seata 3 | 4 | seata-server 5 | 6 | bytetcc,大家就是基于mysql里面创建一些表,基于表中的数据进行状态的更新 7 | 8 | 9 | 核心链路中的各个服务都需要跟TC这个角色进行频繁的网络通信,频繁的网络通信其实就会带来性能的开销,本来一次请求不引入分布式事务只需要100ms,此时引入了分布式事务之后可能需要耗费200ms 10 | 11 | 12 | 13 | 网络请求可能还挺耗时的,上报一些分支事务的状态给TC,seata-server,选择基于哪种存储来放这些分布式事务日志或者状态的,file,磁盘文件,MySQL,数据库来存放对应的一些状态 14 | 15 | 16 | 17 | 18 | 高并发场景下,会不会有问题,seata-server,你也需要支持扩容,也需要部署多台机器,用一个数据库来存放分布式事务的日志和状态的话,假设并发量每秒上万,分库分表,对TC背后的数据库也会有同样的压力 19 | 20 | 这个时候对TC背后的db也得进行分库分表,抗更高的并发压力 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/c2c/68.md: -------------------------------------------------------------------------------- 1 | # 《68_Zuul 作为网关的架构原理介绍》 2 | 3 | 4 | 设计模式,其实在各种开源项目里,到处都是设计模式 5 | 6 | pre过滤器 7 | 8 | -3:ServletDetectionFilter 9 | -2:Servlet30WrapperFilter 10 | -1:FromBodyWrapperFilter 11 | 1:DebugFilter 12 | 5:PreDecorationFilter 13 | 14 | routing过滤器 15 | 16 | 10:RibbonRoutingFilter 17 | 100:SimpleHostRoutingFilter 18 | 500:SendForwardFilter 19 | 20 | post过滤器 21 | 22 | 1000:SendResponseFilter 23 | 24 | error过滤器 25 | 26 | 0:SendErrorFilter 27 | 28 | zuul的源码,其实非常简单的,一点都不复杂,zuul的源码,有可能是spring cloud几个核心组件里面,最简单的,ribbon差不多一个级别的简单 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /docs/distributed-system/gateway-high-concurrency.md: -------------------------------------------------------------------------------- 1 | 2 | 第一个是高并发,第二个是如何优化 3 | 4 | ![高性能网关Zuul](/docs/distributed-system/images/gateway-high-concurrency.png) 5 | **Zuul**网关部署的是什么配置的机器,**部署32核64G,对网关路由转发的请求**,**每秒抗个小几万请求是不成问题的,几台Zuul网关机器** 6 | 7 | **每秒是1万请求,8核16G的机器部署Zuul网关,5台机器就够了** 8 | 9 | ### 生产级的网关,应该具备我刚才说的几个特点和功能: 10 | 11 | #### (1)动态路由:新开发某个服务,动态把请求路径和服务的映射关系热加载到网关里去;服务增减机器,网关自动热感知 12 | #### (2)灰度发布:基于现成的开源插件来做 13 | #### (3)授权认证 14 | #### (4)限流熔断 15 | #### (5)性能监控:每个API接口的耗时、成功率、QPS 16 | #### (6)系统日志 17 | #### (7)数据缓存 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /docs/c2c/53.md: -------------------------------------------------------------------------------- 1 | #《53_Zabbix、Falcon、Prometheus的选型对比》 2 | 3 | 2015~2016年左右以及之前,国内比较多的用的是Zabbix这个国外开源的监控系统,直接部署做一些配置,就可以让他去监控你的各个服务器以及部署的服务实例了;Facon,做的还是比较好的;2018~2019再往后推,基本上跟着微服务体系,一般监控中心国外和国内,最火的,用的比较多的就是Prometheus 4 | 5 | 很多系统平时上线了以后,似乎就是咔咔的跑着,好像你也没有去关注他,如果没人反馈bug给你,你似乎根本就不去care他 6 | 7 | 线上系统,可能产生的三个层面的问题: 8 | 9 | * 1、机器资源的层面:cpu、内存、网络、磁盘、io,出现了负载过高的问题 10 | * 2、JVM进程的层面:jvm内部各个区域的内存使用以及gc频率 11 | * 3、代码层面:代码逻辑的内部,抛异常,出现一些不希望发生的系统异常 12 | 13 | 但凡是线上的系统,配置中心、分布式事务、sentinel dashboard都可以不用,主要把服务注册中心和rpc框架搞好,一套服务之间RPC调用组成的一套系统能上线就可以了,可以跑起来了,但是监控中心是必须要有的 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/03/04.md: -------------------------------------------------------------------------------- 1 | 从技术角度而言:技术广度(面试突击一二三季)、技术深度(阅读源码、项目深度、开源社区)、项目经验(2C、2B、政企、金融、电信、CRUD)、架构设计(负责过的架构有多大,你能设计多大多复杂的架构)、基础知识(数据结构和算法、计算机组成原理、操作系统、网路协议) 2 | 3 | 4 | 5 | 从综合角度而言:管理能力,学历,履历,软素质(表达能力、沟通能力、团队协作、价值观、性格),薪资要求 6 | 7 | 8 | 9 | 面试突击三季都学完 + 自己在面试过程中如果发现有一些问题是自己不会,要额外看一些书籍、或者别的课程、或者别的资料做一些补充 10 | 11 | 12 | 13 | 学历是211的本科、软素质、履历(之前就待过较为知名的公司),进BAT都可以 14 | 15 | 16 | 17 | 学历不是太出彩,软素质也较为一般,履历都是在一些小公司,起码就是说帮你面试中小型公司拿下offer,绝对是有很大的帮助的 18 | 19 | 20 | 21 | 学历不错,211、985之类的,软素质一般,履历之前反而是在国企、小公司,技术还可以,可能可以进一个独角兽企业 22 | 23 | 24 | 25 | 一线城市,20k+,20多k都是可以的 26 | 27 | 二线城市,十多k是可以的 -------------------------------------------------------------------------------- /docs/03/28.md: -------------------------------------------------------------------------------- 1 | # 28、了解过cglib动态代理吗?他跟jdk动态代理的区别是什么? 2 | 优先是jdk动态代理,其次是cglib动态代理,网上搜一下两种动态代理的代码示例 3 | 4 | 5 | 6 | 其实就是动态的创建一个代理类出来,创建这个代理类的实例对象,在这个里面引用你真正自己写的类,所有的方法的调用,都是先走代理类的对象,他负责做一些代码上的增强,再去调用你写的那个类 7 | 8 | 9 | 10 | spring里使用aop,比如说你对一批类和他们的方法做了一个切面,定义好了要在这些类的方法里增强的代码,spring必然要对那些类生成动态代理,在动态代理中去执行你定义的一些增强代码 11 | 12 | 13 | 14 | 如果你的类是实现了某个接口的,spring aop会使用jdk动态代理,生成一个跟你实现同样接口的一个代理类,构造一个实例对象出来,jdk动态代理,他其实是在你的类有接口的时候,就会来使用 15 | 16 | 17 | 18 | 很多时候我们可能某个类是没有实现接口的,spring aop会改用cglib来生成动态代理,他是生成你的类的一个子类,他可以动态生成字节码,覆盖你的一些方法,在方法里加入增强的代码 19 | 20 | 21 | 22 | 百度:jdk动态代理代码示例,cglib动态代理代码示例 -------------------------------------------------------------------------------- /docs/03/15.md: -------------------------------------------------------------------------------- 1 | # 《15、你对JDK中的AQS理解吗?AQS的实现原理是什么?》 2 | 3 | ![ReentrantLock](images/15/01.png) 4 | 5 | ReentrantLock 6 | 7 | 8 | 9 | state变量 -> CAS -> 失败后进入队列等待 -> 释放锁后唤醒 10 | 11 | 12 | 13 | 非公平锁,公平锁 14 | 15 | 16 | 17 | 多线程同时访问一个共享数据,sychronized,CAS,ConcurrentHashMap(并发安全的数据结构可以来用),Lock 18 | 19 | 20 | 21 | synchronized就有点不一样了,你可以自己上网看一下 => AQS,Abstract Queue Synchronizer,抽象队列同步器 22 | 23 | 24 | 25 | Semaphore、其他一些的并发包下的 26 | 27 | 28 | 29 | ReentrantLock lock = new ReentrantLock(true); => 非公平锁 30 | 31 | // 多个线程过来,都尝试 32 | 33 | lock.lock(); 34 | 35 | 36 | 37 | lock.unlock(); -------------------------------------------------------------------------------- /docs/03/39.md: -------------------------------------------------------------------------------- 1 | # 39、说说JVM的年轻代垃圾回收算法?对象什么时候转移到老年代? 2 | 3 | ![01](images/39/01.png) 4 | 5 | 如果说你让代码一边运行,一边有变动,一边判断哪些对象是可以回收的,这个是不现实的,垃圾回收的时候有一个概念,叫做stop the world,停止你的jvm里的工作线程的运行,然后扫描所有的对象,判断哪些可以回收,哪些不可以回收的 6 | 7 | 8 | 9 | 年轻代,大部分情况下,对象生存周期是很短的,可能在0.01ms之内,线程执行了3个方法,创建了几个对象,0.01ms之后就方法都执行结束了,此时那几个对象就会在0.01ms之内变成垃圾,可以回收的 10 | 11 | 12 | 13 | 100个对象,可能90个对象都是垃圾对象,10个对象是存活的对象,5个 14 | 15 | 16 | 17 | 复制算法,一次young gc,年轻代的垃圾回收 18 | 19 | 20 | 21 | 三种场景,第一种场景,有的对象在年轻代里熬过了很多次垃圾回收,15次垃圾回收,此时会认为这个对象是要长期存活的对象 22 | 23 | 24 | 25 | Spring容器里,对每个bean实例对象就一个,长期存活,一直给我们来使用 26 | ![01](images/39/02.png) -------------------------------------------------------------------------------- /docs/03/75.md: -------------------------------------------------------------------------------- 1 | # 75、现代处理器为了提升性能的指令乱序和猜测执行的机制! 2 | 3 | ![处理器的指令乱序执行的机制](images/75/01.png) 4 | 5 | 指令乱序机制 6 | 7 | 8 | 9 | 指令不一定说是拿到了一个指令立马可以执行的,比如有的指令是要进行网络通信、磁盘读写,获取锁,很多种,有的指令不是立马就绪可以执行的,为了提升效率,在现代处理器里面都是走的指令的乱序执行机制 10 | 11 | 12 | 13 | 把编译好的指令一条一条读取到处理器里,但是哪个指令先就绪可以执行,就先执行,不是按照代码顺序来的。每个指令的结果放到一个重排序处理器中,重排序处理器把各个指令的结果按照代码顺序应用到主内存或者写缓冲器里 14 | 15 | 16 | 17 | 这就导致处理器可能压根儿就是乱序在执行我们代码编译后的指令 18 | 19 | 20 | 21 | 另外还有一个猜测执行,比如说if判断中有一坨代码,很可能先去执行if里的代码算出来结果,然后最后再来判断if是否成立 22 | 23 | ```text 24 | int sum = 0 25 | if(flag) { 26 | for(int i = 0; i < 10; i++) { 27 | 28 | } 29 | } 30 | ``` 31 | -------------------------------------------------------------------------------- /docs/03/29.md: -------------------------------------------------------------------------------- 1 | # 29、额外加餐:能说说Spring中的Bean是线程安全的吗? 2 | Spring容器中的bean可以分为5个范围: 3 | 4 | 5 | 6 | (1)singleton:默认,每个容器中只有一个bean的实例 7 | 8 | (2)prototype:为每一个bean请求提供一个实例 9 | 10 | 11 | 12 | 一般来说下面几种作用域,在开发的时候一般都不会用,99.99%的时候都是用singleton单例作用域 13 | 14 | 15 | 16 | (3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收 17 | 18 | (4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效 19 | 20 | (5)global-session 21 | 22 | 23 | 24 | ![global-session](images/29/01.png) 25 | 26 | 27 | 28 | 答案是否定的,绝对不可能是线程安全的,spring bean默认来说,singleton,都是线程不安全的,java web系统,一般来说很少在spring bean里放一些实例变量,一般来说他们都是多个组件互相调用,最终去访问数据库的 -------------------------------------------------------------------------------- /docs/03/69.md: -------------------------------------------------------------------------------- 1 | # 69、volatile原来还可以保证long和double变量写操作的原子性 2 | volatile对原子性保障的语义,在java里很有限的,几乎可以忽略不计。32位的java虚拟机里面,对long/double变量的赋值写是不原子的,此时如果对变量加上了volatile,就可以保证在32位java虚拟机里面,对long/double变量的赋值写是原子的了 3 | 4 | 5 | 6 | int i = 0,原子性,volatile,java语言规范就规定了,原子性的 7 | 8 | 9 | 10 | volatile long i; 11 | 12 | 13 | 14 | 多个线程执行:i = 30,此时就不要紧了,因为volatile修饰了,就可以保证这个赋值操作是原子的了 15 | 16 | 17 | 18 | 你以后出去面试也可能会遇到杠精面试官,你要说volatile是保证可见性和有序性的,不保证原子性,杠精面试官,素质差,很二,心胸很狭隘,volatile可以保证原子性,此时看过这一讲之后 19 | 20 | 21 | 22 | i++,复杂的一些场景 23 | 24 | 25 | 26 | resources = loadResources(); 27 | 28 | resources.execute(); 29 | 30 | ready = true; 31 | -------------------------------------------------------------------------------- /docs/03/07.md: -------------------------------------------------------------------------------- 1 | HashMap map = new HashMap(); 2 | 3 | map.put(“张三”, “测试数据”); 4 | 5 | map.put(“李四”, “测试数据”); 6 | 7 | 8 | 9 | { 10 | 11 | “张三”: “测试数据”, 12 | 13 | “李四”: “测试数据” 14 | 15 | } 16 | 17 | 18 | 19 | 底层最核心的数据结构并不是你想的这样的 20 | 21 | 22 | 23 | 数组 24 | 25 | 26 | 27 | 对张三计算出来一个hash值,根据这个hash值对数组进行取模,就会定位到数组里的一个元素中去 28 | 29 | 30 | 31 | [<>, <>, <>, <>,<张三, 测试数据>, <>,<>,<李四, 测试数据>,<>, <>, <>, <>,<>, <>, <>, <>] 32 | 33 | 34 | 35 | 假设可以放16个元素,取模,index 36 | 37 | 38 | 39 | array[4] = <张三, 测试数据> 40 | 41 | 42 | 43 | map.get(“张三”) -> hash值 -> 对数组长度进行取模 -> return array[4] -------------------------------------------------------------------------------- /docs/03/130.md: -------------------------------------------------------------------------------- 1 | # 130、ZAB协议下一种可能存在的数据一致性问题 2 | Leader收到了过半的follower的ack,接着leader自己commit了,还没来得及发送commit给所有follower自己就挂了,这个时候相当于leader的数据跟所有follower是不一致的,你得保证全部follower最终都得commit 3 | 4 | 5 | 6 | 另外一个,leader可能会自己收到了一个请求,结果没来得及发送proposal给所有follower之前就宕机了,此时这个Leader上的请求应该是要被丢弃掉的 7 | 8 | 9 | 10 | 所以在leader崩溃的时候,就会选举一个拥有事务id最大的机器作为leader,他得检查事务日志,如果发现自己磁盘日志里有一个proposal,但是还没提交,说明肯定是之前的leader没来得及发送commit就挂了 11 | 12 | 13 | 14 | 此时他就得作为leader为这个proposal发送commit到其他所有的follower中去,这个就保证了之前老leader提交的事务已经会最终同步提交到所有follower里去 15 | 16 | 17 | 18 | 然后对于第二种情况,如果老leader自己磁盘日志里有一个事务proposal,他启动之后跟新leader进行同步,发现这个事务proposal其实是不应该存在的,就直接丢弃掉就可以了 19 | -------------------------------------------------------------------------------- /docs/03/128.md: -------------------------------------------------------------------------------- 1 | # 128、采用了2PC两阶段提交思想的ZAB消息广播流程 2 | 3 | ![采用了2PC两阶段提交思想的ZAB消息广播流程](/docs/03/images/128/01.png) 4 | 5 | 每一个消息广播的时候,都是2PC思想走的,先是发起事务Proposal的广播,就是事务提议,仅仅只是个提议而已,各个follower返回ack,过半follower都ack了,就直接发起commit消息到全部follower上去,让大家提交 6 | 7 | 8 | 9 | 发起一个事务proposal之前,leader会分配一个全局唯一递增的事务id,zxid,通过这个可以严格保证顺序 10 | 11 | 12 | 13 | leader会为每个follower创建一个队列,里面放入要发送给follower的事务proposal,这是保证了一个同步的顺序性 14 | 15 | 16 | 17 | 每个follower收到一个事务proposal之后,就需要立即写入本地磁盘日志中,写入成功之后就可以保证数据不会丢失了,然后返回一个ack给leader,然后过半follower都返回了ack,leader推送commit消息给全部follower 18 | 19 | 20 | 21 | leader自己也会进行commit操作 22 | 23 | 24 | 25 | commit之后,就意味这个数据可以被读取到了 26 | -------------------------------------------------------------------------------- /docs/c2c/27.md: -------------------------------------------------------------------------------- 1 | # 《27_Nacos如何支持蓝绿部署、灰度发布以及滚动发布?》 2 | 3 | 非常遗憾的告诉大家,现在并没有一个开源项目能够完美的支持灰度发布和蓝绿部署,因为这并不是一个nacos就可以做到的,大家都知道,nacos支持namespace等高级特性,还可以带服务元数据,所以如果要基于nacos来搞灰度发布和蓝绿部署是可以的 4 | 5 | 比如说,你灰度的时候,负责灰度的版本上线,就注册到一个prod-grey namespace下去,或者是你得带上一些服务标签,类似元数据的概念,然后你的网关流量入口,就得能够识别出灰度机器,按照你的配置分发流量 6 | 7 | 然后你的类似dubbo的RPC框架的负载均衡模块,也得识别出灰度机器,按照配置分发流量过去 8 | 9 | 就是这个事儿要做成,必须是nacos + dubbo + 网关,都得做很多定制和改造,才能搞定的,其实做是可以做的,因为网关的灰度,很多开源网关都支持,dubbo的负载均衡机制也是可以扩展自定义的 10 | 11 | 但是这都有工作量,你得自己去做,这不是现成的 12 | 13 | 蓝绿部署其实也是同理,你新集群的服务都得带标签,或者干脆就去别的namespace,然后你的流量分发这块要能够控制好,包括回滚时的流量秒级切换 14 | 15 | 所以这块正常来说,并没有办法说针对中小型公司,直接开箱即用,就可以灰度发布或者是蓝绿部署,因为流量控制这块有点棘手 16 | 17 | -------------------------------------------------------------------------------- /docs/03/09.md: -------------------------------------------------------------------------------- 1 | hash冲突问题,链表+红黑树,O(n)和O(logn) 2 | 3 | 4 | 5 | map.put和map.get -> hash算法优化(避免hash冲突),寻址性能优化 6 | 7 | 8 | 9 | 算出key的hash值,到数组中寻址,找到一个位置,把key-value对放进数组,或者从数组里取出来 10 | 11 | 12 | 13 | 两个key,多个key,他们算出来的hash的值,与n-1,与运算之后,发现定位出来的数组的位置还是一样的,hash碰撞,hash冲突 14 | 15 | 16 | 17 | [<> -> <> -> <>, ] 18 | 19 | 20 | 21 | array[0]这个位置,就是一个链表 22 | 23 | 24 | 25 | 会在这个位置挂一个链表,这个链表里面放入多个元素,让多个key-value对,同时放在数组的一个位置里 26 | 27 | 28 | 29 | get,如果定位到数组里发现这个位置挂了一个链表,此时遍历链表,从里面找到自己的要找的那个key-value对就可以了 30 | 31 | 32 | 33 | 假设你的链表很长,可能会导致遍历链表,性能会比较差,O(n) 34 | 35 | 36 | 37 | 优化,如果链表的长度达到了一定的长度之后,其实会把链表转换为红黑树,遍历一颗红黑树找一个元素,此时O(logn),性能会比链表高一些 -------------------------------------------------------------------------------- /docs/high-concurrency/redis-cas.md: -------------------------------------------------------------------------------- 1 | ## 面试题 2 | redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗? 3 | 4 | ## 面试官心理分析 5 | 这个也是线上非常常见的一个问题,就是**多客户端同时并发写**一个 key,可能本来应该先到的数据后到了,导致数据版本错了;或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。 6 | 7 | 而且 redis 自己就有天然解决这个问题的 CAS 类的乐观锁方案。 8 | 9 | ## 面试题剖析 10 | 某个时刻,多个系统实例都去更新某个 key。可以基于 zookeeper 实现分布式锁。每个系统通过 zookeeper 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 key,别人都不允许读和写。 11 | 12 | ![zookeeper-distributed-lock](/images/zookeeper-distributed-lock.png) 13 | 14 | 你要写入缓存的数据,都是从 mysql 里查出来的,都得写入 mysql 中,写入 mysql 中的时候必须保存一个时间戳,从 mysql 查出来的时候,时间戳也查出来。 15 | 16 | 每次要**写之前,先判断**一下当前这个 value 的时间戳是否比缓存里的 value 的时间戳要新。如果是的话,那么可以写,否则,就不能用旧的数据覆盖新的数据。 -------------------------------------------------------------------------------- /docs/03/132.md: -------------------------------------------------------------------------------- 1 | # 132、对于需要丢弃的消息是如何在ZAB协议中进行处理的? 2 | 每一条事务的zxid是64位的,高32位是leader的epoch,就认为是leader的版本吧;低32位才是自增长的zxid 3 | 4 | 5 | 6 | > ~~老leader发送出去的proposal,高32位是1,低32位是11358~~ 7 | 8 | 9 | 10 | 如果一个leader自己刚把一个proposal写入本地磁盘日志,就宕机了,没来得及发送给全部的follower,此时新leader选举出来,他会的epoch会自增长一位 11 | 12 | 13 | 14 | proposal,高32位是2,低32位是继续自增长的zxid 15 | 16 | 17 | 18 | 然后老leader恢复了连接到集群是follower了,此时发现自己比新leader多出来一条proposal,但是自己的epoch比新leader的epoch低了,所以就会丢弃掉这条数据 19 | 20 | 21 | 22 | 启动的时候,过半机器选举leader,数据同步 23 | 24 | 25 | 26 | 对外提供服务的时候,2PC + 过半写机制,顺序一致性(最终的一致性) 27 | 28 | 29 | 30 | 崩溃恢复,剩余机器过半,重新选举leader,有数据不一致的情况,针对两种情况自行进行处理,保证数据是一致的(磁盘日志文件、zxid的高32位) 31 | -------------------------------------------------------------------------------- /docs/03/144.md: -------------------------------------------------------------------------------- 1 | # 144、HBase的数据模型是什么样的?(上) 2 | 3 | 《006_HBase的数据模型是什么样的?》 4 | 5 | 6 | 7 | hbase里其实也是建一个一个的表 8 | 9 | 10 | 11 | 表里有很多行的数据,但是其实这个表说白了就是一个逻辑模型,物理上根本没那么简单的,一个表的数据当然是拆为很多region分散在不同的机器上的,要是表里数据太多了,region数量还会变多,这样你加更多机器,region可以自动迁移到不同的机器上去 12 | 13 | 14 | 15 | 每一行都有一个rowkey,还有很多列,表里的数据行都是按照rowkey排序的,大致可以把rowkey理解为mysql里的主键id,在hbase里每一行数据都有一个rowkey行健来唯一的标识一行数据 16 | 17 | 18 | 19 | 所以一般设计rowkey是一门讲究活,后续还会讲如何设计rowkey的,因为一般要把同一类数据的rowkey设计的相似一些,比如说用户id=1的订单,就应该叫做order_1_xx之类的,这样一个用户的订单就会在排序之后靠近在一起 20 | 21 | 22 | 23 | rowkey 列 24 | 25 | order_1_110 xxx 26 | 27 | order_1_111 xxx 28 | 29 | order_2_256 xxx -------------------------------------------------------------------------------- /docs/c2c/03.md: -------------------------------------------------------------------------------- 1 | 《03_海外硅谷互联网大厂的微服务架构演进路线》 2 | 3 | 国外互联网公司,其实也都是几个大公司自己自研,后来逐渐的有一个叫做netflix公司的微服务技术架构开源出来, 4 | 5 | 在国外有很大的影响力,然后接着就被整合到了spring社区,变成了spring cloud项目, 6 | 7 | 里面整合的是netflix等国外公司的微服务相关组件早 期 的spring cloud微服务体系的组件 , 8 | 9 | 是 以eureka、feign+ribbon、zuul、hystrix,用zipkin和sleuth做链路监控,stream做消息中间件集成, 10 | 11 | contract做契约测试支持,当然gateway也可以做网关,consul也是一种注册中心, 12 | 13 | 还有跟spring security配合的安全认证,跟k8s配合的容器支持这些都是国外公司为主的开源项目, 14 | 15 | spring cloud打包集成在一起,在国外比较有市场,两三年前在国内也火了, 16 | 17 | 大量公司都开始拥抱spring cloud,尤其是中小型公司,几乎都是用spring cloud因此呈现的一个状态, 18 | 19 | 就是大厂几乎都是自研,部分大厂是以阿里的dubbo为核心自研的,部分中小型公司还是以dubbo为核心, 20 | 21 | 加上自己找一些开源项目,然后更大比重的中小型公司,就是spring cloud那套技术架构 22 | -------------------------------------------------------------------------------- /docs/c2c/60.md: -------------------------------------------------------------------------------- 1 | #《60_C2C电商社会化治理平台的日志体系设计》 2 | 3 | 线上运行的系统,跑着跑着,突然有用户找客服反馈你的系统有个什么什么bug!bug可能有对应的异常报错,也可能没有报错,就是纯粹的是你的代码级别的bug,客服会找你们技术这边 4 | 5 | 快速的定位bug发生的原因,定位 -> 修复 6 | 7 | 通过查阅日志,分析bug发生时,系统是如何运行的,是否运行中有问题导致bug 8 | 9 | 如果你单个服务/系统部署的机器数量都超过5台了,此时必须要上日志中心 10 | 11 | 《互联网Java工程师面试突击第一季》,儒猿技术窝,免费,不要钱,ES的架构原理,我都讲过,大家直接去看一下,倒排索引,正排索引,shard数据分片,replica副本,写入原理,分布式搜索原理 12 | 13 | 业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)、日志内容(举报的具体内容数据,json字符串来存储) 14 | 15 | 日志中心没有开源的,可能有少数的不知名的,但是连我都没听说过 16 | 17 | 一般都是公司自己基于ES来做研发的,ES+HBase,黄金组合,HBase适合的是海量数据进行存储,ES,内置生成ES的document id,id作为rowkey把日志内容放到HBase里去,程序员,可以根据业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)来搜索日志 18 | 19 | -------------------------------------------------------------------------------- /docs/distributed-system/distributed-transaction-tcc.md: -------------------------------------------------------------------------------- 1 | 2 | 类似TCC事务的,开源框架,ByteTCC,Himly,个人技术高手自己写的,star也不少,也有一些中小型公司生产环境用了类似的分布式事务框架,知名度和普及型不高;很多公司,对类似的分布式事务,是自己写一些类似的框架 3 | 4 | 5 | 6 | 阿里开源了分布式事务框架,fescar,技术体系上有很多地方都是有自己的东西,seata,阿里开源的分布式事务框架,类似TCC事务,seata来做,这个框架是经历过阿里生产环境大量的考验的一个框架 7 | 8 | 支持dubbo、spring cloud两种服务框架,都是可以的 9 | 10 | 11 | 12 | 13 | 可靠消息最终一致性方案,面试突击第一季里都说过,ActiveMQ封装一个可靠消息服务,基于RabbitMQ封装,自己开发一个可靠消息服务,收到一个消息之后,会尝试投递到MQ上去,投递失败,重试投递 14 | 15 | 人家消费成功了以后必须回调他一个接口,通知他消息处理成功,如果一段时间后发现消息还是没有处理成功,此时会再次投递消息到MQ上去,在本地数据库里存放一些消息,基于ActiveMQ / RabbitMQ来实现消息的异步投递和消费 16 | 17 | 18 | 19 | RocketMQ,作为MQ中间件,提供了分布式事务支持,他把可靠消息服务需要实现的功能逻辑都做好了 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /docs/03/107.md: -------------------------------------------------------------------------------- 1 | # 107、听说过mmap吗?内存映射技术为什么可以提升IO性能? 2 | 3 | ![内存映射](images/107/01.png) 4 | 5 | 把**一个磁盘文件映射到内存里来**,然后把映射到内存里来的数据通过socket发送出去 6 | 7 | 8 | 有一种mmap技术,也就是内存映射,直接将磁盘文件数据映射到内核缓冲区,这个映射的过程是基于DMA引擎拷贝的, 9 | 10 | 同时用户缓冲区是跟内核缓冲区共享一块映射数据的,建立共享映射之后,就不需要从内核缓冲区拷贝到用户缓冲区了 11 | 12 | 光是这一点,就可以避免一次拷贝了,但是这个过程中还是会用户态切换到内核态去进行映射拷贝,接着再次从内核态切换到用户态,建立用户缓冲区和内核缓冲区的映射 13 | 14 | 接着把数据通过Socket发送出去,还是要再次切换到内核态 15 | 16 | 17 | 18 | 接着直接把内核缓冲区里的数据拷贝到Socket缓冲区里去,然后再拷贝到网络协议引擎里,发送出去就可以了,最后切换回用户态 19 | 20 | 21 | 22 | **减少一次拷贝**,但是并不减少切换次数,一共是4次切换,3次拷贝 23 | 24 | 25 | 26 | mmap技术是主要在RocketMQ里来使用的,公众号:儒猿技术窝,《从0开始带你成为消息中间件高手》的专栏,RocketMQ,里面剖析了一下,RocketMQ底层主要就是基于mmap技术来提升了磁盘文件的读写,性能 27 | -------------------------------------------------------------------------------- /docs/c2c/59.md: -------------------------------------------------------------------------------- 1 | #《59_基于Elasticsearch设计日志中心的原理分析》 2 | 3 | 线上运行的系统,跑着跑着,突然有用户找客服反馈你的系统有个什么什么bug!bug可能有对应的异常报错,也可能没有报错,就是纯粹的是你的代码级别的bug,客服会找你们技术这边 4 | 5 | 快速的定位bug发生的原因,定位 -> 修复 6 | 7 | 通过查阅日志,分析bug发生时,系统是如何运行的,是否运行中有问题导致bug 8 | 9 | 如果你单个服务/系统部署的机器数量都超过5台了,此时必须要上日志中心 10 | 11 | 《互联网Java工程师面试突击第一季》,儒猿技术窝,免费,不要钱,ES的架构原理,我都讲过,大家直接去看一下,倒排索引,正排索引,shard数据分片,replica副本,写入原理,分布式搜索原理 12 | 13 | 业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)、日志内容(举报的具体内容数据,json字符串来存储) 14 | 15 | 日志中心没有开源的,可能有少数的不知名的,但是连我都没听说过 16 | 17 | 一般都是公司自己基于ES来做研发的,ES+HBase,黄金组合,HBase适合的是海量数据进行存储,ES,内置生成ES的document id,id作为rowkey把日志内容放到HBase里去,程序员,可以根据业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)来搜索日志 18 | 19 | -------------------------------------------------------------------------------- /docs/03/150.md: -------------------------------------------------------------------------------- 1 | # 150、如何设计高并发的朋友圈点赞系统架构? 2 | 我看到了你的朋友圈,此时我就可以对你的朋友圈去进行一个点赞,也可以取消点赞,假设要设计成支撑高并发的点赞系统,应该如何设计? 3 | 4 | 5 | 6 | 朋友圈的点赞和评论,是独立的数据,其实比如点赞,都是可以基于redis来做的,每个朋友圈里对应一个set数据结构,里面放谁给你点赞了,这样每条朋友圈的点赞人和点赞数量直接从redis出就可以了,smembers和scard 7 | 8 | 9 | 10 | 评论也是可以存表里的,都是以朋友圈为粒度来存储 11 | 12 | 13 | 14 | 那么刷朋友圈的时候,比如说你好友和你,另外一个好友都是好友,此时你好友刷到了你的朋友圈,就可以把另外一个好友对你的点赞和评论都拉出来,展示在客户端下面就可以了,这个展示过程可以是动态的 15 | 16 | 17 | 18 | 你是王五,你的朋友圈被张三点赞了,李四跟你们也是好朋友,此时李四刷朋友圈看到了王五发的这条朋友圈,此时你可以在后台,对这条朋友圈的set用张三做一个sismember操作,就是判断一下你们俩的所有共同好友,有哪些人对这条朋友圈点赞了 19 | 20 | 21 | 22 | 此时就可以看出来这条朋友圈被你们的共同好友多少人点赞了,哪些人点赞了 23 | 24 | 25 | 26 | 比如你另外一个好友是否对这条朋友圈点赞了,直接sismember就可以判断出来,这样整个你基于redis,他都是非常高性能的 -------------------------------------------------------------------------------- /docs/03/34.md: -------------------------------------------------------------------------------- 1 | # 《34、额外加餐:能画一张图说说Spring Web MVC的核心架构吗?》 2 | (1)tomcat的工作线程将请求转交给spring mvc框架的DispatcherServlet 3 | 4 | 5 | 6 | (2)DispatcherServlet查找@Controller注解的controller,我们一般会给controller加上你@RequestMapping的注解,标注说哪些controller用来处理哪些请求,此时根据请求的uri,去定位到哪个controller来进行处理 7 | 8 | 9 | 10 | (3)根据@RequestMapping去查找,使用这个controller内的哪个方法来进行请求的处理,对每个方法一般也会加@RequestMapping的注解 11 | 12 | 13 | 14 | (4)他会直接调用我们的controller里面的某个方法来进行请求的处理 15 | 16 | 17 | 18 | (5)我们的controller的方法会有一个返回值,以前的时候,一般来说还是走jsp、模板技术,我们会把前端页面放在后端的工程里面,返回一个页面模板的名字,spring mvc的框架使用模板技术,对html页面做一个渲染;返回一个json串,前后端分离,可能前端发送一个请求过来,我们只要返回json数据 19 | 20 | 21 | 22 | (6)再把渲染以后的html页面返回给浏览器去进行显示;前端负责把html页面渲染给浏览器就可以了 -------------------------------------------------------------------------------- /docs/distributed-system/dubbo-rock-bottom.md: -------------------------------------------------------------------------------- 1 | 2 | ![Dubbo底层通信原理](/docs/distributed-system/images/dubbo-rock-bottom.png) 3 | 如果问到Dubbo底层原理,肯定除了上一讲的底层架构,你能说出来之外,还很可能会追问几个问题,网络通信这块原理的话 4 | 5 | netty来举例,NIO来实现的,一台机器同时抗高并发的请求 6 | 7 | 8 | 9 | **所以希望大家好好完成每天的作业,我布置的大量作业,就是为了帮你锻造出这种能力** 10 | 11 | **学习课程以及完成作业的过程中,大家一定会有很多的问题,可以到专栏的评论区去提问** 12 | 13 | **每天我都会和之前带出来的一批阿里、蚂蚁金服、滴滴的优秀同学给大家进行答疑,并且我们还有专门的付费用户的微信群,大家可以在微信群里跟我们一起进行技术交流** 14 | 15 | **如果你能坚持下来,学满6季,还可以获取私人定制的面试一条龙VIP服务** 16 | 17 | **如果是连续6季面试训练营都购买的同学,还可以获取面试一条龙VIP服务** 18 | 19 | **具体信息大家看“儒猿技术窝”公众号的知识店铺内的训练营详情即可** 20 | 21 | **具体可参见训练营目录下的《训练营专属服务》文档。简单来说,这个私人定制的面试VIP服务,会为你的跳槽面试全程保驾护航** 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /docs/distributed-system/homework.md: -------------------------------------------------------------------------------- 1 | 2 | 结合自身的情况来分析一下 3 | 4 | 结合面试突击第一季的课程,在“儒猿技术窝”公众号的知识店铺里去,在里面会有一个免费的课程,就是面试突击第一季,大家去里面找就可以了 5 | 6 | 可以把免费的面试突击第一季和我们现在付费的后续面试训练营系统同时同步一起看 7 | 8 | 技术广度的一些,各种技术 9 | 10 | ### (1)自己在技术广度上做的如何?你现在主流技术栈哪些技术都有一定的了解,包括核心原理和常见技术方案 11 | 12 | ### (2)自己在项目经验和生产经验上做的如何?你会的这些技术,自己在项目里到底用过多少?用的有多复杂?用的时候考虑了哪些项目细节和生产细节? 13 | 14 | ### (3)技术深度,你现在对哪些技术是除了核心原理以及基础知识之外,对一些技术的底层的概念和原理有一定的了解 15 | 16 | ### (4)系统设计,你目前自己独立负责过设计的系统和架构有多复杂?如果让你来独立设计秒杀系统、红包系统、12306系统,或者是一些其他大型的架构,你会如何来设计呢? 17 | 18 | 能力差距在哪里,肯定会有很多的疑问,第一周是预售周,是除了这4讲试看以外,其他的是不更新的,从第一周预售周结束之后会开始每日更新课程,可以把面试突击第一季复习巩固一下,没看过的人正好借着这一周把面试突击第一季先去看一下 19 | 20 | 而且可以对自己的能力模型做一个详细的梳理,看看自己现在能力有多强,差距在哪里 21 | 22 | -------------------------------------------------------------------------------- /docs/03/108.md: -------------------------------------------------------------------------------- 1 | # 108、零拷贝技术到底是什么,他是如何提升IO性能的? 2 | 3 | ![零拷贝原理](images/108/01.png) 4 | 5 | linux提供了sendfile,也就是零拷贝技术 6 | 7 | 8 | 9 | 在你的代码里面,如果说你基于零拷贝技术来读取磁盘文件,同时把读取到的数据通过Socket发送出去的话,流程如下,Kafka源码,transferFrom和transferTo两个方法,从磁盘上读取文件,把数据通过网络发送出去 10 | 11 | 12 | 13 | 这个零拷贝技术,就是先从用户态切换到内核态,在内核态的状态下,把磁盘上的数据拷贝到内核缓冲区,同时从内核缓冲区拷贝一些offset和length到Socket缓冲区;接着从内核态切换到用户态,从内核缓冲区直接把数据拷贝到网络协议引擎里去 14 | 15 | 16 | 17 | 同时从Socket缓冲区里拷贝一些offset和length到网络协议引擎里去,但是这个offset和length的量很少,几乎可以忽略 18 | 19 | 20 | 21 | 只要2次切换,2次拷贝,就可以了 22 | 23 | 24 | 25 | kafka、tomcat,都是用的零拷贝技术,rocketmq用的是mmap技术,mmap还是要多2次切换和1次拷贝的,在Java代码中如何进行mmap和零拷贝,大家可以去看一看网上的一些资料 26 | 27 | 28 | 29 | 用户态和内核态,用户态空间,内核态空间 30 | -------------------------------------------------------------------------------- /docs/03/52.md: -------------------------------------------------------------------------------- 1 | # 52、聊聊http的长连接的工作原理到底是啥? 2 | 3 | ## 1、面试题 4 | 5 | 6 | 7 | 什么是长连接?http长连接是什么? 8 | 9 | 10 | 11 | ## 2、面试官心里分析 12 | 13 | 14 | 15 | 一期学员,在外面面试的时候,正好还碰到了,聊到dubbo,dubbo://协议,是走的长连接,你聊聊什么是长连接?什么是http长连接? 16 | 17 | 18 | 19 | ## 3、面试题剖析 20 | 21 | 22 | 23 | http本身没什么所谓的长连接短连接之说,其实说白了都是http下层的tcp连接是长连接还是短连接,tcp连接保持长连接,那么多个http请求和响应都可以通过一个链接来走。其实http 1.1之后,默认都是走长连接了,就是底层都是一个网页一个tcp连接,一个网页的所有图片、css、js的资源加载,都走底层一个tcp连接,来多次http请求即可。 24 | 25 | 26 | 27 | http 1.0的时候,底层的tcp是短连接,一个网页发起的请求,每个请求都是先tcp三次握手,然后发送请求,获取响应,然后tcp四次挥手断开连接;每个请求,都会先连接再断开。短连接,建立连接之后,发送个请求,直接连接就给断开了 28 | 29 | 30 | 31 | http 1.1,tcp长连接,tcp三次握手,建立了连接,无论有多少次请求都是走一个tcp连接的,走了n多次请求之后,然后tcp连接被释放掉了 32 | -------------------------------------------------------------------------------- /docs/03/118.md: -------------------------------------------------------------------------------- 1 | # 118、为什么我们在分布式系统架构中需要使用 ZooKeeper 集群? 2 | ZooKeeper,功能和定位,满足的需求 3 | 4 | 使用ZooKeeper去满足自己需求的项目都有哪些 5 | 6 | 7 | 8 | 分布式集群的集中式元数据存储,Master选举实现HA架构,分布式协调和通知 9 | 10 | 11 | 12 | 我们写一个类似ZK的系统,单机版本,就是部署在一台机器上面,里面提供了一些功能,比如说允许你在里面存储一些元数据,支持你进行Master选举,支持你分布式协调和通知,也可以做到 13 | 14 | 15 | 16 | 单机版本的系统,万一挂掉了怎么办? 17 | 18 | 19 | 20 | 集群部署,部署一个集群出来,多台机器,保证高可用性,挂掉一台机器,都可以继续运行下去 21 | 22 | 23 | 24 | 3台机器 25 | 26 | 27 | 28 | 我现在要进行元数据的存储,我向机器01写了一条数据,机器01应该怎么把数据同步给其他的机器02和机器03呢? 29 | 30 | 31 | 32 | 自己写一个类似ZK的系统?不可能单机版本吧?肯定得集群部署保证高可用吧?一旦集群了之后,数据一致性怎么保证?多麻烦! 33 | 34 | 35 | 36 | 你的分布式架构中有需求,干脆就直接用工业级,久经考验的zookeeper就可以了,bug很少,功能很全面,运用在很多工业级的大规模的分布式系统中,HDFS、Kafka、HBase 37 | -------------------------------------------------------------------------------- /docs/c2c/54.md: -------------------------------------------------------------------------------- 1 | #《54_Prometheus的整体架构设计以及原理介绍》 2 | 3 | 在你要监控的服务器上部署exporters,比如node_exporter就是基于linux内核写的,专门收集机器的cpu、内存、网络、io、磁盘的资源使用情况,然后prometheus server就可以从exporters拉取metrics过来存储和展示,以及进行报警 4 | 5 | 除此之外,对什么mysql,redis之类的中间件,都有对应的exporter,你自己也可以写exporter,按照他的标准写就行了 6 | 7 | 还有一种,就是有一个pushgateway,可以让你直接推送metrics给他,比如你系统的一些业务指标监控,就可以走这种方式 8 | 9 | 然后prometheus server可以把拉取到的metrics存储到本地磁盘去,基于TSDB进行时序数据的存储,也会自动的清理旧数据,保留最新数据,TSDB是时间序列数据库,尤为适合这种监控指标的存储,按时间来存储 10 | 11 | 定时查询配置好的报警规则,如果发现metric满足规则,就把alert发送到alertmanager去,此时会通过钉钉了、email了、短信之类的方式去对你进行告警 12 | 13 | 如果要能够可视化的查看metric监控报表,一般是基于Grafana可视化系统来进行的,Grafana天然支持对接prometheus,专门是做指标可视化的,很方便使用,需要独立进行部署,不然他自己也有Prometheus Web UI,可以基于他的PromQL查询语句去查询 14 | 15 | -------------------------------------------------------------------------------- /docs/c2c/61.md: -------------------------------------------------------------------------------- 1 | #《61_C2C电商社会化治理平台接入日志中心》 2 | 3 | 线上运行的系统,跑着跑着,突然有用户找客服反馈你的系统有个什么什么bug!bug可能有对应的异常报错,也可能没有报错,就是纯粹的是你的代码级别的bug,客服会找你们技术这边 4 | 5 | 快速的定位bug发生的原因,定位 -> 修复 6 | 7 | 通过查阅日志,分析bug发生时,系统是如何运行的,是否运行中有问题导致bug 8 | 9 | 如果你单个服务/系统部署的机器数量都超过5台了,此时必须要上日志中心 10 | 11 | 《互联网Java工程师面试突击第一季》,儒猿技术窝,免费,不要钱,ES的架构原理,我都讲过,大家直接去看一下,倒排索引,正排索引,shard数据分片,replica副本,写入原理,分布式搜索原理 12 | 13 | 业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)、日志内容(举报的具体内容数据,json字符串来存储) 14 | 15 | 日志中心没有开源的,可能有少数的不知名的,但是连我都没听说过 16 | 17 | 一般都是公司自己基于ES来做研发的,ES+HBase,黄金组合,HBase适合的是海量数据进行存储,ES,内置生成ES的document id,id作为rowkey把日志内容放到HBase里去,程序员,可以根据业务、项目、服务、时间戳(long)、不同的日志有自己的特殊的业务id(用户id、举报渠道)来搜索日志 18 | 19 | [社会化治理平台架构设计](images/61/社会化治理平台架构设计.png) 20 | -------------------------------------------------------------------------------- /docs/03/77.md: -------------------------------------------------------------------------------- 1 | # 77、synchronized锁同时对原子性、可见性以及有序性的保证 2 | 原子性、可见性、有序性,三块东西,都重新从比较细节和底层的层面,都在硬件的级别去给大家说了一下,到底是怎么回事,为什么会发生这个问题,从底层的层面来说了一下,以及大体上有没有什么办法可以来解决这些问题 3 | 4 | 5 | 6 | 原子性,基本的赋值写操作都是可以保证原子性的,复杂的操作是无法保证原子性的 7 | 8 | 可见性,MESI协议、flush、refresh,配合起来,才可以解决可见性 9 | 10 | 有序性,三个层次,最后一个层次有4种重排(LoadLoad、StoreStore、LoadStore、StoreLoad) 11 | 12 | 13 | 14 | synchronized关键字,同时可以保证原子性、可见性以及有序性的 15 | 16 | 17 | 18 | 原子性的层面而言,他加了以后,有一个加锁和释放锁的机制,加锁了之后,同一段代码就只有他可以执行了 19 | 20 | 21 | 22 | 可见性,可以保证可见性的,他会通过加入一些内存屏障,他在同步代码块对变量做的写操作,都会在释放锁的时候,全部强制执行flush操作,在进入同步代码块的时候,对变量的读操作,全部会强制执行refresh的操作 23 | 24 | 25 | 26 | 更新的数据,别的县城关只要进入代码块,就一定可以读到的 27 | 28 | 29 | 30 | 有序性,synchronized关键字,他会通过加各种各样的内存屏障,来保证说,解决LoadLoad、StoreStore等等重排序 31 | -------------------------------------------------------------------------------- /docs/03/78.md: -------------------------------------------------------------------------------- 1 | # 77、synchronized锁同时对原子性、可见性以及有序性的保证 2 | 原子性、可见性、有序性,三块东西,都重新从比较细节和底层的层面,都在硬件的级别去给大家说了一下,到底是怎么回事,为什么会发生这个问题,从底层的层面来说了一下,以及大体上有没有什么办法可以来解决这些问题 3 | 4 | 5 | 6 | 原子性,基本的赋值写操作都是可以保证原子性的,复杂的操作是无法保证原子性的 7 | 8 | 可见性,MESI协议、flush、refresh,配合起来,才可以解决可见性 9 | 10 | 有序性,三个层次,最后一个层次有4种重排(LoadLoad、StoreStore、LoadStore、StoreLoad) 11 | 12 | 13 | 14 | synchronized关键字,同时可以保证原子性、可见性以及有序性的 15 | 16 | 17 | 18 | 原子性的层面而言,他加了以后,有一个加锁和释放锁的机制,加锁了之后,同一段代码就只有他可以执行了 19 | 20 | 21 | 22 | 可见性,可以保证可见性的,他会通过加入一些内存屏障,他在同步代码块对变量做的写操作,都会在释放锁的时候,全部强制执行flush操作,在进入同步代码块的时候,对变量的读操作,全部会强制执行refresh的操作 23 | 24 | 25 | 26 | 更新的数据,别的县城关只要进入代码块,就一定可以读到的 27 | 28 | 29 | 30 | 有序性,synchronized关键字,他会通过加各种各样的内存屏障,来保证说,解决LoadLoad、StoreStore等等重排序 31 | -------------------------------------------------------------------------------- /docs/c2c/10.md: -------------------------------------------------------------------------------- 1 | # 10_为什么微服务化的系统架构必须要有注册中心? 2 | 3 | 《10_为什么微服务化的系统架构必须要有注册中心?》 4 | 5 | 理解起来,偏向于真实实战场景一些,讲起来也不会那么的纯理论,大家听起来也没那么的枯燥,http接口,更多的情况下,可以对外暴露的仅仅是一个MQ的入口,其实这种系统在开发的真实过程中,一般来说架构技术选型 6 | 7 | 如果为了要让社会化治理的系统,跟其他的系统进行解耦 8 | 9 | 开的口子最好是MQ,其他系统只能看到这个MQ,提交举报消息到MQ去,举报服务可以消费MQ里的人家提交的举报 10 | 11 | 对MQ技术稍微有一点了解的话,kafka,rocketmq,rabbitmq,消费的时候,都是可以让举报服务部署多台服务器来消费的,topic -> partition,多个partition分区,就可以让举报服务部署多台服务器并行的消费举报任务 12 | 13 | 分布式系统的spring cloud技术没有基本的了解,互联网Java工程师面试突击第二季,分布式篇,我对spring cloud技术体系有一个较为深入的讲解,spring cloud netflix技术栈,rpc框架是feign,是基于http协议 14 | 15 | 发送过去的就是一个http请求,人家返回给你的也是一个http响应 16 | 17 | 假设你要是基于dubbo,13.56.2.308: 7890,直接基于TCP跟那台服务器的指定端口建立一个TCP长连接,短连接,可以基于一定自定义协议去制定数据如何组装,基于序列化的协议,把你的请求数据序列化成二进制数据流发送过去,就是一个请求 18 | -------------------------------------------------------------------------------- /docs/distributed-system/highly-concurrent-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 分段加锁 3 | 4 | 有好多同学出去面试,聊到分布式锁这块,都被人考察分布式锁能不能抗高并发的问题了 5 | 6 | 对某个商品下单,对一个分布式锁每秒突然有上万请求过来,都要进行加锁,此时怎么办呢?可能就会导致你 7 | 8 | 9 | 10 | 比如你的苹果库存有10000个,此时你在数据库中创建10个库存字段 11 | 12 | 一个表里有10个库存字段,stock_01,stock_02,每个库存字段里放1000个库存 13 | 14 | 此时这个库存的分布式锁,对应10个key,product_1_stock_01,product_1_stock_02 15 | 16 | 请求过来之后,你从10个key随机选择一个key,去加锁就可以了,每秒过来1万个请求,此时他们会对10个库存分段key加锁,每个key就1000个请求,每台服务器就1000个请求而已 17 | 18 | 19 | 万一说某个库存分段仅仅剩余10个库存了,此时我下订单要买20个苹果,合并扣减库存,你对product_1_stock_5,加锁了,此时查询对应的数据库中的库存,此时库存是10个,不够买20个苹果 20 | 21 | 你可以尝试去锁product_1_stock_1,再查询他的库存可能有30个 22 | 23 | 此时你就可以下订单,锁定库存的时候,就对product_1_stock_5锁定10个库存,对product_1_stock1锁定10个库存,锁定了20个库存 24 | 25 | 26 | 分段加锁 + 合并扣减 27 | -------------------------------------------------------------------------------- /docs/03/100.md: -------------------------------------------------------------------------------- 1 | # 100、再来看看基于DNS Query Flood和HTTP Flood的DDoS攻击 2 | 3 | ![SYN_Flood模式的DDos攻击原理](images/100/01.png) 4 | 5 | 这个DNS Query Flood攻击,顾名思义,就是去攻击DNS服务器,也就是伪造大量的域名解析请求发送给DNS服务器,然后DNS服务器必然没有,接着必然会去找上级DNS服务器,一直到根域名服务器 6 | 7 | 8 | 9 | 这么搞必然导致DNS服务器的资源别耗尽,其他正常人浏览网页也要解析域名的,此时就没法访问DNS服务器了 10 | 11 | 12 | 13 | 13.68.131.42 14 | 15 | 16 | 17 | cc攻击,HTTP flood,其实就是之前说过的那种,直接就是在互联网上找到大量的HTTP代理,说白了,其实本身就有很多公司提供HTTP代理服务,自己搜一下就知道了,就是有很多代理服务器,你可以控制那些HTTP代理服务器去给目标服务器发送大量的HTTP请求 18 | 19 | 20 | 21 | 然后目标服务器直接肯定就挂了 22 | 23 | 24 | 25 | Nginx、Tomcat、Jetty,机器上都是会部署Web服务器,都是一个进程,启动多个线程,来并发的处理各种HTTP请求 26 | 27 | 28 | 29 | 控制大量的肉鸡,控制大量的HTTP代理,TCP SYN Flood、DNS Query Flood、HTTP Flood,搞瘫痪你的服务器,或者DNS服务器,DDoS攻击,利用大量的机器进行分布式的海量请求发送,你的网站的服务不可用 30 | -------------------------------------------------------------------------------- /docs/03/70.md: -------------------------------------------------------------------------------- 1 | # 70、到底有哪些操作在Java规范中是不保证原子性的呢? 2 | 3 | 所有变量的简单赋值写操作,java语言规范原生给你保证原子性的;32位java虚拟机里的long/double是不保证赋值写的原子性的;volatile可以解决这个问题;不保证原子性的一些操作呢? 4 | 5 | i++ 6 | 7 | i = y + 1 8 | 9 | i = x * y ==> 先把x和y分别从主内存里加载到工作内存里面来,然后再从工作内存里加载出来执行计算(处理器),计算后的结果写回到工作内存里去,最后还要从工作内存里把i的最新的值刷回主内存 10 | 11 | 12 | 13 | CAS,AtomicInteger => compareAndSet 14 | 15 | 16 | 你敢说他是原子的? 17 | 18 | 19 | ```text 20 | volatile x = 1; 21 | 22 | volatile y = 2; 23 | 24 | volatile i = x * y; 25 | ``` 26 | 27 | 28 | 我之前给大家已经说过了,画图都演示过了 29 | 30 | ```text 31 | FSDirectory dir = ... 32 | 33 | synchronized(dir) { 34 | 35 | dir.add(); 36 | 37 | dir.remove(); 38 | 39 | dir.insert(); 40 | 41 | } 42 | ``` 43 | 44 | 加锁 45 | 46 | -------------------------------------------------------------------------------- /docs/03/40.md: -------------------------------------------------------------------------------- 1 | # 40、说说老年代的垃圾回收算法?常用的垃圾回收器都有什么? 2 | 3 | 老年代对象越来越多,是不是会发现说,老年代的内存空间也会满的,可以不可以使用类似年轻代的复制算法,不合适的,因为老年代里的对象,很多都是被长期引用的,spring容器管理的各种bean 4 | 5 | 6 | 7 | 长期存活的对象是比较多的,可能甚至有几百MB 8 | 9 | 10 | 11 | 对老年代而言,他里面垃圾对象可能是没有那么多的,标记-清理,找出来那些垃圾对象,然后直接把垃圾对象在老年代里清理掉,标记-整理,把老年代里的存活对象标记出来,移动到一起,存活对象压缩到一片内存空间里去 12 | 13 | 14 | 15 | 剩余的空间都是垃圾对象整个给清理掉,剩余的都是连续的可用的内存空间,解决了内存碎片的一个问题 16 | 17 | 18 | 19 | parnew+cms的组合,g1直接分代回收,新版本,慢慢的就是主推g1垃圾回收器了,以后会淘汰掉parnew+cms的组合,jdk 8~jdk 9比较居多一些,parnew+cms的组合比较多一些,是这么一个情况 20 | 21 | 22 | 23 | 分成好几个阶段,初始标记,并发标记,并发清理,等等,老年代垃圾回收是比较慢的,一般起码比年轻代垃圾回收慢个10倍以上,cms的垃圾回收算法,刚开始用标记-清理,标记出来垃圾对象,清理掉一些垃圾对象,整理,把一些存活的对象压缩到一起,避免内存碎片的产生 24 | 25 | 26 | 27 | 执行一个比较慢的垃圾回收,还要stop the world,需要100mb,此时就会让系统停顿100ms,不能处理任何请求,尽可能的让垃圾回收和工作线程的运行,并发着来执行 28 | 29 | -------------------------------------------------------------------------------- /docs/c2c/39.md: -------------------------------------------------------------------------------- 1 | #《39_Sentinel、Hystrix等技术的选型对比》 2 | 3 | 4 | Spring Cloud Netflix,Hystrix这个项目,功能层面还是挺好用的,但是他的源码写的特别的烂,运用了特别奇怪的代码方式,源码,架构班,sprin cloud netflix源码剖析的课程里面,我深入分析过hystrix的源码的 5 | 6 | Spring Cloud Alibaba,Sentinel这个项目 7 | 8 | https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D 9 | 10 | 雪崩、隔离、熔断、降级、限流 11 | 12 | 13 | Tomcat收到的每一个HTTP请求,都会交给一个独立的工作线程去处理,独立的工作线程一般可以配置为100~500之间的数量,看的是你的CPU有几个核,支持的线程数量就越多,4核,线程数量在200~300之间 14 | 15 | 16 | spring mvc、struts2这样的mvc框架,框架一般会把自己的servlet/filter配置在tomcat里面,tomcat就会把http请求交给mvc框架的servlet/filter,mvc框架就开始执行,处理请求 17 | 18 | 19 | mvc框架往往会扫描到你加了@Controller注解的类,扫描你里面的@Mapping注解,看看这个请求的URL路径格式和@Mapping注解里的指定的URL格式来做一个匹配,会把请求交给你的类里面的方法来处理 20 | 21 | 22 | 23 | 微服务之间调用的一个线程模型了解清楚,任何请求在分布式系统里执行,每个服务里都有一个线程会去处理这个请求 24 | 25 | -------------------------------------------------------------------------------- /docs/03/43.md: -------------------------------------------------------------------------------- 1 | # 43、你知道发生OOM之后,应该如何排查和处理线上系统的OOM问题? 2 | 狸猫技术窝公众号里的救火队队长的《从0开始带你成为jvm实战高手》 3 | 4 | 5 | 6 | oom可能发生在哪几个区域,解决的一个思路,在jvm里可以设置几个参数,如果一旦jvm发生了oom之后,就会导出一份内存快照,就会有当时的线上内存里的对象的一个情况,可以用MAT这样的工具,可以去分析 7 | 8 | 9 | 10 | 无非就是找出来当时的时候占用内存最大的对象都是谁,找出来那些对象是在代码中哪些地方创建出来的,一般来说就是可能会对内存去做一个调优 11 | 12 | 13 | 14 | 还是得去参考jvm专栏里的大量的案例背景,从业务背景出发,一步步去说明,在什么样的业务背景之下,为什么会产生oom的问题呢?必然会导致系统可能就是崩溃了,客服会反馈说,XX功能不能用了,说某个系统崩溃了 15 | 16 | 17 | 18 | 找他自动导出的内存快照,分析,XX对象,直接去定位代码,修改代码 19 | 20 | 21 | 22 | 你一定要把案例的业务、背景和思想给吸收了,就得融入到自己的业务里去,我负责的业务系统,在什么样的情况下,可能说会出现一大批的对象卡在内存里,无法回收,导致我系统没法放更多的对象了 23 | 24 | 25 | 26 | 产生OOM,内存泄漏的问题,少数场景在互联网公司,超高并发下的oom问题,瞬时大量存活对象占据内存, 导致没法创建更多的对象了 27 | 28 | 29 | 30 | 你也得去思考,甚至去模拟一下,最好可以模拟出来,oom不是你自己的代码,可能是你依赖的第三方的组件,netty导致的,结合自己的项目去一步一步的分析,oom问题的产生,和解决的过程 -------------------------------------------------------------------------------- /docs/c2c/12.md: -------------------------------------------------------------------------------- 1 | # 《12_SpringCloudAlibaba之Nacos注册中心架构原理》 2 | 3 | ![Nacos架构原理](images/12/Nacos架构原理.png) 4 | 5 | 偏向于底层的一些网络知识的话,基础知识,互联网Java工程师面试突击第三季,主要就是讲解一些基础知识,网络的东西,TCP,HTTP,长连接和短连接,这些基础概念在里面都是讲过的 6 | 7 | 服务通过nacos server内部的open api进行服务注册,nacos server内部有一个sevice服务的概念,里面有多个instance实例的概念,同时对不同的service服务可以划归到不同的namespace命名空间下去 8 | 9 | namespace可以是一个技术团队,比如说一个技术团队,业务A的技术团队所有的服务都放在一个namespace命名空间下面,业务B的技术团队所有的服务都放在另外一个namespace命名空间 10 | 11 | 其实说白了,注册的时候就是在注册表里维护好每个服务的每个实例的服务器地址,包括ip地址和端口号,这是最为关键的 12 | 13 | 而且一旦注册成功之后,服务就会跟nacos server进行定时的心跳,保持心跳是很关键的,nacos server会定时检查服务各个实例的心跳,如果一定时间没心跳,就认为这个服务实例宕机了,就从注册表里摘除了 14 | 15 | 其他服务会从nacos server通过open api查询要调用的服务实例列表,而且nacos客户端会启动一个定时任务,每隔10s就重新拉取一次服务实例列表,这样如果调用的服务有上线或者下线,就能很快感知到了 16 | 17 | 此外还可以对要调用的服务进行监听,如果有异常变动会由nacos server反向通知他 18 | -------------------------------------------------------------------------------- /docs/c2c/34.md: -------------------------------------------------------------------------------- 1 | #《34_对分布式事务方案SeataServer进行部署》 2 | 3 | http://seata.io/zh-cn/blog/download.html 4 | 5 | 在seata官网下载,下载1.0.0版本的安装 包就行了,就那个binary的, seata-server-1.0.0.zip,然后scp上传到机器上去,yum -y install unzip,然后unzip命令解压缩 6 | 7 | seata server要存储很多数据,两种模式,一个是file,一个是db,建议用file,因为db的性能有点差,默认就是file模式的:sh seata-server.sh -p 8901 -h 192.168.31.155 -m file,如果要用db模式,参考官网,还得先建一大堆的表 8 | 9 | 这边给大家讲一下registry.conf是什么,就是seata server可以集成注册中心,可以让你seata server注册到比如nacos去,作为一个服务,然后你各个服务就不用手动配置seata server地址了,直接发现就可以了,不过不用这个手动配置其实也行 10 | 11 | file.conf,是seata server的配置信息,撸一遍就行了,他还可以支持集成nacos配置中心,把配置放到nacos里去,然后seata server自动加载配置,一般你不用也可以 12 | 13 | 但是正常启动,会要求1GB内存,那肯定是不够的,需要修改启动文件里的内存分配,调整好了就可以启动了 14 | 15 | nohup sh seata-server.sh -p 8901 -h 192.168.31.155 -m file > /dev/null 2>&1 & 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /docs/c2c/40.md: -------------------------------------------------------------------------------- 1 | 2 | #《40_SpringCloudAlibaba之Sentinel限流熔断框架》 3 | 4 | 5 | Spring Cloud Netflix,Hystrix这个项目,功能层面还是挺好用的,但是他的源码写的特别的烂,运用了特别奇怪的代码方式,源码,架构班,sprin cloud netflix源码剖析的课程里面,我深入分析过hystrix的源码的 6 | 7 | Spring Cloud Alibaba,Sentinel这个项目 8 | 9 | https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D 10 | 11 | 雪崩、隔离、熔断、降级、限流 12 | 13 | 14 | Tomcat收到的每一个HTTP请求,都会交给一个独立的工作线程去处理,独立的工作线程一般可以配置为100~500之间的数量,看的是你的CPU有几个核,支持的线程数量就越多,4核,线程数量在200~300之间 15 | 16 | 17 | spring mvc、struts2这样的mvc框架,框架一般会把自己的servlet/filter配置在tomcat里面,tomcat就会把http请求交给mvc框架的servlet/filter,mvc框架就开始执行,处理请求 18 | 19 | 20 | mvc框架往往会扫描到你加了@Controller注解的类,扫描你里面的@Mapping注解,看看这个请求的URL路径格式和@Mapping注解里的指定的URL格式来做一个匹配,会把请求交给你的类里面的方法来处理 21 | 22 | 23 | 24 | 微服务之间调用的一个线程模型了解清楚,任何请求在分布式系统里执行,每个服务里都有一个线程会去处理这个请求 25 | 26 | -------------------------------------------------------------------------------- /docs/03/111.md: -------------------------------------------------------------------------------- 1 | # 111、对分布式系统进行核心链路追踪的时候,链路id是怎么管理的? 2 | 3 | ![链路id管理](images/111/01.png) 4 | 5 | 每一个请求入口,traceid,每一次服务调用,spanid,上游服务id,parenetid,调用时间,timestamp,有正向的,还有反向的,把请求发出,请求接收,业务处理,各种时间都记录下来,计算网络耗时和业务处理耗时 6 | 7 | 8 | 9 | 底层的服务框架,接收到每一层请求调用的时候都要交给链路追踪系统的客户端框架来处理一下,traceid,代表了一次请求 10 | 11 | 12 | 13 | 链路追踪数据: 14 | 15 | 16 | 17 | traceid=1,spanid=1,parentid=0,received_timestamp=12:00:00 300,send_timestamp=12:00:00 302 18 | 19 | 20 | 21 | traceid=1,spanid=2,parentid=1,received_timestamp=12:00:00 303,send_timestamp=12:00:00 305 22 | 23 | 24 | 25 | traceid=1,spanid=3,parentid=2,received_timestamp=12:00:00 306 26 | 27 | 28 | 29 | traceid=1,spanid=3,parentid=2,send_timestamp=12:00:05 502 30 | 31 | 32 | 33 | traceid=1,spanid=2,parentid=1,received_timestamp=12:00:05 503 34 | -------------------------------------------------------------------------------- /docs/03/98.md: -------------------------------------------------------------------------------- 1 | # 98、让所有工程师闻声色变的DDoS攻击到底是什么东西? 2 | 3 | ![DDos攻击原理](images/98/01.png) 4 | 5 | DDoS,distributed denial of service,分布式拒绝服务攻击,最可怕的黑客攻击,可以把你的网站、APP、系统给搞瘫痪了 6 | 7 | 8 | 9 | DoS攻击,就是说黑客知道你的服务器地址了,然后你的系统假设每秒就抗下1000请求,黑客就以每秒1000请求访问你,你的服务器线程资源全部打满,正常用户根本无法发送请求,你的网站就宕机了 10 | 11 | 12 | 13 | 甚至他以每秒1万请求攻击你的服务器呢,那就的系统机器就挂了 14 | 15 | 16 | 17 | DoS攻击是一对一的,就是黑客搞一台高性能服务器,拼命发送请求给你的一台服务器,但是如果你的服务器配置超高,每秒抗1万请求,结果黑客的机器每秒才5000请求,那么就没用了 18 | 19 | 20 | 21 | DDoS的意思就是黑客控制大量的机器,比如普通人的电脑,或者是一些公司的服务器,被他的一些木马植入给控制了,就是所谓的“肉鸡”,然后黑客下达指令,让所有肉鸡一起发送请求给攻击目标,直接搞瘫你的服务器 22 | 23 | 24 | 25 | 如何防御DDoS攻击?自己其实挺难的,这其实是非常专业的一种攻击手段,通常我们可以采购云厂商的安全服务,比如DDoS高防IP,可以把攻击流量都导入到云厂商的高防IP的服务器上去,他们有专业的技术方案和算法来防御 26 | 27 | 28 | 29 | 明天继续讲,DDos的几种攻击方式,利用TCP三次握手的SYN Flood攻击,利用DNS查询的DNS Query Flood攻击,利用HTTP发起的CC攻击 30 | -------------------------------------------------------------------------------- /docs/03/99.md: -------------------------------------------------------------------------------- 1 | # 99、基于SYN Flood模式的DDoS攻击,背后的原理是什么呢? 2 | 3 | ![SYN_Flood模式的DDos攻击原理](images/99/01.png) 4 | 5 | TCP三次握手 6 | 7 | 1、客户端发送一个SYN请求,指明客户端的端口号以及TCP连接的初始序列号 8 | 9 | 2、的服务器收到SYN后,返回一个SYN+ACK,表示请求被接收,TCP序列号加1 10 | 11 | 3、客户端收到服务器的SYN+ACK后,返回一个ACK给服务器,TCP序列号加1,连接建立完毕,接着可以通信了 12 | 13 | 14 | 15 | 如果服务器没有收到第三步的ACK,会重试返回SYN+ACK给客户端,同时处于SYN_RECV状态,把客户端放入等待列表。重试会3~5次,每隔30重试一次,遍历等待列表,再次重试发送SYN+ACK 16 | 17 | 18 | 19 | 只要返回SYN+ACK给客户端,就会为客户端预留一部分资源,重试期间都保留,等待跟客户端建立连接;所以如果说太多的客户端来建立连接,资源耗尽,那么就无法建立新的TCP连接了 20 | 21 | 22 | 23 | 所以黑客就会伪造大量的不同ip地址去发送SYN请求给一台服务器建立TCP连接,每次都是卡在服务器返回SYN+ACK,但是黑客是不会最终返回ACK的,所以导致服务器可能为了黑客建立了大量的半连接放在等待列表里,占用了大量的资源,还得不停的去重试 24 | 25 | 26 | 27 | 一旦服务器的资源耗尽,那么正常的请求过来,是无非建立TCP连接的 28 | 29 | 30 | 31 | 要知道,HTTP底层就是基于TCP实现的,一旦你无法建立TCP连接,那么这台服务器也自然接受不了任何HTTP请求 32 | -------------------------------------------------------------------------------- /docs/03/142.md: -------------------------------------------------------------------------------- 1 | # 142、HBase作为一个NoSQL数据库,有哪些架构上的特点?(下) 2 | 3 | 《HBase作为一个NoSQL数据库,有哪些架构上的特点?(下)》 4 | 5 | 6 | 7 | (1)强一致读写 8 | 9 | 10 | 11 | 他不是zk那种最终一致性,是强一致的,你写成功了立马就可以读。这个功能是极为实用的,他是依靠的分布式存储才做到的,zk那种是属于主从同步,你读follower机器是可能读到不一致数据的 12 | 13 | 14 | 15 | (2)高可用 16 | 17 | 18 | 19 | 每台机器上部署一个RegionServer,管理一大堆的region数据分片,RegionServer都是支持高可用的,一个RegionServer挂掉不会导致数据丢失,他自动可以由别的机器接管他的工作运行下去 20 | 21 | 22 | 23 | (3)支持mapreduce/spark这种分布式计算引擎 24 | 25 | 26 | 27 | 对hbase里的数据进行分布式计算,可以从hbase里分布式抽数据去计算,也可以把计算后的结果写入hbase分布式存储 28 | 29 | 30 | 31 | (4)Java API/thrift API/REST API的支持 32 | 33 | 34 | 35 | 当然支持Java API了,咱们的Java业务系统经常会有海量数据NoSQL存储的需求,此时就可以基于Java API来操作hbase里的数据了 36 | 37 | 38 | 39 | (5)支持协处理器,块缓存和布隆过滤器,可以用于优化查询性能 40 | 41 | 42 | 43 | (6)hbase现在最新版本都是支持web界面的方式来对hbase集群进行运维管理的 -------------------------------------------------------------------------------- /docs/distributed-system/java-internet-interview-outlook.md: -------------------------------------------------------------------------------- 1 | 2 | 快速扫盲,MQ、ES、Dubbo、分布式事务、分布式锁、缓存架构、高并发、高可用,各种常考的技术问题,都拎出来,重点的讲解一下 3 | 4 | 21天互联网Java工程师面试训练营(分布式篇),互联网Java工程师面试突击训练(第二季) 5 | 6 | 对第一季的分布式面试题,进一步加深了,分布式这块再抗一堆连环炮都没问题 7 | 8 | 接着对后面几季的内容,会考虑一下形式,可能会考虑把五季合并为一季,作为面试突击第三季,形式上会综合考虑是继续用视频,还是用文章形式更便于大家日常学习 9 | 10 | 微服务、海量数据、高性能、高并发、高可用,五季 11 | 12 | 互联网Java工程师面试突击训练营(第三季) 13 | 14 | 视频,路上,在公司里不方便看视频,等到回家,晚上来一局王者荣耀 15 | 16 | 文章,上下班路上,在公司里,支持在PC端可以看文章,自己写写代码,做点实验 17 | 18 | 儒猿技术窝,知识店铺,有一个文章专栏,救火队队长,《从0开始带你成为JVM实战高手》,一步一图,大白话,通俗易懂,1个多月,将近2000人买了专栏,普遍好评,非常的好,看的浅显易懂,实战型强,就知道生产环境jvm如何优化 19 | 20 | 21 | 22 | 后台观察一下购买面试训练营第二季的同学学习的进度,没时间看视频,赶进度一个过程中,学习中,第三季,那一定是观察大部分同学都得把第二季学的差不多,重磅推出第三季,加量不加价 23 | 24 | 25 | 付费微信群,里面有很多我这两年带出来的大厂的同学,滴滴、阿里、百度、美团、美菜、每日优鲜、vipkid,热火朝天聊技术问题 26 | 27 | 学习+作业+思考+复习+提问+答疑 28 | -------------------------------------------------------------------------------- /docs/03/33.md: -------------------------------------------------------------------------------- 1 | # 《33、能说说Spring中都使用了哪些设计模式吗?》 2 | 工厂,单例,代理 3 | 4 | 5 | 6 | 不可能有任何的技术深度,面试突击第二季里,我尝试着做了一些技术深度的讲解,但是我觉得还是很困难,只能稍微给你讲解一些原理 7 | 8 | 9 | 10 | Spring源码底层去看,很多种设计模式的一个运用 11 | 12 | 13 | 14 | 工厂模式,单例模式,代理模式 15 | 16 | 17 | 18 | 工厂模式,spring ioc核心的设计模式的思想提现,他自己就是一个大的工厂,把所有的bean实例都给放在了spring容器里(大工厂),如果你要使用bean,就找spring容器就可以了,你自己不用创建对象了 19 | 20 | 21 | 22 | ![工厂模式](images/33/01.png) 23 | 24 | 25 | 26 | spring默认来说,对每个bean走的都是一个单例模式,确保说你的一个类在系统运行期间只有一个实例对象,只有一个bean,用到了一个单例模式的思想,保证了每个bean都是单例的 27 | 28 | 29 | 30 | ![单例模式](images/33/02.png) 31 | 32 | 33 | 34 | 稍微还算是有点含金量的 35 | 36 | 37 | 38 | 如果说你要对一些类的方法切入一些增强的代码,会创建一些动态代理的对象,让你对那些目标对象的访问,先经过动态代理对象,动态代理对象先做一些增强的代码,调用你的目标对象 39 | 40 | 41 | 42 | 在设计模式里,就是一个代理模式的体现和运用,让动态代理的对象,去代理了你的目标对象,在这个过程中做一些增强的访问,你可以把面试突击的内容作为一个抛砖引玉的作用,去更加深入的学习一些技术 -------------------------------------------------------------------------------- /docs/distributed-system/dubbo-augmentability.md: -------------------------------------------------------------------------------- 1 | 两点,第一点,是核心的组件全部接口化,组件和组件之间的调用,必须全部是依托于接口,去动态找配置的实现类,如果没有配置就用他自己默认的 2 | 3 | 第二点,提供一种自己实现的组件的配置的方式,比如说你要是自己实现了某个组件,配置一下,人家到时候运行的时候直接找你配置的那个组件即可,作为实现类,不用自己默认的组件了 4 | 5 | 6 | 7 | 8 | **我们的课程每天都会有一个作业,引导大家把学习到的项目经验、技术方案和生产优化落地到自己负责的项目中去,让大家出去面试的时候,可以把各种技术结合自己的项目来回答面试官的各种深度拷问** 9 | 10 | **大家不要小看这个,根据我多年的面试经验来看,拥有这个技能的人凤毛麟角,这种人出去绝对是各大公司争抢的对象。** 11 | 12 | **所以希望大家好好完成每天的作业,我布置的大量作业,就是为了帮你锻造出这种能力** 13 | 14 | **学习课程以及完成作业的过程中,大家一定会有很多的问题,可以到专栏的评论区去提问** 15 | 16 | **每天我都会和之前带出来的一批阿里、蚂蚁金服、滴滴的优秀同学给大家进行答疑,并且我们还有专门的付费用户的微信群,大家可以在微信群里跟我们一起进行技术交流** 17 | 18 | **如果你能坚持下来,学满6季,还可以获取私人定制的面试一条龙VIP服务** 19 | 20 | **如果是连续6季面试训练营都购买的同学,还可以获取面试一条龙VIP服务** 21 | 22 | **具体信息大家看“儒猿技术窝”公众号的知识店铺内的训练营详情即可** 23 | 24 | **具体可参见训练营目录下的《训练营专属服务》文档。简单来说,这个私人定制的面试VIP服务,会为你的跳槽面试全程保驾护航** 25 | 26 | -------------------------------------------------------------------------------- /docs/c2c/05.md: -------------------------------------------------------------------------------- 1 | 2 | 《05_C2C电商社会化治理平台项目介绍》 3 | 4 | 接下来会以一个真实的项目案例来讲解整个微服务技术架构的落地实践,会以一个C2C二手电商平台的社会化治理系统来讲解,因为虽然微服务技术栈跟具体的业务没关系,其实无论什么业务系统,都可以用一套微服务技术体系,但是如果单纯的讲解技术理论,通过一些没任何含义的demo代码来演示,可能很多人没法很好的理解技术和自己项目的关系 5 | 6 | 所谓的C2C二手电商平台,就是用户可以在上面作为卖家发布自己的二手商品,然后等待买家来谈,来购买,平台就是作为中间服务方提供一些列的平台功能支持,其实国内大的二手交易平台还是有几个的,同时还有好一些专注于垂直领域的二手电商交易平台,比如说二手奢侈品电商,二手电子产品电商 7 | 8 | C2C二手交易电商平台 9 | 10 | 留一个小作业和小任务:希望大家可以自己去体验一下各种二手电商平台的界面,看看他里面都有什么,怎么玩儿的,体验一下 11 | 12 | 用户是买家也是卖家,但是会有一个问题,可能卖家会上传违规商品,买家和卖家进行留言互动可能会进行一些人身攻击之类的违规行为,所以本质上这个电商平台从卖家到买家,都是用户,那怎么进行社会化的治理呢? 13 | 14 | 如果是平台方建立规模庞大的审核团队,那么可能会导致每一件商品以及发表的评论都需要进行预审,预审通过了平台才会给你显示出来,但是要知道一个问题,大型的C2C二手电商平台,可能里面日活用户达到数百万,甚至上千万,每天发表的评论可能也多达上千万,如果全部由自建的预审团队一条一条审核,那这个人力成本是无法接受的 15 | 16 | 这就需要有一个专门的社会化治理平台 17 | 18 | 通过一个平台,以技术的手段,将有人举报违规的内容推送给部分用户,让用户参与到平台治理中来,用户投票决定某个商品或者评论等内容是否违规,这样平台仅仅作为一个桥梁,让用户进行社会化自治 -------------------------------------------------------------------------------- /docs/03/22.md: -------------------------------------------------------------------------------- 1 | # 22、你知道Java内存模型中的原子性、有序性、可见性是什么吗? 2 | 连环炮:Java内存模型 -> 原子性、可见性、有序性 -> volatile -> happens-before / 内存屏障 3 | 4 | 5 | 6 | 也就是并发编程过程中,可能会产生的三类问题 7 | 8 | 9 | 10 | (1)可见性 11 | 12 | 13 | 14 | 之前一直给大家代码演示,画图演示,其实说的就是并发编程中可见性问题 15 | 16 | 17 | 18 | 没有可见性,有可见性 19 | 20 | ![可见性](images/22/01.png) 21 | 22 | 23 | 24 | 25 | 26 | (2)原子性 27 | 28 | 29 | 30 | 有原子性,没有原子性 31 | 32 | 33 | 34 | 原子性:data++,必须是独立执行的,没有人影响我的,一定是我自己执行成功之后,别人才能来进行下一次data++的执行 35 | 36 | 37 | 38 | (3)有序性 39 | 40 | 41 | 42 | 对于代码,同时还有一个问题是指令重排序,编译器和指令器,有的时候为了提高代码执行效率,会将指令重排序,就是说比如下面的代码 43 | 44 | 45 | 46 | 具备有序性,不会发生指令重排导致我们的代码异常;不具备有序性,可能会发生一些指令重排,导致代码可能会出现一些问题 47 | 48 | 49 | 50 | ![有序性](images/22/02.png) 51 | 52 | 53 | 54 | 重排序之后,让flag = true先执行了,会导致线程2直接跳过while等待,执行某段代码,结果prepare()方法还没执行,资源还没准备好呢,此时就会导致代码逻辑出现异常。 55 | 56 | -------------------------------------------------------------------------------- /docs/03/135.md: -------------------------------------------------------------------------------- 1 | # 135、一清二楚:再次回头对ZooKeeper特性的总结 2 | 核心原理,比kafka、hdfs、hbase之类的要简单很多,最最底层的技术,很多人都依赖他 3 | 4 | 5 | 6 | 《020_一清二楚:再次回头对ZooKeeper特性的总结》 7 | 8 | 9 | 10 | 集群模式部署 11 | 12 | 13 | 14 | 一般奇数节点,因为你5台机器可以挂2台,6台机器也是挂2台,不能超过一半的机器挂掉,所以5台和6台效果一致,那奇数节点可以减少机器开销,小集群部署,读多写少 15 | 16 | 17 | 18 | 主从架构:Leader、Follower、Observer(一般刚开始没必要用) 19 | 20 | 21 | 22 | 内存数据模型:znode,多种节点类型 23 | 24 | 25 | 26 | 客户端跟zk进行长连接,TCP,心跳,维持session 27 | 28 | 29 | 30 | zxid,高32位,低32位 31 | 32 | 33 | 34 | ZAB协议,2PC,过半ack + 磁盘日志写,commit + 写内存数据结构 35 | 36 | 37 | 38 | 支持Watcher机制,监听回调通知 39 | 40 | 41 | 42 | 顺序一致性:消息按顺序同步,但是最终才会一致,不是强一致 43 | 44 | 45 | 46 | 高性能,2PC中的过半写机制,纯内存的数据结构,znode 47 | 48 | 49 | 50 | 高可用,follower宕机没影响,leader宕机有数据不一致问题,新选举的leader会自动处理,正常运行,但是在恢复模式期间,可能有一小段时间是没法写入zk的 51 | 52 | 53 | 54 | 高并发,单机leader写,Observer可以线性扩展读QPS 55 | -------------------------------------------------------------------------------- /docs/03/104.md: -------------------------------------------------------------------------------- 1 | # 104、能说说你对堆外内存的理解吗?堆外内存的优势在哪里? 2 | 3 | ![堆外内存](images/104/01.png) 4 | 5 | 堆内和堆外的概念:堆内内存,heap,off-heap 6 | 7 | 8 | 9 | 硬件层面的内存,其实就是一根内存条而已,自己去购买内存条,在笔记本电脑里是可以装更多的内存条的,习惯于用32GB内存的笔记本电脑,买16GB内存,装在里面 10 | 11 | 12 | 13 | 如何用堆外内存? 14 | 15 | 16 | 17 | ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 传入的是你要申请的堆外内存的大小 18 | 19 | // 你可以直接把你的数据写入到内外内存DirectByteBuffer里去 20 | 21 | // 把这块数据通过Socket发送,就是直接发送就可以了,不需要走一个拷贝 22 | 23 | 24 | 25 | 堆外内存的优势?堆内的数据,要网络IO写出去,要先拷贝到堆外内存,再写入到socket里发送出去;如果直接数据分配在堆外内存,是不需要有一次额外的拷贝的,性能是比较高的 26 | 27 | 28 | 29 | 读写文件也是同理的,都可以节约数据拷贝次数 30 | 31 | 32 | 33 | 1、如果堆外内存足够,就直接预留一部分内存 34 | 35 | 2、如果堆外内存不足,则将已经被 JVM 垃圾回收的 DirectBuffer 对象的堆外内存释放 36 | 37 | 3、如果进行一次堆外内存资源回收后,还不够进行本次堆外内存分配的话,则进行 System.gc() 38 | 39 | 4、如果 9 次尝试后依旧没有足够的可用堆外内存,则抛异常。 40 | 41 | 42 | 43 | -XX:MaxDirectMemorySize 44 | -------------------------------------------------------------------------------- /docs/03/146.md: -------------------------------------------------------------------------------- 1 | # 146、HBase的物理存储格式:为啥说他是列式存储? 2 | 3 | 《008_HBase的物理存储格式:为啥说他是列式存储?》 4 | 5 | 6 | 7 | rowkey order:base order:detail order:extent 8 | 9 | order_1_110 xxx(t3) xxx(t4) 10 | 11 | order_1_111 x1(t1); x2(t2) xxx(t5) xxx(t6) 12 | 13 | 14 | 15 | hbase,列式存储的一个系统,他不是说按一行一行的格式来进行存储的,按列来进行存储的 16 | 17 | 18 | 19 | rowkey timestamp 列 值 20 | 21 | order_1_110 t3 order:base xxx 22 | 23 | order_1_110 t4 order:detail xxx 24 | 25 | order_1_111 t1 order:base x1 26 | 27 | order_1_111 t2 order:base x2 28 | 29 | order_1_111 t5 order:detail xxx 30 | 31 | order_1_111 t6 order:extent xxx -------------------------------------------------------------------------------- /docs/03/151.md: -------------------------------------------------------------------------------- 1 | # 151、关于重复点赞问题以及点赞查看时效性的方案设计 2 | 3 | 4 | 5 | 我看到了你的朋友圈,此时我就可以对你的朋友圈去进行一个点赞,也可以取消点赞,假设要设计成支撑高并发的点赞系统,应该如何设计? 6 | 7 | 8 | 9 | 朋友圈的点赞和评论,是独立的数据,其实比如点赞,都是可以基于redis来做的,每个朋友圈里对应一个set数据结构,里面放谁给你点赞了,这样每条朋友圈的点赞人和点赞数量直接从redis出就可以了,smembers和scard 10 | 11 | 12 | 13 | 假设通过数据库的表来存放点赞的数据,此时可以通过联合唯一键来保证幂等性,用户id+朋友圈id是一个联合唯一索引,就可以确保一个人对一条朋友圈只能点赞一次,如果通过redis里的set来实现,set本身就是可以去重的,你多次把一个人放到一条朋友圈的set里去,是不会重复的 14 | 15 | 16 | 17 | 评论也是可以存表里的,都是以朋友圈为粒度来存储 18 | 19 | 20 | 21 | 那么刷朋友圈的时候,比如说你好友和你,另外一个好友都是好友,此时你好友刷到了你的朋友圈,就可以把另外一个好友对你的点赞和评论都拉出来,展示在客户端下面就可以了,这个展示过程可以是动态的 22 | 23 | 24 | 25 | 你是王五,你的朋友圈被张三点赞了,李四跟你们也是好朋友,此时李四刷朋友圈看到了王五发的这条朋友圈,此时你可以在后台,对这条朋友圈的set用张三做一个sismember操作,就是判断一下你们俩的所有共同好友,有哪些人对这条朋友圈点赞了 26 | 27 | 28 | 29 | 此时就可以看出来这条朋友圈被你们的共同好友多少人点赞了,哪些人点赞了 30 | 31 | 32 | 33 | 比如你另外一个好友是否对这条朋友圈点赞了,直接sismember就可以判断出来,这样整个你基于redis,他都是非常高性能的 -------------------------------------------------------------------------------- /docs/03/140.md: -------------------------------------------------------------------------------- 1 | # 140、到底为什么把 HBase 叫做NoSQL数据库呢? 2 | 3 | 《002_到底为什么把HBase叫做NoSQL数据库呢?》 4 | 5 | 6 | 7 | hdfs可以解决我们的一些问题,超大数据集的分布式存储,hbase作为hadoop nosql database,来解决海量数据的增删改查的问题 8 | 9 | 10 | 11 | 到底什么是nosql,跟sql相对应 12 | 13 | 14 | 15 | hbase主要是就是能够帮助你对海量数据进行增删改查,跟sql是相反的,关系型数据库,mysql/oracle,一般来说都是基于SQL语法让你实现复杂的一些SQL语句,还可以支持事务,主要是开发业务系统的 16 | 17 | 18 | 19 | 比如说你有一些需求,是要对10TB的数据,对他们进行相对较为简单的增删改查,比如说插入一行数据,查询一行数据,根据一些简单的条件查询某几行数据,删除一行数据,更新一行数据 20 | 21 | 22 | 23 | hbase就可以搞定,专职就是干这个的,分布式nosql数据库就可以了,他是跟关系型数据库相反的,是不支持SQL语句的,nosql,没有SQL语句的支持,没有SQL的数据库,帮你对海量数据做简单增删改查的 24 | 25 | 26 | 27 | nosql数据库,一般都是分布式的,解决海量数据的简单增删改查问题的,如果你要是针对少量数据做简单增删改查,也不需要nosql,其实你用mysql/oracle天然就可以搞定少量数据的增删改查 28 | 29 | 30 | 31 | 天生不擅长sql,所以不要强行在上面用sql,就是做一些简单的增删改查就可以了 32 | 33 | 34 | 35 | 很多场景是需要对海量数据做基础的增删改查,不需要复杂的sql语法支持,那么天然可以用hbase,海量数据可以存储,分布式的nosql支持 36 | 37 | -------------------------------------------------------------------------------- /docs/high-concurrency/how-to-ensure-high-concurrency-and-high-availability-of-redis.md: -------------------------------------------------------------------------------- 1 | ## 面试题 2 | 如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么? 3 | 4 | ## 面试官心理分析 5 | 其实问这个问题,主要是考考你,redis 单机能承载多高并发?如果单机扛不住如何扩容扛更多的并发?redis 会不会挂?既然 redis 会挂那怎么保证 redis 是高可用的? 6 | 7 | 其实针对的都是项目中你肯定要考虑的一些问题,如果你没考虑过,那确实你对生产系统中的问题思考太少。 8 | 9 | ## 面试题剖析 10 | 如果你用 redis 缓存技术的话,肯定要考虑如何用 redis 来加多台机器,保证 redis 是高并发的,还有就是如何让 redis 保证自己不是挂掉以后就直接死掉了,即 redis 高可用。 11 | 12 | 由于此节内容较多,因此,会分为两个小节进行讲解。 13 | - [redis 主从架构](/docs/high-concurrency/redis-master-slave.md) 14 | - [redis 基于哨兵实现高可用](/docs/high-concurrency/redis-sentinel.md) 15 | 16 | redis 实现**高并发**主要依靠**主从架构**,一主多从,一般来说,很多项目其实就足够了,单主用来写入数据,单机几万 QPS,多从用来查询数据,多个从实例可以提供每秒 10w 的 QPS。 17 | 18 | 如果想要在实现高并发的同时,容纳大量的数据,那么就需要 redis 集群,使用 redis 集群之后,可以提供每秒几十万的读写并发。 19 | 20 | redis 高可用,如果是做主从架构部署,那么加上哨兵就可以了,就可以实现,任何一个实例宕机,可以进行主备切换。 -------------------------------------------------------------------------------- /docs/high-concurrency/redis-production-environment.md: -------------------------------------------------------------------------------- 1 | ## 面试题 2 | 生产环境中的 redis 是怎么部署的? 3 | 4 | ## 面试官心理分析 5 | 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主从架构?集群架构?用了哪种集群方案?有没有做高可用保证?有没有开启持久化机制确保可以进行数据恢复?线上 redis 给几个 G 的内存?设置了哪些参数?压测后你们 redis 集群承载多少 QPS? 6 | 7 | 兄弟,这些你必须是门儿清的,否则你确实是没好好思考过。 8 | 9 | ## 面试题剖析 10 | redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每秒 5 万,5 台机器最多是 25 万读写请求/s。 11 | 12 | 机器是什么配置?32G 内存+ 8 核 CPU + 1T 磁盘,但是分配给 redis 进程的是10g内存,一般线上生产环境,redis 的内存尽量不要超过 10g,超过 10g 可能会有问题。 13 | 14 | 5 台机器对外提供读写,一共有 50g 内存。 15 | 16 | 因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis 从实例会自动变成主实例继续提供读写服务。 17 | 18 | 你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是 10kb。100 条数据是 1mb,10 万条数据是 1g。常驻内存的是 200 万条商品数据,占用内存是 20g,仅仅不到总内存的 50%。目前高峰期每秒就是 3500 左右的请求量。 19 | 20 | 其实大型的公司,会有基础架构的 team 负责缓存集群的运维。 -------------------------------------------------------------------------------- /docs/c2c/15.md: -------------------------------------------------------------------------------- 1 | # 《15_为什么微服务化的系统必须通过RPC框架进行通信?》 2 | 3 | 服务注册中心这个东西初步的捋顺了,你微服务架构里每个服务在任何一台机器上部署,都必须往服务注册中心去做一个注册,服务注册中心就可以维护你的每个服务部署的实例地址列表 4 | 5 | 6 | HTTP、RPC 7 | 8 | 9 | 假设如果你没有RPC的框架,此时假如说你的每个服务对外暴露的接口,都是一些HTTP接口,http://21.38.254.306:8080/xx/xx?xx=xx,其他服务如果说要调用你的这个服务,就必须使用apache的http的组件,或者是JDK自带的http组件,构建出来一个HTTP请求,包括请求路径,请求头,请求体(JSON串过去) 10 | 11 | 好不容易构建出来一个完整的HTTP请求,通过http组件发送这个HTTP请求过去,在底层也是得跟那个服务的指定机器的指定端口号,也都是建立TCP连接,在TCP连接之上,发送HTTP协议组装出来的请求过去 12 | 13 | 14 | 接收人家给你的HTTP响应,解析HTTP响应,响应头,状态码(404,500),响应体(JSON串),极为麻烦 15 | 16 | 17 | 划时代的RPC这种东西,比如说你发布一个服务,主要就是定义了一些接口 18 | ```java 19 | public interface ServcieA { 20 | 21 | public String hello(String name); 22 | 23 | } 24 | ``` 25 | 26 | 27 | 28 | 如果我要调用你的接口,此时我在代码里,不需要care什么HTTP之类的东西 29 | ```java 30 | public void service() { 31 | String result = serviceA.hello(“zhagnsan”); 32 | } 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /docs/03/96.md: -------------------------------------------------------------------------------- 1 | # 96、听说过CSRF攻击吗?你知道他背后的原理是什么吗 2 | Cross Site Request Forgery,垮站点请求伪造 3 | 4 | 5 | 6 | 这个就是黑客想办法去伪造成你这个用户去发送请求到某个系统上去,然后查询你的数据,转账交易之类的,伪装成你,也有很多办法,比如利用XSS搞一个恶意脚本让你执行,然后盗取你的浏览器里的cookie 7 | 8 | 9 | 10 | 利用你的cookie伪装成你登录的状态,然后去执行一些请求 11 | 12 | 13 | 14 | 利用XSS跨站点脚本攻击,获取cookie,然后再利用postman发送垮站点伪造请求 15 | 16 | 17 | 18 | 防御CSRF的方法主要是以下几种: 19 | 20 | (1)防止cookie被窃取:最最根本的,其实还是说防止cookie被窃取,可以给你的网站的cookie设置HttpOnly属性,禁止被别人的script脚本窃取,那么别人就无法伪造用户登录请求了 21 | 22 | 23 | 24 | (2)随机token:每次返回一个页面给你的时候,都生成一个随机token附加在页面的隐藏元素里,同时在你的redis里可以存以下,然后页面发送请求的时候附加随机token,验证通过才能执行请求,你要是自己用postman构造请求就不知道随机token是什么了 25 | 26 | 27 | 28 | (3)验证码:页面提交必须搞一个验证码,那种图形的,现在比较流行的还有拖动一个拼图什么的,必须验证码通过了才能执行你的请求,避免黑客直接伪造请求发送过来,这个其实是比较常见的,最好是在用户进行支付交易的时候,要求必须在页面上拖拽一个拼图验证码 29 | 30 | 31 | 32 | (4)Referer请求头:这个是http请求里有一个referer请求头,带有这个请求的来源,你可以验证一下这个请求是不是从自己的页面里来的,如果是的话才执行,否则就不要执行了 33 | -------------------------------------------------------------------------------- /docs/03/123.md: -------------------------------------------------------------------------------- 1 | # 123、ZooKeeper的数据模型:znode和节点类型 2 | 3 | ![ZooKeeper的数据模型:znode和节点类型](/docs/03/images/123/01.png) 4 | 5 | 核心数据模型就是znode树,平时我们往zk写数据就是创建树形结构的znode,里面可以写入值,就这数据模型,都在zk内存里存放 6 | 7 | 8 | 9 | 有两种节点,持久节点和临时节点,持久节点就是哪怕客户端断开连接,一直存在 10 | 11 | 12 | 13 | 临时节点,就是只要客户端断开连接,节点就没了 14 | 15 | 16 | 17 | 还有顺序节点,就是创建节点的时候自增加全局递增的序号 18 | 19 | 20 | 21 | 大家去看一下,之前Java架构的分布式锁里,有一个zk锁的源码分析,curator框架,zk分布式锁的实现,在里面就是基于zk的临时顺序节点来实现的,加锁的时候,是创建一个临时顺序节点 22 | 23 | 24 | 25 | zk会自动给你的临时节点加上一个后缀,全局递增的,编号 26 | 27 | 28 | 29 | 如果你客户端断开连接了,就自动销毁这个你加的锁,此时人家会感知到,就会尝试去加锁 30 | 31 | 32 | 33 | 如果你是做元数据存储,肯定是持久节点 34 | 35 | 36 | 37 | 如果你是做一些分布式协调和通知,很多时候是用临时节点,就是说,比如我创建一个临时节点,别人来监听这个节点的变化,如果我断开连接了,临时节点消失,此时人家会感知到,就会来做点别的事情 38 | 39 | 40 | 41 | 顺序节点,在分布式锁里用的比较经典 42 | 43 | 44 | 45 | 每个znode还有一个Stat用来存放数据版本,version(znode的版本),cversion(znode子节点的版本),aversion(znode的ACL权限控制版本) 46 | -------------------------------------------------------------------------------- /docs/high-concurrency/es-production-cluster.md: -------------------------------------------------------------------------------- 1 | ## 面试题 2 | es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 3 | 4 | ## 面试官心理分析 5 | 这个问题,包括后面的 redis 什么的,谈到 es、redis、mysql 分库分表等等技术,面试必问!就是你生产环境咋部署的?说白了,这个问题没啥技术含量,就是看你有没有在真正的生产环境里干过这事儿! 6 | 7 | 有些同学可能是没在生产环境中干过的,没实际去拿线上机器部署过 es 集群,也没实际玩儿过,也没往 es 集群里面导入过几千万甚至是几亿的数据量,可能你就不太清楚这里面的一些生产项目中的细节。 8 | 9 | 如果你是自己就玩儿过 demo,没碰过真实的 es 集群,那你可能此时会懵。别懵,你一定要云淡风轻的回答出来这个问题,表示你确实干过这事儿。 10 | 11 | ## 面试题剖析 12 | 其实这个问题没啥,如果你确实干过 es,那你肯定了解你们生产 es 集群的实际情况,部署了几台机器?有多少个索引?每个索引有多大数据量?每个索引给了多少个分片?你肯定知道! 13 | 14 | 但是如果你确实没干过,也别虚,我给你说一个基本的版本,你到时候就简单说一下就好了。 15 | 16 | - es 生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。 17 | - 我们 es 集群的日增量数据大概是 2000 万条,每天日增量数据大概是 500MB,每月增量数据大概是 6 亿,15G。目前系统已经运行了几个月,现在 es 集群里数据总量大概是 100G 左右。 18 | - 目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个 shard。 19 | 20 | 大概就这么说一下就行了。 -------------------------------------------------------------------------------- /docs/distributed-system/dynamic-route.md: -------------------------------------------------------------------------------- 1 | ``` 2 | CREATE TABLE `gateway_api_route` ( 3 | `id` varchar(50) NOT NULL, 4 | `path` varchar(255) NOT NULL, 5 | `service_id` varchar(50) DEFAULT NULL, 6 | `url` varchar(255) DEFAULT NULL, 7 | `retryable` tinyint(1) DEFAULT NULL, 8 | `enabled` tinyint(1) NOT NULL, 9 | `strip_prefix` int(11) DEFAULT NULL, 10 | `api_name` varchar(255) DEFAULT NULL, 11 | PRIMARY KEY (`id`) 12 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 13 | 14 | INSERT INTO gateway_api_route (id, path, service_id, retryable, strip_prefix, url, enabled) VALUES ('order-service', '/order/**', 'order-service',0,1, NULL, 1); 15 | 16 | ``` 17 | 18 | 你可以自己用简单的spring mvc+前端页面封装一个可视化的网关管理工作台,如果新开发了一个服务之后,就可以在这个界面上配置一下,说某个服务对应某个url路径,修改,增删改查 19 | 20 | http://localhost:9000/order/order/create?productId=1&userId=1&count=2&totalPrice=50 21 | 22 | 生产级,企业级的功能,网关的动态路由 23 | -------------------------------------------------------------------------------- /docs/03/42.md: -------------------------------------------------------------------------------- 1 | # 42、你在实际项目中是否做过JVM GC优化,怎么做的? 2 | 如何通过预估 + 压测,做一份生产环境的jvm参数出来的,如何去观察jvm运行的情况,jvm出现频繁full gc的问题,你有没有尝试过生产环境的系统去进行gc的一个优化,对于这个问题 3 | 4 | 5 | 6 | 儒猿技术窝公众号上的救火队队长的《从0开始带你成为jvm实战高手》,有非常详细的案例的分析,通过很多个案例,去分析如何在各种各样奇葩的背景之下,发现jvm的gc很频繁,导致系统卡顿问题 7 | 8 | 9 | 10 | 如何一步一步去分析系统的jvm的性能问题,如何去进行jvm gc调优 11 | 12 | 13 | 14 | 假设你没看过jvm专栏,自己做过jvm gc的生产调优,恭喜你了,直接实话实说,你当时怎么调优,你们的问题如何暴露出来的,你如何一步一步定位问题的,如何进行调优,最后的结果是什么 15 | 16 | 17 | 18 | 你看了jvm专栏,在过程中,或者看完以后,在自己生产环境中根据专栏学习到的知识,去调优过jvm,这个时候,你可以专栏里学习到的知识,去讲。最好对自己系统的生产环境的jvm,进行一个分析,gc频繁的问题 19 | 20 | 21 | 22 | 你尽可能的去调优一下参数,如果效果比较好 23 | 24 | 25 | 26 | 发现分析了一下生产环境的jvm的运行情况,非常好,并发量很低,几十分钟才一次young gc,存活的对象特别少,几乎都在s区域,老年代几乎没什么对象,几天或者几周才发生一次full gc 27 | 28 | 29 | 30 | 在自己本地单机部署,测试环境里,去压测,每秒单机有500并发请求,去观察jvm的运行情况,这个时候他会不会存在频繁gc的问题,你就去调优一下,你就可以基于这个压测的例子去说了 31 | 32 | 33 | 34 | 一定要结合你自己的业务,系统,接口,干什么,并发请求,jvm运行的情况,问题出在哪儿,如何调优,效果如何 35 | -------------------------------------------------------------------------------- /docs/c2c/06.md: -------------------------------------------------------------------------------- 1 | 2 | 《06_C2C电商社会化治理平台面向的痛点介绍》 3 | 4 | 接下来会以一个真实的项目案例来讲解整个微服务技术架构的落地实践,会以一个C2C二手电商平台的社会化治理系统来讲解,因为虽然微服务技术栈跟具体的业务没关系,其实无论什么业务系统,都可以用一套微服务技术体系,但是如果单纯的讲解技术理论,通过一些没任何含义的demo代码来演示,可能很多人没法很好的理解技术和自己项目的关系 5 | 6 | 所谓的C2C二手电商平台,就是用户可以在上面作为卖家发布自己的二手商品,然后等待买家来谈,来购买,平台就是作为中间服务方提供一些列的平台功能支持,其实国内大的二手交易平台还是有几个的,同时还有好一些专注于垂直领域的二手电商交易平台,比如说二手奢侈品电商,二手电子产品电商 7 | 8 | C2C二手交易电商平台 9 | 10 | 留一个小作业和小任务:希望大家可以自己去体验一下各种二手电商平台的界面,看看他里面都有什么,怎么玩儿的,体验一下 11 | 12 | 用户是买家也是卖家,但是会有一个问题,可能卖家会上传违规商品(侵犯版权的盗版商品、假冒伪劣商品、诈骗团伙上传的虚假商品、违法的商品),买家和卖家进行留言互动(通过IM系统进行私聊,对商品还可以进行评论)可能会进行一些人身攻击之类的违规行为,所以本质上这个电商平台从卖家到买家,都是用户,那怎么进行社会化的治理呢? 13 | 14 | 如果是平台方建立规模庞大的审核团队,那么可能会导致每一件商品以及发表的评论都需要进行预审,预审通过了平台才会给你显示出来,但是要知道一个问题,大型的C2C二手电商平台,可能里面日活用户达到数百万,甚至上千万,每天发表的评论可能也多达上千万,如果全部由自建的预审团队一条一条审核,那这个人力成本是无法接受的 15 | 16 | 这就需要有一个专门的社会化治理平台 17 | 18 | 通过一个平台,以技术的手段,将有人举报违规的内容推送给部分用户,让用户参与到平台治理中来,用户投票决定某个商品或者评论等内容是否违规,这样平台仅仅作为一个桥梁,让用户进行社会化自治 -------------------------------------------------------------------------------- /docs/03/85.md: -------------------------------------------------------------------------------- 1 | # 85、采用写缓冲器和无效队列优化MESI协议的实现性能 2 | 3 | ![硬件级别的原理](images/85/01.png) 4 | 5 | MESI协议如果每次写数据的时候都要发送invalidate消息等待所有处理器返回ack,然后获取独占锁后才能写数据,那可能就会导致性能很差了,因为这个对共享变量的写操作,实际上在硬件级别变成串行的了 6 | 7 | 8 | 9 | 所以为了解决这个问题,硬件层面引入了写缓冲器和无效队列 10 | 11 | 12 | 13 | 写缓冲器的作用是,一个处理器写数据的时候,直接把数据写入缓冲器,同时发送invalidate消息,然后就认为写操作完成了,接着就干别的事儿了,不会阻塞在这里。接着这个处理器如果之后收到其他处理器的ack消息之后 14 | 15 | 16 | 17 | 才会把写缓冲器中的写结果拿出来,通过对cache entry设置为E加独占锁,同时修改数据,然后设置为M 18 | 19 | 20 | 21 | 其实写缓冲器的作用,就是处理器写数据的时候直接写入缓冲器,不需要同步阻塞等待其他处理器的invalidate ack返回,这就大大提升了硬件层面的执行效率了 22 | 23 | 24 | 25 | 包括查询数据的时候,会先从写缓冲器里查,因为有可能刚修改的值在这里,然后才会从高速缓存里查,这个就是存储转发 26 | 27 | 28 | 29 | 引入无效队列,就是说其他处理器在接收到了invalidate消息之后,不需要立马过期本地缓存,直接把消息放入无效队列,就返回ack给那个写处理器了,这就进一步加速了性能,然后之后从无效队列里取出来消息,过期本地缓存即可 30 | 31 | 32 | 33 | 通过引入写缓冲器和无效队列,一个处理器要写数据的话,这个性能其实很高的,他直接写数据到写缓冲器,发送一个validate消息出去,就立马返回,执行别的操作了;其他处理器收到invalidate消息之后直接放入无效队列,立马就返回invalidate ack 34 | -------------------------------------------------------------------------------- /docs/distributed-system/redis-distribute-lock.md: -------------------------------------------------------------------------------- 1 | 2 | 面试突击第二季 3 | ![distributed-lock](/docs/distributed-system/images/redis-distribute-lock.png) 4 | Redis分布式锁,很少自己撸,Redisson框架,他基于Redis实现了一系列的开箱即用的高级功能,比如说分布式锁 5 | 6 | 引入maven依赖,他示例代码就几行 7 | 8 | 比如说,苹果这个商品的id是1 9 | 10 | redisson.lock(“product_1_stock”) 11 | 12 | key的业务语义,就是针对product_id = 1的商品的库存,也就就是苹果的库存,进行加锁 13 | 14 | 如果要学习redis技术的,跟我之前录制的《亿级流量商品详情页系统》去学习,在训练营的课程目录里有一个文档,有我之前的课程的地址 15 | 16 | 17 | product_1_stock: { 18 | “xxxx”: 1 19 | } 20 | 21 | 生存时间:30s 22 | 23 | watchdog,redisson框架后台执行一段逻辑,每隔10s去检查一下这个锁是否还被当前客户端持有,如果是的话,重新刷新一下key的生存时间为30s 24 | 25 | 其他客户端尝试加锁,这个时候发现“product_1_stock”这个key已经存在了,里面显示被别的客户端加锁了,此时他就会陷入一个无限循环,阻塞住自己,不能干任何事情,必须在这里等待 26 | 27 | 28 | 第一个客户端加锁成功了,此时有两种情况,第一种情况,这个客户端操作完毕之后,主动释放锁;第二种情况,如果这个客户端宕机了,那么这个客户端的redisson框架之前启动的后台watchdog线程,就没了 29 | 30 | 此时最多30s,key-value就消失了,自动释放了宕机客户端之前持有的锁 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /docs/03/131.md: -------------------------------------------------------------------------------- 1 | # 131、崩溃恢复时选举出来的Leader是如何跟其他Follower进行同步的? 2 | 新选举出来一个leader之后,本身人家会挑选已经收到的事务zxid里最大的那个follower作为新的leader。 3 | 4 | 5 | 6 | 5个机器,1leader + 4个follower 7 | 8 | 9 | 10 | 1个leader把proposal发送给4个follower,其中3个folower(过半)都收到了proposal返回ack了,第四个follower没收到proposal 11 | 12 | 13 | 14 | 此时leader执行commit之后自己挂了,commit没法送给其他的follower,commit刚发送给一个follower 15 | 16 | 17 | 18 | 剩余的4个follower,只要3个人投票一个人当leader,就是leader 19 | 20 | 21 | 22 | 假设那3个收到proposal的follower都投票第四台没有收到proposal的follower当心的leader?这条数据一定永久性丢失了 23 | 24 | 25 | 26 | 选择一个拥有事务zxid最大的机器作为新Leader 27 | 28 | 29 | 30 | 31 | 32 | 其他的follower就会跟他进行同步,他给每个follower准备一个队列,然后把所有的proposal都发送给follower,只要过半follower都ack了,就会发送commit给那个follower 33 | 34 | 35 | 36 | 所谓的commit操作,就是把这条数据加入内存中的znode树形数据结构里去,然后就对外可以看到了,也会去通知一些监听这个znode的人 37 | 38 | 39 | 40 | 如果一个follower跟leader完全同步了,就会加入leader的同步follower列表中去,然后过半follower都同步完毕了,就可以对外继续提供服务了 41 | -------------------------------------------------------------------------------- /docs/03/13.md: -------------------------------------------------------------------------------- 1 | # 《13、能聊聊你对CAS的理解以及其底层实现原理可以吗?》(基础篇) 2 | 3 | ![13](images/13/01.png) 4 | 5 | ![13](images/13/02.png) 6 | 7 | 取值,询问,修改 8 | 9 | 10 | 11 | 多个线程他们可能要访问同一个数据 12 | 13 | 14 | 15 | HashMap map = new HashMap(); 16 | 17 | 18 | 19 | 此时有多个线程要同时读写类似上面的这种内存里的数据,此时必然出现多线程的并发安全问题,几个月培训班的同学,都应该知道 20 | 21 | 22 | 23 | 我们可能要用到并发包下面的很多技术,synchronized 24 | 25 | 26 | 27 | synchronized(map) { 28 | 29 | // 对map里的数据进行复杂的读写处理 30 | 31 | } 32 | 33 | 34 | 35 | 并发包下面的其他的一些技术 36 | 37 | 38 | 39 | CAS 40 | 41 | 42 | 43 | 一段代码: 44 | 45 | ![13](images/13/03.png) 46 | 47 | 此时,synchronized他的意思就是针对当前执行这个方法的myObject对象进行加锁 48 | 49 | 50 | 51 | 只有一个线程可以成功的堆myObject加锁,可以对他关联的monitor的计数器去加1,加锁,一旦多个线程并发的去进行synchronized加锁,串行化,效率并不是太高,很多线程,都需要排队去执行 52 | 53 | ![13](images/13/04.png) 54 | 55 | CAS,compare and set 56 | 57 | 58 | 59 | CAS在底层的硬件级别给你保证一定是原子的,同一时间只有一个线程可以执行CAS,先比较再设置,其他的线程的CAS同时间去执行此时会失败 -------------------------------------------------------------------------------- /docs/distributed-system/register-production-optimize.md: -------------------------------------------------------------------------------- 1 | 2 | #### 分布式系统架构的 3 | 4 | **服务注册中心,eureka、zk、consul,原理画图画清楚** 5 | 6 | **数据一致性,CP、AP** 7 | 8 | 服务注册、故障 和发现的时效性是多长时间 9 | 10 | 注册中心最大能支撑多少服务实例 11 | 12 | 如何部署的,几台机器,每台机器的配置如何,会用比较高配置的机器来做,8核16G,16核32G的高配置机器来搞,基本上可以做到每台机器每秒钟的请求支撑几千绝对没问题 13 | 14 | 可用性如何来保证 15 | 16 | **有没有做过一些优化,服务注册、故障以及发现的时效性,是否可以优化一下,用eureka的话,可以尝试一下,配合我们讲解的那些参数,优化一下时效性,服务上线、故障到发现是几秒钟的时效性** 17 | 18 | **zk,一旦服务挂掉,zk感知到以及通知其他服务的时效性,服务注册到zk之后通知到其他服务的时效性,leader挂掉之后可用性是否会出现短暂的问题,为了去换取一致性** 19 | 20 | 21 | **所以希望大家好好完成每天的作业,我布置的大量作业,就是为了帮你锻造出这种能力** 22 | 23 | **学习课程以及完成作业的过程中,大家一定会有很多的问题,可以到专栏的评论区去提问** 24 | 25 | **每天我都会和之前带出来的一批阿里、蚂蚁金服、滴滴的优秀同学给大家进行答疑,并且我们还有专门的付费用户的微信群,大家可以在微信群里跟我们一起进行技术交流** 26 | 27 | **如果你能坚持下来,学满6季,还可以获取私人定制的面试一条龙VIP服务** 28 | 29 | **如果是连续6季面试训练营都购买的同学,还可以获取面试一条龙VIP服务** 30 | 31 | **具体信息大家看“儒猿技术窝”公众号的知识店铺内的训练营详情即可** 32 | 33 | **具体可参见训练营目录下的《训练营专属服务》文档。简单来说,这个私人定制的面试VIP服务,会为你的跳槽面试全程保驾护航** 34 | 35 | -------------------------------------------------------------------------------- /docs/03/145.md: -------------------------------------------------------------------------------- 1 | # 145、HBase的数据模型是什么样的?(下) 2 | 3 | 《007_HBase的数据模型是什么样的?(下)》 4 | 5 | 6 | 7 | rowkey order:base order:detail order:extent 8 | 9 | order_1_110 xxx xxx 10 | 11 | order_1_111 x1(t1); x2(t2) xxx xxx 12 | 13 | 14 | 15 | 每一行数据都有一些列族,就是column family,每个列族都包含一些列,每个列族都有一系列的存储属性,比如说是否把列族里的列值缓存在内存里,列族里的数据如何进行压缩,类似这种 16 | 17 | 18 | 19 | 一个表里有固定的一些列族,每一行都有这些列族,当然有可能你一行数据在某个列族里没存什么东西,是有可能的 20 | 21 | 22 | 23 | 然后就是列,每个列就是一个列族+分号+列限定符(column qualifier),比如说列族是order,列可能就是order:base,或者是order:detail 24 | 25 | 26 | 27 | 每个表的列族是固定的,但是每一行数据有哪些列是不固定的,插入数据的时候可以动态可以给这行数据设定多个列,每个列都是属于一个列族,就是一个列族+分号+列限定符的形式,就可以确定一个列 28 | 29 | 30 | 31 | 时间戳,timestamp,每一行的每个列的值写入的时候就会有一个时间戳,时间戳就代表了这一行这个列的某个版本的值,当然这个timestamp你也可以自己插入的时候指定一个timestamp也是ok的 32 | 33 | 34 | 35 | 单元格,也就是cell,其实就是一行的某个列族下的某个列(由列限定符来确定)的某个timestamp版本对应的值,说白了就这么个东西,在hbase里,每一行的每个列的值,是有多个版本的,每个版本都是一个cell -------------------------------------------------------------------------------- /docs/03/16.md: -------------------------------------------------------------------------------- 1 | # 《16、说说线程池的底层工作原理可以吗?》 2 | 3 | ![线程池的底层工作原理](images/16/01.png) 4 | 5 | 但凡是参加过几个月java就业培训的同学,都应该知道一个概念,线程池 6 | 7 | 8 | 9 | 系统是不可能说让他无限制的创建很多很多的线程的,会构建一个线程池,有一定数量的线程,让他们执行各种各样的任务,线程执行完任务之后,不要销毁掉自己,继续去等待执行下一个任务 10 | 11 | 12 | 13 | 频繁的创建线程,销毁线程,创建线程,销毁线程 14 | 15 | 16 | 17 | ExecutorService threadPool = Executors.newFixedThreadPool(3) -> 3: corePoolSize 18 | 19 | 20 | 21 | threadPool.submit(new Callable() { 22 | 23 | public void run() {} 24 | 25 | }); 26 | 27 | 28 | 29 | 提交任务,先看一下线程池里的线程数量是否小于corePoolSize,也就是3,如果小于,直接创建一个线程出来执行你的任务 30 | 31 | 32 | 33 | 如果执行完你的任务之后,这个线程是不会死掉的,他会尝试从一个无界的LinkedBlockingQueue里获取新的任务,如果没有新的任务,此时就会阻塞住,等待新的任务到来 34 | 35 | 36 | 37 | 你持续提交任务,上述流程反复执行,只要线程池的线程数量小于corePoolSize,都会直接创建新线程来执行这个任务,执行完了就尝试从无界队列里获取任务,直到线程池里有corePoolSize个线程 38 | 39 | 40 | 41 | 接着再次提交任务,会发现线程数量已经跟corePoolSize一样大了,此时就直接把任务放入队列中就可以了,线程会争抢获取任务执行的,如果所有的线程此时都在执行任务,那么无界队列里的任务就可能会越来越多 42 | 43 | 44 | 45 | fixed,队列,LinkedBlockingQueue,无界阻塞队列 -------------------------------------------------------------------------------- /docs/distributed-system/distributed-system-request-sequence.md: -------------------------------------------------------------------------------- 1 | ## 面试题 2 | 分布式服务接口请求的顺序性如何保证? 3 | 4 | ## 面试官心理分析 5 | 其实分布式系统接口的调用顺序,也是个问题,一般来说是不用保证顺序的。但是**有时候**可能确实是需要**严格的顺序**保证。给大家举个例子,你服务 A 调用服务 B,先插入再删除。好,结果俩请求过去了,落在不同机器上,可能插入请求因为某些原因执行慢了一些,导致删除请求先执行了,此时因为没数据所以啥效果也没有;结果这个时候插入请求过来了,好,数据插入进去了,那就尴尬了。 6 | 7 | 本来应该是 “先插入 -> 再删除”,这条数据应该没了,结果现在 “先删除 -> 再插入”,数据还存在,最后你死都想不明白是怎么回事。 8 | 9 | 所以这都是分布式系统一些很常见的问题。 10 | 11 | ## 面试题剖析 12 | 首先,一般来说,个人建议是,你们从业务逻辑上设计的这个系统最好是不需要这种顺序性的保证,因为一旦引入顺序性保障,比如使用**分布式锁**,会**导致系统复杂度上升**,而且会带来**效率低下**,热点数据压力过大等问题。 13 | 14 | 下面我给个我们用过的方案吧,简单来说,首先你得用 dubbo 的一致性 hash 负载均衡策略,将比如某一个订单 id 对应的请求都给分发到某个机器上去,接着就是在那个机器上,因为可能还是多线程并发执行的,你可能得立即将某个订单 id 对应的请求扔一个**内存队列**里去,强制排队,这样来确保他们的顺序性。 15 | 16 | ![distributed-system-request-sequence](/images/distributed-system-request-sequence.png) 17 | 18 | 但是这样引发的后续问题就很多,比如说要是某个订单对应的请求特别多,造成某台机器成**热点**怎么办?解决这些问题又要开启后续一连串的复杂技术方案......曾经这类问题弄的我们头疼不已,所以,还是建议什么呢? 19 | 20 | 最好是比如说刚才那种,一个订单的插入和删除操作,能不能合并成一个操作,就是一个删除,或者是其它什么,避免这种问题的产生。 -------------------------------------------------------------------------------- /docs/03/87.md: -------------------------------------------------------------------------------- 1 | # 87、内存屏障在硬件层面的实现原理以及如何解决各种问题 2 | 可见性问题: 3 | 4 | 5 | 6 | Store屏障 + Load屏障 7 | 8 | 9 | 10 | 如果加了Store屏障之后,就会强制性要求你对一个写操作必须阻塞等待到其他的处理器返回invalidate ack之后,对数据加锁,然后修改数据到高速缓存中,必须在写数据之后,强制执行flush操作 11 | 12 | 13 | 14 | 他的效果,要求一个写操作必须刷到高速缓存(或者主内存),不能停留在写缓冲里 15 | 16 | 17 | 18 | 如果加了Load屏障之后,在从高速缓存中读取数据的时候,如果发现无效队列里有一个invalidate消息,此时会立马强制根据那个invalidate消息把自己本地高速缓存的数据,设置为I(过期),然后就可以强制从其他处理器的高速缓存中加载最新的值了 19 | 20 | 21 | 22 | 这就是refresh操作 23 | 24 | 25 | 26 | 为了解决有序性问题 27 | 28 | 29 | 30 | 内存屏障,Acquire屏障,Release屏障,但是都是由基础的StoreStore屏障,StoreLoad屏障,可以避免指令重排序的效果 31 | 32 | 33 | 34 | StoreStore屏障,会强制让写数据的操作全部按照顺序写入写缓冲器里,他不会让你第一个写到写缓冲器里去,第二个写直接修改高速缓存了 35 | 36 | 37 | 38 | resource = loadResource(); 39 | 40 | StoreStore屏障 41 | 42 | loaded = true; 43 | 44 | 45 | 46 | StoreLoad屏障,他会强制先将写缓冲器里的数据写入高速缓存中,接着读数据的时候强制清空无效队列,对里面的validate消息全部过期掉高速缓存中的条目,然后强制从主内存里重新加载数据 47 | 48 | 49 | 50 | a = 1; // 强制要求必须直接写入高速缓存,不能停留在写缓冲器里,清空写缓冲器里的这条数据 51 | 52 | int b = c; 53 | -------------------------------------------------------------------------------- /docs/03/97.md: -------------------------------------------------------------------------------- 1 | # 97、如果你们的系统允许用户上传文件,可能会遭到什么样的黑客攻击? 2 | 很多时候如果我们的网站允许别人上传文件,那么文件可能是可执行的脚本,可能是病毒或者木马文件,其实这个是非常危险的,如果是脚本的话,可能会在服务器执行,搞很多破坏,比如黑客黑掉你的服务器,勒索你给他比特币之类的 3 | 4 | 5 | 6 | 比如把自己的文件后缀改成.jpg、.txt之类的东西,来上传,其实本质病毒文件 7 | 8 | 9 | 10 | 病毒脚本是非常的可怕的,因为原则上来说,只要黑客掌握底层的一些技术,就可以利用病毒脚本干各种各样的事情,比如连接你的数据库之类的 11 | 12 | 13 | 14 | 对于文件上传这块,核心的就是要进行白名单校验,限制上传文件的类型,只能是我们指定的,而且要限制文件的大小,还要对文件重命名,限制文件类型不能简单的根据后缀来判断,可能后缀被篡改了,要根据文件二进制数据的开头几个字节代表的magic number来判断文件的类型 15 | 16 | 17 | 18 | 读取这个文件的二进制数据流,读取开头的几个字节,提取这个文件的魔数,根据魔数的值去判断他是什么类型的 19 | 20 | 21 | 22 | FFD8FF:JEPG 23 | 24 | 89504E47:PNG 25 | 26 | 27 | 28 | 类似这样,以此类推 29 | 30 | 31 | 32 | 比如说你的网站要求用户只能上传word类型,png类型,此时你就限制仅仅这几种文件是可以上传的,其他的类型的文件都不让上传 33 | 34 | 35 | 36 | 网上可以查到完整的magic number列表,根据那个限制一下,哪些文件类型可以上传,这样就避免说有那种木马、病毒之类的可执行文件被上传了 37 | 38 | 39 | 40 | 而且还要限制,不允许用户上传大文件,文件超过一定大小就不让上传了 41 | 42 | 43 | 44 | 然后对上传好的文件进行重命名 45 | 46 | 47 | 48 | 而且最好对文件进行一定的压缩,这样可以破坏原来的文件结构,避免文件在服务器执行,利用imagemagick这种开源包,可以很方便进行文件缩放 49 | -------------------------------------------------------------------------------- /docs/c2c/08.md: -------------------------------------------------------------------------------- 1 | 2 | 《08_C2C电商社会化治理平台整体架构设计》 3 | 4 | 核心思路,开发一个系统,很多非法举报进行社会化治理,所谓社会化治理,就是把每个举报都圈定一部分用户作为评审员,让他们进行投票,如果过半数判定举报成立,就成立,同时为了激励用户参与进行评审,可以给他们一些奖励,比如说奖励一些虚拟货币,后续可以在专门的积分兑换商城里兑换一些奖品 5 | 6 | 7 | 在C2C二手电商平台里,一般举报有如下的一些场景: 8 | 9 | (1)通常这类平台会做一些用于社交的社区/论坛之类的,可以发帖之类的,所以这类帖子内容如果有一些不良言论,可能会被举报 10 | (2)有的人挂出的二手商品本身就可能是非法商品,可能会被举报 11 | (3)一般有人挂出自己的二手商品之后,别人可以进行留言提问,然后留言交互过程中可能会涉及到侮辱性的语言,此时留言可能会被举报 12 | (4)一般这类平台都会提供买卖双方进行私聊的IM功能,这个私聊对话可能涉及不良言论,可能会被举报 13 | (5)还有时候商品不光是涉及留言和私聊,对这个卖家售出的历史商品,买家可能是可以进行评论的,这个评论是卖家个人积累的一个信誉评价,但是可能出现不良言论,此时可能会被举报 14 | 15 | 16 | 针对上述场景,全部都可以在有人进行举报的时候,对应的功能模块(比如说商品、论坛、IM、评论,等等),就可以接入和调用社会化治理平台,我们对外提供的应该首先是一个举报服务,作为一个入口 17 | 18 | 这个举报服务涵盖了:投票制度管理(可以针对不同的举报类型,定义不同的投票制度,比如5人3胜,3人2胜,最大等待时长,替补评审员机制,等等),提交举报接口,调用评审员服务圈定评审员,PUSH管理,举报查询接口,投票生命周期管理(发起投票、过程监控、超时等待、候补评审员管理、投票结果),调用奖励服务 19 | 20 | 还有一个评审员服务,包含了:评审员管理(根据用户画像的标签,由运营去圈定一波人做评审员,其实核心在于圈定那些每周都至少会来逛一次的活跃用户,这个规则可以自行配置),评审员圈选,评审员状态管理,评审员过滤,疲劳度控制,评审员自动调整,候补评审员选择,评审结果接收 21 | 22 | 最后是一个奖励服务,包含了:奖励规则配置,奖励发放,奖励兑换 23 | 24 | -------------------------------------------------------------------------------- /docs/c2c/47.md: -------------------------------------------------------------------------------- 1 | #《47_携程开源的Apollo配置中心的原理介绍》 2 | 3 | spring cloud netflix 跟 spring cloud alibaba 4 | 5 | 服务注册中心,就很多种技术选型;分布式事务,也是很多种框架;sentinel和hystrix,能干的事情类似;配置中心领域,携程开源了一款apollo,spring cloud config,nacos本身是一个服务注册中心但是也带了配置中心的功能 6 | 7 | 8 | 进行技术选型,首先当然应该是站在一个细化的角度,从各个方面去对比技术,sentinel和hystrix对比,apollo nacos spring cloud config选型对比,马上就出来博客,他们都可以用表格给你展示的很清晰 9 | 10 | 11 | 哪个技术最热门,用的人最多,那么你就选用那个技术;都很热门,用的人都多,怎么选呢?分场景,每种技术适合什么场景;分公司,每种技术适合小公司还是大公司;RabbitMQ、RocketMQ、Kafka如何选型对比 12 | 13 | 14 | apollo,架构是比较复杂,比较完善的,功能上也很完善,活跃,并不一定中小型公司去使用apollo,spring cloud alibaba,nacos,nacos作为一个服务注册中心本身就包含了配置中心的功能,没必要花很多时间再去部署一套apollo 15 | 16 | 17 | 可以考虑用apollo,把配置这块的功能和架构都抽取出来了 18 | 19 | spring cloud config,如果你用的不是spring cloud alibaba,用的是spring cloud netflix,那么你可以配合那个技术栈,直接用spring cloud提供的config项目作为配置中心就可以了,因为这是属于spring cloud原生技术栈里提供的 20 | 21 | 22 | nacos完全可以满足很多中小型公司的配置中心的需求,哪怕是大公司也可以用的,apollo确实用的公司很多,中大型公司都会去用apollo,而且他的功能很完善的,讲,还是讲apollo,nacos 23 | 24 | https://github.com/ctripcorp/apollo 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/c2c/48.md: -------------------------------------------------------------------------------- 1 | #《48_Apollo配置中心的内核原理深度解析》 2 | 3 | spring cloud netflix 跟 spring cloud alibaba 4 | 5 | 服务注册中心,就很多种技术选型;分布式事务,也是很多种框架;sentinel和hystrix,能干的事情类似;配置中心领域,携程开源了一款apollo,spring cloud config,nacos本身是一个服务注册中心但是也带了配置中心的功能 6 | 7 | 8 | 进行技术选型,首先当然应该是站在一个细化的角度,从各个方面去对比技术,sentinel和hystrix对比,apollo nacos spring cloud config选型对比,马上就出来博客,他们都可以用表格给你展示的很清晰 9 | 10 | 11 | 哪个技术最热门,用的人最多,那么你就选用那个技术;都很热门,用的人都多,怎么选呢?分场景,每种技术适合什么场景;分公司,每种技术适合小公司还是大公司;RabbitMQ、RocketMQ、Kafka如何选型对比 12 | 13 | 14 | apollo,架构是比较复杂,比较完善的,功能上也很完善,活跃,并不一定中小型公司去使用apollo,spring cloud alibaba,nacos,nacos作为一个服务注册中心本身就包含了配置中心的功能,没必要花很多时间再去部署一套apollo 15 | 16 | 17 | 可以考虑用apollo,把配置这块的功能和架构都抽取出来了 18 | 19 | spring cloud config,如果你用的不是spring cloud alibaba,用的是spring cloud netflix,那么你可以配合那个技术栈,直接用spring cloud提供的config项目作为配置中心就可以了,因为这是属于spring cloud原生技术栈里提供的 20 | 21 | 22 | `nacos`完全可以满足很多中小型公司的配置中心的需求,哪怕是大公司也可以用的,apollo确实用的公司很多,中大型公司都会去用apollo,而且他的功能很完善的,讲,还是讲apollo,nacos 23 | 24 | https://github.com/ctripcorp/apollo 25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/c2c/49.md: -------------------------------------------------------------------------------- 1 | #《49_对Apollo配置中心进行分布式架构部署》 2 | 3 | spring cloud netflix 跟 spring cloud alibaba 4 | 5 | 服务注册中心,就很多种技术选型;分布式事务,也是很多种框架;sentinel和hystrix,能干的事情类似;配置中心领域,携程开源了一款apollo,spring cloud config,nacos本身是一个服务注册中心但是也带了配置中心的功能 6 | 7 | 8 | 进行技术选型,首先当然应该是站在一个细化的角度,从各个方面去对比技术,sentinel和hystrix对比,apollo nacos spring cloud config选型对比,马上就出来博客,他们都可以用表格给你展示的很清晰 9 | 10 | 11 | 哪个技术最热门,用的人最多,那么你就选用那个技术;都很热门,用的人都多,怎么选呢?分场景,每种技术适合什么场景;分公司,每种技术适合小公司还是大公司;RabbitMQ、RocketMQ、Kafka如何选型对比 12 | 13 | 14 | apollo,架构是比较复杂,比较完善的,功能上也很完善,活跃,并不一定中小型公司去使用apollo,spring cloud alibaba,nacos,nacos作为一个服务注册中心本身就包含了配置中心的功能,没必要花很多时间再去部署一套apollo 15 | 16 | 17 | 可以考虑用apollo,把配置这块的功能和架构都抽取出来了 18 | 19 | spring cloud config,如果你用的不是spring cloud alibaba,用的是spring cloud netflix,那么你可以配合那个技术栈,直接用spring cloud提供的config项目作为配置中心就可以了,因为这是属于spring cloud原生技术栈里提供的 20 | 21 | 22 | `nacos`完全可以满足很多中小型公司的配置中心的需求,哪怕是大公司也可以用的,apollo确实用的公司很多,中大型公司都会去用apollo,而且他的功能很完善的,讲,还是讲apollo,nacos 23 | 24 | https://github.com/ctripcorp/apollo 25 | 26 | 27 | --------------------------------------------------------------------------------