brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们定制,而ServerRequestInterceptor和ServerResponseInterceptor是在BraveServletFilter部分直接指定就好了(这在任何client技术下都可以复用)。

实际上,ClientRequestInterceptor和ClientResponseInterceptor也是我们的定制点

一、代码

基本参考第二十七章 springboot + zipkin(brave-okhttp实现)

1、service1

1.1、pom.xml

  1. <!-- zipkin brave -->
  2. <dependency>
  3. <groupId>io.zipkin.brave</groupId>
  4. <artifactId>brave-core</artifactId>
  5. <version>3.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-spancollector-http</artifactId>
  10. <version>3.9.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.zipkin.brave</groupId>
  14. <artifactId>brave-web-servlet-filter</artifactId>
  15. <version>3.9.0</version>
  16. </dependency>
  17. <!-- async-http-client -->
  18. <dependency>
  19. <groupId>com.ning</groupId>
  20. <artifactId>async-http-client</artifactId>
  21. <version>1.9.31</version>
  22. </dependency>

1.2、ZipkinConfig

  1. package com.xxx.service1.zipkin.brave.async;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import com.github.kristofa.brave.Brave;
  7. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  8. import com.github.kristofa.brave.Sampler;
  9. import com.github.kristofa.brave.SpanCollector;
  10. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  11. import com.github.kristofa.brave.http.HttpSpanCollector;
  12. import com.github.kristofa.brave.servlet.BraveServletFilter;
  13. import com.ning.http.client.AsyncHttpClient;
  14.  
  15. @Configuration
  16. public class ZipkinConfig {
  17. @Bean
  18. public SpanCollector spanCollector() {
  19. HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
  20. .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
  21. .connectTimeout(5000)//5s,默认10s
  22. .flushInterval(1)//1s
  23. .readTimeout(6000)//5s,默认60s
  24. .build();
  25. return HttpSpanCollector.create("http://localhost:9411",
  26. spanConfig,
  27. new EmptySpanCollectorMetricsHandler());
  28. }
  29.  
  30. @Bean
  31. public Brave brave(SpanCollector spanCollector) {
  32. Brave.Builder builder = new Brave.Builder("asyn1 - service1 - 1");//指定serviceName
  33. builder.spanCollector(spanCollector);
  34. builder.traceSampler(Sampler.create(1));//采集率
  35. return builder.build();
  36. }
  37.  
  38. @Bean
  39. public BraveServletFilter braveServletFilter(Brave brave) {
  40. /**
  41. * 设置sr、ss拦截器
  42. */
  43. return new BraveServletFilter(brave.serverRequestInterceptor(),
  44. brave.serverResponseInterceptor(),
  45. new DefaultSpanNameProvider());
  46. }
  47.  
  48. @Bean
  49. public AsyncHttpClient asyncHttpClient(){
  50. return new AsyncHttpClient();
  51. }
  52. }

说明:指定了serviceName:"asyn1 - service1 - 1"

1.3、ZipkinAsyncController

  1. package com.xxx.service1.zipkin.brave.async;
  2.  
  3. import java.net.URI;
  4. import java.util.concurrent.Future;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.RestController;
  10.  
  11. import com.github.kristofa.brave.Brave;
  12. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  13. import com.github.kristofa.brave.http.HttpClientRequest;
  14. import com.github.kristofa.brave.http.HttpClientRequestAdapter;
  15. import com.github.kristofa.brave.http.HttpClientResponseAdapter;
  16. import com.github.kristofa.brave.http.HttpResponse;
  17. import com.ning.http.client.AsyncHttpClient;
  18. import com.ning.http.client.Request;
  19. import com.ning.http.client.RequestBuilder;
  20. import com.ning.http.client.Response;
  21.  
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiOperation;
  24.  
  25. @Api("zipkin brave async api")
  26. @RestController
  27. @RequestMapping("/zipkin/async/service1")
  28. public class ZipkinAsyncController {
  29.  
  30. @Autowired
  31. private AsyncHttpClient asyncHttpClient;
  32. @Autowired
  33. private Brave brave;
  34.  
  35. @ApiOperation("trace第一步")
  36. @RequestMapping(value = "/test1", method = RequestMethod.GET)
  37. public String myboot() {
  38.  
  39. try {
  40. RequestBuilder builder = new RequestBuilder();
  41. String url = "http://localhost:8032/zipkin/async/service2/test2";
  42. builder.setUrl(url);
  43. Request request = builder.build();
  44.  
  45. clientRequestInterceptor(request);
  46. Future<Response> response = asyncHttpClient.executeRequest(request);
  47. clientResponseInterceptor(response.get());
  48.  
  49. return response.get().getResponseBody();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. return "";
  53. }
  54. }
  55.  
  56. private void clientRequestInterceptor(Request request) {
  57. brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() {
  58.  
  59. @Override
  60. public URI getUri() {
  61. return URI.create(request.getUrl());
  62. }
  63.  
  64. @Override
  65. public String getHttpMethod() {
  66. return request.getMethod();
  67. }
  68.  
  69. @Override
  70. public void addHeader(String headerKey, String headerValue) {
  71. request.getHeaders().add(headerKey, headerValue);
  72. }
  73. }, new DefaultSpanNameProvider()));
  74. }
  75.  
  76. private void clientResponseInterceptor(Response response) {
  77. brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() {
  78. public int getHttpStatusCode() {
  79. return response.getStatusCode();
  80. }
  81. }));
  82. }
  83.  
  84. }

