微服务+springcloud+springcloud alibaba学习笔记【Spring Cloud服务网关】(7/9)

news2024/12/23 23:28:12

Spring Cloud服务网关 7/9

    • 1、GateWay概述
    • 2、GateWay的特性:
    • 3、GateWay与zuul的区别:
    • 4、zuul1.x的模型:
    • 5、什么是webflux:
    • 6、GateWay三大概念:
        • 6.1,路由:
        • 6.2,断言:
        • 6.3,过滤:
    • 7、GateWay的工作原理:
    • 8、使用GateWay:
        • 8.1,建module
        • 8.2,修改pom文件
        • 8.3,写配置文件
        • 8.4,主启动类
        • 8.5,针对pay模块,设置路由:
        • 8.6,开始测试
    • 9、GateWay的网关配置,
        • 9.1 使用硬编码配置GateWay:
        • 9.2 重启服务 测试
        • 9.3 通过服务名实现动态路由
          • 9.3.1 修改GateWay模块的配置文件:
          • 9.3.2 然后就可以启动微服务.测试
          • **9.3.3 Pridicate断言:**
          • **9.3.4 Filter过滤器:**

1、GateWay概述

zuul停更了
在这里插入图片描述

gateway之所以性能号,因为底层使用WebFlux,而webFlux底层使用netty通信(NIO)

SpringCloud Gateway使用的是Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架

在这里插入图片描述

2、GateWay的特性:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFrltNQ8-1681725030916)(.\图片\gateway的4.png)]

Gateway能干什么?

  • 反向代理
  • 鉴权
  • 流量控制
  • 熔断
  • 日志监控

3、GateWay与zuul的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kxBvp6cE-1681725030918)(.\图片\gateway的5.png)]

4、zuul1.x的模型:

在这里插入图片描述

5、什么是webflux:

是一个非阻塞的web框架,类似springmvc这样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wEv1n6lc-1681725030922)(.\图片\gateway的8.png)]

6、GateWay三大概念:

6.1,路由:

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如断言为true则匹配该路由

就是根据某些规则,将请求发送到指定服务上

6.2,断言:

参考的是Java8的java.util.function.Predicate 开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

就是判断,如果符合条件就是xxxx,反之yyyy

6.3,过滤:

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.

路由前后,过滤请求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RvekLADg-1681725030933)(C:\Users\Administrator\AppData\Local\Temp\1681715660122.png)]

7、GateWay的工作原理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zbg6uKOY-1681725030935)(.\图片\gateway的12.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DA2sjgZP-1681725030936)(.\图片\gateway的13.png)]

Gateway的核心逻辑:路由转发+执行过滤器

下章开始配置一个gateway网关。

8、使用GateWay:

8.1,建module

新建一个GateWay的模块项目

名字: Cloud-gateway-9527

8.2,修改pom文件

<?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">
    <parent>
        <artifactId>springcloud2023</artifactId>
        <groupId>com.tigerhhzz.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Cloud-gateway-9527</artifactId>

    <dependencies>
        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--Springboot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--Springboot actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.tigerhhzz.springcloud-tigerhhzz</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 引入lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 引入srpingboot test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

</project>

8.3,写配置文件

server:
  port: 9527
spring:
  application:
    name: cloud-gateway-service

eureka:
  instance:
    hostname: cloud_gateway_service
  client:
    service-url:
      defaultZone: http://www.eureka7001.com:7001/eureka/
    register-with-eureka: true
    fetch-registry: true

8.4,主启动类

package com.tigerhhzz.springcloud;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
@Slf4j
public class GateWayMain9527 {
    public static void main(String[] args) {
        SpringApplication.run(GateWayMain9527.class,args);
        log.info("GateWayMain9527启动成功~~~~~~~~~~~~~~~~~~~");
    }
}

8.5,针对pay模块,设置路由:

我们目前不想暴露8001端口,希望在8001外面套一层9527

