SpringCloud详解06-网关
系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、网关
- 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组件的使用,更多内容见下篇
相关文章
- ShareSDK常见问题
QQ-分享报错901111,9001010等 由于QQ现在需要审核后才可以分享(之前分享不需要审核),所以此错误解决方法只需通过腾讯开放平台的审核即可,另外要检查注册好的应用的基本信息,包名、md5签名和Bundle id是不…...
2023/3/28 16:52:36 - 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 - axios使用
参考地址: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 - 基于springboot和Web实现社区医院管理服务系统【源码+论文】
基于springboot和Web实现社区医院管理服务系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Ma…...
2023/3/28 16:49:07 - 【西安】SWAT模型高阶十七项案例分析
【案例实践】:本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元(HRU)的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...
2023/3/28 16:48:23 - 一文带你彻底搞懂ThreadLocal
前言 ThreadLocal的相关问题也是比较常见的面试题了,网上也有相当多的文章,但是看了很多篇,也没说实际场景,内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了,但还是不能理解,真就是当…...
2023/3/28 16:40:59 - 2023年Java岗面试八股文及答案整理(金三银四最新版)
春招,秋招,社招,我们Java程序员的面试之路,是挺难的,过了HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能够…...
2023/3/28 16:40:37 - 浅谈常量字符串
今天早上看网课刚好学到字符函数的部分,刚好对常量字符串有些疑惑的地方,现在组织了下语言,把今天关于常量字符串的思考写成这篇博客 当我们编写程序时,常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...
2023/3/28 16:40:24 - Python 中 如何向函数传递列表?
嗨害大家好,我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后, 函数就能直接访问列表中的内容咯。 假设有一组专家,我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...
2023/3/28 16:39:59 - MQ是什么
目录MQ是什么MQ是什么 MQ全称为Message Queue,也就是消息队列,是应用程序和应用程序之间的通信方法。 在微服务盛行的当下,MQ被使用的也是越来越多,一般常用来进行「业务异步解耦」、「解耦微服务」、「流量削峰填谷」、「消息分…...
2023/3/28 16:39:18 - mit6.824-MapReduce概念及Lab1的实现
本文是我学习MIT 6.824 Lab1的笔记,主要内容是对于MapReduce的理解和Lab1的实现。 MapReduce框架 如果还没有接触过MapReduce,最好先阅读一下MapReduce论文,如果阅读英文论文对你来说有些困难,也可以阅读MapReduce论文译文。 M…...
2023/3/28 16:33:49 - 1.3 从0开始学Unity游戏开发--引擎和编辑器
上一篇讲到游戏运作的原理是非常简单的,实现一个五子棋很可能只需要使用操作系统提供的原生开发环境,简单的做一些代码实现即可完成,我自己在大学的时候就找到了一个一步一步教你使用Windows API开发一个五子棋游戏的教程,需要用到的也只需要安装一个visual studio顺便安装…...
2023/3/28 16:33:36 - OPenCV中的机器学习
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...
2023/3/28 16:31:33 - python_接口自动化测试框架
本文总结分享介绍接口测试框架开发,环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman、Jmeter等接口测试工…...
2023/3/28 16:26:58 - 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 - cas登录 状态码302不跳转问题
首先明确一个问题,就是ajax请求是不能接受302直接跳转前端浏览器地址的。 也有说ajax能在成功的返回请获得到302的状态,我测试的结果是浏览器已经在上层拦截处理了。 解决步骤如下: 1.前端ajax请求需要cas验证的接口,cas判断未登…...
2023/3/28 16:26:13 - 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 - 基于MATLAB编程的萤火虫改进帝国竞争算法求解多目标优化,FA-ICA目标寻优
目录 背影 帝国竞争 基本定义 优点 萤火虫原理 改进思路 基于萤火虫改进帝国竞争多目标求解 代码 结果分析 展望 背影 多目标多参数优化是常遇到的优化问题,有很多传统算法可以求解,比如fiminmax,fmincon等,但是都容易陷入局部最优,本文用帝国竞争优化萤火虫算法进行多目…...
2023/3/28 16:19:12 - 【Nginx】Nginx的学习(2.Nginx的安装,Linux安装和Windows安装)
1.Nginx下载 Nginx官网下载地址 http://nginx.org/en/download.html 1.1 windows安装 windows安装很简单,直接下载windows的版本,注意不要放到包含中文的路径下面 打开下载路径的cmd的窗口,输入 nginx.exe回车即可, 浏览器输入 ht…...
2023/3/28 16:18:22 - Vue 3.0 应用API
在 Vue 3 中,改变全局 Vue 行为的 API 现在被移动到了由新的 createApp 方法所创建的应用实例上。此外,现在它们的影响仅限于该特定应用实例: import { createApp } from vueconst app createApp({}) 调用 createApp 返回一个应用实例。该实…...
2023/3/28 16:18:07 - Android系统定制及adb日志调试方法
Android系统定制基础 Android双屏异显 深入分析AMS启动流程 WMS启动流程分析和介绍 Android系统启动流程详解 Android Framework学习路线 如何用Android手机抓取Systrace Android Framework基础到深入篇 Android系统定制及adb日志调试方法 Android修改内核源码绕过防调…...
2023/3/28 16:13:53 - VGA、DP、HDMI、DVI、Type-C和Thunderbolt等视频接口对比
问:VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格。表格按时间排序 答:以下是VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格,按…...
2023/3/28 16:10:29 - 关于线程池你了解些什么?
前言学习线程池的思维导图线程池是什么?它有什么用?虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列…...
2023/3/28 16:09:16 - 线程安全、线程同步(同步代码块、同步方法、同步锁)
一. 线程安全 1.1 线程安全问题是什么,发生的原因 多个线程同时修改同一共享资源的时候,会出现线程安全问题。读数据是绝对不会出现线程安全问题的,它一定是因为同时在修改。一旦线程同步了,就是解决了安全问题了。CPU负责调度线…...
2023/3/28 16:06:34 - java-04
类与对象对象内存布局(重要) 属性细节类与对象的内存分配机制(重要)注意这边 b null 改的是b指向的地址哦,我一开始想错了,以为a也会变成null方法调用机制原理图方法调用细节方法练习public class Lianxi{public stat…...
2023/3/28 16:01:35 - 队列的基本实现
队列的基本实现一、队列的概念二、队列的基本实现1.前期准备2.队列的初始化3.队列的销毁4.入队5.出队6.取队头的数据7.取队尾的数据8.队列数据的个数9.判断队列是否为空10.队列出队顺序11.功能展示12.代码展示一、队列的概念 队列:只允许在一端进行插入数据操作&am…...
2023/3/28 16:01:00 - Redis高频40问
Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的…...
2023/3/28 16:00:25 - 学习HM微博项目第3天
步骤:自定义tabBar -> 版本新特性01-搭载界面 -> 版本新特性02-按钮的使用细节 -> 版本新特性03-新版本判断 自定义tabBar 在前面的学习中,系统自带的tabBar是这样的: 由于某个需求,需要在tabBar的中间加上一个发送微博…...
2023/3/28 15:53:47 - 中国象棋隐私政策
1. 适用范围 (a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息; (b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览…...
2023/3/28 15:52:33 - HashMap何时会链表转红黑树
目录什么时候才会转换为红黑树?为什么要转换为红黑树?为什么不一开始就用红黑树,反而要经历一个转换的过程呢?从链表转化为红黑树的阈值为什么是8?什么时候才会转换为红黑树? 当Map链表长度大于或等于阈值…...
2023/3/28 15:52:20
最新文章
- ShareSDK常见问题
QQ-分享报错901111,9001010等 由于QQ现在需要审核后才可以分享(之前分享不需要审核),所以此错误解决方法只需通过腾讯开放平台的审核即可,另外要检查注册好的应用的基本信息,包名、md5签名和Bundle id是不…...
2023/3/28 16:52:36 - 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 - axios使用
参考地址: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 - 基于springboot和Web实现社区医院管理服务系统【源码+论文】
基于springboot和Web实现社区医院管理服务系统演示开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Ma…...
2023/3/28 16:49:07 - 【西安】SWAT模型高阶十七项案例分析
【案例实践】:本次学习共十七个实践案例 1)遥感产品和SWAT模型快速建模 2)基于水文响应单元(HRU)的水资源时空分布特征 3)基于自定义流域与河道的SWAT模型建模与分析 4)子流域划分原理及其对模型不确定性的影响 5)坡度划分原理及其对模型不确…...
2023/3/28 16:48:23 - 一文带你彻底搞懂ThreadLocal
前言 ThreadLocal的相关问题也是比较常见的面试题了,网上也有相当多的文章,但是看了很多篇,也没说实际场景,内容也都差不多。ThreadLocalMap、弱引用、内存泄漏等概念都能背下来了,但还是不能理解,真就是当…...
2023/3/28 16:40:59 - 2023年Java岗面试八股文及答案整理(金三银四最新版)
春招,秋招,社招,我们Java程序员的面试之路,是挺难的,过了HR,还得被技术面,小刀在去各个厂面试的时候,经常是通宵睡不着觉,头发都脱了一大把,还好最终侥幸能够…...
2023/3/28 16:40:37 - 浅谈常量字符串
今天早上看网课刚好学到字符函数的部分,刚好对常量字符串有些疑惑的地方,现在组织了下语言,把今天关于常量字符串的思考写成这篇博客 当我们编写程序时,常量字符串是一种非常常见的数据类型。常量字符串指的是在程序中声明的一个不…...
2023/3/28 16:40:24 - Python 中 如何向函数传递列表?
嗨害大家好,我是芝士❤ 今天也是来给大家整点干货的一天~ 把列表传递给函数后, 函数就能直接访问列表中的内容咯。 假设有一组专家,我们想邀请他们参加研讨会。 def send_invitation(experts):发送邀请函for expert in experts:print(expe…...
2023/3/28 16:39:59 - MQ是什么
目录MQ是什么MQ是什么 MQ全称为Message Queue,也就是消息队列,是应用程序和应用程序之间的通信方法。 在微服务盛行的当下,MQ被使用的也是越来越多,一般常用来进行「业务异步解耦」、「解耦微服务」、「流量削峰填谷」、「消息分…...
2023/3/28 16:39:18 - mit6.824-MapReduce概念及Lab1的实现
本文是我学习MIT 6.824 Lab1的笔记,主要内容是对于MapReduce的理解和Lab1的实现。 MapReduce框架 如果还没有接触过MapReduce,最好先阅读一下MapReduce论文,如果阅读英文论文对你来说有些困难,也可以阅读MapReduce论文译文。 M…...
2023/3/28 16:33:49 - 1.3 从0开始学Unity游戏开发--引擎和编辑器
上一篇讲到游戏运作的原理是非常简单的,实现一个五子棋很可能只需要使用操作系统提供的原生开发环境,简单的做一些代码实现即可完成,我自己在大学的时候就找到了一个一步一步教你使用Windows API开发一个五子棋游戏的教程,需要用到的也只需要安装一个visual studio顺便安装…...
2023/3/28 16:33:36 - OPenCV中的机器学习
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...
2023/3/28 16:31:33 - python_接口自动化测试框架
本文总结分享介绍接口测试框架开发,环境使用python3selenium3unittestddtrequests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用HTMLTestRunner来生成测试报告,目前有开源的poman、Jmeter等接口测试工…...
2023/3/28 16:26:58 - 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 - cas登录 状态码302不跳转问题
首先明确一个问题,就是ajax请求是不能接受302直接跳转前端浏览器地址的。 也有说ajax能在成功的返回请获得到302的状态,我测试的结果是浏览器已经在上层拦截处理了。 解决步骤如下: 1.前端ajax请求需要cas验证的接口,cas判断未登…...
2023/3/28 16:26:13 - 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 - 基于MATLAB编程的萤火虫改进帝国竞争算法求解多目标优化,FA-ICA目标寻优
目录 背影 帝国竞争 基本定义 优点 萤火虫原理 改进思路 基于萤火虫改进帝国竞争多目标求解 代码 结果分析 展望 背影 多目标多参数优化是常遇到的优化问题,有很多传统算法可以求解,比如fiminmax,fmincon等,但是都容易陷入局部最优,本文用帝国竞争优化萤火虫算法进行多目…...
2023/3/28 16:19:12 - 【Nginx】Nginx的学习(2.Nginx的安装,Linux安装和Windows安装)
1.Nginx下载 Nginx官网下载地址 http://nginx.org/en/download.html 1.1 windows安装 windows安装很简单,直接下载windows的版本,注意不要放到包含中文的路径下面 打开下载路径的cmd的窗口,输入 nginx.exe回车即可, 浏览器输入 ht…...
2023/3/28 16:18:22 - Vue 3.0 应用API
在 Vue 3 中,改变全局 Vue 行为的 API 现在被移动到了由新的 createApp 方法所创建的应用实例上。此外,现在它们的影响仅限于该特定应用实例: import { createApp } from vueconst app createApp({}) 调用 createApp 返回一个应用实例。该实…...
2023/3/28 16:18:07 - Android系统定制及adb日志调试方法
Android系统定制基础 Android双屏异显 深入分析AMS启动流程 WMS启动流程分析和介绍 Android系统启动流程详解 Android Framework学习路线 如何用Android手机抓取Systrace Android Framework基础到深入篇 Android系统定制及adb日志调试方法 Android修改内核源码绕过防调…...
2023/3/28 16:13:53 - VGA、DP、HDMI、DVI、Type-C和Thunderbolt等视频接口对比
问:VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格。表格按时间排序 答:以下是VGA、DP、HDMI、DVI、Type-C和Thunderbolt这几种视频输入接口的定义、技术特点、版本迭代和年代的表格,按…...
2023/3/28 16:10:29 - 关于线程池你了解些什么?
前言学习线程池的思维导图线程池是什么?它有什么用?虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列…...
2023/3/28 16:09:16 - 线程安全、线程同步(同步代码块、同步方法、同步锁)
一. 线程安全 1.1 线程安全问题是什么,发生的原因 多个线程同时修改同一共享资源的时候,会出现线程安全问题。读数据是绝对不会出现线程安全问题的,它一定是因为同时在修改。一旦线程同步了,就是解决了安全问题了。CPU负责调度线…...
2023/3/28 16:06:34 - java-04
类与对象对象内存布局(重要) 属性细节类与对象的内存分配机制(重要)注意这边 b null 改的是b指向的地址哦,我一开始想错了,以为a也会变成null方法调用机制原理图方法调用细节方法练习public class Lianxi{public stat…...
2023/3/28 16:01:35 - 队列的基本实现
队列的基本实现一、队列的概念二、队列的基本实现1.前期准备2.队列的初始化3.队列的销毁4.入队5.出队6.取队头的数据7.取队尾的数据8.队列数据的个数9.判断队列是否为空10.队列出队顺序11.功能展示12.代码展示一、队列的概念 队列:只允许在一端进行插入数据操作&am…...
2023/3/28 16:01:00 - Redis高频40问
Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的…...
2023/3/28 16:00:25 - 学习HM微博项目第3天
步骤:自定义tabBar -> 版本新特性01-搭载界面 -> 版本新特性02-按钮的使用细节 -> 版本新特性03-新版本判断 自定义tabBar 在前面的学习中,系统自带的tabBar是这样的: 由于某个需求,需要在tabBar的中间加上一个发送微博…...
2023/3/28 15:53:47 - 中国象棋隐私政策
1. 适用范围 (a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息; (b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览…...
2023/3/28 15:52:33 - HashMap何时会链表转红黑树
目录什么时候才会转换为红黑树?为什么要转换为红黑树?为什么不一开始就用红黑树,反而要经历一个转换的过程呢?从链表转化为红黑树的阈值为什么是8?什么时候才会转换为红黑树? 当Map链表长度大于或等于阈值…...
2023/3/28 15:52:20