当前位置: 首页 > news >正文

微服务之hystrix熔断降级和负载均衡

文章目录

  • 前言
  • 熔断降级概念和使用
    • 修改bill-consumer模块
      • 修改配置文件
      • 修改pom文件
      • 创建文件BillServiceImpl
      • 修改BillService文件
    • 修改bill-provider模块
      • 修改BillServiceApi文件
    • 熔断降级测试
  • loadBalancer负载均衡
    • 关闭idea
    • 复制一个bill-provider项目
    • 使用idea打开刚刚的项目加入项目
    • 修改父级pom文件
    • 修改bill-provider-7781模块
      • 修改模块名
      • 修改pom文件
      • 修改文件或者文件夹为7781
      • 修改启动类
      • 修改配置文件
    • 测试
      • 启动nacos
      • 启动三个启动类
      • 打开nacos可视化界面
      • 多次访问http://127.0.0.1:7790/bill/find?id=1
  • loadBalancer负载均衡的随机策略
    • 修改bill-consumer-7790
      • 在consumer中引入jar文件
      • 新建RandomLoadBalancerConfig
      • 修改BillServive文件

前言

如果你还没有学习OpenFeign可以看之前的博客微服务之OpenFeign 服务调用,本篇博客是接着上一篇写的。

熔断降级概念和使用

熔断降级就是起到保护的作用
比如consumer模块访问provider模块,但是provider模块出错误,我就会访问另一个服务,将code,message错误信息封装返回给provider模块。
在这里插入图片描述

修改bill-consumer模块

代码编写的整体思路如下
在这里插入图片描述

修改配置文件

在配置文件中添加

feign: #开启熔断降级处理circuitbreaker:enabled: true

修改pom文件

这个在dependencies节点下添加。
注意不是dependencyManagement下的dependencies。

<!-- 添加熔断降级依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.9.RELEASE</version>
</dependency>

创建文件BillServiceImpl

在文件com/hsh/billconsumer7790/service/api文件下新建impl文件夹

package com.hsh.billconsumer7790.service.api.impl;import com.hsh.billconsumer7790.service.api.BillService;
import com.hsh.utils.ResultJSON;
import org.springframework.stereotype.Component;@Component
public class BillServiceImpl implements BillService {@Overridepublic ResultJSON findBillListById(Integer id) {return ResultJSON.error("接口调用失败,熔断降级处理.....");}
}

修改BillService文件

@FeignClient注解添加fallback属性用于熔断降级

package com.hsh.billconsumer7790.service.api;import com.hsh.billconsumer7790.service.api.impl.BillServiceImpl;
import com.hsh.utils.ResultJSON;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;// @FeignClient()是调用的服务名称,即调用哪个模块哪个类
// 这里添加fallback = BillServiceImpl.class,表示如果调用失败,则调用BillServiceImpl中的方法
@FeignClient(name = "bill-provider-7780",path = "bill",fallback = BillServiceImpl.class)
public interface BillService {@GetMapping("/findBillListById")ResultJSON findBillListById(@RequestParam("id") Integer id);
}

修改bill-provider模块

修改BillServiceApi文件

路径如下com/hsh/billprovider7780/api添加除零错误,测试熔断降级

