2 Star 11 Fork 2

馆主阿牛 / 无忧出行网约车项目

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
Apache-2.0

无忧出行网约车项目

介绍

基于分布式微服务架构的网约车项目,分为乘客端,司机端以及运营端,实现了登录,乘客预估,乘客发单,司机接单,司乘同显,订单状态变更,支付等完整打车业务流程。

技术架构

SpringBoot+ OpenFeign+ Kafka + Redis + MySQL+ Nacos + Seate + Mybatis + Mybatis-plus + Docker + UniApp + Vue 等。

分布式微服务中台架构

主要功能

  1. 账号系统:乘客司机注册登录以及信息变更,使用JWT生成双Token,使用Redis存储Token实现身份验证以及权限校验。
  2. 订单系统:订单创建,取消订单,订单状态变更等功能,使用Seate AT模式实现分布式事务保证订单状态更改和司机完单数的数据一致性。
  3. 派单引擎:使用Kafka多分区机制,批量拉取和线程池实现订单的快速消费,使用CountDownLatch计数等待异步提交offset;使用Redisson分布式锁保证一司机一单;使用贪心策略实现最优匹配,部分地区使用匈牙利算法实现全局最优匹配。
  4. 地图模块:使用高德猎鹰服务实现车辆调度,坐标上传,轨迹查询,路径规划等;使用高德地图服务实现定位点标记,轨迹绘制,车辆运动。
  5. 消息模块:使用服务端推送技术SSE实现消息通知,对乘客和司机进行订单消息和订单状态变更的通知,同时通过实时推送司机坐标给乘客实现司乘同显;使用CurrentHashMap保存SSE对象,解决线程安全问题。
  6. 计价系统:提供开城服务,即添加计价规则,使用版本号机制保证预估和行程中计价规则的统一;使用BigDecimal 计算价格。
  7. 支付系统:接入支付宝沙箱支付,完成同步回调和异步回调。

司乘业务流程图

乘客端业务流程图
司机端业务流程图

部分订单消费逻辑

@Component
@Slf4j
public class KafkaConsumer {
    @Autowired
    private DispatchService dispatchService;

    @Autowired
    private KafkaProducer kafkaProducer;

    /**
     * 高度 io 任务,核心线程数设置为cpu核数的2倍
     */
    private int coreSize = 2*Runtime.getRuntime().availableProcessors();

    private final ExecutorService executorService = Executors.newFixedThreadPool(coreSize);
    /**
     * 消费者
     * @param records
     * @param acknowledgment
     * @return
     * @describute concurrency = "2" 表示开启两个消费者线程消费两个分区
     */
    @KafkaListener(topics = {"travel-topic"}, concurrency = "2")
    public void consumer(List<ConsumerRecord<String, String>> records, Acknowledgment acknowledgment) {
        // 倒计时锁,取一半,防止线程池溢出,当不减少时,说明出现了严重的司乘供需不平衡,此时不再从kafka马上拉取
        // 直到一半任务完成,说明线程池有一半空余线程了,可以继续拉取订单
        CountDownLatch latch = new CountDownLatch(records.size()/2);
        for (ConsumerRecord<String, String> record : records) {
            executorService.execute(() -> {
                log.info("consumer, topic:{}, partition:{}, value: {}",
                        record.topic(), record.partition(), record.value());
                // 消费消息,订单匹配
                consumeMsg(record.value());
                latch.countDown(); // 任务提交,计数器减一
            });
        }

        try {
            latch.await(); // 等待一半任务执行完成就可以提交拉取下一批了,说明至少空出了一半线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 手动异步提交偏移量
        acknowledgment.acknowledge();
    }

    /**
     * 消费消息
     * @param msg
     */
    public void consumeMsg(String msg){
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            OrderInfo orderInfo = objectMapper.readValue(msg, OrderInfo.class);
            // 订单匹配
            dispatchService.disPatch(orderInfo);
        } catch (Exception e) {
            e.printStackTrace();
            // 将消费失败的消息放到另一个专门处理失败消息的主题 "errOrderHandle-topic"
            kafkaProducer.sendMessage("errOrderHandle-topic",msg);
        }
    }
}

项目展示

乘客端

图1 图2 图3
图4 图5

司机端

图1 图2
图4 图5

交流与赞助

全栈学习交流1群:799160455 (已满员)

全栈学习交流2群:879763865

联系我 支持本项目
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

基于分布式微服务架构的网约车项目。 展开 收起
Apache-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/aniu-666/worry-free-travel.git
git@gitee.com:aniu-666/worry-free-travel.git
aniu-666
worry-free-travel
无忧出行网约车项目
master

搜索帮助