(一)Spring Cloud 直击微服务作用、架构应用、hystrix降级

直击微服务作用

  微服务架构:

    遇到了什么问题?
        将单体架构拆分成微服务架构后,如果保证多个服务(项目)正常运行?
    哪个技术可以解决这个问题?
        微服务技术
        服务治理: 服务管理,维护服务与服务之间的关系
    这个技术如何使用?
        netflix/网飞:
        SpringCloud: ★
        Alibaba: ★ 

软件架构

架构: 结构

软件架构: 软件的结构

淘宝架构演进过程:

100并发 -> 千万并发,阿里淘宝的 14 次架构演进之路!

软件架构演进过程:
    单体架构: All in one
        优点: 架构简单 部署方便
        缺点: 
            耦合度高,维护成本大
            技术栈受限
        使用场景: 用户量小,一般情况下开发学生管理系统
    分布式架构:
        将大项目拆分成多个小项目
    微服务架构:
        拆分原则:
            单一职责: 一个服务只做一件事情(不允许出现冗余的功能或模块)
            自治: 团队独立,技术独立,部署独立,数据库独立
            面向服务: 微服务开发完毕后,需要对外提供统一的访问接口(对接规范)
            隔离性强: 服务调用做好隔离、容错、降级,避免出现级联问题
微服务技术:
    各个公司将自己的单体架构的项目拆分成微服务架构项目后,都有自己的解决方案.我们学习时,主要学习SpringCloud官方提供的微服务组件,SpringCloud官方使用的组件主要来自NetFlix和Alibaba
    学习微服务其实就是学习相关的微服务组件,一个组件可以解决微服务拆分后的一类问题.

如何使用:

准备微服务环境
创建两个数据库,分别写一套对应的增删改查操作

依赖

     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR10</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

Eureka组件

遇到了什么问题?
    - order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
    - 有多个user-service实例地址,order-service调用时该如何选择?
    - order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?
哪个技术可以解决这个问题?
    Eureka组件可以解决
这个技术如何使用?
    1.搭建Eureka服务端
    2.在微服务中整合Eureka客户端
    3.在消费者方,通过服务名称获取提供者的地址,负载均衡进行访问

RestTemplate对象

RestTemplate: 模拟浏览器的行为向服务器发送请求


/**
 * @Author: huahua
 * @name:RestTemplateTest
 * @Date:2023/7/18 10:41
 */
@SpringBootTest
public class RestTemplateTest {
    /**
     * RPC(Remote Procedure Call Protocol): 远程过程调用
     *      只要实现了两台机器之间的数据交互就可以称之为远程过程调用
     * RestTemplate: 封装了远程调用的客户端
     *
     */
    @Autowired
    private RestTemplate restTemplate;