package com.hsh.billprovider7780.api;import com.hsh.billprovider7780.service.BillService;
import com.hsh.utils.ResultJSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/bill")
public class BillServiceApi {@Autowiredprivate BillService billService;@GetMapping("/findBillListById")public ResultJSON findBillListById(@RequestParam("id")Integer  id){// 添加除零错误int i = 1/0;return billService.findBillListById(id);}
}

熔断降级测试

先去启动nacos
再去开启你的两个模块
输入路劲http://127.0.0.1:7790/bill/find?id=1
结果如下
在这里插入图片描述

loadBalancer负载均衡

SpringCloud 从 2020.0.1 版本开始,移除了 Ribbon 组件,使⽤Spring Cloud LoadBalancer 组件来代替 Ribbon 实现客户端负载均衡

下面开始讲解负载均衡

关闭idea

我们先把项目停下来,然后关闭idea

复制一个bill-provider项目

我们打开刚刚的项目所在文件夹,复制一下bill-provider-7780项目。
在这里插入图片描述bill-provider-7780 - 副本重命名为bill-provider-7781
在这里插入图片描述

使用idea打开刚刚的项目加入项目

在这里插入图片描述
打开maven点击加号
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
解决办法就是修改父级文件

修改父级pom文件

<modules><!-- ......--><!-- 引入bill-provider-7781  --><module>bill-provider-7781</module>
</modules>

在这里插入图片描述
出现两个7780是因为还没有修改bill-provider-7781模块配置文件

修改bill-provider-7781模块

修改模块名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改pom文件

将pom文件中的所有7780改为7781,可通过ctrl+F搜索替换
然后重启idea并刷新maven
此时打开maven两个7780就改回来了。
在这里插入图片描述

修改文件或者文件夹为7781

在这里插入图片描述

注意重构的时候只选择当前文件

修改启动类

package com.hsh.billprovider7781;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
// 将扫包的7780改为7781
@MapperScan("com.hsh.billprovider7781.mapper")
public class BillProvider7781Application {public static void main(String[] args) {SpringApplication.run(BillProvider7781Application.class, args);}
}

修改配置文件

只修改端口号即可,服务名不需要修改,因为负载均衡本身就是针对两个相同的项目

server:port: 7781  # 端口号修改
spring:application:name: bill-provider-7780 # 服务名不修改
# .....

测试

启动nacos

在这里插入图片描述

启动三个启动类

记得将int i = 1/0错误那行代码注释掉
在这里插入图片描述

打开nacos可视化界面

在这里插入图片描述

多次访问http://127.0.0.1:7790/bill/find?id=1

我们访问http://127.0.0.1:7790/bill/find?id=1发现 两个都有输出这就是负载均衡。
在这里插入图片描述

在这里插入图片描述

loadBalancer负载均衡的随机策略

修改bill-consumer-7790

在consumer中引入jar文件

这个jar包引过就不需要再去引用了。

<!--客户端负载均衡loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

注意:将两个provider服务名改为一致,端口号不一致,consumer中调用服务(一个provider两个实例)

新建RandomLoadBalancerConfig

在config包中添加配置类RandomLoadBalancerConfig,实现随机策略

package com.hsh.billconsumer7790.config;import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;public class RandomLoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactoryloadBalancerClientFactory) {String name =environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

修改BillServive文件

package com.hsh.billconsumer7790.service.api;import com.hsh.billconsumer7790.config.RandomLoadBalancerConfig;
import com.hsh.billconsumer7790.service.api.impl.BillServiceImpl;
import com.hsh.utils.ResultJSON;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;// @FeignClient()是调用的服务名称,即调用哪个模块哪个类
// 这里添加fallback = BillServiceImpl.class,表示如果调用失败,则调用BillServiceImpl中的方法
@FeignClient(name = "bill-provider-7780",path = "bill",fallback = BillServiceImpl.class)
// 引用负载均衡  name表示对那个模块进行负载均衡 configuration 表示使用什么负载均衡算法
@LoadBalancerClient(name = "bill-provider",configuration = RandomLoadBalancerConfig.class)
public interface BillService {@GetMapping("/findBillListById")ResultJSON findBillListById(@RequestParam("id") Integer id);
}
http://www.dtcms.com/a/498763.html

相关文章:

  • Docker(三) Docker基础前置
  • kubuntu24.04 fcitx5-rime输入法配置
  • Daemon: 系统中看不见的守护进程
  • 3-SpringCloud-LoadBalancer-OpenFeign服务调用与负载均衡
  • 百度推广进入后是别的网站 说是服务器问题上海嘉定网站建设公司
  • Photoshop - Photoshop 工具栏(12)横排文本工具
  • K8S(十五)—— 企业级K8s集群管理实践:Rancher安装配置与核心功能实操
  • 透明网站模板python基础代码
  • Linux网络HTTP(上)(7)
  • JavaScript 二维数组的三种定义与初始化方法
  • 网站开发过程中的方法wordpress文件上传下载
  • DataFun:智能风控与业务安全
  • 思过崖上学「 subprocess 」:令狐冲的 Swift 6.2 跨平台进程心法
  • GD32 ACM核 MCU进入低功耗模式,唤醒后需要注意的事,程序如何正常运行??
  • iOS八股文之 网络
  • 技术演进中的开发沉思-138java-servlet篇:Servlet 多线程的
  • 快速上手大模型:机器学习3
  • 代替VB6的TWINBASIC ide和开源商业模式分析-VB7
  • 网站图片移动怎么做网页设计图片居右代码
  • 东莞整站优化推广公司找火速用广州seo推广获精准访问量
  • c# .NET core多线程的详细讲解
  • Python机器学习---2.算法:逻辑回归
  • solidity的变量学习小结
  • 【Java 开发日记】MySQL 与 Redis 如何保证双写一致性?
  • 基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的台风灾害知识问答系统(vue+flask+AI算法)
  • 短剧APP开发性能优化专项:首屏加载提速技术拆解
  • 2025年远程控制软件横评:UU远程、ToDesk、向日葵
  • 前端核心理论深度解析:从基础到实践的关键知识点
  • 合肥官方网站建设有哪些公司
  • 大模型-高效优化技术全景解析:微调 量化 剪枝 梯度裁剪与蒸馏 下