这一章节讲如何使用ribbon和hystrix.

在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息,

这里Artifact填写ribbonconsumer, 再次next,

这里选择如下图:

最后在Module Name中填写ribbon-consumer.

生成的pom.xml文件如下:

  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.3.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.xum</groupId>
  12. <artifactId>ribbon-consumer</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>ribbon-consumer</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.cloud</groupId>
  29. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.cloud</groupId>
  37. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.cloud</groupId>
  41. <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-actuator</artifactId>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-test</artifactId>
  50. <scope>test</scope>
  51. </dependency>
  52. <dependency>
  53. <groupId>com.netflix.hystrix</groupId>
  54. <artifactId>hystrix-javanica</artifactId>
  55. <version>RELEASE</version>
  56. <scope>compile</scope>
  57. </dependency>
  58. </dependencies>
  59. <dependencyManagement>
  60. <dependencies>
  61. <dependency>
  62. <groupId>org.springframework.cloud</groupId>
  63. <artifactId>spring-cloud-dependencies</artifactId>
  64. <version>${spring-cloud.version}</version>
  65. <type>pom</type>
  66. <scope>import</scope>
  67. </dependency>
  68. </dependencies>
  69. </dependencyManagement>
  70. <build>
  71. <plugins>
  72. <plugin>
  73. <groupId>org.springframework.boot</groupId>
  74. <artifactId>spring-boot-maven-plugin</artifactId>
  75. </plugin>
  76. </plugins>
  77. </build>
  78. <repositories>
  79. <repository>
  80. <id>spring-milestones</id>
  81. <name>Spring Milestones</name>
  82. <url>https://repo.spring.io/milestone</url>
  83. </repository>
  84. </repositories>
  85. </project>

在src->main->resources下建立application.yml文件, 内容如下

  1. eureka:
  2. client:
  3. serviceUrl:
  4. defaultZone: http://localhost:8761/eureka/
  5. server:
  6. port: 8771
  7. spring:
  8. application:
  9. name: ribbon-consumer
  10. management:
  11. endpoint:
  12. health:
  13. show-details: always
  14. endpoints:
  15. web:
  16. exposure:
  17. include: '*'

在RibbonConsumerApplication.java里的内容如下, 要加上@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableDiscoveryClient这三个注解.

  1. package com.xum.ribbonconsumer;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
  6. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  7. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  8. import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.web.client.RestTemplate;
  11.  
  12. @EnableCircuitBreaker
  13. @EnableHystrixDashboard
  14. @EnableDiscoveryClient
  15. @SpringBootApplication
  16. public class RibbonConsumerApplication {
  17.  
  18. @Bean
  19. @LoadBalanced  // 这里是加载平衡, 我这里使用RestTemplate
  20. RestTemplate restTemplate () {
  21. return new RestTemplate();
  22. }
  23.  
  24. public static void main(String[] args) {
  25. SpringApplication.run(RibbonConsumerApplication.class, args);
  26. }
  27. }

然后在RibbonConsumerApplication.java文件夹同级目录下建立Controller文件夹, 里面写一个RibbonConsumerController.java, 内容如下:

  1. package com.xum.ribbonconsumer.controller;
  2.  
  3. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import org.springframework.web.client.RestTemplate;
  10.  
  11. @RestController
  12. @RequestMapping(value = "/ribbonconsumer")
  13. public class RibbonConsumerController {
  14. private static final Logger LOG = LoggerFactory.getLogger(RibbonConsumerController.class);
  15.  
  16. @Autowired
  17. RestTemplate restTemplate;
  18.  
  19. @RequestMapping(value = "/test")
  20. @HystrixCommand(fallbackMethod = "testConsumer_ribbon") // 这里是HystrixCommand注解, 如果eureka-client项目没有启动, 那么就会转到本项目的fallbackMethod方法,即testConsumer_ribbon(), 就是下面的方法
  21. public String testConsumer() { // 这里是通过getForEntity属性来调用eureka-client里的testone/test这条api
  22. LOG.info("RibbonConsumerController=>testConsumer");
  23. return restTemplate.getForEntity("http://eureka-client/testone/test",String.class).getBody();
  24. }
  25.   // 这里就是熔断器(Hystrix)自我保护的方法,其实是自定义的方法.
  26. public String testConsumer_ribbon() {
  27. LOG.info("RibbonConsumerController=>testConsumer_ribbon");
  28. return "testConsumer_ribbon";
  29. }
  30. }

