SpringCloud教程(Finchley版本)-04:断路器(Hystrix-Ribbon)

在微服务系统中,我们把系统拆分成了很多小的服务,各个服务之间通过不同的方式进行依赖和调用,为了保证服务的高可用性,单个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等。如何能够保证在一个依赖出问题的情况下,不会出现故障传播,导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
本文介绍如何结合上一文SpringCloud教程(Finchley版本)-03:负载均衡(Ribbon),使用Hystrix来实现断路器功能。主要分为以下几个步骤:
  • 1.创建项目
  • 2.引入依赖
  • 3.修改配置文件
  • 4.添加启动注解
  • 5.注入模板类
  • 6.跨服务调用
  • 7.启动项目,测试

1.创建项目

新建一个Springboot项目hystrix_ribbon_server1。

2.引入依赖

		<!--eureka-client-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

		<!--eureka ribbon-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>

		<!--hystrix-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>
	<!--springcloud依赖管理-->
	<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>
	<spring-cloud.version>Finchley.SR2</spring-cloud.version>

3.修改配置文件

server:
  port: 8017
spring:
  application:
    name: hystrix-ribbon-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

4.添加启动注解

5.注入模板类

4.5步骤和前文的Ribbon一样。

package com.java4all.hystrix_ribbon_server1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class HystrixRibbonServer1Application {

	/**
	 *
	 * @Bean : 注入一个名为restTemplate的bean
	 * @LoadBalanced :表明这个 restTemplate 开启了负载均衡的功能
	 *
	 * */
	@Bean
	@LoadBalanced
	RestTemplate restTemplate(){return new RestTemplate();}

	public static void main(String[] args) {
		SpringApplication.run(HystrixRibbonServer1Application.class, args);
	}
}

6.跨服务调用

写一套简单的业务代码,然后调用前面创建的company-server服务提供的接口。

6.1 controller

@RestController
@RequestMapping(value = "hrs")
public class HrsController {

  @Autowired
  private HrsService hrsService;

  @GetMapping(value = "getCompany")
  public String getCompany(String id){
    String company = hrsService.getCompany(id);
    System.out.println(company);
    return company;
  }
}

6.2 service

public interface RibbonService {

  String getCompany(String id);
}

6.3 serviceImpl

在serviceImpl实现类中,我们引入前面的RestTemplate模板类,来跨服务调用,并开启了负载均衡功能。

在getCompany方法上添加@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法erroCompany,熔断方法直接返回了一个字符串

@Service
public class HrsServiceImpl implements HrsService{

  //启动类中注入了此模板,并且开启了负载均衡功能
  @Autowired
  RestTemplate restTemplate;

  //给方法添加熔断器的功能,并指定熔断方法
  @HystrixCommand(fallbackMethod = "erroCompany")
  @Override
  public String getCompany(String id) {
    //程序名替代服务地址,ribbon会根据服务名自动选择服务实例
    String company = restTemplate
        .getForObject("http://company-server/company/get?id=" + id, String.class);
    return company;
  }
  
  /**熔断方法*/
  public String erroCompany(String id){
    return "服务出错,返回默认企业:"+id;
  }
}

7.启动项目,测试

此时,启动项目,访问http://localhost:8017/hrs/getCompany?id=234,我们这个项目的接口会去调用前面启动的企业服务,由于企业服务启动了两台:8011,8014,那么,通过ribbon负载均衡后,会分发到两台服务上。如下:
在这里插入图片描述
在这里插入图片描述
当我们把8011挂掉后,此时,由于eureka更新服务列表默认时间为30s,这之间,如果请求落在8011上,那么,就会调用熔断方法,返回指定的结果,如下:
在这里插入图片描述

在这里插入图片描述

下一篇:SpringCloud教程(Finchley版本)-05:负载均衡(Feign)
完整源码参考:https://github.com/myJava4all/springcloudfinchley
在这里插入图片描述

已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管理平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管理,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管理模块、商品分类模块以及考勤管理模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部分常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管理平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管理;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管理;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管理平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页