一、简介

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. Linux ns 6. Network Namespace 详解

    文章目录 1. 简介 1.1 Docker Network 桥接模式配置 2. 代码解析 2.1 copy_net_ns() 2.2 pernet_list 2.2.1 loopback_net_op ...

  2. SpringCloud config native 配置

    1.概述 最近项目使用springCloud 框架,使用config搭建git作为配置中心. 在私有化部署中,出现很多比较麻烦的和鸡肋的设计. 每次部署都需要安装gitlab 有些环境安装完gitla ...

  3. 普通邮箱设置客户端授权码并开启stmp服务以及关于QQ邮箱“命令顺序不正确。 服务器响应为:Error: need EHLO and AUTH first !”问题全指导

    Zoomla!逐浪CMS带有强大的邮局功能,可以用于发送邮件与进行事务管理. 其中邮局配置大家不太熟悉这里提供一系列教程. 1.首先在QQ邮箱当中开启"POP3/SMTP服务" 2 ...

  4. 大爽Python入门教程 3-4 实践例题

    大爽Python入门公开课教案 点击查看教程总目录 1. 求和 使用循环,计算列表所有项的和,并输出这个和. 列表示例 lst = [8, 5, 7, 12, 19, 21, 10, 3, 2, 11 ...

  5. python中jsonpath模块,解析多层嵌套的json数据

    1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...

  6. Django 项目配置拆分独立

    目录 一.创建配置目录 二.创建基础配置文件 三.创建各个环境的配置 四.调整settings.py 五.程序使用 六.目录结构 Django 项目中,我们默认的配置是都在 settings.py 文 ...

  7. [bzoj1691]挑剔的美食家

    考虑将奶牛和牧草放在一起,根据鲜嫩程度排序,那么显然就可以发现一个贪心策略:每一头奶牛一定选择当前剩余的最便宜且符合条件的牧草,然后用一个set维护价格即可 1 #include<bits/st ...

  8. [bzoj1115]石子游戏

    考虑令$bi=ai-a_{i-1}$,那么每一次操作相当于让$bi-=x$且$b_{i+1}+=x$,相当于从i向i+1移动x个石子,那么容易发现偶数堆没有用处,因为另一方可以用同样的操作,因此问题相 ...

  9. 多声部处理细节之crossstaff音符处理

    下面给出这几个案例的代码 ,可直接粘贴编译. \version "2.20.0" \language "english" \paper { #(set-pape ...

  10. CF713C Sonya and Problem Wihtout a Legend

    考虑我们直接选择一个暴力\(dp\). \(f_{i,j} = min_{k<=j}\ (f_{i - 1,k}) + |a_i - j|\) 我们考虑到我们直接维护在整个数域上\(min(f_ ...