系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、网关
    • 1、什么是网关?
    • 2、为什么需要网关?
    • 3、SpringCloudAlibaba GateWay
  • 二、快速入门
    • 1.导入依赖
    • 2.创建 GateWayApplication 启动类
    • 3.创建application.yml文件
    • 4.启动服务方,消费方,网关,进行测试
  • 三、谓词配置
  • 四、过滤器配置
    • 1.令牌桶算法
    • 2.使用步骤
      • (1)添加依赖
      • (2)创建RedisHostKeyResovler类
      • (3)在application.yml中增加filters和redis的配置
      • (4)启动Redis,测试
  • 五、自定义全局过滤器
    • 1.导入依赖
    • 2.创建全局过滤器类
    • 3.测试
  • 总结


前言

接上篇,本篇记录网关组件的使用


一、网关

1、什么是网关?

就是网络请求的统一入口,网关的本质就是过滤器的组合

2、为什么需要网关?

  • 如果我们的有成千上万个服务,我们在请求每个服务的时候都需要进行认证,难度与工作量可想而知,要控制用户对于整个服务的访问次数的限制。

  • 如果没有统一的入口,那么前端在与服务端交互的时候定位到各个服务,假设服务器端作服务的重构,那么前端也得跟着一起修改。

3、SpringCloudAlibaba GateWay

gateway是spring cloud的第二代网关,其性能是zuul的1.6倍左右,其内部是基于netty、reactor(多路复用)、webflux进行构建,性能强大。gateway需要从注册中心获取服务,然后通过网关来调用对应的服务。但是gateway不在web环境下运行,也就是说不能打成war包放在tomcat下运行

二、快速入门

1.导入依赖

提示:所有的案例代码,都是基于前几篇的基础上

创建springcloudalibaba-micro-service-gateway-9090子工程(使用maven创建),导入依赖

<?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><!--此处修改了父工程的组织id--><artifactId>springcloudalibaba-GateWay</artifactId><groupId>com.lzl</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>springcloudalibaba-micro-service-gateway</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 排除掉springmvc相关的配置信息 --><exclusion><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></exclusion><!-- 排除掉tomcat相关的配置 --><exclusion><groupId>org.springframework.bootk</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId></exclusion><exclusion><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-websocket</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>com.lzl</groupId><artifactId>springcloudalibaba-micro-service-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version></dependency><!--nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency></dependencies></project>

2.创建 GateWayApplication 启动类

package com.lzl;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/15 15:16*/
@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class,args);}
}

3.创建application.yml文件

spring:application:name: micro-service-gateway # 网关名称cloud:nacos:discovery:server-addr: 127.0.0.1:8848enabled: trueregister-enabled: false # 不注册到nacos上gateway:discovery:locator:enabled: true #开启网关端口并使用服务方的名称来访问#之前:http://localhost:8080/feign/getById?id=1#现在:http://localhost:9090/consumer/feign/getById?id=1server:port: 9090

4.启动服务方,消费方,网关,进行测试

通过网关配置的端口9090,和消费方的服务名访问消费方接口

在这里插入图片描述
成功

三、谓词配置

谓词(predicate)是gateway内置的的一下关于请求相关的处理,在application.yml中增加routes的配置
注意:谓词配置后,访问时就不需要再写服务名称了,因为谓词里面已经配置过了
配置谓词之前:http://localhost:9090/consumer/feign/findAll
配置谓词之后:http://localhost:9090/feign/findAll

简言之,谓词配置,就是在原本访问的基础上,加一些条件。

yml文件的内容:

