一、简介

Turbine是聚合服务器发送事件流数据的一个工具,Hystrix的监控中,只能监控单个节点,实际生产中都为集群,因此可以通过Turbine来监控集群下Hystrix的metrics情况

Turbine的github地址:https://github.com/Netflix/Turbine

二、基本环境

  • 一个eureka模块
  • 两个消费者模块
  • 一个turbine监控模块

三、创建eureka模块

(1)创建项目

创建一个spring boot项目

(2)依赖


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.abc</groupId>
  6. <artifactId>00-eurekaserver-8000</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <parent>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-parent</artifactId>
  12. <version>2.1.7.RELEASE</version>
  13. <relativePath/> <!-- lookup parent from repository -->
  14. </parent>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. </dependency>
  29. <!--热部署依赖-->
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <optional>true</optional>
  34. </dependency>
  35. </dependencies>
  36. <dependencyManagement>
  37. <dependencies>
  38. <dependency>
  39. <groupId>org.springframework.cloud</groupId>
  40. <artifactId>spring-cloud-dependencies</artifactId>
  41. <version>${spring-cloud.version}</version>
  42. <type>pom</type>
  43. <scope>import</scope>
  44. </dependency>
  45. </dependencies>
  46. </dependencyManagement>
  47. <build>
  48. <plugins>
  49. <plugin>
  50. <groupId>org.springframework.boot</groupId>
  51. <artifactId>spring-boot-maven-plugin</artifactId>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>

(3)application.yml配置


  1. server:
  2. port: 8000
  3. eureka:
  4. instance:
  5. hostname: localhost # 指定Eureka主机
  6. client:
  7. register-with-eureka: false # 指定当前主机是否向Eureka服务器进行注册
  8. fetch-registry: false # 指定当前主机是否要从Eurka服务器下载服务注册列表
  9. service-url: # 服务暴露地址
  10. defaultZone: http://localhost:8000/eureka
  11. # defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
  12. # server:
  13. # enable-self-preservation: false # 关闭自我保护

(4)启动类


  1. package com.abc.eureka;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
  5. @SpringBootApplication
  6. @EnableEurekaServer // 开启Eureka服务
  7. public class EurekaServerApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(EurekaServerApplication.class, args);
  10. }
  11. }

四、创建消费者09-consumer-turbine-8080

(1)创建项目

创建一个spring boot项目

(2)依赖


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.abc</groupId>
  12. <artifactId>09-consumer-turbine-8080</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>09-consumer-turbine-8080</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <!--hystrix依赖-->
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  25. </dependency>
  26. <!--feign依赖-->
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-starter-openfeign</artifactId>
  30. </dependency>
  31. <!-- hystrix-dashboard依赖 -->
  32. <dependency>
  33. <groupId>org.springframework.cloud</groupId>
  34. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  35. </dependency>
  36. <!--actuator依赖-->
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-actuator</artifactId>
  40. </dependency>
  41. <!--eureka客户端依赖-->
  42. <dependency>
  43. <groupId>org.springframework.cloud</groupId>
  44. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-web</artifactId>
  49. </dependency>
  50. <!-- https://mvnrepository.com/artifact/org.webjars.bower/jquery -->
  51. <dependency>
  52. <groupId>org.webjars.bower</groupId>
  53. <artifactId>jquery</artifactId>
  54. <version>2.1.1</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.projectlombok</groupId>
  58. <artifactId>lombok</artifactId>
  59. <optional>true</optional>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  64. </dependency>
  65. <!--热部署依赖-->
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-devtools</artifactId>
  69. <optional>true</optional>
  70. </dependency>
  71. </dependencies>
  72. <dependencyManagement>
  73. <dependencies>
  74. <dependency>
  75. <groupId>org.springframework.cloud</groupId>
  76. <artifactId>spring-cloud-dependencies</artifactId>
  77. <version>${spring-cloud.version}</version>
  78. <type>pom</type>
  79. <scope>import</scope>
  80. </dependency>
  81. </dependencies>
  82. </dependencyManagement>
  83. <build>
  84. <plugins>
  85. <plugin>
  86. <groupId>org.springframework.boot</groupId>
  87. <artifactId>spring-boot-maven-plugin</artifactId>
  88. </plugin>
  89. </plugins>
  90. </build>
  91. </project>

