diff --git a/.gitignore b/.gitignore index bf9187c..a8eb2ba 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,3 @@ tests/*/*.sh /php polaris.log build.sh -polaris.yaml diff --git a/doc/ApiDoc.md b/doc/ApiDoc.md index 6694d9c..02f29e0 100644 --- a/doc/ApiDoc.md +++ b/doc/ApiDoc.md @@ -12,8 +12,8 @@ *函数入参* -| 参数名称 | 参数类型 | 参数用途 | -| :-------------- | :------- | :------------------------------ | +| 参数名称 | 参数类型 | 参数用途 | +| :------------ | :------- | :------------------------------ | | `config_path` | string | 设置配置文件的文件路径信息 | | `log_dir` | string | 设置SDK自身的日志文件保存的位置 | @@ -125,28 +125,28 @@ $polaris_client->InitLimit(); *函数入参* -| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | -| :----------- | :------------ | :------------------ | :----------------------------------------------------------------------- | -| `timeout` | | long | 超时时间,单位毫秒 | -| `flowId` | | long | 本次请求的标识ID | -| `instance` | | map | | -| | `namespace` | string | 服务所在的命名空间 | -| | `service` | string | 服务名称 | -| | `host` | string | 实例的IP | -| | `port` | string | 实例的端口,字符串数字: "100" | -| | `protocol` | string | 实例端口的协议 | -| | `priority` | string | 实例优先级,字符串数字: "100" | -| | `weight` | string | 实例的权重,字符串数字: "100" | -| | `version` | string | 实例版本 | -| | `vpc_id` | string | 实例所在的VPC_ID信息 | -| | `heartbeat` | string | 是否开启心服务端对本实例执行跳健康检查,eg: "true" | -| | `ttl` | string | 心跳间隔时间,单位为秒,仅在 `heartbeat` 为 `true` 下生效,eg: "100" | -| | `metadata` | map | 实例的标签信息 | +| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | +| :----------- | :----------- | :------------------ | :------------------------------------------------------------------- | +| `timeout` | | long | 超时时间,单位毫秒 | +| `flowId` | | long | 本次请求的标识ID | +| `instance` | | map | | +| | `namespace` | string | 服务所在的命名空间 | +| | `service` | string | 服务名称 | +| | `host` | string | 实例的IP | +| | `port` | string | 实例的端口,字符串数字: "100" | +| | `protocol` | string | 实例端口的协议 | +| | `priority` | string | 实例优先级,字符串数字: "100" | +| | `weight` | string | 实例的权重,字符串数字: "100" | +| | `version` | string | 实例版本 | +| | `vpc_id` | string | 实例所在的VPC_ID信息 | +| | `heartbeat` | string | 是否开启心服务端对本实例执行跳健康检查,eg: "true" | +| | `ttl` | string | 心跳间隔时间,单位为秒,仅在 `heartbeat` 为 `true` 下生效,eg: "100" | +| | `metadata` | map | 实例的标签信息 | *函数执行返回* -| 参数名称 | 参数类型 | 参数用途 | 示例 | -| :-------------- | :------- | :------------------------- | :--- | +| 参数名称 | 参数类型 | 参数用途 | 示例 | +| :------------ | :------- | :------------------------- | :--- | | `code` | int | 方法执行状态码 | | | `err_msg` | string | 错误信息 | | | `instance_id` | string | 注册成功,实例的唯一ID标识 | | @@ -187,21 +187,21 @@ var_dump($res); *函数入参* -| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | -| :----------- | :------------ | :------------------ | :---------------------------- | -| `timeout` | | long | 超时时间,单位毫秒 | -| `flowId` | | long | 本次请求的标识ID | -| instance | | map | | -| | `namespace` | string | 服务所在的命名空间 | -| | `service` | string | 服务名称 | -| | `host` | string | 实例的IP | -| | `port` | string | 实例的端口,字符串数字: "100" | -| | `vpc_id` | string | 实例所在的VPC_ID信息 | +| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | +| :----------- | :----------- | :------------------ | :---------------------------- | +| `timeout` | | long | 超时时间,单位毫秒 | +| `flowId` | | long | 本次请求的标识ID | +| instance | | map | | +| | `namespace` | string | 服务所在的命名空间 | +| | `service` | string | 服务名称 | +| | `host` | string | 实例的IP | +| | `port` | string | 实例的端口,字符串数字: "100" | +| | `vpc_id` | string | 实例所在的VPC_ID信息 | *函数执行返回* -| 参数名称 | 参数类型 | 参数用途 | -| :---------- | :------- | :------------- | +| 参数名称 | 参数类型 | 参数用途 | +| :-------- | :------- | :------------- | | `code` | int | 方法执行状态码 | | `err_msg` | string | 错误信息 | @@ -238,8 +238,8 @@ var_dump($res); *函数入参* -| 参数名称 | 参数类型 | 参数用途 | -| :------------ | :------- | :---------------------------- | +| 参数名称 | 参数类型 | 参数用途 | +| :---------- | :------- | :---------------------------- | | `namespace` | string | 服务所在的命名空间 | | `service` | string | 服务名称 | | `host` | string | 实例的IP | @@ -248,8 +248,8 @@ var_dump($res); *函数执行返回* -| 参数名称 | 参数类型 | 参数用途 | -| :---------- | :------- | :------------- | +| 参数名称 | 参数类型 | 参数用途 | +| :-------- | :------- | :------------- | | `code` | int | 方法执行状态码 | | `err_msg` | string | 错误信息 | @@ -280,27 +280,27 @@ var_dump($res); ### 前提 -| Key | Value类别 | 作用 | -| :------------------------- | :------------- | :-------------------------------- | +| Key | Value类别 | 作用 | +| :----------------------- | :------------- | :-------------------------------- | | `load_balance_type` | weightedRandom | 权重随机 | -| | ringHash | 一致性hash负载均衡 | -| | maglev | 一致性Hash: maglev 算法 | -| | l5cst | 兼容L5的一致性Hash | -| | simpleHash | hash_key%总实例数 选择服务实例 | -| | cMurmurHash | 兼容brpc c_murmur的一致性哈希 | -| | localityAware | 兼容brpc locality_aware的负载均衡 | -| | default | 使用全局配置的负载均衡算法 | -| | | | +| | ringHash | 一致性hash负载均衡 | +| | maglev | 一致性Hash: maglev 算法 | +| | l5cst | 兼容L5的一致性Hash | +| | simpleHash | hash_key%总实例数 选择服务实例 | +| | cMurmurHash | 兼容brpc c_murmur的一致性哈希 | +| | localityAware | 兼容brpc locality_aware的负载均衡 | +| | default | 使用全局配置的负载均衡算法 | +| | | | | `metadata_failover_type` | notKey | 返回不包含元数据路由key的节点 | -| | all | 降级返回所有节点 | -| | none | 默认不降级 | -| | | | +| | all | 降级返回所有节点 | +| | none | 默认不降级 | +| | | | | `weight_type` | static | 静态权重 | -| | dynamic | 动态权重 | -| | | | +| | dynamic | 动态权重 | +| | | | | `ret_status` | error | 服务实例错误 | -| | timeout | 服务实例超时 | -| | ok | 服务实例正常 | +| | timeout | 服务实例超时 | +| | ok | 服务实例正常 | ### InitService @@ -312,35 +312,35 @@ var_dump($res); *请求参数* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :------------------------- | :------------ | :------------------ | :------------------------------------------------------------- | -| `timeout` | | | long | 超时时间,单位毫秒 | -| `flowId` | | | long | 本次请求的标识ID | -| `instance` | | | map | | -| | `namespace` | | string | 被调服务所在的命名空间 | -| | `service` | | string | 被调服务名称 | -| | `version` | | string | 实例版本 | -| | `vpc_id` | | string | 实例所在的VPC_ID信息 | -| | `metadata` | | map | 设置元数据,用于元数据路由 | -| | `canary` | | string | 设置调用哪个金丝雀服务实例 | -| | `source_set_name` | | string | 设置调用哪个set下的服务 | -| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点,eg:"true" | -| | `hash_string` | | string | 设置 hash 字符串,用于一致性哈希负载均衡算法 | -| | `hash_key` | | string | 设置hash key,用于一致性哈希负载均衡算法,eg:"123" | -| | `replicate_index` | | string | 用于一致性hash算法时获取副本实例,eg:"123" | -| | `backup_instance_num` | | string | 设置用于重试的实例数。可选,默认不返回用于重试的实例,eg:"123" | -| | `load_balance_type` | | string | 设置负载均衡类型。可选,默认使用配置文件中设置的类型 | -| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | -| | `labels` | | map | 设置请求标签,用于接口级别熔断 | -| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | -| | | `namespace` | string | 实例的标签信息 | -| | | `service` | string | 实例的标签信息 | -| | | `metadata` | map | 实例的标签信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :----------------------- | :----------- | :------------------ | :------------------------------------------------------------- | +| `timeout` | | | long | 超时时间,单位毫秒 | +| `flowId` | | | long | 本次请求的标识ID | +| `instance` | | | map | | +| | `namespace` | | string | 被调服务所在的命名空间 | +| | `service` | | string | 被调服务名称 | +| | `version` | | string | 实例版本 | +| | `vpc_id` | | string | 实例所在的VPC_ID信息 | +| | `metadata` | | map | 设置元数据,用于元数据路由 | +| | `canary` | | string | 设置调用哪个金丝雀服务实例 | +| | `source_set_name` | | string | 设置调用哪个set下的服务 | +| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点,eg:"true" | +| | `hash_string` | | string | 设置 hash 字符串,用于一致性哈希负载均衡算法 | +| | `hash_key` | | string | 设置hash key,用于一致性哈希负载均衡算法,eg:"123" | +| | `replicate_index` | | string | 用于一致性hash算法时获取副本实例,eg:"123" | +| | `backup_instance_num` | | string | 设置用于重试的实例数。可选,默认不返回用于重试的实例,eg:"123" | +| | `load_balance_type` | | string | 设置负载均衡类型。可选,默认使用配置文件中设置的类型 | +| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | +| | `labels` | | map | 设置请求标签,用于接口级别熔断 | +| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | +| | | `namespace` | string | 实例的标签信息 | +| | | `service` | string | 实例的标签信息 | +| | | `metadata` | map | 实例的标签信息 | *函数执行返回* -| 参数名称 | 参数类型 | 参数用途 | 示例 | -| :---------- | :------- | :------------- | :--- | +| 参数名称 | 参数类型 | 参数用途 | 示例 | +| :-------- | :------- | :------------- | :--- | | `code` | int | 方法执行状态码 | | | `err_msg` | string | 错误信息 | | @@ -388,66 +388,66 @@ var_dump($res); *请求参数* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :------------------------- | :------------ | :------------------ | :------------------------------------------------------ | -| `timeout` | | | long | 超时时间,单位毫秒 | -| `flowId` | | | long | 本次请求的标识ID | -| `instance` | | | map | | -| | `namespace` | | string | 被调服务所在的命名空间 | -| | `service` | | string | 被调服务名称 | -| | `version` | | string | 实例版本 | -| | `vpc_id` | | string | 实例所在的VPC_ID信息 | -| | `metadata` | | map | 设置元数据,用于元数据路由 | -| | `canary` | | string | 设置调用哪个金丝雀服务实例 | -| | `source_set_name` | | string | 设置调用哪个set下的服务 | -| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点, eg: "true" or "false" | -| | `hash_string` | | string | 设置 hash 字符串,用于一致性哈希负载均衡算法,eg: "100" | -| | `hash_key` | | string | 设置hash key,用于一致性哈希负载均衡算法,eg: "100" | -| | `replicate_index` | | string | 用于一致性hash算法时获取副本实例,eg: "100" | -| | `backup_instance_num` | | string | 设置用于重试的实例数。可选,默认不返回用于重试的实例 | -| | `load_balance_type` | | string | 设置负载均衡类型。可选,默认使用配置文件中设置的类型 | -| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | -| | `labels` | | map | 设置请求标签,用于接口级别熔断 | -| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | -| | | `namespace` | string | 实例的标签信息 | -| | | `service` | string | 实例的标签信息 | -| | | `metadata` | map | 实例的标签信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :----------------------- | :----------- | :------------------ | :------------------------------------------------------ | +| `timeout` | | | long | 超时时间,单位毫秒 | +| `flowId` | | | long | 本次请求的标识ID | +| `instance` | | | map | | +| | `namespace` | | string | 被调服务所在的命名空间 | +| | `service` | | string | 被调服务名称 | +| | `version` | | string | 实例版本 | +| | `vpc_id` | | string | 实例所在的VPC_ID信息 | +| | `metadata` | | map | 设置元数据,用于元数据路由 | +| | `canary` | | string | 设置调用哪个金丝雀服务实例 | +| | `source_set_name` | | string | 设置调用哪个set下的服务 | +| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点, eg: "true" or "false" | +| | `hash_string` | | string | 设置 hash 字符串,用于一致性哈希负载均衡算法,eg: "100" | +| | `hash_key` | | string | 设置hash key,用于一致性哈希负载均衡算法,eg: "100" | +| | `replicate_index` | | string | 用于一致性hash算法时获取副本实例,eg: "100" | +| | `backup_instance_num` | | string | 设置用于重试的实例数。可选,默认不返回用于重试的实例 | +| | `load_balance_type` | | string | 设置负载均衡类型。可选,默认使用配置文件中设置的类型 | +| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | +| | `labels` | | map | 设置请求标签,用于接口级别熔断 | +| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | +| | | `namespace` | string | 实例的标签信息 | +| | | `service` | string | 实例的标签信息 | +| | | `metadata` | map | 实例的标签信息 | *函数执行返回* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :-------------- | :---------------------- | :------------------ | :----------------------- | -| `code` | | | int | 方法执行状态码 | -| `err_msg` | | | string | 错误信息 | -| `response` | | | map | InstancesResponse | -| | `flow_id` | | long | 请求流水号 | -| | `service` | | string | 服务名 | -| | `namespace` | | string | 命名空间 | -| | `revision` | | string | 版本信息 | -| | `metadata` | | map | 服务元数据 | -| | `weight_type` | | string | 权重类型 | -| | `subset` | | map | 实例所属的subset | -| | `instances` | | map | 服务实例列表 | -| | | `instance_id` | string | 服务实例ID | -| | | `host` | string | 服务的节点IP或者域名 | -| | | `port` | int | 节点端口号 | -| | | `container_name` | string | 实例元数据信息中的容器名 | -| | | `internal_set_name` | string | 实例元数据信息中的set名 | -| | | `logic_set` | string | 实例LogicSet信息 | -| | | `region` | string | location region | -| | | `zone` | string | location zone | -| | | `campus` | string | location campus | -| | | `vpc_id` | string | 获取服务实例所在VPC ID | -| | | `protocol` | string | 实例协议信息 | -| | | `version` | int | 实例版本号信息 | -| | | `weight` | int | 实例静态权重值, 0-1000 | -| | | `priority` | int | 实例优先级 | -| | | `dynamic_weight` | int | 实例动态权重 | -| | | `hash_key` | int | GetHash | -| | | `locality_aware_info` | int | locality_aware_info | -| | | `healthy` | bool | 实例健康状态 | -| | | `isola` | bool | 实例隔离状态 | -| | | `metadata` | map | 实例元数据信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :------------ | :-------------------- | :------------------ | :----------------------- | +| `code` | | | int | 方法执行状态码 | +| `err_msg` | | | string | 错误信息 | +| `response` | | | map | InstancesResponse | +| | `flow_id` | | long | 请求流水号 | +| | `service` | | string | 服务名 | +| | `namespace` | | string | 命名空间 | +| | `revision` | | string | 版本信息 | +| | `metadata` | | map | 服务元数据 | +| | `weight_type` | | string | 权重类型 | +| | `subset` | | map | 实例所属的subset | +| | `instances` | | map | 服务实例列表 | +| | | `instance_id` | string | 服务实例ID | +| | | `host` | string | 服务的节点IP或者域名 | +| | | `port` | int | 节点端口号 | +| | | `container_name` | string | 实例元数据信息中的容器名 | +| | | `internal_set_name` | string | 实例元数据信息中的set名 | +| | | `logic_set` | string | 实例LogicSet信息 | +| | | `region` | string | location region | +| | | `zone` | string | location zone | +| | | `campus` | string | location campus | +| | | `vpc_id` | string | 获取服务实例所在VPC ID | +| | | `protocol` | string | 实例协议信息 | +| | | `version` | int | 实例版本号信息 | +| | | `weight` | int | 实例静态权重值, 0-1000 | +| | | `priority` | int | 实例优先级 | +| | | `dynamic_weight` | int | 实例动态权重 | +| | | `hash_key` | int | GetHash | +| | | `locality_aware_info` | int | locality_aware_info | +| | | `healthy` | bool | 实例健康状态 | +| | | `isola` | bool | 实例隔离状态 | +| | | `metadata` | map | 实例元数据信息 | > 具体代码使用示例 @@ -481,49 +481,6 @@ $flow_id = 123456; $res = $polaris_client->GetOneInstance($init_service_info, $timeout, $flow_id); var_dump($res); -/* - -$res的结构 - -array( - "code" => 0, - "err_msg" => , - "response" => array( - "flow_id" => - "service" => - "namespace" => - "revision" => - "metadata" => - "weight_type" => - "subset" => - "instances" => array( - "instance_id" => - "host" => - "port" => - "container_name" => - "internal_set_name" => - "logic_set" => - "region" => - "zone" => - "campus" => - "vpc_id" => - "protocol" => - "version" => - "weight" => - "priority" => - "dynamic_weight" => - "hash_key" => - "locality_aware_info" => - "healthy" => - "isola" => - "metadata" => array( - "{key}" => "{value}" - ) - ) - ) -) - - */ ``` ### GetInstances @@ -536,59 +493,59 @@ array( *请求参数* -| 参数名称 | | | 参数类型 | 参数用途 | -| :----------- | :------------------------------------ | :------------ | :------------------ | :--------------------------------------------------------------------------- | -| `timeout` | | | long | 超时时间,单位毫秒 | -| `flowId` | | | long | 本次请求的标识ID | -| `instance` | | | map | | -| | `namespace` | | string | 被调服务所在的命名空间 | -| | `service` | | string | 被调服务名称 | -| | `include_unhealthy_instances` | | string | 设置服务路由时否包含不健康的服务实例。可选,默认不包含, 字符串bool值:"true" | -| | `include_circuit_breaker_instances` | | string | 设置服务路由时是否包含熔断的服务实例。可选,默认不包含, 字符串bool值:"true" | -| | `skip_route_filter` | | string | 设置是否跳过服务路由。可选,默认不跳过服务路由, 字符串bool值:"true" | -| | `canary` | | string | 设置调用哪个金丝雀服务实例 | -| | `source_set_name` | | string | 设置调用哪个set下的服务 | -| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | -| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | -| | | `namespace` | string | 实例的标签信息 | -| | | `service` | string | 实例的标签信息 | -| | | `metadata` | map | 实例的标签信息 | +| 参数名称 | | | 参数类型 | 参数用途 | +| :--------- | :---------------------------------- | :---------- | :------------------ | :--------------------------------------------------------------------------- | +| `timeout` | | | long | 超时时间,单位毫秒 | +| `flowId` | | | long | 本次请求的标识ID | +| `instance` | | | map | | +| | `namespace` | | string | 被调服务所在的命名空间 | +| | `service` | | string | 被调服务名称 | +| | `include_unhealthy_instances` | | string | 设置服务路由时否包含不健康的服务实例。可选,默认不包含, 字符串bool值:"true" | +| | `include_circuit_breaker_instances` | | string | 设置服务路由时是否包含熔断的服务实例。可选,默认不包含, 字符串bool值:"true" | +| | `skip_route_filter` | | string | 设置是否跳过服务路由。可选,默认不跳过服务路由, 字符串bool值:"true" | +| | `canary` | | string | 设置调用哪个金丝雀服务实例 | +| | `source_set_name` | | string | 设置调用哪个set下的服务 | +| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | +| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | +| | | `namespace` | string | 实例的标签信息 | +| | | `service` | string | 实例的标签信息 | +| | | `metadata` | map | 实例的标签信息 | *函数执行返回* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :-------------- | :---------------------- | :------------------ | :----------------------- | -| `code` | | | int | 方法执行状态码 | -| `err_msg` | | | string | 错误信息 | -| `response` | | | map | InstancesResponse | -| | `flow_id` | | long | 请求流水号 | -| | `service` | | string | 服务名 | -| | `namespace` | | string | 命名空间 | -| | `revision` | | string | 版本信息 | -| | `metadata` | | map | 服务元数据 | -| | `weight_type` | | string | 权重类型 | -| | `subset` | | map | 实例所属的subset | -| | `instances` | | map | 服务实例列表 | -| | | `instance_id` | string | 服务实例ID | -| | | `host` | string | 服务的节点IP或者域名 | -| | | `port` | int | 节点端口号 | -| | | `container_name` | string | 实例元数据信息中的容器名 | -| | | `internal_set_name` | string | 实例元数据信息中的set名 | -| | | `logic_set` | string | 实例LogicSet信息 | -| | | `region` | string | location region | -| | | `zone` | string | location zone | -| | | `campus` | string | location campus | -| | | `vpc_id` | string | 获取服务实例所在VPC ID | -| | | `protocol` | string | 实例协议信息 | -| | | `version` | int | 实例版本号信息 | -| | | `weight` | int | 实例静态权重值, 0-1000 | -| | | `priority` | int | 实例优先级 | -| | | `dynamic_weight` | int | 实例动态权重 | -| | | `hash_key` | int | GetHash | -| | | `locality_aware_info` | int | locality_aware_info | -| | | `healthy` | bool | 实例健康状态 | -| | | `isola` | bool | 实例隔离状态 | -| | | `metadata` | map | 实例元数据信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :------------ | :-------------------- | :------------------ | :----------------------- | +| `code` | | | int | 方法执行状态码 | +| `err_msg` | | | string | 错误信息 | +| `response` | | | map | InstancesResponse | +| | `flow_id` | | long | 请求流水号 | +| | `service` | | string | 服务名 | +| | `namespace` | | string | 命名空间 | +| | `revision` | | string | 版本信息 | +| | `metadata` | | map | 服务元数据 | +| | `weight_type` | | string | 权重类型 | +| | `subset` | | map | 实例所属的subset | +| | `instances` | | map | 服务实例列表 | +| | | `instance_id` | string | 服务实例ID | +| | | `host` | string | 服务的节点IP或者域名 | +| | | `port` | int | 节点端口号 | +| | | `container_name` | string | 实例元数据信息中的容器名 | +| | | `internal_set_name` | string | 实例元数据信息中的set名 | +| | | `logic_set` | string | 实例LogicSet信息 | +| | | `region` | string | location region | +| | | `zone` | string | location zone | +| | | `campus` | string | location campus | +| | | `vpc_id` | string | 获取服务实例所在VPC ID | +| | | `protocol` | string | 实例协议信息 | +| | | `version` | int | 实例版本号信息 | +| | | `weight` | int | 实例静态权重值, 0-1000 | +| | | `priority` | int | 实例优先级 | +| | | `dynamic_weight` | int | 实例动态权重 | +| | | `hash_key` | int | GetHash | +| | | `locality_aware_info` | int | locality_aware_info | +| | | `healthy` | bool | 实例健康状态 | +| | | `isola` | bool | 实例隔离状态 | +| | | `metadata` | map | 实例元数据信息 | > 具体代码使用示例 @@ -601,13 +558,7 @@ $polaris_client->InitConsumer(); $init_service_info = array( "namespace" => "default", "service" => "php_ext_test", - "vpc_id" => "test_vpc", - "metadata" => array( - "env" => "pre" - ), - "labels" => array( - "user_id" => "uin_001" - ), + "canary" => "test_vpc", "source" => array( "namespace" => "", "service" => "", @@ -634,59 +585,59 @@ var_dump($res); *请求参数* -| 参数名称 | | | 参数类型 | 参数用途 | -| :----------- | :------------------------------------ | :------------ | :------------------ | :--------------------------------------------------------------------------- | -| `timeout` | | | long | 超时时间,单位毫秒 | -| `flowId` | | | long | 本次请求的标识ID | -| `instance` | | | map | | -| | `namespace` | | string | 被调服务所在的命名空间 | -| | `service` | | string | 被调服务名称 | -| | `include_unhealthy_instances` | | string | 设置服务路由时否包含不健康的服务实例。可选,默认不包含, 字符串bool值:"true" | -| | `include_circuit_breaker_instances` | | string | 设置服务路由时是否包含熔断的服务实例。可选,默认不包含, 字符串bool值:"true" | -| | `skip_route_filter` | | string | 设置是否跳过服务路由。可选,默认不跳过服务路由, 字符串bool值:"true" | -| | `canary` | | string | 设置调用哪个金丝雀服务实例 | -| | `source_set_name` | | string | 设置调用哪个set下的服务 | -| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | -| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | -| | | `namespace` | string | 实例的标签信息 | -| | | `service` | string | 实例的标签信息 | -| | | `metadata` | map | 实例的标签信息 | +| 参数名称 | | | 参数类型 | 参数用途 | +| :--------- | :---------------------------------- | :---------- | :------------------ | :--------------------------------------------------------------------------- | +| `timeout` | | | long | 超时时间,单位毫秒 | +| `flowId` | | | long | 本次请求的标识ID | +| `instance` | | | map | | +| | `namespace` | | string | 被调服务所在的命名空间 | +| | `service` | | string | 被调服务名称 | +| | `include_unhealthy_instances` | | string | 设置服务路由时否包含不健康的服务实例。可选,默认不包含, 字符串bool值:"true" | +| | `include_circuit_breaker_instances` | | string | 设置服务路由时是否包含熔断的服务实例。可选,默认不包含, 字符串bool值:"true" | +| | `skip_route_filter` | | string | 设置是否跳过服务路由。可选,默认不跳过服务路由, 字符串bool值:"true" | +| | `canary` | | string | 设置调用哪个金丝雀服务实例 | +| | `source_set_name` | | string | 设置调用哪个set下的服务 | +| | `metadata_failover_type` | | string | 设置元数据路由匹配失败时的降级策略,默认不降级 | +| | `source` | | map | 设置源服务信息,用于服务路由计算。可选 | +| | | `namespace` | string | 实例的标签信息 | +| | | `service` | string | 实例的标签信息 | +| | | `metadata` | map | 实例的标签信息 | *函数执行返回* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :-------------- | :---------------------- | :------------------ | :----------------------- | -| `code` | | | int | 方法执行状态码 | -| `err_msg` | | | string | 错误信息 | -| `response` | | | map | InstancesResponse | -| | `flow_id` | | long | 请求流水号 | -| | `service` | | string | 服务名 | -| | `namespace` | | string | 命名空间 | -| | `revision` | | string | 版本信息 | -| | `metadata` | | map | 服务元数据 | -| | `weight_type` | | string | 权重类型 | -| | `subset` | | map | 实例所属的subset | -| | `instances` | | map | 服务实例列表 | -| | | `instance_id` | string | 服务实例ID | -| | | `host` | string | 服务的节点IP或者域名 | -| | | `port` | int | 节点端口号 | -| | | `container_name` | string | 实例元数据信息中的容器名 | -| | | `internal_set_name` | string | 实例元数据信息中的set名 | -| | | `logic_set` | string | 实例LogicSet信息 | -| | | `region` | string | location region | -| | | `zone` | string | location zone | -| | | `campus` | string | location campus | -| | | `vpc_id` | string | 获取服务实例所在VPC ID | -| | | `protocol` | string | 实例协议信息 | -| | | `version` | string | 实例版本号信息 | -| | | `weight` | int | 实例静态权重值, 0-1000 | -| | | `priority` | int | 实例优先级 | -| | | `dynamic_weight` | int | 实例动态权重 | -| | | `hash_key` | int | GetHash | -| | | `locality_aware_info` | int | locality_aware_info | -| | | `healthy` | bool | 实例健康状态 | -| | | `isola` | bool | 实例隔离状态 | -| | | `metadata` | map | 实例元数据信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :------------ | :-------------------- | :------------------ | :----------------------- | +| `code` | | | int | 方法执行状态码 | +| `err_msg` | | | string | 错误信息 | +| `response` | | | map | InstancesResponse | +| | `flow_id` | | long | 请求流水号 | +| | `service` | | string | 服务名 | +| | `namespace` | | string | 命名空间 | +| | `revision` | | string | 版本信息 | +| | `metadata` | | map | 服务元数据 | +| | `weight_type` | | string | 权重类型 | +| | `subset` | | map | 实例所属的subset | +| | `instances` | | map | 服务实例列表 | +| | | `instance_id` | string | 服务实例ID | +| | | `host` | string | 服务的节点IP或者域名 | +| | | `port` | int | 节点端口号 | +| | | `container_name` | string | 实例元数据信息中的容器名 | +| | | `internal_set_name` | string | 实例元数据信息中的set名 | +| | | `logic_set` | string | 实例LogicSet信息 | +| | | `region` | string | location region | +| | | `zone` | string | location zone | +| | | `campus` | string | location campus | +| | | `vpc_id` | string | 获取服务实例所在VPC ID | +| | | `protocol` | string | 实例协议信息 | +| | | `version` | string | 实例版本号信息 | +| | | `weight` | int | 实例静态权重值, 0-1000 | +| | | `priority` | int | 实例优先级 | +| | | `dynamic_weight` | int | 实例动态权重 | +| | | `hash_key` | int | GetHash | +| | | `locality_aware_info` | int | locality_aware_info | +| | | `healthy` | bool | 实例健康状态 | +| | | `isola` | bool | 实例隔离状态 | +| | | `metadata` | map | 实例元数据信息 | > 具体代码使用示例 @@ -699,13 +650,7 @@ $polaris_client->InitConsumer(); $init_service_info = array( "namespace" => "default", "service" => "php_ext_test", - "vpc_id" => "test_vpc", - "metadata" => array( - "env" => "pre" - ), - "labels" => array( - "user_id" => "uin_001" - ), + "canary" => "test_vpc", "source" => array( "namespace" => "", "service" => "", @@ -732,34 +677,34 @@ var_dump($res); *请求参数* -| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | -| :----------- | :---------------------- | :------------ | :------------------ | :---------------------------------------------------------------------------------------------- | -| `timeout` | | | long | 超时时间,单位毫秒 | -| `flowId` | | | long | 本次请求的标识ID | -| `instance` | | | map | | -| | `namespace` | | string | 被调服务所在的命名空间 | -| | `service` | | string | 被调服务名称 | -| | `instance_id` | | string | 服务实例ID | -| | `host` | | string | 服务实例Host(可选,如果设置了服务实例ID,则这个可不设置,优先使用服务实例ID) | -| | `port` | | string | 服务实例Port(可选,如果设置了服务实例ID,则这个可不设置,优先使用服务实例ID),字符串数字:"200" | -| | `delay` | | string | 设置服务实例调用时延,字符串数字:"200" | -| | `locality_aware_info` | | string | 设置需要传递的LocalityAware的信息,字符串数字:"200" | -| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点, "true" or "false" | -| | `ret_status` | | string | 调用返回状态码,字符串数字:"200" | -| | `ret_code` | | string | 设置调用返回码。可选,用于支持根据返回码实现自己的插件 | -| | `subset` | | map | 设置被调服务subset信息 | -| | `labels` | | map | 设置被调服务labels信息 | -| | `source` | | map | 设置源服务信息 | -| | | `namespace` | string | 实例的标签信息 | -| | | `service` | string | 实例的标签信息 | -| | | `metadata` | map | 实例的标签信息 | +| 一级参数名称 | 二级参数名称 | 三级参数名称 | 参数类型 | 参数用途 | +| :----------- | :-------------------- | :----------- | :------------------ | :---------------------------------------------------------------------------------------------- | +| `timeout` | | | long | 超时时间,单位毫秒 | +| `flowId` | | | long | 本次请求的标识ID | +| `instance` | | | map | | +| | `namespace` | | string | 被调服务所在的命名空间 | +| | `service` | | string | 被调服务名称 | +| | `instance_id` | | string | 服务实例ID | +| | `host` | | string | 服务实例Host(可选,如果设置了服务实例ID,则这个可不设置,优先使用服务实例ID) | +| | `port` | | string | 服务实例Port(可选,如果设置了服务实例ID,则这个可不设置,优先使用服务实例ID),字符串数字:"200" | +| | `delay` | | string | 设置服务实例调用时延,字符串数字:"200" | +| | `locality_aware_info` | | string | 设置需要传递的LocalityAware的信息,字符串数字:"200" | +| | `ignore_half_open` | | string | 设置是否略过跳过半开探测节点, "true" or "false" | +| | `ret_status` | | string | 调用返回状态,error、timeout、ok | +| | `ret_code` | | string | 设置调用返回码。可选,用于支持根据返回码实现自己的插件 | +| | `subset` | | map | 设置被调服务subset信息 | +| | `labels` | | map | 设置被调服务labels信息 | +| | `source` | | map | 设置源服务信息 | +| | | `namespace` | string | 实例的标签信息 | +| | | `service` | string | 实例的标签信息 | +| | | `metadata` | map | 实例的标签信息 | *函数执行返回* | 一级参数名称 | 参数类型 | 参数用途 | | :----------- | :------- | :------------- | -| `code` | int | 方法执行状态码 | -| `err_msg` | string | 错误信息 | +| `code` | int | 方法执行状态码 | +| `err_msg` | string | 错误信息 | > 具体代码使用示例 @@ -773,9 +718,8 @@ $init_service_info = array( "namespace" => "default", "service" => "php_ext_test", "vpc_id" => "test_vpc", - "metadata" => array( - "env" => "pre" - ), + "locality_aware_info" => "", + "ret_status" => "ok", "labels" => array( "user_id" => "uin_001" ), @@ -807,27 +751,27 @@ var_dump($res); *请求参数* -| 一级参数名称 | 参数类型 | 参数用途 | -| :------------ | :------------------ | :-------------------------------------------------------- | -| `subset` | map | 设置请求的所属服务子集,可选 | -| `labels` | map | 设置标签用于选择限流配置 | -| `amount` | string | 设置请求需要分配的配额数量,可选,默认为1, 字符串数字:100 | -| `namespace` | string | 被调服务所在的命名空间 | -| `service` | string | 被调服务名称 | +| 一级参数名称 | 参数类型 | 参数用途 | +| :----------- | :------------------ | :-------------------------------------------------------- | +| `subset` | map | 设置请求的所属服务子集,可选 | +| `labels` | map | 设置标签用于选择限流配置 | +| `amount` | string | 设置请求需要分配的配额数量,可选,默认为1, 字符串数字:100 | +| `namespace` | string | 被调服务所在的命名空间 | +| `service` | string | 被调服务名称 | *函数执行返回* -| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | -| :--------------- | :-------------------- | :------------------ | :--------------------------------------------------------- | -| `code` | | int | 方法执行状态码 | -| `err_msg` | | string | 错误信息 | -| `quota_result` | | map | 规则里配置的所有key | -| | `wait_time` | long | 规则里配置的所有key | -| | `degrade` | bool | 规则里配置的所有key | -| | `duration` | long | 规则里配置的所有key | -| | `quota_left` | long | 规则里配置的所有key | -| | `quota_all` | long | 规则里配置的所有key | -| | `quota_result_code` | long | 配额获取结果(0:配额正常,1:配额被限流,2:需求需要等待重试) | +| 一级参数名称 | 二级参数名称 | 参数类型 | 参数用途 | +| :------------- | :------------------ | :------------------ | :--------------------------------------------------------- | +| `code` | | int | 方法执行状态码 | +| `err_msg` | | string | 错误信息 | +| `quota_result` | | map | 规则里配置的所有key | +| | `wait_time` | long | 请求需要获取多长时间才能使用配额 | +| | `degrade` | bool | 是否降级 | +| | `duration` | long | 配置周期 | +| | `quota_left` | long | 剩余配额 | +| | `quota_all` | long | 配置的配额 | +| | `quota_result_code` | long | 配额获取结果(0:配额正常,1:配额被限流,2:需求需要等待重试) | > 具体代码使用示例 @@ -878,10 +822,10 @@ arra( *请求参数* -| 一级参数名称 | 参数类型 | 参数用途 | -| :---------------- | :------------------ | :------------------------------- | -| `namespace` | long | 超时时间,单位毫秒 | -| `service` | long | 超时时间,单位毫秒 | +| 一级参数名称 | 参数类型 | 参数用途 | +| :-------------- | :------------------ | :------------------------------- | +| `namespace` | long | 命名空间 | +| `service` | long | 服务名称 | | `response_time` | string | 请求响应时间,字符串数字:"1000" | | `respont_type` | string | "Limit"、"Failed"、"OK" | | `respont_code` | long | 本次请求的标识ID | @@ -892,8 +836,8 @@ arra( | 一级参数名称 | 参数类型 | 参数用途 | | :----------- | :------- | :------------- | -| `code` | int | 方法执行状态码 | -| `err_msg` | string | 错误信息 | +| `code` | int | 方法执行状态码 | +| `err_msg` | string | 错误信息 | > 具体代码使用示例 @@ -915,19 +859,6 @@ $call_result = array( $res = $polaris_client->UpdateCallResult($call_result); var_dump($res); - -/* -arra( - "code" => , - "err_msg" => , - "rule_keys" => array( - "", - "", - "", - "" - ) -) - */ ``` ### InitQuotaWindow @@ -940,20 +871,20 @@ arra( *请求参数* -| 一级参数名称 | 参数类型 | 参数用途 | -| :------------ | :------------------ | :---------------------------------------------------- | -| `subset` | map | 设置请求的所属服务子集,可选 | -| `labels` | map | 设置标签用于选择限流配置 | -| `amount` | string | 设置请求需要分配的配额数量,可选,默认为1,字符串数字 | -| `namespace` | string | 被调服务所在的命名空间 | -| `service` | string | 被调服务名称 | +| 一级参数名称 | 参数类型 | 参数用途 | +| :----------- | :------------------ | :---------------------------------------------------- | +| `subset` | map | 设置请求的所属服务子集,可选 | +| `labels` | map | 设置标签用于选择限流配置 | +| `amount` | string | 设置请求需要分配的配额数量,可选,默认为1,字符串数字 | +| `namespace` | string | 被调服务所在的命名空间 | +| `service` | string | 被调服务名称 | *函数执行返回* | 一级参数名称 | 参数类型 | 参数用途 | | :----------- | :------- | :------------- | -| `code` | int | 方法执行状态码 | -| `err_msg` | string | 错误信息 | +| `code` | int | 方法执行状态码 | +| `err_msg` | string | 错误信息 | > 具体代码使用示例 @@ -977,17 +908,4 @@ $quota_request = array( $res = $polaris_client->InitQuotaWindow($quota_request); var_dump($res); - -/* -arra( - "code" => , - "err_msg" => , - "rule_keys" => array( - "", - "", - "", - "" - ) -) - */ ``` diff --git a/example/README.md b/example/README.md deleted file mode 100644 index 08b35cb..0000000 --- a/example/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Example - -### How To Use - -```shell -php {polaris_consumer.php | polaris_limit_php | polaris_provider.php} -``` \ No newline at end of file diff --git a/example/polaris_consumer.php b/example/polaris_consumer.php deleted file mode 100644 index 6172cc9..0000000 --- a/example/polaris_consumer.php +++ /dev/null @@ -1,25 +0,0 @@ -"; - -if(!extension_loaded('polaris')) { - dl('polaris.' . PHP_SHLIB_SUFFIX); -} - -// 创建一个 polaris-client 实例 -$polaris = new PolarisClient(array( - "config_path" => "/root/Github/polaris-php/polaris.yaml", - "log_dir" => "./" -)); - -$polaris -> InitConsumer(); - -$get_req = array( - "namespace" => "default", - "service" => "polaris_consumer_test", - -); - -$res = $polaris->GetInstances($get_req, 5000, 1); -var_dump($res); - -?> \ No newline at end of file diff --git a/example/polaris_provider.php b/example/polaris_provider.php deleted file mode 100644 index 735a319..0000000 --- a/example/polaris_provider.php +++ /dev/null @@ -1,71 +0,0 @@ -"; - -if(!extension_loaded('polaris')) { - dl('polaris.' . PHP_SHLIB_SUFFIX); -} - -// 创建一个 polaris-provider 实例 -$polaris = new PolarisClient(array( - "config_path" => "/root/Github/polaris-php/polaris.yaml", - "log_dir" => "./" -)); - -$polaris -> InitProvider(); - -// 实例注册信息 -$register_instance_info = array( - "namespace" => "default", - "service" => "polaris_php_test", - "host" => "127.0.0.3", - "port" => "8080", - "heartbeat" => "true", - "protocol" => "gRPC", - "vpc_id" => "", - "weight" => "88", - "ttl" => "3", - "metadata" => array( - "client" => "php" - ) -); - -// 执行实例注册动作 -$res = $polaris->Register($register_instance_info, 5000, 1); -var_dump($res); - - -// 实例心跳信息 -$heartbeat_info = array( - "namespace" => "default", - "service" => "polaris_php_test", - "host" => "127.0.0.3", - "port" => "8080", -); - -// 先进行一次心跳上报,触发实例租约计算任务 -$res = $polaris->Heartbeat($heartbeat_info); -var_dump($res); - -print "sleep 20 second\n"; -// 睡眠等待一段时间,不发实例心跳 -sleep(120); - -// 执行实例注册动作 -$res = $polaris->Heartbeat($heartbeat_info); -var_dump($res); -// 在等待一段时间 -sleep(10); - - -// 实例反注册信息 -$deregister_instance_info = array( - "namespace" => "default", - "service" => "polaris_php_test", - "host" => "127.0.0.3", - "port" => "8080", -); - -// 执行实例反注册动作 -$res = $polaris->Deregister($deregister_instance_info, 5000, 1); -var_dump($res); -?> \ No newline at end of file diff --git a/examples/quickstart/README.md b/examples/quickstart/README.md new file mode 100644 index 0000000..609cff4 --- /dev/null +++ b/examples/quickstart/README.md @@ -0,0 +1,42 @@ +# QuickStart + +根据简单的 php socket 应用示例,演示 php 应用如何快速接入北极星。 + +## 目录介绍 + +> consumer + +php-client 端示例,负责发起 socket 请求。启动时先从北极星拉取一个对应 php-server 的服务地址并发起调用 + +> provider + +php-server 端示例,负责处理 socket 请求。启动时进程1负责处理socket请求,进程2则进行服务实例的注册,并发送心跳维持 +实例的健康状态 + +## 如何构建 + +- 构建对应的 polaris-php 插件, [构建文档](../../doc/HowToBuild.md) + +## 如何使用 + +### 创建服务 + +预先通过北极星控制台创建对应的服务,如果是通过本地一键安装包的方式安装,直接在浏览器通过127.0.0.1:8091打开控制台。 + +![create_service](./image/create_php_service.png) + +### 执行程序 + +运行 php-server + +```shell +cd provider +php provider.php +``` + +运行 php-client + +```shell +cd consumer +php consumer.php +``` \ No newline at end of file diff --git a/examples/quickstart/consumer/consumer.php b/examples/quickstart/consumer/consumer.php new file mode 100644 index 0000000..39dc56b --- /dev/null +++ b/examples/quickstart/consumer/consumer.php @@ -0,0 +1,59 @@ +"; + +if(!extension_loaded('polaris')) { + dl('polaris.' . PHP_SHLIB_SUFFIX); +} + +// 创建一个 polaris-client 实例 +$polaris = new PolarisClient(array( + "config_path" => "./polaris.yaml", + "log_dir" => "./" +)); + +$polaris -> InitConsumer(); + +$get_req = array( + "namespace" => "default", + "service" => "polaris_php_test", + +); + +$res = $polaris->GetOneInstance($get_req, 5000, 1); + +$instances = $res["response"]["instances"]; + +$address = $instances[0]['host']; +$service_port = (int)$instances[0]["port"]; + +// 创建并返回一个套接字(通讯节点) +$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); +if ($socket === false) { + echo "socket_create() failed, reason: ".socket_strerror(socket_last_error())."\n"; +} + +echo "Attempting to connect to '$address' on port '$service_port'..."; +// 发起socket连接请求 +$result = socket_connect($socket, $address, $service_port); +if($result === false) { + echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($socket))."\n"; + exit(1); +} else { + echo "Connect success. \n"; +} + +$input = "This is a message from client"."\n"; + +// 向socket服务器发送消息 +socket_write($socket, $input, strlen($input)); +echo "Client send success \n"; + +echo "Reading response:\n"; +// 读取socket服务器发送的消息 +while ($out = socket_read($socket, 8192)) { + echo $out; +} +echo PHP_EOL; +socket_close($socket); // 关闭socket连接 + +?> \ No newline at end of file diff --git a/examples/quickstart/consumer/polaris.yaml b/examples/quickstart/consumer/polaris.yaml new file mode 100644 index 0000000..94c61d1 --- /dev/null +++ b/examples/quickstart/consumer/polaris.yaml @@ -0,0 +1,4 @@ +global: + serverConnector: + addresses: + - 127.0.0.1:8091 diff --git a/examples/quickstart/image/create_php_service.png b/examples/quickstart/image/create_php_service.png new file mode 100644 index 0000000..38e2a2e Binary files /dev/null and b/examples/quickstart/image/create_php_service.png differ diff --git a/examples/quickstart/provider/polaris.yaml b/examples/quickstart/provider/polaris.yaml new file mode 100644 index 0000000..94c61d1 --- /dev/null +++ b/examples/quickstart/provider/polaris.yaml @@ -0,0 +1,4 @@ +global: + serverConnector: + addresses: + - 127.0.0.1:8091 diff --git a/examples/quickstart/provider/provider.php b/examples/quickstart/provider/provider.php new file mode 100644 index 0000000..5713d03 --- /dev/null +++ b/examples/quickstart/provider/provider.php @@ -0,0 +1,99 @@ +_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + if ($this->_socket === false) { + die(socket_strerror(socket_last_error($this->_socket))); + } + } + + public function run() + { + $bind_ok = socket_bind($this->_socket, $this->ip, $this->port); + + if ($bind_ok === false) { + echo "socket_bind() failed, reason: ".socket_strerror(socket_last_error())."\n"; + } else { + echo "socket_bind() success"; + } + + socket_listen($this->_socket, 5); + while(true) { + $socketAccept = socket_accept($this->_socket); + $request = socket_read($socketAccept, 1024); + echo "receive from client '$request'"; + socket_write($socketAccept, 'hello. I`m provider', strlen('hello. I`m provider')); + socket_close($socketAccept); + } + } + + public function close() + { + socket_close($this->_socket); + } +} + + +$pid = pcntl_fork(); +if ( $pid == 0 ) { + // 创建一个 polaris-provider 实例 + $polaris = new PolarisClient(array( + "config_path" => "./polaris.yaml", + "log_dir" => "./" + )); + + $polaris -> InitProvider(); + + // 实例注册信息 + $register_instance_info = array( + "namespace" => "default", + "service" => "polaris_php_test", + "host" => "127.0.0.1", + "port" => "9996", + "heartbeat" => "true", + "protocol" => "TCP", + "vpc_id" => "", + "weight" => "88", + "ttl" => "5", + "metadata" => array( + "client" => "php" + ) + ); + + // 执行实例注册动作 + $res = $polaris->Register($register_instance_info, 5000, 1); + var_dump($res); + + // 实例心跳信息 + $heartbeat_info = array( + "namespace" => "default", + "service" => "polaris_php_test", + "host" => "127.0.0.1", + "port" => "9996", + ); + while (true) { + // 先进行一次心跳上报,触发实例租约计算任务 + $res = $polaris->Heartbeat($heartbeat_info); + sleep(4); + var_dump($res); + } +} else { + echo "run tpc server\n"; + $tcp_server = new TCPServer(); + $tcp_server->run(); +} +?> \ No newline at end of file diff --git a/examples/ratelimit/README.md b/examples/ratelimit/README.md new file mode 100644 index 0000000..ce153f7 --- /dev/null +++ b/examples/ratelimit/README.md @@ -0,0 +1,59 @@ +# RateLimit Example + +根据简单的 polaris-php 使用示例,演示 php 应用如何快速使用北极星的服务限流功能。 + +## 如何构建 + +- 构建对应的 polaris-php 插件, [构建文档](../../doc/HowToBuild.md) + +## 如何使用 + +### 创建服务 + +- 预先通过北极星控制台创建对应的服务,如果是通过本地一键安装包的方式安装,直接在浏览器通过127.0.0.1:8091打开控制台。 + - ![create_service](./image/create_php_service.png) +- 配置该服务的限流参数 + - ![setting_ratelimit](./image/setting_ratelimit_rule.png) + + +### 执行程序 + +```shell +php ratelimit.php +``` + +观察输出结果 + +- 第一次输出期望值 + +``` +array(3) { + ["code"]=> int(0) + ["err_msg"]=> string(9) "0-success" + ["quota_result"]=> array(6) { + ["quota_result_code"]=> int(0) // 配额正常 + ["quota_duration"]=> int(1000) + ["quota_left"]=> int(0) + ["quota_all"]=> int(1) + ["degrade"]=> bool(false) + ["wait_time"]=> int(0) + } +} +``` + +- 第二次输出期望值 + +``` +array(3) { + ["code"]=> int(0) + ["err_msg"]=> string(9) "0-success" + ["quota_result"]=> array(6) { + ["quota_result_code"]=> int(1) // 配额被限流 + ["quota_duration"]=> int(1000) + ["quota_left"]=> int(0) + ["quota_all"]=> int(1) + ["degrade"]=> bool(false) + ["wait_time"]=> int(0) + } +} +``` \ No newline at end of file diff --git a/examples/ratelimit/image/create_php_service.png b/examples/ratelimit/image/create_php_service.png new file mode 100644 index 0000000..38e2a2e Binary files /dev/null and b/examples/ratelimit/image/create_php_service.png differ diff --git a/examples/ratelimit/image/setting_ratelimit_rule.png b/examples/ratelimit/image/setting_ratelimit_rule.png new file mode 100644 index 0000000..d5d004b Binary files /dev/null and b/examples/ratelimit/image/setting_ratelimit_rule.png differ diff --git a/examples/ratelimit/polaris.yaml b/examples/ratelimit/polaris.yaml new file mode 100644 index 0000000..94c61d1 --- /dev/null +++ b/examples/ratelimit/polaris.yaml @@ -0,0 +1,4 @@ +global: + serverConnector: + addresses: + - 127.0.0.1:8091 diff --git a/example/polaris_limit.php b/examples/ratelimit/ratelimit.php similarity index 68% rename from example/polaris_limit.php rename to examples/ratelimit/ratelimit.php index 329f925..7d584e2 100644 --- a/example/polaris_limit.php +++ b/examples/ratelimit/ratelimit.php @@ -7,16 +7,13 @@ // 创建一个 polaris-provider 实例 $polaris = new PolarisClient(array( - "config_path" => "/root/Github/polaris-php/polaris.yaml", + "config_path" => "./polaris.yaml", "log_dir" => "./" )); $polaris->InitLimit(); -var_dump($req_test_1); -var_dump($res); - -$req_test_3 = array( +$client_req = array( "namespace" => "default", "service" => "polaris_php_test", "labels" => array( @@ -26,9 +23,9 @@ ); // FetchRuleLabelKeys -$res = $polaris->GetQuota($req_test_3); +$res = $polaris->GetQuota($client_req); var_dump($res); -$res = $polaris->GetQuota($req_test_3); +$res = $polaris->GetQuota($client_req); var_dump($res); ?> \ No newline at end of file