cloud-provider-payment8001看看controller的访问地址(两个controller 分别是如下)

    @GetMapping("/payment/lb")
    public String getPaymentLB(){
        return serverPort;
    }

  @GetMapping(value = "/payment/{id}")
  public CommonResult getPaymentById(@PathVariable("id")Long id){
      Payment result = paymentService.getPaymentById(id);
      log.info("****查询结果:" + result);
      if(result != null){
          return new CommonResult(200, "查询成功,serverPort:  "+serverPort, result);
      }
      return new CommonResult(400, "没有对应id的记录", null);
  }

**修改GateWay模块(9527)的配置文件:

server:
  port: 9527
spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      routes: #多个路由
        - id: payment_routh                       #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001   #匹配后提供服务的路由地址
          #uri: lb://cloud-payment-service         #路由的ID,没有固定规则但要求唯一,建议配合服务名
          predicates: #断言
            - Path=/payment/**                #断言 路径相匹配的进行路由
        - id: payment_routh2
          uri: http://localhost:8001
          #uri: lb://cloud-payment-service
          predicates:
            - Path=/payment/lb/**
            #- After=2022-06-16T19:49:30.417+08:00[Asia/Shanghai]
            #- Cookie=username,tigerhhzz

eureka:
  instance:
    hostname: cloud_gateway_service
  client:
    service-url: //服务提供者provider注册进eureka服务中心
      defaultZone: http://www.eureka7001.com:7001/eureka/
    register-with-eureka: true
    fetch-registry: true

这里表示,

当访问localhost:9527/payment/31时,

路由到localhost:8001/payment/31

8.6,开始测试

启动Cloud-eureka-server7001

启动Cloud-provider-payment8001

启动Cloud-gateway-9527

如果启动GateWay报错
        可能是GateWay模块引入了web和监控的starter依赖,需要移除

访问:

添加网关前:http://localhost:8001/payment/1

添加网关后:http://localhost:9527/payment/1

9、GateWay的网关配置,

Gateway网关路由有两种配置方式:

  • 在配置文件yaml中配置

  • 代码中注入RouteLocator的Bean

GateWay的网关配置,除了支持配置文件,还支持硬编码方式

9.1 使用硬编码配置GateWay:

自己写一个:通过9527网关访问到外网的百度和腾讯网站

创建配置类:

package com.tigerhhzz.springcloud.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GateWayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("path_route",r->r.path("/baidunews").uri("https://news.baidu.com/"));
        return routes.build();
    }

    @Bean
    public RouteLocator customRouteLocator2(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder routes = builder.routes();
        routes.route("path_route1",r->r.path("/tencent").uri("https://www.tencent.com/"));
        return routes.build();
    }
}

9.2 重启服务 测试

9.3 通过服务名实现动态路由

上面的配置虽然首先了网关,但是是在配置文件中写死了要路由的地址

现在需要修改,不指定地址,而是根据微服务名字进行路由,我们可以在注册中心获取某组微服务的地址

默认情况下Gatway会根据注册中心注册的服务列表, 以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能

需要注意的是uri的协议lb,表示启用Gateway的负载均衡功能.

lb://serverName是spring cloud gatway在微服务中自动为我们创建的负载均衡uri

需要:

一个eureka7001+两个服务提供者8001/8002

9.3.1 修改GateWay模块的配置文件:
server:
  port: 9527
spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes: #多个路由
        - id: payment_routh                       #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001   #匹配后提供服务的路由地址
          uri: lb://cloud-provider-service         #路由的ID,没有固定规则但要求唯一,建议配合服务名
          predicates: #断言
            - Path=/payment/**                #断言 路径相匹配的进行路由
        - id: payment_routh2
          #uri: http://localhost:8001
          uri: lb://cloud-provider-service
          predicates:
            - Path=/payment/lb/**
            #- After=2022-06-16T19:49:30.417+08:00[Asia/Shanghai]
            #- Cookie=username,tigerhhzz

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url: #服务提供者provider注册进eureka服务中心
      defaultZone: http://localhost:7001/eureka/
    register-with-eureka: true
    fetch-registry: true
9.3.2 然后就可以启动微服务.测试

8001/8002两个端口切换 http://localhost:9527/payment/lb

9.3.3 Pridicate断言:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCeJPUxW-1681725030938)(.\图片\gateway的24.png)]

我们之前在配置文件中配置了断言:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIHr60zu-1681725030939)(.\图片\gateway的22.png)]

这个断言表示,如果外部访问路径是指定路径,就路由到指定微服务上

可以看到,这里有一个Path,这个是断言的一种,断言的类型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IHC3GcGo-1681725030942)(.\图片\gateway的23.png)]

After:
        可以指定,只有在指定时间后,才可以路由到指定微服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IaCcOBPz-1681725030944)(.\图片\gateway的26.png)]

这里表示,只有在2020年的2月21的15点51分37秒之后,访问才可以路由

在此之前的访问,都会报404

如何获取当前时区?**

import java.time.ZonedDateTime;

/**
 * @author tigerhhzz
 * @date 2023/4/17 17:10
 */