server:port: 9090spring:application:name: micro-service-gateway # 网关名称cloud:nacos:discovery:server-addr: 127.0.0.1:8848enabled: trueregister-enabled: false # 不注册到nacos上gateway:discovery:locator:enabled: true #开启网关端口并使用服务方的名称来访问#之前:http://localhost:8080/feign/getById?id=1#现在:http://localhost:9090/consumer/feign/getById?id=1routes:# id可以不是服务名,名字任意,但是不能重复,推荐使用服务名的方式- id: consumer# uri才是控制着某个具体的访问到达我们特定的服务uri: lb://consumer# 谓词: 就是满足的条件,可以在org.springframework.cloud.gateway.handler.predicate这个包下predicates:# 配置访问消费方controller的一级目录名称,这样就可以通过http://localhost:9090/feign/findAll来访问了- Path=/feign/**# 请求的参数中必须携带origin这个参数名,参数值符合[a-zA-Z]+ 这个正则- Query=origin,[a-zA-Z]+# 请求的方式- Method=get,post# 设置时间区间内访问: 2020年12月31日 - 2030年12月31日,可以访问,+08:00表示时区- After=2020-12-31T00:00:00+08:00[Asia/Shanghai]- Before=2030-12-31T00:00:00+08:00[Asia/Shanghai]# 描述IP在10.8.13.1~10.8.13.255之间的地址才可以访问- RemoteAddr=10.8.162.0/24# 请求的头中必须得携带token, value值符合[a-zA-Z0-9]+ 这个正则#- Header=token,[a-zA-Z0-9]+

在这里插入图片描述

不满足谓词条件时,访问不到对应的接口,origin必须是英文大小写,数字不满足谓词条件
在这里插入图片描述

满足谓词条件,可以访问

四、过滤器配置

1.令牌桶算法

GateWay提供了很多内置的过滤器让我们使用,具体的过滤器在spring-cloud-gateway-core-2.1.2.RELEASE.jar下的org.springframework.cloud.gateway.filter.factory包下,接下来我们挑其中一个非常常用的过滤来讲解用法,在实际的开发过程中,有这样一种业务需求,就是限制同一个IP对服务器频繁的请求,例如我们限制每个IP在每秒只能访问3次,那么要怎么实现呢?其实spring-boot已经帮我们实现好了一个,只需要做一定的配置就可以了。
IP限制的原理就是令牌桶算法, 随着时间流逝,系统会按恒定 1/QPS 时间间隔(如果 QPS=100,则间隔是 10ms)往桶里加入 Token,如果桶已经满了就不再加了。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务。如下图所示:

在这里插入图片描述

2.使用步骤

(1)添加依赖

在springcloudalibaba-micro-service-gateway-9090工程中添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)创建RedisHostKeyResovler类