(3)application.yml配置


  1. # 在微服务网关zuul中演示时需要该工程的端口号为8090
  2. server:
  3. port: 8080
  4. spring:
  5. application: # 指定微服务对外暴露的名称
  6. name: abcmsc-consumer-depart01
  7. eureka:
  8. client:
  9. service-url:
  10. defaultZone: http://localhost:8000/eureka
  11. # instance:
  12. # metadata-map:
  13. # cluster: ribbon
  14. # 开启Feign对Hystrix的支持
  15. feign:
  16. hystrix:
  17. enabled: true
  18. client:
  19. config:
  20. default:
  21. connectTimeout: 5000 # 指定Feign连接提供者的超时时限
  22. readTimeout: 5000 # 指定Feign从请求到获取提供者响应的超时时限
  23. # 开启actuator的所有web终端
  24. management:
  25. endpoints:
  26. web:
  27. exposure:
  28. include: "*"
  29. # 设置服务熔断时限
  30. hystrix:
  31. command:
  32. default:
  33. execution:
  34. isolation:
  35. thread:
  36. timeoutInMilliseconds: 3000

(4)实体类Depart


  1. package com.abc.consumer.bean;
  2. import lombok.Data;
  3. @Data
  4. public class Depart {
  5. private Integer id;
  6. private String name;
  7. }

(5)DepartCodeConfig类


  1. package com.abc.consumer.codeconfig;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. @Configuration
  7. public class DepartCodeConfig {
  8. @LoadBalanced // 开启消息者端的负载均衡功能,默认是轮询策略
  9. @Bean
  10. public RestTemplate restTemplate() {
  11. return new RestTemplate();
  12. }
  13. }

(6)DepartController类


  1. package com.abc.consumer.controller;
  2. import com.abc.consumer.bean.Depart;
  3. import com.abc.consumer.service.DepartService;
  4. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.web.bind.annotation.*;
  7. import java.util.List;
  8. @RestController
  9. @RequestMapping("/consumer/depart")
  10. public class DepartController {
  11. @Autowired
  12. DepartService service;
  13. // 服务降级:若当前处理器方法发生异常,则执行fallbackMethod属性指定的方法
  14. @HystrixCommand(fallbackMethod = "getHystrixHandle")
  15. @GetMapping("/get/{id}")
  16. public Depart getHandle(@PathVariable("id") int id) {
  17. return service.getDepartById(id);
  18. }
  19. public Depart getHystrixHandle(@PathVariable("id") int id) {
  20. Depart depart = new Depart();
  21. depart.setId(id);
  22. depart.setName("no this depart -- 方法级别");
  23. return depart;
  24. }
  25. }

(7)DepartService类


  1. package com.abc.consumer.service;
  2. import com.abc.consumer.bean.Depart;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.web.bind.annotation.*;
  6. import java.util.List;
  7. @Service
  8. // 指定当前Service所绑定的提供者微服务名称
  9. // fallback指定该接口所绑定的服务降级类
  10. @FeignClient(value = "abcmsc-provider-depart")
  11. @RequestMapping("/provider/depart")
  12. public interface DepartService {
  13. @GetMapping("/get/{id}")
  14. Depart getDepartById(@PathVariable("id") int id);
  15. }

(8)启动类


  1. package com.abc.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.cloud.client.SpringCloudApplication;
  4. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  5. import org.springframework.cloud.openfeign.EnableFeignClients;
  6. // 指定Service接口所在的包,开启OpenFeign客户端
  7. @EnableFeignClients(basePackages = "com.abc.consumer.service")
  8. @SpringCloudApplication
  9. @EnableHystrixDashboard // 开启Hystrix仪表盘功能
  10. public class Consumer01Application {
  11. public static void main(String[] args) {
  12. SpringApplication.run(Consumer01Application.class, args);
  13. }
  14. }

五、创建消费者09-consumer-turbine-8081

(1)复制项目09-consumer-turbine-8080

(2)修改依赖

(3)修改application.yml配置

(4)修改09-consumer-turbine-8081.iml

六、创建消费者turbine监控

(1)创建项目

创建一个spring boot项目