public class T2 {
    public static void main(String[] args) {
        ZonedDateTime now = ZonedDateTime.now();
        System.out.println(now);
        //2023-04-17T17:11:53.743+08:00[Asia/Shanghai]
    }
}
before:
        与after类似,他说在指定时间之前的才可以访问
        between:
        需要指定两个时间,在他们之间的时间才可以访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-12SZOTcd-1681725030946)(.\图片\gateway的27.png)]

cookie:
        只有包含某些指定cookie(key,value),的请求才可以路由

在这里插入图片描述

利用curl访问测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldx6VelW-1681725030950)(C:\Users\Administrator\AppData\Local\Temp\1681723144707.png)]

yml中加上:

- Cookie=username,tigerhhzz

curl测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QlqBXABx-1681725030951)(C:\Users\Administrator\AppData\Local\Temp\1681723346723.png)]

Header:
        只有包含指定请求头的请求,才可以路由

在这里插入图片描述

测试:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-36upRH7u-1681725030954)(.\图片\gateway的33.png)]

host:
        只有指定主机的才可以访问,
        比如我们当前的网站的域名是www.aa.com
        那么这里就可以设置,只有用户是www.aa.com的请求,才进行路由

在这里插入图片描述

可以看到,如果带了域名访问,就可以,但是直接访问ip地址.就报错了

method:
        只有指定请求才可以路由,比如get请求...

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79LjESh0-1681725030964)(.\图片\gateway的38.png)]

path:
        只有访问指定路径,才进行路由
        比如访问,/abc才路由

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZypMcU4Q-1681725030965)(.\图片\gateway的39.png)]

Query:
        必须带有请求参数才可以访问

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2wKVp6W-1681725030967)(.\图片\gateway的40.png)]

9.3.4 Filter过滤器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Umoyx3ST-1681725030968)(.\图片\gateway的41.png)]

生命周期:

在请求进入路由之前,和处理请求完成,再次到达路由之前

种类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pv4pTscY-1681725030970)(.\图片\gateway的42.png)]

GateWayFilter,单一的过滤器

与断言类似,比如闲置,请求头,只有特定的请求头才放行,反之就过滤:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHhsEGgQ-1681725030971)(.\图片\gateway的43.png)]

GlobalFilter,全局过滤器:

自定义过滤器:

实现两个接口

package com.tigerhhzz.springcloud.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Component
public class MyGateWayFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("**************come in MylogGateWayGilter:  " + new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null) {
            System.out.println("********用户名为空,非法用户。");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

然后启动服务,即可,因为过滤器通过@COmponet已经加入到容器了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DTkDBjjJ-1681725030974)(C:\Users\Administrator\AppData\Local\Temp\1681724706488.png)]

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Springboot 整合 Redis 进行基本操作