package com.lzl.resolver;import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/17 14:12*/@Component
public class RedisHostKeyResolver implements KeyResolver {/*** webflux:*      Mono: 用于返回单个值*      Flux: 用于返回集合数据*/@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {//获取用户的访问的 ipString host = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();return Mono.just(host); //构建 Mono<String>}
}

(3)在application.yml中增加filters和redis的配置

server:port: 9090spring:application:name: micro-service-gateway # 网关名称cloud:nacos:discovery:server-addr: 127.0.0.1:8848enabled: trueregister-enabled: false # 不注册到nacos上gateway:discovery:locator:enabled: true #开启网关端口并使用服务方的名称来访问#之前:http://localhost:8080/feign/getById?id=1002#现在:http://localhost:9090/micro-service-consumer/feign/getById?id=1002routes:# id可以不是服务名,名字任意,但是不能重复,推荐使用服务名的方式- id: consumer# uri才是控制着某个具体的访问到达我们特定的服务uri: lb://consumer# 谓词: 就是满足的条件,可以在org.springframework.cloud.gateway.handler.predicate这个包下predicates:# 配置访问消费方controller的一级目录名称,这样就可以通过http://localhost:9090/feign-user-consumer/getUsers来访问了- Path=/feign/**# 请求的参数中必须携带origin这个参数名,参数值符合[a-zA-Z]+ 这个正则- Query=origin,[a-zA-Z]+# 请求的方式- Method=get,post# 设置时间区间内访问: 2020年12月31日 - 2030年12月31日,可以访问,+08:00表示时区#- After=2020-12-31T00:00:00+08:00[Asia/Shanghai]#- Before=2030-12-31T00:00:00+08:00[Asia/Shanghai]# 描述IP在10.8.13.1~10.8.13.255之间的地址才可以访问#- RemoteAddr=10.8.162.0/24# 请求的头中必须得携带token, value值符合[a-zA-Z0-9]+ 这个正则#- Header=token,[a-zA-Z0-9]+filters:# RequestRateLimiter是固定值- name: RequestRateLimiterargs:# key-resolver是用于限流的bean对象,通过SpEL的方式 #{@XXX} 取出spring容器中的beankeyResolver: '#{@redisHostKeyResolver}'# 每秒往令牌桶中存放的数量redis-rate-limiter.replenishRate: 1# 令牌桶中最多的令牌的数量redis-rate-limiter.burstCapacity: 3#redis配置redis:host: 127.0.0.1port: 6379

(4)启动Redis,测试

启动windows版redis
在这里插入图片描述

可以让局域网内的其他用户访问本机:http://本机ip:9090/feign/findAll?origin=abc
本机访问如下:
在这里插入图片描述

五、自定义全局过滤器

1.导入依赖

在GateWay子工程导入下边依赖

<dependency><groupId>com.qf</groupId><artifactId>springcloudalibaba-micro-service-commons</artifactId><version>1.0-SNAPSHOT</version>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.79</version>
</dependency>

2.创建全局过滤器类

package com.lzl.filters;import com.alibaba.fastjson.JSON;
import com.lzl.utils.JsonResult;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.nio.charset.StandardCharsets;
import java.util.List;
/*** --效率,是成功的核心关键--** @Author lzl* @Date 2023/3/17 15:00*///创建多个全局过滤器
@Configuration
public class FilterConfig {@Bean@Order(-100)//正数值越小,负数的绝对值越大,优先级越高public GlobalFilter loginFilter(){return new GlobalFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("-100");//获取传入的用户名和密码ServerHttpRequest request = exchange.getRequest();//获取所有参数MultiValueMap<String, String> queryParams = request.getQueryParams();//获取前端传过来的name以及passwordList<String> nameList = queryParams.get("name");List<String> passwordList = queryParams.get("password");System.out.println(nameList);//判断if(nameList !=null && nameList.size() > 0 && passwordList !=null && passwordList.size() > 0){//模拟数据库查询if("jack".equals(nameList.get(0)) && "123".equals(passwordList.get(0))){//放行return chain.filter(exchange);}else{//参数输入错误JsonResult jsonResult = JsonResult.error();jsonResult.setData("name or password is error");//返回ServerHttpResponse response = exchange.getResponse();String jsonString = JSON.toJSONString(jsonResult);DataBuffer dataBuffer = response.bufferFactory().wrap(jsonString.getBytes(StandardCharsets.UTF_8));return response.writeWith(Mono.just(dataBuffer));}}else{//参数输入错误JsonResult jsonResult = JsonResult.error();jsonResult.setData("name or password is null");//返回ServerHttpResponse response = exchange.getResponse();String jsonString = JSON.toJSONString(jsonResult);DataBuffer dataBuffer = response.bufferFactory().wrap(jsonString.getBytes(StandardCharsets.UTF_8));return response.writeWith(Mono.just(dataBuffer));}}};}@Bean@Order(-90)//正数值越小,负数的绝对值越大,优先级越高public GlobalFilter otherFilter(){return new GlobalFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("-90");return chain.filter(exchange);}};}}

3.测试

浏览器访问http://localhost:9090/feign/getUsers?origin=qwer&name=jack&password=123,进行测试
在这里插入图片描述
没有携带过滤器指定参数时,报错
在这里插入图片描述
参数不正确,报错

在这里插入图片描述
参数输入正确,成功访问


总结

本篇记录了,springcloudAlibab的网关组件GateWay组件的使用,更多内容见下篇

SpringCloud详解06-网关

相关文章

  1. ShareSDK常见问题

    QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…...

    2023/3/28 16:52:36
  2. PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范

    目录PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范1、以太网口概述2、RJ45的典型应用3、以太网的典型电路设计①集成网络变压器的RJ45设计方式②变压器分离的的RJ45设计方式4、布局要求5、布线要求PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范 1、以太网口概…...

