#这个章节主要是针对Hystrix的使用,因为Feign的章节在上一节已经实现了,整个代码也是在上一个章节的基础上修改的

##################Hystrix一个简单Demo实现#######################

1、pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.test</groupId>
<artifactId>eureka-client-feign-hystrix</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-client-feign-hystrix</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

2、application.yml文件配置

spring:
application:
name: eureka-client-feign-hystrix #应用名
logging: #logging日志配置
level:
root: INFO
org.hibernate: INFO
server:
port: 8667 #服务端口 eureka:
instance:
hostname: localhost
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.application.instance_id:${server.port}}
client:
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:8661/eureka

3、启动类加配置

package com.test.eurekaclientfeign;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class EurekaClientFeignHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientFeignHystrixApplication.class, args);
} }

4、User.java类

package com.test.eurekaclientfeign.entity;

import java.io.Serializable;
import java.math.BigDecimal; public class User implements Serializable {
private Long id; private String name; private String username; private BigDecimal balance; private short age; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public BigDecimal getBalance() {
return balance;
} public void setBalance(BigDecimal balance) {
this.balance = balance;
} public short getAge() {
return age;
} public void setAge(short age) {
this.age = age;
}
}

5、自定义UserFeignClientConfig.java类,该类的使用,表示不使用Feign的默认配置

package com.test.eurekaclientfeign.feign;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class UserFeignClientConfig {
/* @Bean
public Contract feignContract() {
return new feign.Contract.Default();
}*/ @Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}

6、UserFeignClient1.java

package com.test.eurekaclientfeign.feign;

import com.test.eurekaclientfeign.entity.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; @FeignClient(name = "eureka-client-user", configuration = UserFeignClientConfig.class)
public interface UserFeignClient1 {
@RequestMapping(method = RequestMethod.GET, value = "/user/{id}")
User findById(@PathVariable("id") Long id);
}

7、MovieController.java类,实现远程调用的类

package com.test.eurekaclientfeign.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.test.eurekaclientfeign.entity.User;
import com.test.eurekaclientfeign.feign.UserFeignClient1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MovieController { @Autowired(required = true)
private UserFeignClient1 userFeignClient1; @GetMapping(value = "/hystrix/{id}")
@HystrixCommand(fallbackMethod = "defaultMethod")
//一但无法调用远程的findById(),则会调用Hystrix的默认接口defaultMethod(),其参数要一致,否则无法使用
public User findById(@PathVariable("id") Long id) {
return this.userFeignClient1.findById(id);
} public User defaultMethod(@PathVariable("id") Long id){
User user = new User();
user.setId(id);
user.setName("hystrix");
return user;
} }

8、URL访问

http://localhost:8661/  # 服务发现
http://192.168.137.1:8667/hystrix/9 #实现断路,因为数据库没有id=9的数据
http://192.168.137.1:8667/hystrix/1 #可以正常访问

Hystrix访问实现如下:

########Hystrix将调用访问和断路执行方法绑定在一个线程#########

只需在MovieController.java中的HystrixCommand添加一个commandProperties属性即可,如下

package com.test.eurekaclientfeign.controller;

import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.test.eurekaclientfeign.entity.User;
import com.test.eurekaclientfeign.feign.UserFeignClient1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MovieController { @Autowired(required = true)
private UserFeignClient1 userFeignClient1; @GetMapping(value = "/hystrix/{id}")
@HystrixCommand(fallbackMethod = "defaultMethod",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)
//一但无法调用远程的findById(),则会调用Hystrix的默认接口defaultMethod(),其参数要一致,否则无法使用
//添加commandProperties属性,可以使得findById()和defaultMethod()绑定到一个线程中
public User findById(@PathVariable("id") Long id) {
return this.userFeignClient1.findById(id);
} public User defaultMethod(@PathVariable("id") Long id){
User user = new User();
user.setId(id);
user.setName("hystrix");
return user;
} }

###########Hystrix健康检查与监控################

1、在pom.xml再添加下面依赖

  <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、在启动类添加一个Bean

