B083-SpringCloud-eureka ribbon feign hystrix

目录

      • eureka
        • 基础项目准备
        • 注册中心的搭建
        • 生产者注册到eureka
        • 消费者注册到eureka并通过eureka调用生产者
        • eureka集群
      • 服务提供者集群
      • 集群以后消费者调用服务的问题
      • ribbon
        • 消费者使用ribbon负载均衡
        • 赋值负载均衡策略
        • 负载均衡优化
      • feign
      • Hystrix
        • Hystrix概述
        • Ribbon搭配Hystrix降级处理
        • Feign搭配Hystrix降级处理

eureka

基础项目准备

搭建未用到springcloud的微服务架构,同昨天
浏览器访问测试:http://localhost:5010/user/consumer/8

注册中心的搭建

同昨天(新建工程 导包 配置 启动类 注解)
浏览器访问测试:http://localhost:1010

生产者注册到eureka

同昨天(导包 配置 注解)
重启生产者,浏览器访问测试:http://localhost:4010/user/provider/3
tips:将eureka页面中显示的实例服务的计算机名称改为ip
在这里插入图片描述

消费者注册到eureka并通过eureka调用生产者

同昨天(导包 配置 注解)

UserConsumerController

/**
 * 服务的消费者
 */
@RestController
@RequestMapping("/user/consumer")
public class UserConsumerController {

//    private static String URL_PRIFIX = "http://localhost:4010";

    @Autowired
    private RestTemplate restTemplate;  // 用于发起远程调用的工具

    @Autowired
    private DiscoveryClient client;

    // 返回一个用户
    @RequestMapping("/{id}")
    public User getUser(@PathVariable("id") Long id){

        List<ServiceInstance> list = client.getInstances("user-provider");
        // 获取第一台机器
        ServiceInstance serviceInstance = list.get(0);
        // 获取第一台机器的ip
        String ip = serviceInstance.getHost();
        // 获取第一台机器的端口
        int port = serviceInstance.getPort();
        String url = "http://"+ip+":"+port+"/user/provider/" + id;

        // 根据id发起远程调用4010获取用户
//        return restTemplate.getForObject(URL_PRIFIX + "/user/provider/" + id,User.class);
        return restTemplate.getForObject(url,User.class);
    }
}

重启消费者,浏览器访问测试:http://localhost:5010/user/consumer/44

eureka集群

在这里插入图片描述
防止eureka单点故障
见文档6

application.yml备份一份单机版本,复制多份集群配置版本
如application-eureka1.yml

server:
  port: 1010
eureka:
  instance:
    hostname: eureka1
  client:
    registerWithEureka: false #是否要注册到eureka
    fetchRegistry: false #表示是否从Eureka Server获取注册信息
    serviceUrl:
      defaultZone: http://eureka1:1010/eureka,http://eureka2:1020/eureka,http://eureka3:1030/eureka
spring:
  application:
    name: eureka1

外网无法访问http://eureka1:1010/eureka,需要本机配置虚拟域名
C:\Windows\System32\drivers\etc\hosts
在这里插入图片描述
关闭所有项目,修改application.yml

spring:
  profiles:
    active: eureka1

设置idea编辑该启动类配置支持多实例启动
在这里插入图片描述
active分别写eureka1、eureka2、eureka3启动后会找到以对应后缀的文件共同启动
浏览器访问测试:http://localhost:1010,http://localhost:1020,http://localhost:1030
在这里插入图片描述
设置把自己也注册进去
删掉或注释以下两行即可

#    registerWithEureka: false #是否要注册到eureka
#    fetchRegistry: false #表示是否从Eureka Server获取注册信息

active分别写eureka1、eureka2、eureka3启动后会找到以对应后缀的文件共同启动
tips:前两个启动报错正常,因为配置里的其他eureka还没启动,不用管,最后一个启动就不会报错了
浏览器访问测试:http://localhost:1010,http://localhost:1020,http://localhost:1030
在这里插入图片描述

服务提供者集群

