SpringCloud微服务架构
文章目录
-
- 认识微服务:
- SpringCloud
-
- 服务拆分及远程调用
- 实现夸远程服务调用使用RestTemplate
- Eureka注册中心
-
- 搭建EruekaServer
- 注册服务
- 服务发现
- Ribbon负载均衡
-
- 修改负载均衡规则
- 解饿加载
- Nacos注册中心(nacos一部分功能)
-
- 服务注册到nacos
- nacos服务分级存储模型
- 环境隔离 -namespace
- Nacos配置管理
- http客户端Feign
-
- 自定义Feign的配置
- Feign的性能优化
- 统一网关Gateway
-
- 网关功能:
- 搭建网关服务:
- 路由断言工厂Route Predicate Factory
- 过滤器工厂
-
- 请求头过滤器
- 默认过滤器
- 自定义全局过滤器
- 过滤器执行顺序
- 解决跨域问题
认识微服务:
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
优点:
-
部署简单
-
部署成本低
缺点:
-
耦合度高
-
扩展性差
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
优点:
-
降低服务耦合度
-
有利于服务升级扩展
缺点:
-
架构复杂
-
难度大
微服务: 微服务是一种经过良好架构设计的分布式架构方案,微服务架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,能做到单一职责,避免重复业务开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、技术独立、数据独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级、避免出现级联问题
优点: 拆分粒度更小、服务更独立、耦合度更低
缺点: 架构非常复杂,运维、监控、部署难度提高
(Dubbo、SpringCloud、SpringCloudAlibaba)微服务技术对比:
企业需求:
SpringCloud
SpringCloud是目前国内使用最广泛的微服务架构框架。它集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配。
官网地址:Spring Cloud
服务拆分及远程调用
服务拆分注意事项:
- 不同微服务,不要开发相同业务
- 微服务数据独立,不要访问其他微服务的数据库
- 微服务可以将自己的业务暴露为接口,提供给其他服务调用
实现夸远程服务调用使用RestTemplate
通过@Bean注解将RestTemplate对象交给spring管理,在需要的地方注入RestTemplate对象
调用方法:
//利用RestTemplate发送http请求//url路径String url = "http://localhost:8081/user/"+ order.getUserId();//发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);
Eureka注册中心
服务调用出现的问题 : 1.调用服务地址硬编码 2.多个服务如何选择 3.怎么知道服务提供者是否是健康状态
Eureka的作用:
-
消费者如何向服务提供者提供具体信息的
- 服务启动时向eureka注册自己的信息
- eureka保存信息
- 消费者根据服务名称向eureka拉取提供者信息
-
如果多个提供者,消费者该如何选择
- 消费者利用负载均衡算法,从服务列表中挑选一个
-
消费者如何感知服务器提供者的健康状态
- 服务提供者每隔30秒向EruekaServer发送请求,报告健康状态
- eureka会更新服务器列表,不正常得到提供者会被剔除
搭建EruekaServer
1.创建项目引入依赖
<!-- eureak服务端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
2.编写启动类,添加@EnableEurekaServer注解
3.添加application.yml文件
server:port: 10086 #服务端口
spring:application:name: eurekaserver
eureka:client:service-url: #eureka的地址信息deafultZone: http://127.0.0.1:10086/eureka
启动项目后方法10086端口就可以到eureka的界面
注册服务
将服务注册到eureka的步骤:
1.在服务项目中引入spring-cloud-starter-netflix-eureka-client的依赖
<!-- eureka客户端依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
2.在application.yml文件,编写配置
server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: ******driver-class-name: com.mysql.jdbc.Driverapplication:name: userService #user服务名称
mybatis:type-aliases-package: cn.itcast.user.pojoconfiguration:map-underscore-to-camel-case: true
logging:level:cn.itcast: debugpattern:dateformat: MM-dd HH:mm:ss:SSS
eureka:client:service-url: #eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
服务发现
1.在请求路径上面把路径换成我们注册服务的名称
public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//利用RestTemplate发送http请求//url路径(将路径换成需要的服务的名称)String url = "http://userservice/user/"+ order.getUserId();//发送http请求,实现远程调用User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}
2.加上RestTemplate的Bean上面加 @LoadBalanced 注解
Ribbon负载均衡
ribbon的负载均衡策略
修改负载均衡规则
默认是轮询方式
1.代码方式:在消费端的Application中,定义一个新的IRule
@Bean
public IRule randomRule(){return new RandowRule();
}
2.配置文件方式:配置文件只是更改一个服务的负载,不是全局
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
解饿加载
Ribbon默认是采用懒加载,即第一次加载时才会去创建LoadBalanceClient,请求时间会很长。而解饿加载则会在项目启动时创建,降低第一次访问的耗时。
ribbon:eager-load:enabled: true #开启解饿加载clients: -userservice #指定服务名称,多个服务需要在下面加 -
Nacos注册中心(nacos一部分功能)
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富。
Windows启动nacos命令:startup.cmd -m standalone
服务注册到nacos
1.在Cloud-demo父工程中添加Spring-cloud-alilbaba 的管理依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope></dependency>
2.添加nacos的客户端依赖
<!-- nacos客户端依赖包--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
3.改写application.yml 文件,向yml文件中加入nacos的服务地址配置
application:name: userservice #user服务名称cloud:nacos:discovery:server-addr: localhost:8848 #nacos服务地址
nacos服务分级存储模型
添加服务集群属性
修改application.yml
cloud:nacos:discovery:server-addr: localhost:8848 #nacos服务地址cluster-name: SH #集群名称,Hz代指杭州
更改服务访问规则(NacosRule负载均衡规则)
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.nacos.ribbon.NacosRule
NacosRule负载均衡规则 : 集群优先
环境隔离 -namespace
1.在nacos网站去创建namespace命名空间
2.配置服务所在命名空间,在application.yml文件中修改
cloud:nacos:discovery:server-addr: localhost:8848cluster-name: HZnamespace: 359d6479-2271-43fa-9ca3-9cf1f1082906 #dev环境(复制我们创建好的命名空间Id)
不同nameSpace下的服务不可见(不能访问)
Nacos和eureka的区别
Nacos配置管理
配置更改热更新
统一配置管理
1.引入Nacos的配置管理客户端依赖:
<!-- nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
2.在服务提供者中的resource目录中添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml文件
spring:application:name: userservice #服务名称profiles:active: dev #环境cloud:nacos:discovery:server-addr: localhost:8848 #nacos地址config:file-extension: yaml #文件后缀名
将application.yml文件中重复的配置删掉
配置自动刷新
-
方式一:在@Value注入的变量所在类上添加注解@RefreshScope
-
方式二:使用@ConfigurationProperties注解
@Data
@Component
@ConfigurationProperties(prefix = “pattern”)
public class PatternProperties {
private String dateformat;
}
多环境配置共享优先级:
服务名-profile.yaml > 服务名.yaml > 本地配置
热更新的Springboot实现
1.导入jar包
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.11</version></dependency>
2.更改application.yaml文件
nacos:config:data-id: jc-club-oss #用于指定要获取的配置数据的ID或名称。secret-key: nacos # 用于进行访问控制的密钥,用于对配置中心的访问进行认证和授权。access-key: nacos # 用于进行访问控制的密钥,用于对配置中心的访问进行认证和授权。group: DEFAULT_GROUP #用于指定配置数据所属的分组,这样可以更好地组织和管理配置。type: yaml #指定配置数据的类型,例如 YAML、Properties 等。server-addr: http://117.72.14.166:8848/ #指定Nacos配置中心的地址,包括主机名和端口。auto-refresh: true #标识是否自动刷新配置内容,当配置中心的配置发生变化时,客户端是否自动更新配置。remote-first: true #当配置中心不可用时,是否优先使用本地缓存的配置。bootstrap:enable: true #是否启用Bootstrap配置,Bootstrap配置是在Spring应用程序启动时首先加载的一组配置。
3.使用@NacosValue注解
@NacosValue(value = "${storage.service.type}",autoRefreshed = true)private String storageType;@GetMapping("/testNacos")public String testNacos() {return storageType;}
出现 failed to req API:/nacos/v1/ns/instance after all servers([localhost:8848]) tried: java.net.ConnectException: Connection refused: connect 异常
因为同时导入了Nacos的配置中心和注册中心的依赖导致
Nacos配置中心依赖 -config 注册中心 -discovery
http客户端Feign
使用之前的RestTemplate方式调用会出现一些问题
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
Feign是一声明式的http客户端,作用是帮助我们优雅的实现http请求的发送。
1.引入Feign依赖
<!-- feign客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.2.7.RELEASE</version>
</dependency>
2.在启动类上添加注解开启Feign的功能
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients
3.编写Feign客户端
@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}
注意:若出现 Load balancer does not have available server for client: userservice 错误 需要查看服务的命名空间是否一致
微服务之间用openfeign调用要想保证微服务之间的用户上下信息一致需要添加feign的拦截器
@Component
public class FeignRequestInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = requestAttributes.getRequest();if (!ObjectUtils.isEmpty(request)) {String loginId = request.getHeader("loginId");if (StringUtils.isNotBlank(loginId)){requestTemplate.header("loginId",loginId);}}}
}
同时将FeignRequestInterceptor注册成Bean交给Spring管理
@Configuration
public class FeignConfiguration {@Beanpublic RequestInterceptor requestInterceptor(){return new FeignRequestInterceptor();}
}
这样其他微服务就可以通过拦截器拿到loginId
自定义Feign的配置
配置日志级别方式一(修改配置文件的方式):
feign:client:config:default:# 设置日志记录级别,其取值共有none、basic、headers、fullloggerLevel: FULL
配置日志级别方式二(声明Bean的方式):
public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){return Logger.Level.BASIC;}
}
全局有效
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
具体服务有效
@FeignClient(value = "userservice",configuration = DefaultFeignConfiguration.class)
Feign的性能优化
使用连接池代替默认的URLConnection:
Feign添加HttpClient的支持依赖:
<!-- 引入HttpClient依赖--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
配置application.yml文件:
feign:httpclient:enabled: true #支持httpClient的开关max-connections: 200 #最大连接数max-connections-per-route: 50 #单个路径的最大连接数
Feign的优化:
- 日志级别尽量用basic
- 使用HttpClient或者OkHttp代替URLConnection
Feign的最佳实践
方式二:
-
新建module并引入feign的starter的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
-
将feign的客户端和实体类抽取到新建的module中
-
在需要使用服务的pom文件中引入依赖
-
修改组件有关的import部分,改成使用新建module中的包
统一网关Gateway
网关功能:
- 身份认证和权限校验
- 服务路由,负载均衡
- 请求限流
Springcloud 中网关的实现包括两种:
- gateway
- zuul
搭建网关服务:
1.创建一个module,引入SpringCloudGateway的依赖和Nacos的服务发现依赖:
<!-- nacos服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
<!-- 网关gateway依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
2.编写路由配置以及Nacos地址
server:port: 10010 #网关端口
spring:application:name: gateway #服务名称cloud:nacos:server-addr: localhost:8848gateway:routes: #网关路由配置- id: user-service #路由Id,自定义,只要唯一即可#uri: http://127.0.0.1:8081 #路由的目标地址http是固定地址uri: lb://userservice #路由目标地址 lb就是负载均衡,后面跟服务名称predicates: #路由断言,也就是判断请求是否符合路由规则的条件- Path=/user/** #按照路径匹配,只要以/user/开头就符合条件- id: order-serviceuri: lb://orderservicepredicates: - Path=/order/**
总结:
网关搭建步骤:
-
创建项目,引入nacos服务发现和gateway依赖
-
配置application.yml,包括服务基本信息、nacos地址、路由
路由配置包括:
-
路由id:路由的唯一标示
-
路由目标(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡
-
路由断言(predicates):判断路由的规则,
-
路由过滤器(filters):对请求或响应做处理
路由断言工厂Route Predicate Factory
我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件
例如Path=/user/**是按照路径匹配,这个规则是由
org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory
类来
处理的,像这样的断言工厂在SpringCloudGateway还有十几个:
名称
说明
示例
After
是某个时间点后的请求
- After=2037-01-20T17:42:47.789-07:00[America/Denver]
Before
是某个时间点之前的请求
- Before=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
Between
是某两个时间点之前的请求
- Between=2037-01-20T17:42:47.789-07:00[America/Denver], 2037-01-21T17:42:47.789-07:00[America/Denver]
Cookie
请求必须包含某些cookie
- Cookie=chocolate, ch.p
Header
请求必须包含某些header
- Header=X-Request-Id, d+
Host
请求必须是访问某个host(域名)
- Host=.somehost.org,.anotherhost.org
Method
请求方式必须是指定方式
- Method=GET,POST
Path
请求路径必须符合指定规则
- Path=/red/{segment},/blue/**
Query
请求参数必须包含指定参数
- Query=name, Jack或者- Query=name
RemoteAddr
请求者的ip必须是指定范围
- RemoteAddr=192.168.1.1/24
Weight
权重处理
过滤器工厂
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:
名称
说明
AddRequestHeader
给当前请求添加一个请求头
RemoveRequestHeader
移除请求中的一个请求头
AddResponseHeader
给响应结果中添加一个响应头
RemoveResponseHeader
从响应结果中移除有一个响应头
RequestRateLimiter
限制请求的流量
请求头过滤器
下面我们以AddRequestHeader 为例来讲解。
需求:给所有进入userservice的请求添加一个请求头:Truth=itcast is freaking awesome!
只需要修改gateway服务的application.yml文件,添加路由过滤即可:
spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/** filters: # 过滤器- AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
当前过滤器写在userservice路由下,因此仅仅对访问userservice的请求有效。
默认过滤器
如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
spring:cloud:gateway:routes:- id: user-service uri: lb://userservice predicates: - Path=/user/**default-filters: # 默认过滤项- AddRequestHeader=Truth, Itcast is freaking awesome!
自定义全局过滤器
需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
-
参数中是否有authorization,
-
authorization参数值是否为admin
如果同时满足则放行,否则拦截
实现:
在gateway中定义一个过滤器:
package cn.itcast.gateway.filters;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取请求参数MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();// 2.获取authorization参数String auth = params.getFirst("authorization");// 3.校验if ("admin".equals(auth)) {// 放行return chain.filter(exchange);}// 4.拦截// 4.1.禁止访问,设置状态码exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);// 4.2.结束处理return exchange.getResponse().setComplete();}
}
过滤器执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器链(集合)中,排序后依次执行每个过滤器:
排序的规则:
- 每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
- GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
- 路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
- 当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
详细内容,可以查看源码:
org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters()
方法是先加载defaultFilters,然后再加载某个route的filters,然后合并。
org.springframework.cloud.gateway.handler.FilteringWebHandler#handle()
方法会加载全局过滤器,与前面的过滤器合并后根据order排序,组织过滤器链
解决跨域问题
在gateway服务的application.yml文件中,添加下面的配置:
spring:cloud:gateway:# 。。。globalcors: # 全局的跨域处理add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题corsConfigurations:'[/**]':allowedOrigins: # 允许哪些网站的跨域请求 - "http://localhost:8090"allowedMethods: # 允许的跨域ajax的请求方式- "GET"- "POST"- "DELETE"- "PUT"- "OPTIONS"allowedHeaders: "*" # 允许在请求中携带的头信息allowCredentials: true # 是否允许携带cookiemaxAge: 360000 # 这次跨域检测的有效期
网关提示503错误,并且配置的地址信息都符合 查看是否配置的负载均衡的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
相关文章:

SpringCloud微服务架构
文章目录 认识微服务:SpringCloud 服务拆分及远程调用实现夸远程服务调用使用RestTemplateEureka注册中心 搭建EruekaServer注册服务服务发现 Ribbon负载均衡 修改负载均衡规则解饿加载 Nacos注册中心(nacos一部分功能) 服务注册到nacosnacos…...

WebSocket封装
提示:记录工作中遇到的需求及解决办法 文章目录 前言二、背景三、WebSocket3.1 什么是 WebSocket ?为什么使用他?四、封装 WebSocket4.1 Javascript 版本4.2 Typescript 版本4.3 如何使用?五、我的痛点如何处理前言 本文将介绍 WebSocket 的封装,比如:心跳机制,重连和一…...

基于Flask后端框架的均值填充
Flask可以在Jupyter上运行,首先需要安装这两个库: !pip install Flask-CORS !pip install Flask 引入依赖: from flask import Flask, request, jsonify, send_file import os import pandas as pd import io from flask import Flask fr…...

SQL-Server链接服务器访问Oracle数据
SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …...

Python中continue语句的使用
1 问题 本文将对在循环中continue语句的用途和如何正确使用continue进行分析与总结。 2 方法 (1)定义: 在编程中,“continue”是一个关键字,用于循环结构中。它的作用是跳过当前循环的剩余部分,立即进入下一…...

JavaScript的diff库详解(示例:vue项目实现两段字符串比对标黄功能)
diff库介绍 diff 库是基于 Myers 差分算法 实现的 JavaScript 文本差异库。 Myers 差分算法 是由 Eugene Myers 在 1986 年发表的一篇经典算法论文 “An O(ND) Difference Algorithm and its Variations” 中描述的一种高效算法,用于计算两个序列(通常是…...

自动驾驶3D目标检测综述(六)
停更了好久终于回来了(其实是因为博主去备考期末了hh) 这一篇接着(五)的第七章开始讲述第八章的内容。第八章主要介绍的是三维目标检测的高效标签。 目录 第八章 三维目标检测高效标签 一、域适应 (一)…...

the request was rejected because no multipart boundary was found
文章目录 1. 需求描述2. 报错信息3. 探索过程 1. 使用postman 排除后端错误2. 搜索网上的解决方法3. 解决方法 1. 需求描述 想要在前端上传一个PDF 发票,经过后端解析PDF之后,将想要的值自动回填到对应的输入框中 2. 报错信息 org.apache.tomcat.u…...

HarmonyOS-面试整理
目录 为什么选择HarmonyOS/ 优点/特点鸿蒙系统的权限有哪些说一说鸿蒙系统的安全机制说一说鸿蒙系统的微内核与安卓的内核区别鸿蒙操作系统的微内核架构有哪些优势分布式能力在鸿蒙系统中如何实现请解释一下鸿蒙系统中的分布式软总线技术如何在鸿蒙操作系统中进行多设备协同开发…...

[C#] 「Unity」「游戏开发」如何在Canvas下的Button控件下实例化Image元素
在开发过程中,经常需要在UI上动态添加元素。特别是在Unity中,Canvas控件通常用来作为UI元素的容器,而Button控件则常用于交互。而在某些情况下,我们可能需要在一个Button下实例化一个Image元素,并确保它的位置与Button的位置保持一致。然而,简单地使用Button的坐标值往往…...

Nginx1.20.2-Linux-安装
文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本,指定编译路径为/usr/local/nginx 5.编译并安装6.…...

Elasticsearch名词解释
文章目录 1.什么是Elasticsearch?2.什么是elastic stack(ELK)?3.什么是Lucene?4.什么是文档(document)?5.什么是词条(term)?6.什么是正向索引?7.什么是倒排索引?8.ES中的索引(index)9.映射(Mapping)10.DSL11.elastcisearch与my…...

Node项目——从0开始构建且共享至Gitee
从0开始构建一个Node.js项目涉及多个步骤,包括设置开发环境、初始化项目、安装依赖、编写代码以及配置版本控制等。以下是一个详细的步骤指南: 1. 安装Node.js和npm 首先,确保你已经安装了Node.js和npm(Node Package Manager&am…...

layui多图上传,tp8后端接收处理
环境:layui2.9.21\thinkphp8.1 前端代码: layui.use([upload, layer], function() {const upload layui.upload;const layer layui.layer;const $ layui.$;// 上传图片const uploadInstImage upload.render({elem: #uploadImage,url: /admin/demo/…...

QEMU网络配置简介
本文简单介绍下qemu虚拟机网络的几种配置方式。 通过QEMU的支持,常见的可以实现以下4种网络形式: 基于网桥(bridge)的虚拟网络。基于NAT(Network Addresss Translation)的虚拟网络。QEMU内置的用户模式网…...

28.Marshal.PtrToStringAnsi C#例子
//怎么说呢,这个代码Marshal的英文意思有将军,控制等等, //我的理解是类似于console控制台。 //然后后面这个Ansi是一种ASCII的扩展,还有其他编码方式可选 就是一个把后面的指针转化为字符串的一个代码 这是用法…...

基于feapder爬虫与flask前后端框架的天气数据可视化大屏
# 最近又到期末了,有需要的同学可以借鉴。 一、feapder爬虫 feapder是国产开发的新型爬虫框架,具有轻量且数据库操作方便、异常提醒等优秀特性。本次设计看来利用feapder进行爬虫操作,可以加快爬虫的速率,并且简化数据入库等操作…...

Linux隐藏登录和清除历史命令以及其他相关安全操作示例
隐藏登录 ssh -T rootxxx.xxx.xxx.xxx /bin/bash -i 命令拆解-T :告诉ssh客户端,不要分配一个TTY(伪终端)root :连接用户xxx.xxx.xxx.xxx :连接的服务器ip地址/bin/bash :在远程服务器上启动…...

从授权校验看SpringBoot自动装配
背景 最近需要实现一个对于系统的授权检测功能,即当SpringBoot应用被启动时,需要当前设备是否具有有效的的授权许可信息,若无则直接退出应用。具体的实现方案请继续看下文。 环境 Ruoyi-Vue SpringBoot3 RuoYi-Vue: 🎉 基于Spr…...

tensorboard的界面参数与图像数据分析讲解
目录 1.基础概念: (a)精确率与召回率: (b)mAP: (c)边界框损失: (d)目标损失: (e)分类损失: (f):学习率: 2.设置部分(最右边部分): GENERAL(常规设置…...

MTK 平台关于WIFI 6E P2P的解说
一 前言 官方 P2P 6E 设计原理,请查看这个网站 hostap - hostapd/wpa_supplicant 配置:p2p_6ghz_disable 允许上层指定是否允许6G连接 仅允许6G用于WFD –不允许6G用于纯P2P 缺点:存在很多 IOT issues 如:一些物联网设备无法识别6G类/信道,可能存在物联网问…...

离线语音识别+青云客语音机器人(幼儿园级别教程)
1、使用步骤 确保已安装以下库: pip install vosk sounddevice requests pyttsx3 2、下载 Vosk 模型: 下载适合的中文模型,如 vosk-model-small-cn-0.22。 下载地址: https://alphacephei.com/vosk/models 将模型解压后放置在…...

leetcode hot 100 跳跃游戏
55. 跳跃游戏 已解答 中等 相关标签 相关企业 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则…...

陪诊陪护助浴系统源码:JAVA养老护理助浴陪诊小程序医院陪护陪诊小程序APP源码
JAVA养老护理助浴陪诊小程序及医院陪护陪诊APP:打造智慧养老新生态 在人口老龄化日益加剧的当下,养老护理服务的需求日益增长,而传统的养老服务模式已难以满足日益多样化的需求。为此,我们基于JAVA技术栈,精心打造了一…...

怎么在家访问公司服务器?
在日常工作中,特别是对信息技术从业者而言,工作往往离不开公司的服务器。他们需要定期访问服务器,获取一些关键的机密文件或数据。如果您在家办公,并且需要处理未完成的任务,同时需要从公司服务器获取所需的数据&#…...

asp.net core框架搭建4-部署IIS/Nginx/Docker
文章目录 系列文章一、Linux上部署Nginx1.1 Centos 安装配置环境1.2 使用Systemctl 控制Nginx 二、部署IIS三、部署Docker3.1 创建 Dockerfile 文件3.2 构建 Docker 镜像3.3 运行 Docker 容器3.4 检查容器运行情况 结束语 作者:xcLeigh 文章地址:https:/…...

ubuntu中zlib安装的步骤是什么
参考:https://www.yisu.com/ask/40496522.html 在Ubuntu中安装zlib的步骤如下: 打开终端,输入以下命令更新包列表: sudo apt update复制代码 安装zlib库和开发文件: sudo apt install zlib1g zlib1g-dev复制代码 安装完成后&a…...

代码随想录算法训练营第二十天-二叉树-669. 修剪二叉搜索树
对于递归的写法除了大写的服字,无话可说由于是修剪二叉树,所以会有明确的方向性当某一结点小于最小值,说明其左子树全部要修剪掉当某一结点大于最大值,说明其右子树全部要修剪掉 #include <iostream>struct TreeNode {int …...

发现API安全风险,F5随时随地保障应用和API安全
分析数据显示,目前超过90%的基于Web的网络攻击都以API端点为目标,试图利用更新且较少为人所知的漏洞,而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略,在风险升级成代价高昂、令人警惕且往往无法…...

【AI学习】2024年末一些AI总结的摘录
看到不少的总结,边摘录边思考。尤其是这句话:“人类真正的问题是:我们拥有旧石器时代的情感、中世纪的制度和神一般的技术”。 22024生成模型综述 来自爱可可-爱生活 2024年见证了AI领域的重大飞跃。从OpenAI的主导地位到Claude的异军突起&…...