Swoft中使用Consul微服务

这篇具有很好参考价值的文章主要介绍了Swoft中使用Consul微服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Swoft中接入Consul

Swoft服务限流

Swoft服务熔断和降级


在之前我写的一篇内容:PHP中接入consul,实现微服务的注册发现和配置中心_浮尘笔记的博客-CSDN博客 中,使用ThinkPHP6.0框架接入了微服务Consul,并且留下了一个彩蛋 “将在 swoft 框架中介入consul,实现更多微服务的功能”,那么本篇就在 Swoft 框架中使用 swoft-consul 组件,实现服务注册。官方文档:服务注册与发现 | Swoft

另外,关于Swoft的入门和基本用法可以参考上一篇内容:Swoft的注解分析和实现一个RPC服务_浮尘笔记的博客-CSDN博客,因为本篇内容的示例会基于上一篇内容的代码继续。

Swoft中接入Consul

之前的三个服务:order、goods、user中,先来修改user的内容。

修改 user/app/bean.php,添加consul的配置

//打开user服务的http配置,以及监听rpc
'httpServer' => [
    'class'    => HttpServer::class,
    'port'     => 18418,
    'listener' => [
        'rpc' => bean('rpcServer'),
    ],
],

'consul' => [
    'host' => '127.0.0.1',
    'port' => 8500,
],

修改 user/app/Listener/RegisterServiceListener.php

$service = [
    'ID' => 'swoft-user',
    'Name' => 'swoft-user',
    'Tags' => [
        'http'
    ],
    'Address' => '127.0.0.1',
    'Port' => 18408,
    'checks' => [
        [
            'name' => 'get-user-list',
            'http' => 'http://127.0.0.1:18418/consul/getList',
            'interval' => '10s',
            'timeout' => '5s',
        ]
    ],
];

// 去掉下面 Register 的注释
$this->agent->registerService($service);

在 user/app/Http/Controller/ 目录下面新增 ConsulController.php,内容如下:

<?php declare(strict_types=1);

namespace App\Http\Controller;

use Exception;
use Swoft\Co;
use Swoft\Http\Server\Annotation\Mapping\Controller;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
use Swoft\Rpc\Client\Annotation\Mapping\Reference;

/**
 * Class ConsulController
 *
 * @since 2.0
 *
 * @Controller()
 */
class ConsulController {
    /**
     * @RequestMapping("getList")
     *
     * @return array
     */
    public function getList(): array {
        return ['getListResult' => 'OK'];
    }
}

上面的controller中仅返回一个固定的数组,用来测试注册是否成功。

接下来 consul agent -dev 先启动consul,打开浏览器输入 http://127.0.0.1:8500/ui/

然后启动 swoft的http服务,同时也会启动rpc服务,php user/bin/swoft http:start

Swoft中使用Consul微服务

然后去 consul 的控制台查看,swoft-user已经注册进去了

Swoft中使用Consul微服务

访问 http://127.0.0.1:18418/consul/getList 

Swoft中使用Consul微服务

至此,就在swoft中实现了服务注册的流程。 

Swoft服务限流

限流的目的是对并发访问和并发请求进行限速,或者一个时间窗口内请求进行限速从而来保护系统,一旦达到或超过限制速率就可以拒绝服务,或者进行排队等待等。常见的限流算法有:计数器、漏桶、令牌桶等,Swoft 限流器底层采用的就是令牌桶算法,底层依赖于 Redis 实现分布式限流。官方文档:服务限流 | Swoft

接下来在user服务中加上一个限流器测试一下。

修改上面的 user/app/Http/Controller/ConsulController.php

use Swoft\Limiter\Annotation\Mapping\RateLimiter;

class ConsulController
{
    /**
     * 服务限流:每秒钟访问1次,最大访问2次,以及回调函数limiterFallback
     * @RateLimiter(rate=1, max=2, fallback="limiterFallback")
     *
     * @RequestMapping("getList")
     *
     * @return array
     */
    public function getList(): array {
        return ['getListResult' => 'OK'];
    }

    /**
     * 限流的回调函数:不写业务逻辑,只返回一个错误信息
     * @return array
     */
    public function limiterFallback(): array
    {
        return ['访问次数超限'];
    }
}

启动服务 php ./bin/swoft http:start,然后访问  http://127.0.0.1:18418/consul/getList

刷新特别快的情况下就会出现报错信息

Swoft中使用Consul微服务

Swoft服务熔断和降级

断路器(Circuit Breaker)模式是为了防止在分布式系统中出现这种瀑布似的连锁反应导致的灾难。官方文档:服务熔断与降级 | Swoft

还是上面的 user/app/Http/Controller/ConsulController.php

use Swoft\Breaker\Annotation\Mapping\Breaker;