在这里插入图片描述
生产环境把jar包部署多个服务器就ok了,但是现在是开发阶段同一台主机不同端口号来代替服务器 ,方案有两种。
方案1:拷贝一份代码为多份,修改端口不一样。分别启动
方案2:一份代码,多份配置。 每一个配置启动一份。
我们这里用第二种

application.yml备份一份单机版本,复制多份集群配置版本
如application-pro1.yml

server:
  port: 4010
spring:
  application:
    name: user-provider
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:1010/eureka,http://eureka2:1020/eureka,http://eureka3:1030/eureka #告诉服务提供者要把服务注册到哪儿
  instance:
    prefer-ip-address: true # 当调用getHostname获取实例的hostname时,返回ip而不是host名称
    ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
    hostname: user-provider:4010

修改application.yml

spring:
  profiles:
    active: pro1

设置idea编辑该启动类配置支持多实例启动
active分别写pro1、pro2、pro3启动后会找到以对应后缀的文件共同启动
浏览器访问测试:http://localhost:1010
在这里插入图片描述
tips:spring application name一样就会单行一起展示,不一样就会多行分别展示
启动消费者服务,浏览器访问测试:http://localhost:5010/user/consumer/55

集群以后消费者调用服务的问题

在这里插入图片描述

ribbon

消费者使用ribbon负载均衡

见文档7.1,7.3,7.4.1,7.4.2

拷贝user-consumer-5010为user-consumer-ribbon-5110
user-consumer-ribbon-5110的pom里修改artifactId

<artifactId>user-consumer-ribbon-5110</artifactId>

父pom里增加

<module>user-consumer-ribbon-5110</module>

刷新Maven
application.yml调整端口

server:
  port: 5110
spring:
  application:
    name: user-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1010/eureka #告诉服务提供者要把服务注册到哪儿
  instance:
    prefer-ip-address: true # 当调用getHostname获取实例的hostname时,返回ip而不是host名称
    ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
    hostname: user-consumer:5110

删除target文件夹

导包

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

获取RestTemplate加注解

@Configuration
public class HttpUtils {

    @Bean
    @LoadBalanced //开启ribbon的负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

修改UserConsumerController

@RestController
@RequestMapping("/user/consumer")
public class UserConsumerController {

    private static String URL_PRIFIX = "http://USER-PROVIDER";

    @Autowired
    private RestTemplate restTemplate;  // 用于发起远程调用的工具

    @Autowired
    private DiscoveryClient client;

    // 返回一个用户
    @RequestMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id){

        // 开启ribbon的负载均衡,使用服务名字调用
        User user = restTemplate.getForObject(URL_PRIFIX + "/user/provider/" + id, User.class);
        return user;
    }
}

服务提供者加代码以方便看是哪一个提供者提供的服务
UserProviderController

@RestController
@RequestMapping("/user/provider")
public class UserProviderController {

    @Autowired
    private ApplicationContext context;

    // 返回一个用户
    @RequestMapping("/{id}")
    public User getUser(@PathVariable("id") Long id) {
        // 为了方便看是哪一个提供者提供的服务
        String activeProfile = context.getEnvironment().getActiveProfiles()[0];
        return new User(id, "zs," + activeProfile);
    }
}

分别启动eureka集群,生产者集群和用了ribbon的消费者服务
浏览器访问测试:http://localhost:5110/user/consumer/5110,不断刷新会出现轮询效果

赋值负载均衡策略

见文档7.4.4

内置策略配置bean

@Configuration
public class HttpUtils {

    @Bean
    @LoadBalanced //开启ribbon的负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

    // 配置负载均衡策略,即返回一个IRule对象交给spring管理
    @Bean
    public IRule getRule(){
        // 随机选择一个可用的服务器的策略
        return new RandomRule();
    }
}

自定义策略重写IRule接口实现类重写对应方法

浏览器刷新访问测试:http://localhost:5110/user/consumer/5110

负载均衡优化

见文档7.4.5

