完整的php微服务案例

介绍

Jin-microservices是基于 php 语言 + hyperf 微服务 框架的完整微服务demo。
github:github.com/Double-Jin/jin-microser...
gitee:gitee.com/ljj96/jin-microservices

关于 JM

作为php、go双修的开发者, go 语言的微服务体系已经基本掌握,go 语言相关的微服务的文章、开源项目在网上搜索一搜一大堆,这让会 go 语言的开发者能容易地上手并实现微服务,毕竟go语言是除java外最合适做微服务的语言这一。

php语言的优势在于web生态,开发的应用绝大多数为单体应用架构。近年来随着基于 swoole 扩展的 hyperf框架的出现,让php也能开发微服务架构,这里要感谢开源工作者。但用 “php + 微服务 “作为关键词时,搜索出来的文章、开源项目都是一些简单的案例,开发者并不能通过这些简单的案例来了解微服务,这让我有了想写本项目的原始动力。

前言

JM 是一款基于 php 语言 + hyperf 微服务 框架编写的完整微服务demo,与网上能找到的单一功能点简单实现的文章不同,JM从实际项目需求出发,力求做到git clone 项目下来后对着文件就能帮你构建微服务完整的知识体系,让你实际用hyperf开发微服务项目时能粘贴复制本项目的代码。

微服务架构并不是比单体架构先进的架构,只是在项目体量、项目开发者人数达到一定量级后的一种选择。切勿盲目鼓吹微服务,在团队开发、运维能力不足的情况下强行推进微服务架构恐怕会适得其反。

下面提到的组件并不是微服务架构才能使用,如elk、nacos、dtm这些,在单体应用里面也有合适的场景用到,取其精华来满足业务上的需要。如在生产上用到这些组件最好选择编译安装或购买云服务

功能亮点

  • 完整微服务架构
  • JsonRpc调用
  • JWT认证
  • 统一异常处理
  • 服务注册与服务发现
  • 消息队列
  • 链接追踪
  • 配置中心
  • 服务限流
  • 服务降级
  • 分布式日志
  • 分布式事务

准备

微服务是把单体应用进行分拆后的架构,分拆后带来的问题通过引用第三方组件来解决,安装部署这些组件的时候你将会遇到很多奇奇怪怪的问题。为减低难度,本项目大部分组件采用docker来安装,整体流程我已在不同的电脑上验证数遍,即便如此还是会存在如composer、github、http/tcp访问、端口、内存、docker版本等问题,同样的操作换了台电脑就可能出问题,这需要你跟据报错内容查找相关资料自行解决。

  • 8核16G电脑
  • 熟悉docker
  • 了解网络协议
  • 基本的运维能力

安装

使用

  • 目录结构

      |-- api-gateway //网关服务项目代码 
      |-- order-srv //订单服务项目代码
      |-- user-srv // 用户服务项目代码
      |-- task-srv // 定时任务、队列消费服务项目代码
      |-- README.md //说明文档
  • 完整微服务架构
    完整的php微服务案例

  • JsonRpc调用

    • GET http://127.0.0.1:9501/User/UserInfo 通讯单一服务
    • GET http://127.0.0.1:9501/User/UserBonusList 通讯单一服务
    • GET http://127.0.0.1:9501/User/UserStoredList 通讯单一服务
    • GET http://127.0.0.1:9501/Order/OrderList 通讯多个服务
  • JWT认证

    • GET http://127.0.0.1:9501/Auth/Login 用户登录
    • GET http://127.0.0.1:9501/Auth/Logout Authorization : Bearer {{token}} 用户退出登录
  • 统一异常处理

    • 封装AppServiceExceptionHandler.php 统一处理http请求异常
    • 封装RateLimitExceptionHandler.php 统一处理限流异常
    • 封装JsonRpcExceptionHandler.php 统一处理JsonPrc通讯异常
    • 封装DtmExceptionHandler.php 统一处理DTM事务中间件异常
  • 服务注册与服务发现
    带你走进微服务

  • 消息队列

    • GET http://127.0.0.1:9501/User/UserRabbitMQ 调用投递用户消息队列接口
    • GET http://127.0.0.1:9501/Order/OrderRabbitMQ 调用投递订单消息队列接口
      完整的php微服务案例
  • 链接追踪
    带你走进微服务

  • 配置中心
    带你走进微服务
    带你走进微服务

  • 服务限流
    GET http://127.0.0.1:9501/RateLimit/Test
    带你走进微服务

  • 服务降级
    GET http://127.0.0.1:9501/CircuitBreaker/Test
    带你走进微服务

  • 分布式日志

    当系统变为集群后,应用日志在数十台甚至是上百台不同的服务器上,能实现日志的统一查找、分析和归档等功能便可称为分布式日志系统。

    生产上方案会有很多,如将日志直接输出来Elasticsearch,如使用云服务商提供的日志收集。本案例采用的是通过filebeat将日志同步到ELK中。

    带你走进微服务

  • 分布式事务

    数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。但对分布式系统来说,数据的操作来自多个不同的数据库,单个数据库事务的成功或失败不代表整个系统的数据一致性是对的,只能够通过分布式事务来解决。

    分布式事务就是指事务的发起者、资源及资源管理器和事务协调者分别位于分布式系统的不同节点之上。行业上常用的有二阶段提交、SAGA、TCC等方案,当了解原理后,你自行用http/tcp也能实现二阶段提交、SAGA、TCC。

    下面的接口通过DTM调度实现在一个SAGA案例。
    POST http://127.0.0.1:9501/Order/CreateOrder 分布式事务
    带你走进微服务
    带你走进微服务
    完整的php微服务案例

不足

  • 不支持gRpc的服务注册与服务发现
  • 配置中心组件只支持config调用,无法做到env的动态写入与框架重启,但可通过k8s实现

感谢

本作品采用《CC 协议》,转载必须注明作者和本文链接
未经允许禁止转载 -- 苦力小林,
本帖由系统于 4周前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 25

正好想学习一下微服务

4周前 评论

感谢分享. 我看你用nacos, 那不是支持服务注册与服务发现么. (1) 我在想, 假若不同服务要调用同样的model, 你们实际项目是每个服务都写一份model, 还是通过rpc调用? (2) 应该还有个网关层吧? (3) 常量是通过nacos来配置, 还是其它. 如果写在服务里面, 通过常量是写多份么? 感谢

4周前 评论
Double-Jin (楼主) 4周前
Double-Jin (楼主) 4周前
Double-Jin (楼主) 4周前
Double-Jin (楼主) 4周前
Mumujin 3周前
CodingHePing

可以

4周前 评论
李铭昕

:+1:

4周前 评论

mark

3周前 评论

分布式事务是如何实现的,有demo吗

3周前 评论
Double-Jin (楼主) 3周前

大佬就是nb

2周前 评论

大佬 这方面知识还能去哪里参考下php的 有的话可以提供一下方向 网上搜也是搜不到教学视频等, 目前 在转着java了 搞到ssm这块了 想着java学深入点应该有这方面的知识体系

1周前 评论
Double-Jin (楼主) 1周前
TommyTu

mark

1周前 评论

点赞,希望多来点案例!!

1周前 评论

高大上,:+1:

11小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!