    // get方式的请求
    @Test
    public void test01(){
        // 向目标服务器发送请求,并接收对应的结果
        //String resp = restTemplate.getForObject("http://user-service/user/1", String.class);
        //TbUser resp = restTemplate.getForObject("http://user-service/user/1", TbUser.class);
        // 携带参数
        //TbUser resp = restTemplate.getForObject("http://user-service/user/findByName/柳岩", TbUser.class);
        //System.out.println(resp);

        ResponseEntity<TbUser> resp = restTemplate.getForEntity("http://127.0.0.1:8081/user/1", TbUser.class);
        // 获取响应状态
        HttpStatus statusCode = resp.getStatusCode();
        // 获取响应数据
        TbUser tbUser = resp.getBody();
        // 获取响应头
        HttpHeaders headers = resp.getHeaders();
        // 获取响应头中的cookie头
        List<String> list = headers.get("Set-Cookie");
        System.out.println(statusCode);
        System.out.println(tbUser);
        System.out.println(headers);
        System.out.println(list);

    }
    /**
     * 请求头设置参数,访问指定接口
     */
    @Test
    public void test03(){
        String url="http://127.0.0.1:8081/user/2";
        //设置请求头参数
        HttpHeaders headers = new HttpHeaders();
        headers.add("token","damimi");
        //请求头填充到请求对象下
        HttpEntity<Map> entry = new HttpEntity<>(headers);
        //发送请求
        ResponseEntity<TbUser> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entry, TbUser.class);
        TbUser result = responseEntity.getBody();
        System.out.println(result);
    }
    /**
     * post模拟form表单提交数据
     */
    @Test
    public void test04(){
        String url="http://localhost:8081/user/save";
        //设置请求头,指定请求数据方式
        HttpHeaders headers = new HttpHeaders();
        //告知被调用方,请求方式是form表单提交,这样对方解析数据时,就会按照form表单的方式解析处理
        headers.add("Content-type","application/x-www-form-urlencoded");
        //组装模拟form表单提交数据,内部元素相当于form表单的input框
        LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        map.add("username","迪丽热巴");
        map.add("address","天津");
        HttpEntity<LinkedMultiValueMap<String, Object>> httpEntity = new HttpEntity<>(map, headers);
        /*
            参数1:请求url地址
            参数2:请求方式 POST
            参数3:请求体对象,携带了请求头和请求体相关的参数
            参数4:响应数据类型
         */
        ResponseEntity<TbUser> exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, TbUser.class);
        TbUser body = exchange.getBody();
        System.out.println(body);
    }

    /**
     * post发送json数据
     */
    @Test
    public void test05() throws JsonProcessingException {
        String url="http://localhost:8081/user/save2";
        //设置请求头的请求参数类型
        HttpHeaders headers = new HttpHeaders();
        //告知被调用方,发送的数据格式的json格式,对方要以json的方式解析处理
        headers.add("Content-type","application/json; charset=utf-8");
        //组装json格式数据
        HashMap<String, String> reqMap = new HashMap<>();
        reqMap.put("username","zhangsan");
        reqMap.put("address","上海");
        ObjectMapper objectMapper = new ObjectMapper();
        String reqMapJson = objectMapper.writeValueAsString(reqMap);
        //构建请求对象
        HttpEntity<String> httpEntity = new HttpEntity<>(reqMapJson, headers);
          /*
            发送数据
            参数1:请求url地址
            参数2:请求方式
            参数3:请求体对象,携带了请求头和请求体相关的参数
            参数4:响应数据类型
         */
        ResponseEntity<TbUser> responseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, TbUser.class);
        //或者
        // Account account=restTemplate.postForObject(url,httpEntity,Account.class);
        TbUser body = responseEntity.getBody();
        System.out.println(body);
    }

    @Test
    public void test07(){
        ResponseEntity<String> resp = restTemplate.getForEntity("http://www.takungpao.com/news/index.html", String.class);
        String body = resp.getBody();
        System.out.println(body);
    }
}

Ribbon

当服务从Eureka中拉取多个服务地址时,Ribbon可以实现负载均衡(从多个地址中选择一个)
在RestTemplate对象上添加注解 @LoadBalanced

Hystrix组件

作用: 解决雪崩问题
      雪崩问题: 在一个业务链路中,由于下游服务的故障,导致整个链路关联的所以服务宕机.
解决方案:
    服务降级: 换一种方式快速给上游服务一个响应.
    服务熔断: 当出错率到达一定的阈值时,直接熔断,不再访问下游服务,直接降级.

服务降级

1.导入启动器

在消费者/上游服务方导入

 <!-- Hystrix启动器 -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2.在引导上开启Hystrix支持

@EnableHystrix

3.编写降级逻辑

a.在需要降级的方法上降级注解: @HystrixCommand(fallbackMethod="降级方法名")
b.编写降级的方法
  降级处理的方法,与原方法返回值,参数列表保持一致

package com.bw.order.controller;