小坑:okToRetryOnAllOperations: false,是否所有操作都重试
防止调用方使用ribbon请求超时但超时时间后被调用服务又处理成功,然后调用方认为未成功又重复请求的情况
对于添加数据请求数据库有做幂等性校验就没问题,即対某列添加唯一性约束,重复数据不会添加成功

feign

见文档7.5.1

拷贝user-consumer-ribbon-5110为user-consumer-feign-5210
修改artifactId
父pom添加module
修改application.yml
删除target

替换ribbon包为feign包,关闭ribbon注解,ribbon配置,ribbon策略代码和feign一样不用删
添加UserClient

@FeignClient("user-provider")
@RequestMapping("/user/provider/")
public interface UserClient {

    @RequestMapping("/{id}")	// 通过这些参数自动生成一个代理实现类,发起远程调用
    User getUser(@PathVariable("id") Long id);
}

启动类加注解

@SpringBootApplication
@EnableEurekaClient //表示是eureka的客户端
@EnableFeignClients(basePackages = "cn.ming.client") //如果是主内所在子包,可以不用加basePackages,但是最好加上
public class UserConsumerApp {

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

修改UserConsumerController

@RestController
@RequestMapping("/user/consumer")
public class UserConsumerController {

    @Autowired
    private UserClient client;

    // 返回一个用户
    @RequestMapping("/{id}")
    public User getUserById(@PathVariable("id") Long id){
        System.out.println(client.getClass());//
        User user = client.getUser(id);
        return user;
    }
}

启动eureka集群,生产者集群和此项目
浏览器刷新访问测试:http://localhost:5210/user/consumer/5210

Hystrix

Hystrix概述

见文档2.1,2.2
在这里插入图片描述
如下单前检查用户是否登录或调取用户信息,其中一台挂掉会影响请求到这台机器上的所有请求,影响越来越大,造成雪崩现象

eureka只是定时更新可调用服务列表,处理此问题不专业

Hystrix可対问题机器进行隔离,熔断,限流,降级,缓存,
隔离:单独分开
熔断:例如:每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。
限流:减少给此服务分发的请求数量
降级:回调返回设定的错误,避免直接没任何响应
缓存:把请求排队或转给其他服务处理

Ribbon搭配Hystrix降级处理

Hystrix是在远程调用是应用的,所以要搭配ribbon或feign使用
在服务提供者方向写

项目准备
拷贝user-provider-4010为user-provider-hystrix-4110
修改父pom和子pom
修改application.yml
删除target

导包

		<!--断路器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

启动类加注解

@SpringBootApplication
@EnableEurekaClient //表示是eureka的客户端
@EnableHystrix  //表示添加 hystrix 服务熔断降级
public class UserProviderApp {

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

修改UserProviderController

@RestController
@RequestMapping("/user/provider")
public class UserProviderController {

    @Autowired
    private ApplicationContext context;

    // 返回一个用户
    @RequestMapping("/{id}")
    @HystrixCommand(fallbackMethod = "fallbackMethod")	//服务降级的处理回调的方法
    public User getUser(@PathVariable("id") Long id) {
        // 为了方便看是哪一个提供者提供的服务
        String activeProfile = context.getEnvironment().getActiveProfiles()[0];

        if (id == 2){	//模拟服务器出错
            throw new RuntimeException("服务器异常1");
        }
        return new User(id, "zs," + activeProfile);
    }