(2)依赖


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.7.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.abc</groupId>
  12. <artifactId>09-consumer-turbine-monitor-9000</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>09-consumer-turbine-monitor-9000</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
  24. </dependency>
  25. <!--hystrix依赖-->
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  29. </dependency>
  30. <!--feign依赖-->
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-openfeign</artifactId>
  34. </dependency>
  35. <!-- hystrix-dashboard依赖 -->
  36. <dependency>
  37. <groupId>org.springframework.cloud</groupId>
  38. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  39. </dependency>
  40. <!--actuator依赖-->
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-actuator</artifactId>
  44. </dependency>
  45. <!--eureka客户端依赖-->
  46. <dependency>
  47. <groupId>org.springframework.cloud</groupId>
  48. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-web</artifactId>
  53. </dependency>
  54. <!-- https://mvnrepository.com/artifact/org.webjars.bower/jquery -->
  55. <dependency>
  56. <groupId>org.webjars.bower</groupId>
  57. <artifactId>jquery</artifactId>
  58. <version>2.1.1</version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.projectlombok</groupId>
  62. <artifactId>lombok</artifactId>
  63. <optional>true</optional>
  64. </dependency>
  65. <!--热部署依赖-->
  66. <dependency>
  67. <groupId>org.springframework.boot</groupId>
  68. <artifactId>spring-boot-devtools</artifactId>
  69. <optional>true</optional>
  70. </dependency>
  71. </dependencies>
  72. <dependencyManagement>
  73. <dependencies>
  74. <dependency>
  75. <groupId>org.springframework.cloud</groupId>
  76. <artifactId>spring-cloud-dependencies</artifactId>
  77. <version>${spring-cloud.version}</version>
  78. <type>pom</type>
  79. <scope>import</scope>
  80. </dependency>
  81. </dependencies>
  82. </dependencyManagement>
  83. <build>
  84. <plugins>
  85. <plugin>
  86. <groupId>org.springframework.boot</groupId>
  87. <artifactId>spring-boot-maven-plugin</artifactId>
  88. </plugin>
  89. </plugins>
  90. </build>
  91. </project>

(3)application.yml配置


  1. server:
  2. port: 9000
  3. spring:
  4. application: # 指定微服务对外暴露的名称
  5. name: 09-consumer-turbine-monitor-9000
  6. eureka:
  7. client:
  8. service-url: # 指定Eureka服务注册中心
  9. defaultZone: http://localhost:8000/eureka
  10. # 开启Feign对Hystrix的支持
  11. feign:
  12. hystrix:
  13. enabled: true
  14. client:
  15. config:
  16. default:
  17. connectTimeout: 5000 # 指定Feign连接提供者的超时时限
  18. readTimeout: 5000 # 指定Feign从请求到获取提供者响应的超时时限
  19. # 开启actuator的所有web终端
  20. management:
  21. endpoints:
  22. web:
  23. exposure:
  24. include: "*"
  25. # 设置服务熔断时限
  26. hystrix:
  27. command:
  28. default:
  29. execution:
  30. isolation:
  31. thread:
  32. timeoutInMilliseconds: 3000
  33. turbine:
  34. app-config: abcmsc-consumer-depart01,abcmsc-consumer-depart02
  35. cluster-name-expression: new String("default")
  36. combine-host-port: true
  37. instanceUrlSuffix: /actuator/hystrix.stream #turbine默认监控actuator/路径下的端点,修改直接监控hystrix.stream
  38. #cluster-name-expression: metadata['cluster']
  39. #aggregator:
  40. # cluster-config: ribbon
  41. #instanceUrlSuffix: /hystrix.stream #turbine默认监控actuator/路径下的端点,修改直接监控hystrix.stream

(4)启动类


  1. package com.abc.consumer;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  5. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  6. import org.springframework.cloud.netflix.turbine.EnableTurbine;
  7. @SpringBootApplication
  8. @EnableTurbine
  9. @EnableHystrixDashboard
  10. @EnableEurekaClient
  11. public class MonitorApplication {
  12. public static void main(String[] args) {
  13. SpringApplication.run(MonitorApplication.class, args);
  14. }
  15. /*@Bean
  16. public ServletRegistrationBean getServlet() {
  17. HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
  18. ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
  19. registrationBean.setLoadOnStartup(1);
  20. registrationBean.addUrlMappings("/actuator/hystrix.stream);
  21. registrationBean.setName("HystrixMetricsStreamServlet");
  22. return registrationBean;
  23. }*/
  24. }

七、启动

(1)启动eureka模块

(2)启动两个消费者模块

(3)启动turbine监控模块

八、效果

(1)请求http://localhost:8080/consumer/depart/get/1

(1)请求http://localhost:8081/consumer/depart/get/1

浏览器访问http://localhost:9000/hystrix

输入http://localhost:9000/turbine.stream

其他说明

图片说明借鉴  https://www.jianshu.com/p/590bad4c8947