class ConsulController {
    /**
     * 服务降级
     * fallback 降级函数, 必须和 Breaker 标记的函数完全一样除了名称不一样且在同一个类里面
     * sucThreshold 连续成功3次状态切换阀门
     * failThreshold 连续失败1次状态切换阀门
     * timeout 超时时间2秒
     * retryTime 熔断器由开启状态到半开状态尝试切换时间 3秒
     *
     * @Breaker(fallback="funcFallback", sucThreshold=3, failThreshold=1, timeout=2.0, retryTime=3)
     * @RequestMapping("getInfo")
     * @return array
     * @throws Exception
     */
    public function getInfo(): array
    {
        //设定一个随机数,当随机数>=5的时候触发降级
        $times = rand(1, 10);
        echo $times;
        if($times >= 5){
            throw new Exception('Breaker exception');
        }
        echo ' -- OK' . PHP_EOL;
        return [
            'times' => $times,
            'result' => 'OK'
        ];
    }

    /**
     * 降级的回调函数
     * @return array
     */
    public function funcFallback(): array
    {
        echo ' -- error' . PHP_EOL;
        return ['error' => '服务已被降级'];
    }

}

启动服务 php ./bin/swoft http:start,然后访问 http://127.0.0.1:18418/consul/getInfo

随机刷新可以看到如下效果

Swoft中使用Consul微服务

关于Swoft接入Consul,以及在Swoft中实现服务限流和降级熔断就大概演示到这里吧,关于Swoft的更多功能可以参考官方文档。

详细代码:user/app/Http/Controller/ConsulController.php · 浮尘/swoft-demo-2023 - Gitee.com 文章来源地址https://www.toymoban.com/news/detail-468084.html

到了这里,关于Swoft中使用Consul微服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [golang 微服务] 6. GRPC微服务集群+Consul集群+grpc-consul-resolver案例演示

    上一节讲解了consul集群: [golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群,这样的话,当一台server挂掉之后,集群就会从另一台server中获取服务,这就保证了客户端访问consul集群的负载均衡性. 这里还有一个问题: 就是当终端的对应的 微服务挂掉 了,consul集群se

    2024年02月09日
    浏览(39)
  • nodejs微服务:服务发现与Consul

    服务发现 我们在做微服务开发的时候,客户端的一个接口可能需要调用N个服务,客户端必须知道所有服务的网络位置(ip+port),如下所示 客户端 Client 服务A (IP 1, PROT 1) 服务B (IP 2, PROT 2) 服务C (IP 3, PROT 3) … 服务N (IP N, PROT N) 客户端需要知道目前所有可用的服务端的ip和端口

    2023年04月09日
    浏览(32)
  • Prometheus+Consul 自助服务发现

    Prometheus 官网 https://prometheus.io/download/ Consul 介绍 Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。通过 Prometheus 实现

    2024年02月07日
    浏览(36)
  • Consul服务注册发现集群搭建

    Consul 是一种用于服务发现、配置和分布式一致性的开源工具和平台。它由 HashiCorp 公司开发和维护,旨在简化构建和维护分布式系统的任务。 Consul 提供了许多功能,包括: 服务发现 :Consul允许服务注册和发现。当服务启动时,它可以向Consul注册自己的位置和元数据。其他服

    2024年04月08日
    浏览(41)
  • Swoft - Bean

    在 Swoft 中,一个 Bean 就是一个类的一个对象实例。 它(Bean)是通过容器来存放和管理整个生命周期的。 最直观的感受就是省去了频繁new的过程,节省了资源的开销。 1、创建Bean 在【gateway/app/Http/Controller】下新建一个名为【TestController.php】的文件,文件内容如下。注释:“ga

    2024年01月23日
    浏览(26)
  • 微服务框架Consul--新手入门

    Consul 是由 HashiCorp 开发的一款软件工具,提供了一组功能,用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能: 服务发现:Consul 允许服务自行注册并以动态和自动化的方式发现其

    2024年02月07日
    浏览(43)
  • prometheus基于consul的服务发现

    https://developer.hashicorp.com/consul/install http://IP:8500/ui/ vim /app/consul/etc/nodes.json consul reload #加载配置文件 增加如下配置 systemctl restart prometheus 可以发现现在获取的Targets里面有consul的字段 https://www.bilibili.com/video/BV1PT4y1P7bX/?from=searchseid=851756632097160928

    2024年02月20日
    浏览(66)
  • docker consul 服务注册与发现

    Docker consul的容器服务更新与发现 ------------------------------------ Consul ------------------------------------ (1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接

    2024年02月09日
    浏览(45)
  • prometheus + consul 服务注册+报警 最佳实践

    本文主要将prometheus和consul 结合起来使用,通过conusl 注册服务至prometheus,实现服务统一注册,统一报警管理等。 整个架构思路consul+consul_export+prometheus+alertmanager ,consul通过check检测服务状态,然后通过consul_export暴露给prometheus,prometheus通过alert规则,通知alertmanager,接着邮件

    2024年03月25日
    浏览(44)
  • Docker consul、容器服务更新与发现

    Consul服务器:192.168.188.17,consul服务,nginx服务,consul-template守护进程 Registrator服务器:192.168.188.11,registrator容器,nginx容器 建立consul服务器 mkdir /opt/consul cp consul_0.9.2_linux_amd64.zip /opt/consul cd /opt/consul unzip consul_0.9.2_linux_amd64.zip mv consul /usr/local/bin/ 设置代理 在后台启动consul服务

    2024年01月19日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包