    2023/3/28 16:49:58
  3. axios使用

    参考地址&#xff1a;https://github.com/axios/axios html CDN <script src"https://cdn.jsdelivr.net/npm/axios1.1.2/dist/axios.min.js"></script>或者 <script src"https://unpkg.com/axios1.1.2/dist/axios.min.js"></scrip…...

    2023/3/28 16:49:20
  4. 基于springboot和Web实现社区医院管理服务系统【源码+论文】

    基于springboot和Web实现社区医院管理服务系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…...

    2023/3/28 16:49:07
  5. 【西安】SWAT模型高阶十七项案例分析

    【案例实践】&#xff1a;本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元&#xff08;HRU&#xff09;的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...

    2023/3/28 16:48:23
  6. 一文带你彻底搞懂ThreadLocal

    前言 ThreadLocal的相关问题也是比较常见的面试题了&#xff0c;网上也有相当多的文章&#xff0c;但是看了很多篇&#xff0c;也没说实际场景&#xff0c;内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了&#xff0c;但还是不能理解&#xff0c;真就是当…...

    2023/3/28 16:40:59
  7. 2023年Java岗面试八股文及答案整理(金三银四最新版)

    春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们Java程序员的面试之路&#xff0c;是挺难的&#xff0c;过了HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸能够…...

    2023/3/28 16:40:37
  8. 浅谈常量字符串

    今天早上看网课刚好学到字符函数的部分&#xff0c;刚好对常量字符串有些疑惑的地方&#xff0c;现在组织了下语言&#xff0c;把今天关于常量字符串的思考写成这篇博客 当我们编写程序时&#xff0c;常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...

    2023/3/28 16:40:24
  9. Python 中 如何向函数传递列表?

    嗨害大家好&#xff0c;我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后&#xff0c; 函数就能直接访问列表中的内容咯。 假设有一组专家&#xff0c;我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...

    2023/3/28 16:39:59
  10. MQ是什么

    目录MQ是什么MQ是什么 MQ全称为Message Queue&#xff0c;也就是消息队列&#xff0c;是应用程序和应用程序之间的通信方法。 在微服务盛行的当下&#xff0c;MQ被使用的也是越来越多&#xff0c;一般常用来进行「业务异步解耦」、「解耦微服务」、「流量削峰填谷」、「消息分…...

    2023/3/28 16:39:18
  11. mit6.824-MapReduce概念及Lab1的实现

    本文是我学习MIT 6.824 Lab1的笔记&#xff0c;主要内容是对于MapReduce的理解和Lab1的实现。 MapReduce框架 如果还没有接触过MapReduce&#xff0c;最好先阅读一下MapReduce论文&#xff0c;如果阅读英文论文对你来说有些困难&#xff0c;也可以阅读MapReduce论文译文。 M…...

    2023/3/28 16:33:49
  12. 1.3 从0开始学Unity游戏开发--引擎和编辑器

    上一篇讲到游戏运作的原理是非常简单的,实现一个五子棋很可能只需要使用操作系统提供的原生开发环境,简单的做一些代码实现即可完成,我自己在大学的时候就找到了一个一步一步教你使用Windows API开发一个五子棋游戏的教程,需要用到的也只需要安装一个visual studio顺便安装…...

    2023/3/28 16:33:36
  13. OPenCV中的机器学习

    博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

    2023/3/28 16:31:33
  14. python_接口自动化测试框架

    本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动&#xff0c;采用Excel管理测试用例等集成测试数据功能&#xff0c;以及使用HTMLTestRunner来生成测试报告&#xff0c;目前有开源的poman、Jmeter等接口测试工…...

    2023/3/28 16:26:58
  15. SpringBoot技术快速入门

    目录 Spring Boot是什么 Spring Boot 的特点 配置开发环境 创建 Spring Boot 项目 Maven 创建Spring Boot 项目 Spring Initializr 创建SpringBoot项目 启动 Spring Boot Spring Boot starter入门 SpringBoot基本设置 6.1SpringBoot设置端口号 6.2SpringBoot设置项目…...