package com.test.eurekaclientfeign;

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean; @SpringBootApplication
@EnableFeignClients
@EnableCircuitBreaker
public class EurekaClientFeignHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientFeignHystrixApplication.class, args);
} @Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}

3、启动Eureka和服务程序,访问远程调用的服务程序,执行下面的URL

#使用了actuator,所以都必须以这个组件开始
http://localhost:8667/actuator/hystrix.stream http://localhost:8667/actuator/health

第八章 SpringCloud之Feign、Hystrix结合使用的更多相关文章

  1. springcloud(七) feign + Hystrix 整合 、

    之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和 RestTemplate + Hystrix  ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用. ...

  2. SpringCloud 在Feign上使用Hystrix(断路由)

    SpringCloud  在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在properties文件中 ...

  3. springcloud(九)-Feign使用Hystrix

    前言 上一篇我们使用注解@HystrixCommond的fallbackMethod属性实现回退.然而,Feign是以接口形式工作的,它没有方法体,上一篇讲解的方式显然不适用于Feign. 那么Fei ...

  4. SpringCloud中使用Hystrix

    1.  引言 一般而言,一个服务都是部署了多台机器的,那么在这种情况下,当其中一个服务挂了以后Hystrix是怎么处理的呢? 为了验证这个问题,我们准备两个服务:user-api 和 app-gate ...

  5. 二、springcloud之熔断器hystrix

    一.背景 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服 ...

  6. SpringCloud 进阶之Hystrix(断路器)

    1. Hystrix 断路器 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败, 比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况 ...

  7. SpringCloud之Feign

    [前面的话]书接上文,本文的某些知识依赖我的第一篇SpringCLoud的文章:SpringCloud之Eureka,如果没有看过可以先移步去看一下.另外在微服务架构中,业务都会被拆分成一个个独立的服 ...

  8. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  9. springcloud之Feign、ribbon设置超时时间和重试机制的总结

    一 超时时间配置 如果在一个微服务当中对同一个接口同时配置了Hystrix与ribbon两个超时时间,则在接口调用的时候,两个计时器会同时读秒. 比如,访问一个接口需要2秒,你的ribbon配置的超时 ...

随机推荐

  1. 从FBV到CBV二(认证器)

    span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }.CodeMirror ...

  2. linux使用VNC服务轻松远程安装oracle

    VNC服务在远程服务器上安装oracle,新手安装oracle时总会遇到这样或者那样的问题,下面我就详细解说一下安装过程,其实oracle安装很简单,并不要把他相像的特别复杂. 本环境用:centos ...

  3. shell条件嵌套(if条件语句)

    [注意1]:和Java.PHP等语言不一样,sh的流程控制不可为空,如: 代码如下: <?php if (isset($_GET["q"])) { search(q); } ...

  4. 解决引导内核遇到undefined instruction的错误

    其实在上一篇随笔之前,就是在启动linux 内核的时候,出了点问题 刚Starting kernel ...就出现了undefined instrction,这是什么问题呢? 在网上也搜了不少资料,有 ...

  5. python爬虫练习之批量下载zabbix文档

    # -*- coding: UTF-8 -*- import requests,re,time url = 'https://www.zabbix.com/documentation/3.4/zh/m ...

  6. 小程序UI设计(5)-符合视觉规范-按钮视觉规范

    在设计工具中,根据规范我们定义了大中小三种按钮的尺寸大:720rpx *94rpx 圆角10px 字体18中:360rpx*70rpx 圆角8px 字体16 文字距离两边最小60小:120rpx*60 ...

  7. Java中如何判断两个对象是否相等(Java equals and ==)

    原文https://www.dutycode.com/post-140.html 如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解. 从以下几个点来理解 ...

  8. jdk1.8环境变量配置

    JAVA_HOME=/usr/java/jdk1.8.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOM ...

  9. [转] Linux环境变量配置文件以及启动顺序

    转自:https://blog.csdn.net/bjnihao/article/details/51775854 一.环境变量配置文件: 对所有用户都起作用 /etc/profile /etc/pr ...

  10. jquery preventDefault()方法 语法

    jquery preventDefault()方法 语法 作用:preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交).大理石平台价格 语法:event ...