import com.bw.order.domain.TbOrder;
import com.bw.order.domain.TbUser;
import com.bw.order.service.TbOrderService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: huahaua
 * @name:OrderController
 * @Date:2023/8/14 18:48
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private TbOrderService orderService;
    // 此方法执行超时后,调用对应降级的方法快速处理业务
    @RequestMapping("/findById/{id}")
    @HystrixCommand(fallbackMethod="findUserByIdForFail")
    public TbOrder findById(@PathVariable Integer id){
        TbOrder order = orderService.findById(id);
        return order;
    }

    // todo:降级处理的方法,与原方法返回值,参数列表保持一致
    public TbOrder findUserByIdForFail(Integer id){
        TbOrder order = new TbOrder();
        order.setName("你的小可爱走丢了....服务降级");
        return order;
    }
}

4.注意事项和配置

Hystrix默认降级时间为1秒钟
配置降级时间:

hystrix:
  command:
    default:
      execution.isolation.thread.timeoutInMilliseconds: 2000 # 单位毫秒

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

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

相关文章

智能化输电线路定位技术:提升电网运行效率的未来发展方向

随着科技的不断发展&#xff0c;电力行业也在逐步引入智能化技术&#xff0c;以提高输电线路的运行效率和安全性。在这篇文章中&#xff0c;恒峰智慧科技将探讨一种新的输电线路定位技术——分布式行波测量技术&#xff0c;它如何帮助我们实现这一目标。 一、分布式故障定位及隐…

游泳耳机排行榜前四名,分享几款值得推荐的游泳耳机

游泳是一项全面锻炼身体的运动&#xff0c;然而&#xff0c;水的阻力有时让人感到运动的笨拙和单调。为了让游泳更具趣味性和挑战性&#xff0c;选择一款高品质的游泳耳机至关重要。以下是游泳耳机排行榜前四名&#xff0c;以及几款强烈推荐的游泳耳机&#xff0c;它们结合防水…

Python教程(22)——Python面向对象的属性和方法

在Python面向对象编程中&#xff0c;属性和方法是类及其对象的重要组成部分。如果说封装、继承和多态是面向对象编程中的思想&#xff0c;那么类的属性和方法就是骨架&#xff0c;因为有属性和方法&#xff0c;面向对象编程才变的有血有肉。 属性 属性是类或对象所拥有的数据&…

UWB 技术及应用

超宽带技术为工业自动化提供独特优势&#xff0c;是首要的室内定位技术。 UWB 因其相对于 RFID、BLE 或 WiFi 等同类技术的众多优势而被认为是室内定位技术的黄金标准。它是基于位置的自动化的理想解决方案。 UWB 结合了短光速脉冲&#xff0c;可在宽带宽上精确测量信号到达时…

linux离线安装docker20.10.7 版本(亲测有效)

目录 1 下载2 安装2.1 新建docker.service2.2 为什么要写docker.service2.3 启动docker2.5 安装docker-compose2.5.1 为什么安装2.5.2 安装 3 /usr/local/bin/ 和 /usr/bin 区别 1 下载 将这个上传到linux 服务器的 随便一个目录 2 安装 解压离线安装包 tar -zxvf docker-20.1…

面试算法105:最大的岛屿

题目 海洋岛屿地图可以用由0、1组成的二维数组表示&#xff0c;水平或竖直方向相连的一组1表示一个岛屿&#xff0c;请计算最大的岛屿的面积&#xff08;即岛屿中1的数目&#xff09;。例如&#xff0c;在下图中有4个岛屿&#xff0c;其中最大的岛屿的面积为5。 分析 将岛屿…

局域网实现文件自动同步

软件下载地址: https://dbrwe.blog.csdn.net/article/details/132331206?spm1001.2014.3001.5502 打开【自动上传与同步】配置 在下面 自动同步 自动回传打上钩就可以同步或者下载文件

生成式人工智能市场规模、趋势和统计数据(2024-2026)

生成式人工智能市场规模、趋势和统计数据&#xff08;2024-2026&#xff09; 目录 生成式人工智能市场规模、趋势和统计数据&#xff08;2024-2026&#xff09;一、生成式人工智能行业亮点二、生成式人工智能市场规模三、生成式人工智能市场增长预测四、生成式人工智能采用统计…