SpringBoot整合Redis 首先创建 Springboot 项目。 spring-data-redis针对jedis提供了如下功能&#xff1a;1.连接池自动管理&#xff0c;并提供了一个高度封装的“RedisTemplate”类2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口ValueOperat…

计网第六章.应用层各协议概览

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一. C/S方式和P2P对等方式二. 动态主机配置协议DHCP三.域名系统DNS域名解析过程四.文件传输协议FTP基本工作原理&#xff1a;五.电子邮件六.万维网www万维网的文档6.1 HTTP&#xff08;HyperText Transfer Protocol&am…

左手Python 右手R —— 最大公约数和最小公倍数

左手Python 右手R —— 最大公约数和最小公倍数前言1、 最大公约数1.1 约数1.2 最大公约数1.3 求解方法2、 最小公倍数2.1 倍数2.2 最小公倍数2.3 求解方法3、程序实现3.1 python 代码实现3.2 R语言代码实现小结创作不易&#xff0c;都浏览到这儿了&#xff0c;看官可否将下面的…

【Linux系统创建,修改用户和组和修改目录文件的权限以及实验的心得体会】

实验过程 1.创建一个新用户nick,设置其主目录为home/nick。 &#xff08;1&#xff09;添加新用户&#xff1a; sudo useradd -m 用户名 sudo passwd 新用户名 &#xff08;2&#xff09;给新用户可以执行的root权限 sudo vi /etc/sudoers #User privilege specification roo…

Spring Security实战(一)——基于内存和数据库模型的认证与授权

目录 简介 一、初识Spring Security&#xff08;入门案例&#xff09; &#xff08;1&#xff09;新建project &#xff08;2&#xff09;选择依赖 &#xff08;3&#xff09;编写一个 HelloController &#xff08;4&#xff09;启动项目&#xff0c;访问localhost:8080…

手动清除gitlab中prometheus的数据

背景&#xff1a; gitlab服务器上&#xff0c; 磁盘经常爆满。后来通过 du -sh ./* 查出prometheus下的data占了绝大多数磁盘空间。 因此&#xff0c;准备删除prometheus的数据。 思路 由于prometheus的数据占用的空间较大&#xff0c;因此在实际使用时&#xff0c;可以关闭…

【 Spring MVC 核心功能(一) - 使用注解实现 URL 路由映射】

文章目录引言一、RequestMapping 注解介绍1.1 RequestMapping 是 post 还是 get 请求&#xff1f;1.2 RequestMapping 指定一种请求方式二、GetMapping三、PostMapping四、总结引言 前面我们讲到&#xff0c;学习 Spring MVC 需要掌握三个核心功能即连接&#xff0c;获取参数&…

avi文件怎么转成mp4视频,3种方法快速学

avi文件怎么转成mp4视频&#xff1f;前面小编给大家讲了mov格式和webm格式&#xff0c;以及如何将mov和webm格式转换成mp4格式。今天小编给大家说一说另外一种视频格式&#xff0c;就是avi&#xff0c;AVI英文全称为Audio Video Interleaved&#xff0c;即音频视频交错格式&…

SpringBoot中对Bean的处理方法以及第三方Bean处理的方式

我们可以通过Spring当中提供的注解Component以及它的三个衍生注解&#xff08;Controller、Service、Repository&#xff09;来声明IOC容器中的bean对象&#xff0c;为应用程序注入运行时所需要依赖的bean对象&#xff0c;也就是依赖注入DI。 关于IOC容器中Bean的其他使用细节…

矿泉水为什么会溴酸盐超标

矿泉水为什么会溴酸盐超标&#xff1f; 水生产企业多使用臭氧消毒&#xff0c;不过&#xff0c;水生产企业不存在水运输路途遥远的问题&#xff0c;因此可以使用臭氧消毒。同时&#xff0c;也是因为臭氧在消毒后会直接变成氧气&#xff0c;所以不会有使用氯消毒后的那种味道&a…

give_you_flag(GIF原理、二维码定位符)