    2023/3/28 16:26:46
  16. cas登录 状态码302不跳转问题

    首先明确一个问题&#xff0c;就是ajax请求是不能接受302直接跳转前端浏览器地址的。 也有说ajax能在成功的返回请获得到302的状态&#xff0c;我测试的结果是浏览器已经在上层拦截处理了。 解决步骤如下&#xff1a; 1.前端ajax请求需要cas验证的接口&#xff0c;cas判断未登…...

    2023/3/28 16:26:13
  17. OpenGL API 之 glVertexAttribPointer

    glVertexAttribPointer 定义通用顶点属性数据的数组 C Specification format void glVertexAttribPointer(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const void * pointer); Parameters nametypedescriptionindexGLuint Specifies the inde…...

    2023/3/28 16:22:38
  18. 基于MATLAB编程的萤火虫改进帝国竞争算法求解多目标优化,FA-ICA目标寻优

    目录 背影 帝国竞争 基本定义 优点 萤火虫原理 改进思路 基于萤火虫改进帝国竞争多目标求解 代码 结果分析 展望 背影 多目标多参数优化是常遇到的优化问题,有很多传统算法可以求解,比如fiminmax,fmincon等,但是都容易陷入局部最优,本文用帝国竞争优化萤火虫算法进行多目…...

    2023/3/28 16:19:12
  19. 【Nginx】Nginx的学习(2.Nginx的安装,Linux安装和Windows安装)

    1.Nginx下载 Nginx官网下载地址 http://nginx.org/en/download.html 1.1 windows安装 windows安装很简单&#xff0c;直接下载windows的版本&#xff0c;注意不要放到包含中文的路径下面 打开下载路径的cmd的窗口&#xff0c;输入 nginx.exe回车即可&#xff0c; 浏览器输入 ht…...

    2023/3/28 16:18:22
  20. Vue 3.0 应用API

    在 Vue 3 中&#xff0c;改变全局 Vue 行为的 API 现在被移动到了由新的 createApp 方法所创建的应用实例上。此外&#xff0c;现在它们的影响仅限于该特定应用实例&#xff1a; import { createApp } from vueconst app createApp({}) 调用 createApp 返回一个应用实例。该实…...

    2023/3/28 16:18:07
  21. Android系统定制及adb日志调试方法

    Android系统定制基础 Android双屏异显 深入分析AMS启动流程 WMS启动流程分析和介绍 Android系统启动流程详解 Android Framework学习路线 如何用Android手机抓取Systrace Android Framework基础到深入篇 Android系统定制及adb日志调试方法 Android修改内核源码绕过防调…...

    2023/3/28 16:13:53
  22. VGA、DP、HDMI、DVI、Type-C和Thunderbolt等视频接口对比

    问&#xff1a;VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格。表格按时间排序 答&#xff1a;以下是VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格&#xff0c;按…...

    2023/3/28 16:10:29
  23. 关于线程池你了解些什么?

    前言学习线程池的思维导图线程池是什么?它有什么用?虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列…...

    2023/3/28 16:09:16
  24. 线程安全、线程同步(同步代码块、同步方法、同步锁)

    一. 线程安全 1.1 线程安全问题是什么&#xff0c;发生的原因 多个线程同时修改同一共享资源的时候&#xff0c;会出现线程安全问题。读数据是绝对不会出现线程安全问题的&#xff0c;它一定是因为同时在修改。一旦线程同步了&#xff0c;就是解决了安全问题了。CPU负责调度线…...

    2023/3/28 16:06:34
  25. java-04