    public User fallbackMethod(Long id){	//降级处理的方法
        return new User(id,"服务器异常2");
    }
}

启动eureka集群,带hystrix的生产者,带ribbon的消费者
浏览器访问测试:http://localhost:5110/user/consumer/2

Feign搭配Hystrix降级处理

写在消费者一边

项目准备
拷贝user-consumer-feign-5210到user-consumer-feign-hystrix-5310
修改父pom和子pom
修改application.yml
删除target文件夹

不用新加依赖,有openfeign就行
application.yml

feign:
   hystrix:
       enabled: true #开启熔断支持
   client:
    config:
      remote-service:           #服务名,填写default为所有服务
        connectTimeout: 3000
        readTimeout: 3000
hystrix:
  command:
      default:
        execution:
          isolation:
            thread:
              timeoutInMilliseconds: 3000

新增类UserFallBack

@Component //降级处理
public class UserFallBack implements FallbackFactory<UserClient> {
    @Override
    public UserClient create(Throwable throwable) {

        return new UserClient() {
            @Override
            public User getUser(Long id) {
                return new User(id,"系统繁忙,请联系管理员");
            }
        };
    }
}

修改UserClient

@FeignClient(value = "user-provider",fallbackFactory = UserFallBack.class)
@RequestMapping("/user/provider/")
public interface UserClient {

    @RequestMapping("/{id}")    // 通过这些参数自动生成一个代理实现类,发起远程调用
    User getUser(@PathVariable("id") Long id);
}

修改user-provider-4010的UserProviderController