下载附件是一个GIF 看到最后你会发现它突然漏了一个二维码出来 我们将这个GIF分解成图片&#xff08;动图就是由多张静态图片组合而成&#xff0c;按照一定的顺序和时间播放的&#xff09; https://tu.sioe.cn/gj/fenjie/ 提取出里面包含二维码的那张 但是我们发现这里有一个…

word2vec原理

1.背景 2013年&#xff0c;Google开源了一款用于词向量计算的工具—word2vec&#xff0c;引起了工业界和学术界的关注。首先&#xff0c;word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练&#xff1b;其次&#xff0c;该工具得到的训练结果——词向量(word embed…

GDPU C语言 天码行空7

1. 数组最大值交换 ⭐ 1e9&#xff1a;10的9次方 #include<stdio.h>int main() {int n, i,idx 0;//idx 记录第一个出现的最大值下标scanf("%d", &n);double a[30];double max -1e9;// 1e9 表示10的9次方&#xff0c;十亿&#xff0c;int 的最大范围级别…

使用RT-Thread Studio搭配STM32CubeMX新建RT-Thread项目

STM32CubeMX下载 RT-Thread Studio下载 安装好RT-Thread Studio后&#xff0c;先打开RT-Thread SDK管理器确认有没有自己MCU需要的SDK包&#xff0c;直接安装好之后里面是有STM32F1系列的SDK包&#xff0c;其他的需要自己安装。 之后点击文件→新建→RT-Thread项目&#xff0…

C++ 实现 matlab 的 zp2tf 函数

文章目录1. matlab 的 zp2tf 函数的作用2. matlab 的 zp2tf 函数的使用方法3. C实现3.1 complex.h 文件3.2 zp2tf.h 文件4. 测试结果4.1 测试文件4.2 测试结果1. matlab 的 zp2tf 函数的作用 作用是将极点形式的 H(s) 函数的分母展开 2. matlab 的 zp2tf 函数的使用方法 [z,…

ICASSP2023 | 基于多任务学习的保留背景音的语音转换

在影视、有声书内容中&#xff0c;背景音是一种表现丰富的艺术形式。语音转换&#xff08;Voice Conversion&#xff09;如能将源说话人语音转换成目标说话人语音的同时&#xff0c;保留源语音中的背景音&#xff0c;将会提供更沉浸的语音转换体验。之前的语音转换研究主要关注…

低代码平台很赞,用2个小时,搭出1套应用

最近低代码很火&#xff0c;到处都是低代码的尝试贴&#xff0c;笔者今天也决定深入体验一下&#xff0c;感受它的便捷程度。 在案例开始之前&#xff0c;我们先来聊聊概念。 一、低代码 低代码实质上并不是一个新颖的话题&#xff0c;也不是最近才有的技术突破和创新&#xf…

Python--异常处理机制

Python异常处理机制 1、什么是异常处理&#xff1a; 程序运行时常会碰到一些错误&#xff0c;例如除数为 0、年龄为负数、数组下标越界等&#xff0c;这些错误如果不能发现并加以处理&#xff0c;很可能会导致程序崩溃。 可以简单的理解异常处理机制&#xff0c;就是在程序运…

Nginx生产环境配置、elasticsearch生产环境配置、rocketmq生产环境配置 (史上最全)

Nginx实现10万并发 在优化内核时&#xff0c;可以做的事情很多&#xff0c;不过&#xff0c;我们通常会根据业务特点来进行调整&#xff0c;当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时&#xff0c;期内核参数的调整都是不同的&#xff0c; 概述&am…

计算机组成原理——第五章中央处理器

半生风雨半生伤&#xff0c;半醉半醒半心凉 文章目录前言5.1 CPU的功能和基本结构5.2 指令周期的数据流5.3.1 单总线结构5.3.2 专用通路结构前言 之前我们就说过CPU主要包括两个部分&#xff0c;运算器和控制器&#xff0c;运算器主要是实现算数运算.逻辑运算&#xff0c; 运算…