说明:

  • clientRequestInterceptor(com.ning.http.client.Request request)

    • 其实就是在做cs
  • clientResponseInterceptor(com.ning.http.client.Response response)
    • 其实就是在做cr

2、service2

2.1、pom.xml

  1. <!-- zipkin brave -->
  2. <dependency>
  3. <groupId>io.zipkin.brave</groupId>
  4. <artifactId>brave-core</artifactId>
  5. <version>3.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-spancollector-http</artifactId>
  10. <version>3.9.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.zipkin.brave</groupId>
  14. <artifactId>brave-web-servlet-filter</artifactId>
  15. <version>3.9.0</version>
  16. </dependency>
  17. <!-- async-http-client -->
  18. <dependency>
  19. <groupId>com.ning</groupId>
  20. <artifactId>async-http-client</artifactId>
  21. <version>1.9.31</version>
  22. </dependency>

2.2、ZipkinConfig

  1. package com.xxx.service1.zipkin.brave.async;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import com.github.kristofa.brave.Brave;
  7. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  8. import com.github.kristofa.brave.Sampler;
  9. import com.github.kristofa.brave.SpanCollector;
  10. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  11. import com.github.kristofa.brave.http.HttpSpanCollector;
  12. import com.github.kristofa.brave.servlet.BraveServletFilter;
  13. import com.ning.http.client.AsyncHttpClient;
  14.  
  15. @Configuration
  16. public class ZipkinConfig {
  17. @Bean
  18. public SpanCollector spanCollector() {
  19. HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
  20. .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
  21. .connectTimeout(5000)//5s,默认10s
  22. .flushInterval(1)//1s
  23. .readTimeout(6000)//5s,默认60s
  24. .build();
  25. return HttpSpanCollector.create("http://localhost:9411",
  26. spanConfig,
  27. new EmptySpanCollectorMetricsHandler());
  28. }
  29.  
  30. @Bean
  31. public Brave brave(SpanCollector spanCollector) {
  32. Brave.Builder builder = new Brave.Builder("asyn2 - service2 - 2");//指定serviceName
  33. builder.spanCollector(spanCollector);
  34. builder.traceSampler(Sampler.create(1));//采集率
  35. return builder.build();
  36. }
  37.  
  38. @Bean
  39. public BraveServletFilter braveServletFilter(Brave brave) {
  40. /**
  41. * 设置sr、ss拦截器
  42. */
  43. return new BraveServletFilter(brave.serverRequestInterceptor(),
  44. brave.serverResponseInterceptor(),
  45. new DefaultSpanNameProvider());
  46. }
  47.  
  48. @Bean
  49. public AsyncHttpClient asyncHttpClient(){
  50. return new AsyncHttpClient();
  51. }
  52. }

说明:指定了serviceName:"asyn2 - service2 - 2"