结构型设计模式——适配器模式

适配器模式 这个更加好理解&#xff0c;就是做适配功能的类&#xff0c;例如&#xff0c;现在手机没有了圆形耳机接口&#xff0c;只有Type-C接口&#xff0c;因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器&#xff08;适配器&#xff09;&#xff0c;这…

再不收藏就晚了,Axure RP Pro 各版本大集合

Axure RP Pro下载链接 https://pan.baidu.com/s/1hRJRY6t0ZONKhdwvykAc3g?pwd0531 1.鼠标右击【Axure RP Pro9.0】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Axure RP Pro9.0】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Axu…

基于ssm的一家运动鞋店的产品推广网站的设计论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本一家运动鞋店就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

整理的十大算法和十大排序,分别用汇编语言,C语言,C++,java,python编写实现

整理的十大算法和十大排序&#xff0c;分别用汇编语言&#xff0c;C语言&#xff0c;C,java,python编写实现十大算法&#xff0c;分别用分别用C语言&#xff0c;C,java,python编写实现 Floyd Warshall算法 http://www.net188.com/thread-616-1-1.html …

<软考高项备考>《论文专题 - 57 干系人管理(1) 》

1 论文基础 1.1 写作要点 过程定义、作用写作要点、思路识别干系人识别干系人是定期识别项目干系人&#xff0c;分析和记录他们的利益、参与度、相互依赖性、影响力和对项目成功的潜在影响的过程。作用:使项目团队能够建立对每个干系人或干系人群体的适度关注。本项目里有哪些…

Qt之有趣的数字钟

一.效果 基于网络代码修改,支持时、分、秒;支持滑动、翻页和旋转。 二.实现 #include <QtCore> #include <QPainter> #include <QAction> #include <QWidget> #include <QMainWindow> #include <QTimer> #include <QKeyEvent> #…

TDengine 签约西电电力

近年来&#xff0c;随着云计算和物联网技术的迅猛发展&#xff0c;传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上&#xff0c;电力行业构建了信息网络、通信网络和能源网络&#xff0c;致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

gem5学习(10):创建一个简单的配置脚本——Creating a simple configuration script

目录 一、gem5 configuration scripts 1、An aside on SimObjects 二、Creating a config file 1、导入m5库和SimObjects 2、创建模拟系统 3、设置系统时钟 4、设置内存模拟方式 5、创建CPU 6、创建系统级内存总线 7、连接请求-响应端口 &#xff08;1&#xff09;A…

Word2007导出PDF的正确做法

客户让做个一程序&#xff0c;从Excel读出数据&#xff0c;经过统计、计算生成PDF文档。我的做法是中间安装模板生成Word文档&#xff0c;然后在导出为PDF。 程序完成后需要测试&#xff0c;客户的环境是Win10Office2007。我用虚拟机搭建了环境&#xff0c;发现Word2007竟然无…

使用Nonebot编写QQ机器人

使用 NoneBot 这个工具&#xff0c;来编写 QQ 机器人。 安装基础软件 一、安装 NoneBot 库 直接使用 pip 安装即可 pip install nonebot二、安装酷Q 软件和 HTTP API 插件 酷Q 软件可以直接到官网下载&#xff0c;https://cqp.cc/b/news&#xff0c;或者可以到网盘下载&am…

理解接雨水算法

一、IDEA注释显示图片 在做题时&#xff0c;需要对照这图片&#xff0c;才能更好的梳理思路。 首先&#xff0c;注释里添加<img/>标签 之后&#xff0c;将鼠标光标放置在需要以阅读模式预览注释的地方&#xff0c;然后按快捷键CtrlAltQ即可 二、接雨水算法 先看接雨水…

nRF 5340环境搭建和工具下载(采用vscode最新搭建教程)

1. nRF 5340环境搭建和工具下载 1. 1 软件安装 nRF Connect for Desktop https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop nRF Command Line Tools https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools/downl…