    @RequestMapping("/{id}")
    public User getUser(@PathVariable("id") Long id) {
        // 为了方便看是哪一个提供者提供的服务
        String activeProfile = context.getEnvironment().getActiveProfiles()[0];
        if (id == 2){   //模拟服务器出错,让hystrix搭配feign降级处理
            throw new RuntimeException("服务器异常");
        }
        return new User(id, "zs," + activeProfile);
    }

启动eureka集群,user-provider-4010和user-consumer-feign-hystrix-5310
浏览器访问测试:http://localhost:5310/user/consumer/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/425326.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot+vue学生信息管理系统学籍 成绩 选课 奖惩,奖学金缴费idea maven mysql

技术栈 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库工具&#xff1a;Navicat/SQLyog都可以学生信息管理系统主要实现角…

★【递归】【链表】Leetcode 21. 合并两个有序链表

★【递归】【链表】Leetcode 21. 合并两个有序链表 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 ---------------&#x1f388;&#x1f388;题目链接&#x1f388;&#x1f388;------------------- 解法1 &#xff1a;递归链表 简直是好题啊好题多做做 >>>…

解决Excel客户端中的Copilot灰色不可用

很多小伙伴已经用上了office套件中的copilot功能 Copilot for Microsoft 365账号介绍与相关问题的解答 Copilot for Microsoft 365账号登录指南 Copilot for Microsoft 365功能使用指南 问题发现 大部分人使用的都是Word和PowerPoint功能&#xff0c;但是也有部分小伙伴使…

(学习日记)2024.03.03:UCOSIII第五节:常用汇编指令+OS初始化+启动任务+任务切换

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

力扣hot5---双指针

题目&#xff1a; 解决方案&#xff1a;双指针 指针 i 指向最左侧&#xff0c;指针 j 指向最右侧。此时在宽度上达到了最大值&#xff0c;那么哪个柱子更矮&#xff0c;哪个柱子向内部移动&#xff0c;知道 i 与 j 相遇。为什么呢&#xff1f; 如果哪个哪个柱子更矮&#xff0c…

Python实现DMI工具判断信号:股票技术分析的工具系列(3)

Python实现DMI工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;3&#xff09; 介绍算法解释 代码rolling函数介绍完整代码 介绍 先看看官方介绍&#xff1a; DMI (趋向指标&#xff09; 用法 1.PDI线从下向上突破MDI线&#xff0c;显示有新多头进场&#xff0c;为…

SketchUp Pro 2023:颠覆传统,重塑设计世界mac/win版

SketchUp Pro 2023是一款强大的三维建模软件&#xff0c;专为设计师、建筑师和创意专业人士打造。这款软件以其直观易用的界面和强大的功能而著称&#xff0c;为用户提供了无限的创意空间。 SketchUp Pro 2023软件获取 SketchUp Pro 2023在用户体验方面进行了全面的优化&#…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

YOLOv9改进|使用CARAFE轻量级通用上采样算子

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 CARAFE 发表于ICCV2019。上采样操作可以表示为每个位置的上采样核和输入特征图中对应邻域的像素做点积&#xff0c;我们称之为特征重…

笔记74:在SLAM建图过程中,为什么要使用【障碍物点云配准算法】和【里程计估算算法】结合的方法

仅使用【障碍物点云配准算法】&#xff0c;很容易导致在一条长通道中&#xff0c;因为前后两帧的雷达点云图过于相似&#xff0c;导致特征匹配一直完全重合&#xff0c;使得机器人建图一直停留在原地&#xff0c;但实体机器人早就沿着通道跑向远端了&#xff1b; 使用Hector_ma…

【JavaEE进阶】CSS选择器的常见用法

CSS选择器的主要功能就是选中页面指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 CSS选择器主要有以下几种: 标签选择器类选择器id选择器复合选择器通配符选择器 接下来用代码来学习这几个选择器的使用。 <!DOCTYPE html> <html lang&q…

springboot2入门到实战-整合QQ邮箱

springboot整合QQ邮箱 配置邮箱 登录邮箱服务器&#xff1a; 登录QQ邮箱 springboot整合email 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>配…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础&#xff0c;同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式&#xff0c;其基本思想都是类似的&#xff1a;当点击事件传到 View 时&#xff0c;系统记下触摸点的坐标&#xff0c;手指移动时系统记下移动后…

行为树入门:BehaviorTree.CPP Groot2练习(前置后置条件)(3)

前置与后置条件理论 前置条件 例程&#xff1a; //hp_get叶节点class hp_get : public BT::SyncActionNode{public:hp_get(const std::string& name, const BT::NodeConfig& config) :BT::SyncActionNode(name, config){}// 给该节点申明端口static BT::PortsList pro…

使用ChatGPT写代码靠谱吗?

原文链接&#xff1a;使用ChatGPT写代码靠谱吗&#xff1f; 写在前面 对于ChatGPT从我们“惊讶”到现在已经快一年多了&#xff0c;但是&#xff0c;对于个人来说&#xff0c;使用还是比较少的。更确切的来说&#xff0c;也许有些同学是没有使用过。 ChatGPT功能确实比较强大…

代码随想录算法训练营第三十天| 回溯篇总结

文章目录 前言一、组合问题二、切割问题三、子集问题四、排列问题五、性能分析总结 前言 回溯法就是暴力搜索&#xff0c;并不是什么高效的算法&#xff0c;最多再剪枝一下。 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合 排列问题&#xff1a;N个数按一定规则全…

快速上手vercel,免费部署上线你的前端项目,3分钟学会

在你还不了解 vercel的时候&#xff0c;我已经部署了三个自己的项目了&#xff0c;都是免费&#xff0c;而且实时同步github并更新&#xff0c;当然也可以你自己本地直接部署到vercel&#xff0c;不经过github&#xff0c;今天三分钟教会你&#xff0c;但是注意&#xff1a;国内…

花28块,薅自己的羊毛!我错在哪里?

这些年返利类型的网站也是参差不齐&#xff0c;他就发现了赚钱的大门 而这个人就是我的大姨&#xff0c;他的喜好和别人不一样&#xff0c; 特别爱薅羊毛&#xff0c;但他都不知道我也被他拉在那个群里了&#xff01; 她对自媒体颇感兴趣&#xff0c;并创建了一个团体的小群…

Vue+SpringBoot打造大学计算机课程管理平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 实验课程档案模块2.2 实验资源模块2.3 学生实验模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 实验课程档案表3.2.2 实验资源表3.2.3 学生实验表 四、系统展示五、核心代码5.1 一键生成实验5.2 提交实验5.3 批阅实…

从0开始回顾Mysql --- MySQL初体验

大白话从0开始回顾MySQL&#xff0c;去除了一些繁琐的操作的演示以及内容&#xff0c;如MySQL安装等&#xff0c;本篇文章适合复习MySQL语法&#xff0c;学习MySQL语句&#xff0c;对MySQL不太熟练的同学&#xff0c;希望对大家有一些帮助。 MySQL初体验 首先&#xff0c;我将…