2.3、ZipkinAsyncController

  1. package com.xxx.service2.zipkin.brave.async;
  2.  
  3. import java.net.URI;
  4. import java.util.concurrent.Future;
  5.  
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.RestController;
  10.  
  11. import com.github.kristofa.brave.Brave;
  12. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  13. import com.github.kristofa.brave.http.HttpClientRequest;
  14. import com.github.kristofa.brave.http.HttpClientRequestAdapter;
  15. import com.github.kristofa.brave.http.HttpClientResponseAdapter;
  16. import com.github.kristofa.brave.http.HttpResponse;
  17. import com.ning.http.client.AsyncHttpClient;
  18. import com.ning.http.client.Request;
  19. import com.ning.http.client.RequestBuilder;
  20. import com.ning.http.client.Response;
  21.  
  22. import io.swagger.annotations.Api;
  23. import io.swagger.annotations.ApiOperation;
  24.  
  25. @Api("zipkin brave async api")
  26. @RestController
  27. @RequestMapping("/zipkin/async/service2")
  28. public class ZipkinAsyncController {
  29.  
  30. @Autowired
  31. private AsyncHttpClient asyncHttpClient;
  32. @Autowired
  33. private Brave brave;
  34.  
  35. @ApiOperation("trace第2步")
  36. @RequestMapping(value = "/test2", method = RequestMethod.GET)
  37. public String myboot2() {
  38.  
  39. try {
  40. /*****************************serivce3*******************************/
  41. RequestBuilder builder3 = new RequestBuilder();
  42. String url3 = "http://localhost:8033/zipkin/async/service3/test3";
  43. builder3.setUrl(url3);
  44. Request request3 = builder3.build();
  45.  
  46. clientRequestInterceptor(request3);
  47. Future<Response> response3 = asyncHttpClient.executeRequest(request3);
  48. clientResponseInterceptor(response3.get());
  49.  
  50. /*****************************serivce4*******************************/
  51. RequestBuilder builder4 = new RequestBuilder();
  52. String url4 = "http://localhost:8034/zipkin/async/service4/test4";
  53. builder4.setUrl(url4);
  54. Request request4 = builder4.build();
  55.  
  56. clientRequestInterceptor(request4);
  57. Future<Response> response4 = asyncHttpClient.executeRequest(request4);
  58. clientResponseInterceptor(response4.get());
  59.  
  60. return response3.get().getResponseBody() + "=====" + response4.get().getResponseBody();
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. return "";
  64. }
  65. }
  66.  
  67. private void clientRequestInterceptor(Request request) {
  68. brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(new HttpClientRequest() {
  69.  
  70. @Override
  71. public URI getUri() {
  72. return URI.create(request.getUrl());
  73. }
  74.  
  75. @Override
  76. public String getHttpMethod() {
  77. return request.getMethod();
  78. }
  79.  
  80. @Override
  81. public void addHeader(String headerKey, String headerValue) {
  82. request.getHeaders().add(headerKey, headerValue);
  83. }
  84. }, new DefaultSpanNameProvider()));
  85. }
  86.  
  87. private void clientResponseInterceptor(Response response) {
  88. brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse() {
  89. public int getHttpStatusCode() {
  90. return response.getStatusCode();
  91. }
  92. }));
  93. }
  94.  
  95. }

3、service3

3.1、pom.xml

  1. <!-- zipkin brave -->
  2. <dependency>
  3. <groupId>io.zipkin.brave</groupId>
  4. <artifactId>brave-core</artifactId>
  5. <version>3.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-spancollector-http</artifactId>
  10. <version>3.9.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.zipkin.brave</groupId>
  14. <artifactId>brave-web-servlet-filter</artifactId>
  15. <version>3.9.0</version>
  16. </dependency>