    类与对象对象内存布局(重要&#xff09; 属性细节类与对象的内存分配机制&#xff08;重要&#xff09;注意这边 b null 改的是b指向的地址哦&#xff0c;我一开始想错了&#xff0c;以为a也会变成null方法调用机制原理图方法调用细节方法练习public class Lianxi{public stat…...

    2023/3/28 16:01:35
  26. 队列的基本实现

    队列的基本实现一、队列的概念二、队列的基本实现1.前期准备2.队列的初始化3.队列的销毁4.入队5.出队6.取队头的数据7.取队尾的数据8.队列数据的个数9.判断队列是否为空10.队列出队顺序11.功能展示12.代码展示一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&am…...

    2023/3/28 16:01:00
  27. Redis高频40问

    Redis连环40问&#xff0c;绝对够全&#xff01; Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用 C 语言编写的&#xff0c;高性能非关系型的键值对数据库。与传统数据库不同的是&#xff0c;Redis 的数据是存在内存中的&#xf…...

    2023/3/28 16:00:25
  28. 学习HM微博项目第3天

    步骤&#xff1a;自定义tabBar -> 版本新特性01-搭载界面 -> 版本新特性02-按钮的使用细节 -> 版本新特性03-新版本判断 自定义tabBar 在前面的学习中&#xff0c;系统自带的tabBar是这样的&#xff1a; 由于某个需求&#xff0c;需要在tabBar的中间加上一个发送微博…...

    2023/3/28 15:53:47
  29. 中国象棋隐私政策

    1. 适用范围 (a) 在您注册本应用帐号时&#xff0c;您根据本应用要求提供的个人注册信息&#xff1b; (b) 在您使用本应用网络服务&#xff0c;或访问本应用平台网页时&#xff0c;本应用自动接收并记录的您的浏览器和计算机上的信息&#xff0c;包括但不限于您的IP地址、浏览…...

    2023/3/28 15:52:33
  30. HashMap何时会链表转红黑树

    目录什么时候才会转换为红黑树&#xff1f;为什么要转换为红黑树&#xff1f;为什么不一开始就用红黑树&#xff0c;反而要经历一个转换的过程呢&#xff1f;从链表转化为红黑树的阈值为什么是8&#xff1f;什么时候才会转换为红黑树&#xff1f; 当Map链表长度大于或等于阈值…...

    2023/3/28 15:52:20

最新文章

  1. ShareSDK常见问题

    QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…...

    2023/3/28 16:52:36
  2. PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范

    目录PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范1、以太网口概述2、RJ45的典型应用3、以太网的典型电路设计①集成网络变压器的RJ45设计方式②变压器分离的的RJ45设计方式4、布局要求5、布线要求PCB模块化设计09——RJ45-以太网口PCB布局布线设计规范 1、以太网口概…...

    2023/3/28 16:49:58
  3. axios使用

    参考地址&#xff1a;https://github.com/axios/axios html CDN <script src"https://cdn.jsdelivr.net/npm/axios1.1.2/dist/axios.min.js"></script>或者 <script src"https://unpkg.com/axios1.1.2/dist/axios.min.js"></scrip…...

    2023/3/28 16:49:20
  4. 基于springboot和Web实现社区医院管理服务系统【源码+论文】

    基于springboot和Web实现社区医院管理服务系统演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…...

    2023/3/28 16:49:07
  5. 【西安】SWAT模型高阶十七项案例分析

    【案例实践】&#xff1a;本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元&#xff08;HRU&#xff09;的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...

    2023/3/28 16:48:23
  6. 一文带你彻底搞懂ThreadLocal

    前言 ThreadLocal的相关问题也是比较常见的面试题了&#xff0c;网上也有相当多的文章&#xff0c;但是看了很多篇&#xff0c;也没说实际场景&#xff0c;内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了&#xff0c;但还是不能理解&#xff0c;真就是当…...

    2023/3/28 16:40:59
  7. 2023年Java岗面试八股文及答案整理(金三银四最新版)

    春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们Java程序员的面试之路&#xff0c;是挺难的&#xff0c;过了HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸能够…...

    2023/3/28 16:40:37
  8. 浅谈常量字符串

    今天早上看网课刚好学到字符函数的部分&#xff0c;刚好对常量字符串有些疑惑的地方&#xff0c;现在组织了下语言&#xff0c;把今天关于常量字符串的思考写成这篇博客 当我们编写程序时&#xff0c;常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...

    2023/3/28 16:40:24
  9. Python 中 如何向函数传递列表?

    嗨害大家好&#xff0c;我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后&#xff0c; 函数就能直接访问列表中的内容咯。 假设有一组专家&#xff0c;我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...

    2023/3/28 16:39:59
  10. MQ是什么

    目录MQ是什么MQ是什么 MQ全称为Message Queue&#xff0c;也就是消息队列&#xff0c;是应用程序和应用程序之间的通信方法。 在微服务盛行的当下&#xff0c;MQ被使用的也是越来越多&#xff0c;一般常用来进行「业务异步解耦」、「解耦微服务」、「流量削峰填谷」、「消息分…...

    2023/3/28 16:39:18
  11. mit6.824-MapReduce概念及Lab1的实现

    本文是我学习MIT 6.824 Lab1的笔记&#xff0c;主要内容是对于MapReduce的理解和Lab1的实现。 MapReduce框架 如果还没有接触过MapReduce&#xff0c;最好先阅读一下MapReduce论文&#xff0c;如果阅读英文论文对你来说有些困难&#xff0c;也可以阅读MapReduce论文译文。 M…...

    2023/3/28 16:33:49
  12. 1.3 从0开始学Unity游戏开发--引擎和编辑器

    上一篇讲到游戏运作的原理是非常简单的,实现一个五子棋很可能只需要使用操作系统提供的原生开发环境,简单的做一些代码实现即可完成,我自己在大学的时候就找到了一个一步一步教你使用Windows API开发一个五子棋游戏的教程,需要用到的也只需要安装一个visual studio顺便安装…...

    2023/3/28 16:33:36
  13. OPenCV中的机器学习

    博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…...

    2023/3/28 16:31:33
  14. python_接口自动化测试框架

    本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动&#xff0c;采用Excel管理测试用例等集成测试数据功能&#xff0c;以及使用HTMLTestRunner来生成测试报告&#xff0c;目前有开源的poman、Jmeter等接口测试工…...

    2023/3/28 16:26:58
  15. SpringBoot技术快速入门

    目录 Spring Boot是什么 Spring Boot 的特点 配置开发环境 创建 Spring Boot 项目 Maven 创建Spring Boot 项目 Spring Initializr 创建SpringBoot项目 启动 Spring Boot Spring Boot starter入门 SpringBoot基本设置 6.1SpringBoot设置端口号 6.2SpringBoot设置项目…...

    2023/3/28 16:26:46
  16. cas登录 状态码302不跳转问题

    首先明确一个问题&#xff0c;就是ajax请求是不能接受302直接跳转前端浏览器地址的。 也有说ajax能在成功的返回请获得到302的状态&#xff0c;我测试的结果是浏览器已经在上层拦截处理了。 解决步骤如下&#xff1a; 1.前端ajax请求需要cas验证的接口&#xff0c;cas判断未登…...

    2023/3/28 16:26:13
  17. OpenGL API 之 glVertexAttribPointer

    glVertexAttribPointer 定义通用顶点属性数据的数组 C Specification format void glVertexAttribPointer(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const void * pointer); Parameters nametypedescriptionindexGLuint Specifies the inde…...

    2023/3/28 16:22:38
  18. 基于MATLAB编程的萤火虫改进帝国竞争算法求解多目标优化,FA-ICA目标寻优

    目录 背影 帝国竞争 基本定义 优点 萤火虫原理 改进思路 基于萤火虫改进帝国竞争多目标求解 代码 结果分析 展望 背影 多目标多参数优化是常遇到的优化问题,有很多传统算法可以求解,比如fiminmax,fmincon等,但是都容易陷入局部最优,本文用帝国竞争优化萤火虫算法进行多目…...

    2023/3/28 16:19:12
  19. 【Nginx】Nginx的学习(2.Nginx的安装,Linux安装和Windows安装)

    1.Nginx下载 Nginx官网下载地址 http://nginx.org/en/download.html 1.1 windows安装 windows安装很简单&#xff0c;直接下载windows的版本&#xff0c;注意不要放到包含中文的路径下面 打开下载路径的cmd的窗口&#xff0c;输入 nginx.exe回车即可&#xff0c; 浏览器输入 ht…...

    2023/3/28 16:18:22
  20. Vue 3.0 应用API

    在 Vue 3 中&#xff0c;改变全局 Vue 行为的 API 现在被移动到了由新的 createApp 方法所创建的应用实例上。此外&#xff0c;现在它们的影响仅限于该特定应用实例&#xff1a; import { createApp } from vueconst app createApp({}) 调用 createApp 返回一个应用实例。该实…...

    2023/3/28 16:18:07
  21. Android系统定制及adb日志调试方法

    Android系统定制基础 Android双屏异显 深入分析AMS启动流程 WMS启动流程分析和介绍 Android系统启动流程详解 Android Framework学习路线 如何用Android手机抓取Systrace Android Framework基础到深入篇 Android系统定制及adb日志调试方法 Android修改内核源码绕过防调…...

    2023/3/28 16:13:53
  22. VGA、DP、HDMI、DVI、Type-C和Thunderbolt等视频接口对比

    问&#xff1a;VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格。表格按时间排序 答&#xff1a;以下是VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格&#xff0c;按…...

    2023/3/28 16:10:29
  23. 关于线程池你了解些什么?

    前言学习线程池的思维导图线程池是什么?它有什么用?虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列…...

    2023/3/28 16:09:16
  24. 线程安全、线程同步(同步代码块、同步方法、同步锁)

    一. 线程安全 1.1 线程安全问题是什么&#xff0c;发生的原因 多个线程同时修改同一共享资源的时候&#xff0c;会出现线程安全问题。读数据是绝对不会出现线程安全问题的&#xff0c;它一定是因为同时在修改。一旦线程同步了&#xff0c;就是解决了安全问题了。CPU负责调度线…...

    2023/3/28 16:06:34
  25. java-04

    类与对象对象内存布局(重要&#xff09; 属性细节类与对象的内存分配机制&#xff08;重要&#xff09;注意这边 b null 改的是b指向的地址哦&#xff0c;我一开始想错了&#xff0c;以为a也会变成null方法调用机制原理图方法调用细节方法练习public class Lianxi{public stat…...

    2023/3/28 16:01:35
  26. 队列的基本实现

    队列的基本实现一、队列的概念二、队列的基本实现1.前期准备2.队列的初始化3.队列的销毁4.入队5.出队6.取队头的数据7.取队尾的数据8.队列数据的个数9.判断队列是否为空10.队列出队顺序11.功能展示12.代码展示一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&am…...

    2023/3/28 16:01:00
  27. Redis高频40问

    Redis连环40问&#xff0c;绝对够全&#xff01; Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用 C 语言编写的&#xff0c;高性能非关系型的键值对数据库。与传统数据库不同的是&#xff0c;Redis 的数据是存在内存中的&#xf…...

    2023/3/28 16:00:25
  28. 学习HM微博项目第3天

    步骤&#xff1a;自定义tabBar -> 版本新特性01-搭载界面 -> 版本新特性02-按钮的使用细节 -> 版本新特性03-新版本判断 自定义tabBar 在前面的学习中&#xff0c;系统自带的tabBar是这样的&#xff1a; 由于某个需求&#xff0c;需要在tabBar的中间加上一个发送微博…...

    2023/3/28 15:53:47
  29. 中国象棋隐私政策

    1. 适用范围 (a) 在您注册本应用帐号时&#xff0c;您根据本应用要求提供的个人注册信息&#xff1b; (b) 在您使用本应用网络服务&#xff0c;或访问本应用平台网页时&#xff0c;本应用自动接收并记录的您的浏览器和计算机上的信息&#xff0c;包括但不限于您的IP地址、浏览…...

    2023/3/28 15:52:33
  30. HashMap何时会链表转红黑树

    目录什么时候才会转换为红黑树&#xff1f;为什么要转换为红黑树&#xff1f;为什么不一开始就用红黑树&#xff0c;反而要经历一个转换的过程呢&#xff1f;从链表转化为红黑树的阈值为什么是8&#xff1f;什么时候才会转换为红黑树&#xff1f; 当Map链表长度大于或等于阈值…...

    2023/3/28 15:52:20