Turbine使用的更多相关文章

  1. 第二十六章 hystrix-dashboard + turbine

    一.使用turbine的意义 引入多个hystrix stream: 1.使用hystrix-dashboard的可以添加多个stream的功能 图中添加的两个stream会在真正monitor的时候 ...

  2. 附7 turbine

    一.作用 聚集同一个微服务的相同的commandKey.Threadpool.commandGroupKey数据进行聚合 二.配置 1.集群(cluster)(turbine聚集数据的粒度) turb ...

  3. apache开源项目-- Turbine

    1.缘起 Jetspeed是Apache Jakarta小组的开放源码门户系统.它使得最终用户可以通过WAP手机.浏览器.PDA等各种设备来使用各种各样的网络资源(比如应用程序.数据以及这之外的任何网 ...

  4. springcloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  5. spring cloud熔断监控Hystrix Dashboard和Turbine

    参考: http://blog.csdn.net/ityouknow/article/details/72625646 完整pom <?xml version="1.0" e ...

  6. 改造断路器集群监控Hystrix Turbine实现自动注册消费者、实时监控多个服务

    在上一篇文章中,我们搭建了Hystrix Dashoard,对指定接口进行监控.但是只能对一个接口进行监听,功能比较局限: Turbine:汇总系统内多个服务的数据并显示到 Hystrix Dashb ...

  7. spring cloud(五)熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  8. Spring Cloud Turbine微服务集群实时监控

    本文代码下载地址: https://gitlab.com/mySpringCloud/turbine SpringBoot版本:1.5.9.RELEASE (稳定版) SpringCloud版本:Ed ...

  9. SpringCloud系列七:Hystrix 熔断机制(Hystrix基本配置、服务降级、HystrixDashboard服务监控、Turbine聚合监控)

    1.概念:Hystrix 熔断机制 2.具体内容 所谓的熔断机制和日常生活中见到电路保险丝是非常相似的,当出现了问题之后,保险丝会自动烧断,以保护我们的电器, 那么如果换到了程序之中呢? 当现在服务的 ...

  10. Spring Cloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine

    1. Hystrix Dashboard (断路器:hystrix 仪表盘)  Hystrix一个很重要的功能是,可以通过HystrixCommand收集相关数据指标. Hystrix Dashboa ...

随机推荐

  1. 【Python+postman接口自动化测试】(2)什么是接口?

    接口的概念 接口又称API(Application Programming Interface,应用程序编程接口),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的 ...

  2. centos yum更换阿里镜像

    #1.如果没有wget命令,则需要执行下面命令进行安装.为保险期间,先执行下面命令. yum install wget #2.备份原镜像源,以免出错后可以恢复. mv /etc/yum.repos.d ...

  3. 使用Charles请求跳转可作为线上和线下环境的切换

    举个例子: 1.后端拿测试环境的客户端调试本地的代码 2.连接后端本地服务测试客户端和后端的交互 这样就可以改变客户端请求的测试环境换成其他的环境 一.配置 tools--Map remot... 这 ...

  4. golang常用库:日志记录库-logrus使用

    介绍 logrus 它是一个结构化.插件化的日志记录库.完全兼容 golang 标准库中的日志模块.它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输 ...

  5. 一个反直觉的sql

    引子 在<容易引起雪崩的两个处理>里,我提到一个慢查询的问题.本文先从整洁架构的角度讲讲慢查询sql完成的功能以及设计,再介绍对sql进行的实施测试现象以及思考. 设计讲解 一见杨过误终身 ...

  6. [第三章]c++学习笔记2(静态成员变量)

    静态成员:在说明前加了static关键字的对象 使用例: 基本概念 普通成员变量每个对象有各自的一份,而静态成员变量总共只有一份,为所有对象共享. 普通成员函数必须具体作用与某个对象,而静态成员函数并 ...

  7. python实现高斯图像金字塔

    一,定义 图像金字塔:同一图像的不同分辨率的子图集合,其生成方式有向上取样和向下取样.向下取样是从G0采样形成分辨率较低的G1,G1再采样形成分辨率较低的G2......,就构成了一个金字塔.向下取样 ...

  8. [EntityFramework]记录Linq中如何比较数据库中Timestamp列的方法(如大于0x00000000000007D1的记录)

    Timestamp对于EF实体的类型是byte[] class Program { static void Main(string[] args) { using (var context = new ...

  9. [loj3276]遗迹

    假设已知$a_{i}$,通过以下方式确定$b_{i}$:从后往前枚举每一个数$i$,先令$b_{i}=a_{i}$,再将$b_{i}$不断减1直至不存在$j>i$且$b_{i}=b_{j}$或$ ...

  10. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...