3.2、ZipkinConfig

  1. package com.xxx.service3.zipkin.brave.async;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import com.github.kristofa.brave.Brave;
  7. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  8. import com.github.kristofa.brave.Sampler;
  9. import com.github.kristofa.brave.SpanCollector;
  10. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  11. import com.github.kristofa.brave.http.HttpSpanCollector;
  12. import com.github.kristofa.brave.servlet.BraveServletFilter;
  13.  
  14. @Configuration
  15. public class ZipkinConfig {
  16. @Bean
  17. public SpanCollector spanCollector() {
  18. HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
  19. .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
  20. .connectTimeout(5000)//5s,默认10s
  21. .flushInterval(1)//1s
  22. .readTimeout(6000)//5s,默认60s
  23. .build();
  24. return HttpSpanCollector.create("http://localhost:9411",
  25. spanConfig,
  26. new EmptySpanCollectorMetricsHandler());
  27. }
  28.  
  29. @Bean
  30. public Brave brave(SpanCollector spanCollector) {
  31. Brave.Builder builder = new Brave.Builder("asyn3 - service3 - 3");//指定serviceName
  32. builder.spanCollector(spanCollector);
  33. builder.traceSampler(Sampler.create(1));//采集率
  34. return builder.build();
  35. }
  36.  
  37. @Bean
  38. public BraveServletFilter braveServletFilter(Brave brave) {
  39. /**
  40. * 设置sr、ss拦截器
  41. */
  42. return new BraveServletFilter(brave.serverRequestInterceptor(),
  43. brave.serverResponseInterceptor(),
  44. new DefaultSpanNameProvider());
  45. }
  46. }

说明:指定了serviceName:"asyn3 - service3 - 3"

3.3、ZipkinAsyncController

  1. package com.xxx.service3.zipkin.brave.async;
  2.  
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9.  
  10. @Api("zipkin brave async api")
  11. @RestController
  12. @RequestMapping("/zipkin/async/service3")
  13. public class ZipkinAsyncController {
  14.  
  15. @ApiOperation("trace第3步")
  16. @RequestMapping(value = "/test3", method = RequestMethod.GET)
  17. public String myboot3() {
  18.  
  19. try {
  20. return "async - service3";
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. return "";
  24. }
  25. }
  26.  
  27. }

4、service4

4.1、pom.xml

  1. <!-- zipkin brave -->
  2. <dependency>
  3. <groupId>io.zipkin.brave</groupId>
  4. <artifactId>brave-core</artifactId>
  5. <version>3.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>io.zipkin.brave</groupId>
  9. <artifactId>brave-spancollector-http</artifactId>
  10. <version>3.9.0</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>io.zipkin.brave</groupId>
  14. <artifactId>brave-web-servlet-filter</artifactId>
  15. <version>3.9.0</version>
  16. </dependency>

4.2、ZipkinConfig

  1. package com.xxx.service4.zipkin.brave.async;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import com.github.kristofa.brave.Brave;
  7. import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
  8. import com.github.kristofa.brave.Sampler;
  9. import com.github.kristofa.brave.SpanCollector;
  10. import com.github.kristofa.brave.http.DefaultSpanNameProvider;
  11. import com.github.kristofa.brave.http.HttpSpanCollector;
  12. import com.github.kristofa.brave.servlet.BraveServletFilter;
  13.  
  14. @Configuration
  15. public class ZipkinConfig {
  16. @Bean
  17. public SpanCollector spanCollector() {
  18. HttpSpanCollector.Config spanConfig = HttpSpanCollector.Config.builder()
  19. .compressionEnabled(false)//默认false,span在transport之前是否会被gzipped。
  20. .connectTimeout(5000)//5s,默认10s
  21. .flushInterval(1)//1s
  22. .readTimeout(6000)//5s,默认60s
  23. .build();
  24. return HttpSpanCollector.create("http://localhost:9411",
  25. spanConfig,
  26. new EmptySpanCollectorMetricsHandler());
  27. }
  28.  
  29. @Bean
  30. public Brave brave(SpanCollector spanCollector) {
  31. Brave.Builder builder = new Brave.Builder("asyn4 - service4 - 4");//指定serviceName
  32. builder.spanCollector(spanCollector);
  33. builder.traceSampler(Sampler.create(1));//采集率
  34. return builder.build();
  35. }
  36.  
  37. @Bean
  38. public BraveServletFilter braveServletFilter(Brave brave) {
  39. /**
  40. * 设置sr、ss拦截器
  41. */
  42. return new BraveServletFilter(brave.serverRequestInterceptor(),
  43. brave.serverResponseInterceptor(),
  44. new DefaultSpanNameProvider());
  45. }
  46.  
  47. }

说明:指定了serviceName:"asyn4 - service4 - 4"