下面是eureka-client项目下testone/test的api返回内容, 这里是简写了,具体的内容可以回看前面eureka-client项目搭建.

  1. @RequestMapping(value = "/test")
  2. public String test(@RequestParam(value = "name", required = false, defaultValue = "testOneClient")String name) {
  3. String info = "Hi " + name + ", this is EurekaClient, port is " + port;
  4. return info;
  5. }

最后顺序启动如下项目:

1. eureka-server

2. config-server

3. eureka-client

4. ribbon-consumer

最后用post man发送api: http://localhost:8771/ribbonconsumer/test

或则浏览器打开这条api.

可以看到返回的内容就好像调用eureka-client下的api: http://localhost:8762/testone/test

如果eureka-client项目里没有启动, 那么Hystrix会实现自我保护, 会调用到(fallbackMethod = "testConsumer_ribbon")方法, 自定义的方法.

测试一下, 把eureka-client项目停止,

在post man或则浏览器中输入http://localhost:8771/ribbonconsumer/test, 内容如下:

可以看到, 会调用到testConsumer_ribbon()的保护方法里去.

SpringCloud的学习记录(5)的更多相关文章

  1. SpringCloud的学习记录(1)

    最近一段时间重新学习一边SpringCloud(有半年不用了),这里简单记录一下. 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE. 1. 构建M ...

  2. SPRINGCLOUD 开发学习记录

    一个简单的微服务系统:服务注册和发现,服务消费,负载均衡,断路器,智能路由,配置管理 服务注册中心: eureka是一个高可用组件,没有后端缓存,每一个实例注册后向注册中心发送心跳,默认情况下,eru ...

  3. SpringCloud的学习记录(8)

    这一章节讲zipkin-server. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等 ...

  4. SpringCloud的学习记录(7)

    这一章节讲zuul的使用. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息, 这里 ...

  5. SpringCloud的学习记录(6)

    这一章节讲fegin的使用. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Artifact等信息, 这 ...

  6. SpringCloud的学习记录(3)

    这一章节讲搭建config-server的项目. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和Arti ...

  7. SpringCloud的学习记录(2)

    这一章节主要讲如何搭建eureka-client项目. 在我们生成的Demo项目上右键点击New->Module->spring Initializr, 然后next, 填写Group和A ...

  8. SpringCloud的学习记录(4)

    本篇基于上一篇写的, 在git上更改配置后, eureka-client如何更新. 我们只需要在配置文件中配置 spring-cloud-starter-bus-amqp; 这就是说我们需要装rabb ...

  9. SpringCloud基础教程学习记录

    这个学习记录是学习自翟永超前辈的SpringCloud的基础教程. 自己写这个教程的目的主要是在于,想要更凝练总结一些其中的一些实用点,顺便做个汇总,这样自己在复习查看的时候更加方便,也能顺着自己的思 ...

随机推荐

  1. Django 05 自定义过滤器、自定义标签

    Django 05 自定义过滤器.自定义标签 一.自定义过滤器 #1.在项目目录下创建一个python package包 取名为common(这个名字可以自定义) #2.在common目录下创建一个t ...

  2. Spring Boot中JPA如何实现按日期合计

    1. 用queryDsl方法 JPAQueryFactory.select( Projections.fields(OrderCountByDayBean.class, qOrder.amount.s ...

  3. JS图片加载失败用默认图片代替

    1.onerror 事件会在文档或图像加载过程中发生错误时被触发. 当图片不存在时,将触发onerror,onerror 中img为 指定的默认图片. 图片存在则显示正常图片,图片不存在将显示默认. ...

  4. thinkPHP5.0获取器

    获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用: class Cate extends Model { public function getTypeAttr ...

  5. 25-----BBS论坛

    BBS论坛(二十五) 25.1.发布帖子后台逻辑完成 (1)apps/models.py class PostModel(db.Model): __tablename__ = 'post' id = ...

  6. 配置MapReduce程序运行环境

    已安装eclipse,hadoop 查看教程dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  7. HandlerInterceptor拦截器使用总结

    简介 SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对请求进行拦截和处理. 常见应用场景 1.权限检查:如检测请求是否具有登录权限,如果没有直接返回到登陆页面. ...

  8. C语言有GetOpenFile吗?

    windows中有个GetOpenFile的函数,就是上面那个啦!!我们怎么来实现呢?要我用C语言写出来我真的跪了..但是我们可以输入文件的[绝对路径],配合fopen函数来实现的.. 注意问题 ①文 ...

  9. Unity Animation.CrossFade Animation.Play

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCo ...

  10. nodejs --- crypto实现加密(转)

    crypto实现加密 本文转自:http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0 ...