4.3、ZipkinAsyncController

  1. package com.xxx.service4.zipkin.brave.async;
  2.  
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9.  
  10. @Api("zipkin brave async api")
  11. @RestController
  12. @RequestMapping("/zipkin/async/service4")
  13. public class ZipkinAsyncController {
  14.  
  15. @ApiOperation("trace第4步")
  16. @RequestMapping(value = "/test4", method = RequestMethod.GET)
  17. public String myboot3() {
  18.  
  19. try {
  20. return "async - service4";
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. return "";
  24. }
  25. }
  26.  
  27. }

二、测试结果

1、依赖关系图:

2、span时间消耗图

3、详情图

点击第4个span,查看详情:

第二十八章 springboot + zipkin(brave定制-AsyncHttpClient)的更多相关文章

  1. 【第二十八章】 springboot + zipkin(brave定制-AsyncHttpClient)

    brave本身没有对AsyncHttpClient提供类似于brave-okhttp的ClientRequestInterceptor和ClientResponseInterceptor,所以需要我们 ...

  2. Gradle 1.12用户指南翻译——第二十八章. Jetty 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  3. “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java第二十八章:数组详解(上篇)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. SpringBoot | 第二十八章:监控管理之Spring Boot Admin使用

    前言 上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息.但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很 ...

  6. 第二十七章 springboot + zipkin(brave-okhttp实现)

    本文截取自:http://blog.csdn.net/liaokailin/article/details/52077620 一.前提 1.zipkin基本知识:附8 zipkin 2.启动zipki ...

  7. 第十八章 springboot + thymeleaf

    代码结构: 1.ThymeleafController package com.xxx.firstboot.web; import org.springframework.stereotype.Con ...

  8. 第三十八章 springboot+docker(maven)

    回顾上一章的整个部署过程: 使用"mvn install"进行打包jar 将jar移动到与Dockerfile文件相同的文件夹下 编写Dockerfile文件 使用"do ...

  9. 我的学习之路_第二十八章_JQuery 和validator插件

    jQuery 利用jQuery进行遍历 js原生: for(var i=0;i>?;i++){ } jQuery: 方式一: 想要遍历的jQuery对象.each(function(index, ...

随机推荐

  1. C# 动态加载组件后怎么在开发环境中调试

    动态加载组件 那就是简单的Assembly.Load动态加载dll而以.这网上资料也有不少.基本的思路基本上就是在本地上一个指定目录如[plugs]存在着一堆dll文件.主程序在初始运行时一般会把指定 ...

  2. ubuntu VNC中Xfce4中Tab键失效的解决方法

    转:https://blog.csdn.net/xuezhisdc/article/details/48662435 说明 在Ubuntu Server 14.04上安装了xfce4桌面环境,但是却发 ...

  3. 网络与多线程---OC中多线程方法GCD(二)

    小编在前一篇中介绍了多线程实现的五种常用方法.在接下来所介绍的这种方法是最具有魅力的,最具有诱惑的实现多线程的方案---GCD 一.什么是GCD GCD是Grand Central Dispatch的 ...

  4. Codeforces Beta Round #14 (Div. 2) A. Letter 水题

    A. Letter 题目连接: http://www.codeforces.com/contest/14/problem/A Description A boy Bob likes to draw. ...

  5. qunar-dns

    去哪儿QInfra大会 IT大咖说 - 大咖干货,不再错过   http://www.itdks.com/eventlist/detail/1313

  6. RabbitMQ消息交换模式简介

    RabbitMQ是AMQP的一个典型实现,它消息发布者的消息发布到Exchange上,同时需要制定routingkey,可以通过指定交换机的不同模式实现不同的行为. RabbitMQ提供了四种Exch ...

  7. ARM Memory Copy

    MODULE ARM_MEMORY PUBLIC ARM_MEMCPY PUBLIC ARM_MEMSET PUBLIC ARM_MEMSET8 PUBLIC ARM_MEMSET16 PUBLIC ...

  8. Yarn中ResourceManager的RPC协议

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemNjXzAwMTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  9. Revit手工创建族

    手工创建族 1.画两个参考平面. 图3001 2.点击族类型,添加参数. 图3002,3003 3.添加类型,为类型赋值. 3004 4.创建拉伸截面,完成后,可以三维查看. 3005 5.创建对齐, ...

  10. Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库

    H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分.下面来演示一下如何将H2数据库嵌入到我们的Web应用中. 一.搭建测 ...