springcloud学习总结
springcloud
构建微服务项目步骤
- 导入依赖
- 编写配置文件
- 开启这个功能 @Enablexxx
- 配置类
- 于2023年2月24日下午17点38分开始学习
- 于2023年3月17日晚上20点26分学完总结
- 代码地址:https://gitee.com/liang-weihao/StudySpringcloud
- 学习笔记地址:https://www.kuangstudy.com/bbs/1374942542566551554
简介
SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
- springcloud就是为了分布式,通过rpc远程调用或http来互相通信访问
- spring boot的核心自动装配,约定大于配置
- 常用组件
Spring cloud有哪些常用组件,作用是什么?
- Eureka:注册中心
- Nacos:注册中心、配置中心
- Consul: 注册中心、配置中心
- Spring Cloud Config:配置中心
- Feign/OpenFeign:RPC调用
- Kong:服务网关
- Zuul:服务网关
- Spring Cloud Gateway: 服务网关
- Ribbon:负载均衡
- Spring CLoud sleuth: 链路追踪
- Zipkin:链路追踪
- Seata:分布式事务
- Dubbo:RPC调用
- Sentinel: 服务熔断
- Hystrix:服务熔断
springcloud和springboot的关系
- SpringBoot专注于快速方便的开发单个个体微服务。 -Jar
- SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供: 配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等等集成服务。
- SpringBoot可以离开SpringClooud独立使用,开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系
- SpringBoot专注于快速、方便的开发单个个体微服务,SpringCloud关注全局的服务治理框架
dubbo
- rpc框架
- dubbo专门的rpc远程调用
- spring cloudNetflix 2018年停更
- 微服务就是将传统一站式根据业务拆分成一个一个服务,彻底去耦合,一个微服务处理一件事情
- 微服务的优缺点
- 每个进程一个端口
- 微服务的技术栈
- 返回类型就是类点class
RestTemplate远程服务调用
@Autowired//返回类型:(url,实体map,返回类型Class<T> responseType)
private RestTemplate restTemplate;//提供多种便捷访问http服务的方法,简单的restful服务模板
package com.liang.springcloud.controller;import com.liang.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;import java.util.List;@Controller
@ResponseBody
public class DeptConsumerController {//理解:消费者,不应该有service层//RestTemplate很多方法给我们直接调用,注册到spring中@Autowired//返回类型:(url,实体map,返回类型Class<T> responseType)private RestTemplate restTemplate;//提供多种便捷访问http服务的方法,简单的restful服务模板private static final String REST_URL_PREFIX = "http://localhost:8001";@RequestMapping("/consumer/dept/add")public boolean add(Dept dept){return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept, Boolean.class);}//http://localhost:8001/dept/list要从这个地址拿到数据@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id){return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class);}@RequestMapping("/consumer/dept/list")public List<Dept> list(){return restTemplate.getForObject(REST_URL_PREFIX+"dept/list", List.class);}
}
Eureka服务注册与发现
- 主需要在主启动类上加注解
@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
public class EurekaService_7001 {public static void main(String[] args) {SpringApplication.run(EurekaService_7001.class,args);}
}
- 在其他服务配置文件,配置好eureka配置,然后在主启动类加上注解自动注册
@EnableEurekaClient//cs架构,自动在服务启动后自动注册到eureka中
什么是eureka?
Eureka: 怎么读?
-
Netflix 在设计Eureka时,遵循的就是AP原则
Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比如Zookeeper; -
心跳监测机制,五秒不回复证明挂掉,就会把服务节点移掉
-
自我保护机制(宁可保留全部服务,也不盲目注销任何健康的服务)
-
注意yml文件,编写要空一格
-
搭建eureka集群,对应配置文件加上绑定互联
-
创建三个服务端口分别为,注册中心(7001,7002,7003)
server:port: 7003# eureka配置
eureka:instance:hostname: eureka7003.com #Eureka服务端的实例名称client:register-with-eureka: false # 表示是否向eureka注册中心注册自己fetch-registry: false # fetch-registry 如果为false,则表示自己为注册中心service-url: # 监控页面defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
- 集群信息
- 把注册的提供服务8001启动,就会注册到对应的服务里
server:port: 8001#mybatis的配置
mybatis:type-aliases-package: com.liang.springcloud.pojoconfig-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/mapper/*.xml#spring的配置
spring:application:name: springcloud-provider-deptdatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8username: rootpassword: root# Eureka的配置,服务注册到哪里
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: springcloud-provider-dept8001-liangwh #修改的是eureka status默认的描述信息
#info配置
info:app.name: liangwh-springcloudcompany.name: liangwh123321.com
zookeeper和eureka的区别
-
cap原则,一个分布式系统不可能同时满足三个
-
作为服务注册中心,Eureka比Zookeeper好在哪里?
-
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A (可用性)、P (容错性)。由于分区容错性P在分布式系统中是必须要保证的,因此我们只能在A和C之间进行权衡
。Zookeeper保证的是CP;
。Eureka保证的是AP:
-
ribbon负载均衡
-
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具(轮询和随机)
-
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将NetFlix的中间层服务连接在一起。Ribbon的客户端组件提供一系列完整的配置项如: 连接超时、重试等等。简单的说,就是在配置文件中列出LoadBalancer (简称LB: 负载均衡)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等等) 去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法
-
负载均衡,把用户的请求平摊到多个服务上,达到高可用
ribbon能干嘛?
。LB,即负载均衡 (Load Balance) ,在微服务或分布式集群中经常用的一种应用。
。负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)
。常见的负载均衡软件有 Nginx,Lvs 等等
·dubbo、 SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义
。负载均衡简单分类:
集中式LB0
即在服务的消费方和提供方之间使用独立的LB设施,如Nginx(反向代理),由该设施负责把访问请求通过某种策略转发至服务的提供方!
进程式LB,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选出一个合适的服务器
Ribbon就属于进程内LB它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址!
- 注意报错 - @org.springframework.beans.factory.annotation.Autowired(required=true)
表明引用的类没有注入到bean中需要在该类加上注解 @Bean
@Configuration
public class ConfigBean {
//配置负载均衡实现RestTemplate@Bean@LoadBalanced//ribbonpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
-
@Bean一般和@Configuration一起使用
-
idea显示数据库
-
集群,三个服务提供者对应三个不同的数据库,通过ribbon实现负载均衡访问不同数据库(轮询)
ribbon默认算法
//ribbon 和 eureka整合以后,客户端可以直接调用,不用关心ip 和 端口号
//消费者主启动类
@SpringBootApplication
@EnableEurekaClient
//在微服务启动的时候就能去加载我们自定义的ribbon类
@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = liangRule.class)
public class DeptConsumer_88 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_88.class, args);}}
- 注意自定义类要在主启动类上一级
package com.liang.myrule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.concurrent.ThreadLocalRandom;public class LiangRandomRule extends AbstractLoadBalancerRule {//每个服务,访问6次,换下一个服务(3个)//total=0,默认=0,如果=6,指向下一个服务节点//index= 0,默认=0,如果total = 5,index+1private int total = 0; //被调用的次数private int currentIndex = 0; //当前谁提供的服务@SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {return null;} else {Server server = null;while(server == null) {if (Thread.interrupted()) {return null;}List<Server> upList = lb.getReachableServers();//获得可访问服务器List<Server> allList = lb.getAllServers();//获取全部服务int serverCount = allList.size();if (serverCount == 0) {return null;}// int index = this.chooseRandomInt(serverCount);//生成区间随机数
// server = (Server)upList.get(index);//从活着的服务中,随机获取一个// -自定义算法开始==============================if (total<5){server = upList.get(currentIndex);total++;}else {total = 0;currentIndex ++;if (currentIndex>=upList.size()){currentIndex = 0;}server = upList.get(currentIndex);//从活着的服务中,获得指定的服务来操作}// -自定义算法结束==============================if (server == null) {Thread.yield();} else {if (server.isAlive()) {return server;}server = null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
}
@Configuration
public class liangRule {@Beanpublic IRule myRule(){return new LiangRandomRule();//默认是轮询,现在我们自定义访问自己定义的算法}
}
Feign负载均衡
简介
- feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。SpringCloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
只需要创建一个接口,然后添加注解即可!
feign ,主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法
1.微服务名字 (ribbon]
2.接口和注解 [feign ] - 主要靠接口和注解就可以使用
在service加上注解
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
- 接口
@Component//注入到容器
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {@GetMapping("/dept/get/{id}")public Dept queryById(@PathVariable("id")Long id);@GetMapping("/dept/list")public List<Dept> queryAll();@PostMapping("/dept/add")public boolean addDept(Dept dept);
}
- controller 层
@RestController
public class DeptConsumerController {//理解:消费者,不应该有service层//RestTemplate很多方法给我们直接调用,注册到spring中@Autowired//返回类型:(url,实体map,返回类型Class<T> responseType)private RestTemplate restTemplate;//提供多种便捷访问http服务的方法,简单的restful服务模板//ribbon(负载均衡) 我们这里的地址应该是一个变量,通过服务访问
// private static final String REST_URL_PREFIX = "http://localhost:8001";
// private static final String REST_URL_PREFIX = "http://SPRINGCLOUD-PROVIDER-DEPT";@Autowiredprivate DeptClientService deptClientService;@RequestMapping("/consumer/dept/add")public boolean add(Dept dept){return this.deptClientService.addDept(dept);}//http://localhost:8001/dept/list要从这个地址拿到数据@RequestMapping("/consumer/dept/get/{id}")public Dept get(@PathVariable("id") Long id){return deptClientService.queryById(id);}@RequestMapping("/consumer/dept/list")public List<Dept> list(){return this.deptClientService.queryAll();}
- 主启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.liang.springcloud"})
public class FeignDeptConsumer_88 {public static void main(String[] args) {SpringApplication.run(FeignDeptConsumer_88.class, args);}}
Hystrix服务熔断降级
简介
Hvstrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障以提高分布式系统的弹性。
"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故喷在分布式系统中的蔓延,乃至雪崩
Hystrix能干嘛
。服务降级
。服务熔断
。服务限流
。接近实时的监控
- 服务雪崩
- ‘弃车保帅’
服务熔断
服务熔断是什么?
-
熔断机制是对应雪崩效应的一种微服务链路保护机制
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回 错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在Springloud框架里熔断机制通过Hystrix实现。Hvstrix会监控微服务间调用的状况,当失败的调用到一定闻值,5秒内20次调用失败就会启动熔断机制。
熔断机制的注解是 @HystrixCommand。 -
在主启动类加上注解
@EnableCircuitBreaker//添加对熔断的支持
-
链式编程注解(在对应实体类加上即可)
@Accessors(chain = true)//链式写法
@Data
@NoArgsConstructor
@Accessors(chain = true)//链式写法
public class Dept implements Serializable {private Long deptno;//主键private String dname;private String db_source;//一个服务对应一个数据库,数据库存的字段public Dept(String dname) {this.dname = dname;}
}
- 写法
//备选方法@GetMapping("/dept/get/{id}")public Dept hystrixGet(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("id=>"+id+"没有对应信息,null==@hystrix").setDb_source("no this database in mysql");}
- hystrix服务熔断调用其他方法
@GetMapping("/dept/get/{id}")@HystrixCommand(fallbackMethod = "hystrixGet")//只要失败就调用其他方法public Dept get(@PathVariable("id") Long id){Dept dept = deptService.queryById(id);if (dept == null){throw new RuntimeException("id=>"+id+"不存在这个id");}return dept;}//备选方法public Dept hystrixGet(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("id=>"+id+"没有对应信息,null==@hystrix").setDb_source("no this database in mysql");}
服务降级
- 先开启eureka注册中心7001再开启服务提供者8001最后开启消费者88,然后把8001提供者挂掉,降级就会默认返回自定义信息,而不是直接访问不到数据库
- 对应消费者配置文件加上降级
#开启降级 feign.hystrix
feign:hystrix:enabled: true
@Component//注入到容器
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFactory.class)
public interface DeptClientService {@GetMapping("/dept/get/{id}")public Dept queryById(@PathVariable("id")Long id);@GetMapping("/dept/list")public List<Dept> queryAll();@PostMapping("/dept/add")public boolean addDept(Dept dept);
}
//降级~
@Component
public class DeptClientServiceFactory implements FallbackFactory {@Overridepublic DeptClientService create(Throwable throwable) {return new DeptClientService() {@Overridepublic Dept queryById(Long id) {return new Dept().setDeptno(id).setDname("id=>"+id+"没有对应的信息,客户端提供了降级的信息,这个服务现在已经被关闭").setDb_source("no数据");}}
总结
-
服务熔断
- 服务端(某个服务超时或者异常,引起熔断)
-
服务降级
- 客户端 (从整体网站请求负载考虑,当某个服务熔断关闭之后,服务将不被调用),服务就不被调用
- 可以在客户端自定义回调fallbackFactory,返回一个默认值,整体服务下降,但是能用比挂掉强
dashboard监控
- 在主启动类加上注解
@EnableHystrixDashboard //开启
- 配置好端口
-
直接访问
- 填写监测路径
- 去对应的请求刷新,这边监测页面会对应刷新
绿色代表健康红色危险
Zuul路由网关
概述
-
什么是Zuul?
- Zuul包含了对请求的路由和过滤两个最主要的功能!
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验,服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得
注意: Zuul服务最终还是会注册进Eureka
提供:代理 + 路由 + 过滤 三大功能!
Zuul能干嘛?
- Zuul包含了对请求的路由和过滤两个最主要的功能!
-
路由
-
过滤
-
主启动类加上注解
@EnableZuulProxy //zuul启动
访问地址:http://www.liangstudy.com:9527/springcloud-provider-dept/dept/get/1
zuul:routes:mydept.serviceId: springcloud-provider-dept # 配置自定义路径mydept.path: /mydept/**ignored-services: "*" # 忽略全部#ignored-services: springcloud-provider-dept #不能再使用这个路径访问prefix: /liang #设置访问公共的前缀
-
http://www.liangstudy.com:9527/mydept/dept/get/1
-
http://www.liangstudy.com:9527/liang/mydept/dept/get/1
config配置中心
概述
分布式系统面临的–配置文件的问题
-
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的的配置文件要修改起来,岂不是要发疯!
-
Spring loud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
-
springc config 分为服务端和客户端两部分
Springcloud config分布式配置中心能干嘛
。集中管理配置文件
。不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test/ /prod /beta /release
。运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
。当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置0
。将配置信息以REST接口的形式暴露
- Git clone代码的时候 下用ssh(需要公钥秘钥)报错的时候就用https得clone
Git
-
Git add .添加到本地仓库
-
Git status 查看当前文件的提交状态
-
Git commit -m ‘描述信息’ 提交到本地暂存区
-
Git push上传到远程服务器
-
修改git的配置
$ git config --global user.email "1814356884@qq.com"
$ git config --list
$ git config --global user.name "liangweihao"
-
主启动类加上注解
@EnableConfigServer
-
访问路径:http://localhost:3344/application-dev.yml
-
记得把Git仓库设为开源公开状态
-
客户端拿服务端的代码
-
拼接
毕业啦!
相关文章:
![](https://img-blog.csdnimg.cn/82991877b6574482bae009f3d8bcbd33.png)
springcloud学习总结
springcloud 构建微服务项目步骤 导入依赖编写配置文件开启这个功能 Enablexxx配置类 于2023年2月24日下午17点38分开始学习于2023年3月17日晚上20点26分学完总结代码地址:https://gitee.com/liang-weihao/StudySpringcloud学习笔记地址:https://www.…...
![](https://img-blog.csdnimg.cn/6825892e188745ab99a3ca0bfa520010.png)
2022年亏损超10亿,告别野蛮成长的众安在线急需新“引擎”
2023年3月21日,众安在线披露了2022年财报,营收233.52亿元,同比增长6.44%;净亏损16.33亿元,去年同期净利润为11.6亿元,同比由盈转亏。 尽管众安在线再次身陷亏损的泥潭,但投资者却没有选择逃离。…...
![](https://img-blog.csdnimg.cn/7c6fc26b4e6c47d9aa82210cd25bafae.png)
ChatGPT文心一言逻辑大比拼(一)
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
![](https://img-blog.csdnimg.cn/96da91119f644bf4827c8058270cbd3a.png)
【机器学习面试总结】————特征工程
【机器学习面试总结】————特征工程一、特征归一化为什么需要对数值类型的特征做归一化?二、类别型特征在对数据进行预处理时,应该怎样处理类别型特征?三、高维组合特征的处理什么是组合特征?如何处理高维组合特征?四、组合特征怎样有效地找到组合特征?五、文本表示模型…...
![](https://img-blog.csdnimg.cn/434a4a18eeb54f978ba2dbc7e621e7cb.png)
如何将字符串反转?
参考答案 使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)不考虑字符串中的字符是否是 Unicode 编码,自己实现。递归1. public AbstractStrin…...
![](https://img-blog.csdnimg.cn/img_convert/0c2c828e77ec4f8386a104cfbefe83de.webp?x-oss-process=image/format,png)
Linux内核IO基础知识与概念
什么是 IO在计算机操作系统中,所谓的I/O就是 输入(Input)和输出(Output),也可以理解为读(Read)和写(Write),针对不同的对象,I/O模式可以划分为磁盘…...
![](https://img-blog.csdnimg.cn/20210410120210363.png#pic_center)
paper文献和科研小工具
一、好用的网站 Aminer 二、好用的工具 1. SciSpace SciSpace官网 【ChatGPT 论文阅读神器】SciSpace 用户注册与实战测试 SciSpace是一款基于 ChatGPT 的论文阅读神器。 2. ReadPaper 强大且超实用的论文阅读工具——ReadPaper ReadPaper官网 ReadPaper下载链接 Rea…...
![](https://img-blog.csdnimg.cn/img_convert/961b4afb9a615ac284c72f9d12f25ccb.png)
dfs和bfs能解决的问题
一.理解暴力穷举之dfs和bfs暴力穷举暴力穷举是在解决问题中最常用的手段,而dfs和bfs算法则是这个手段的两个非常重要的工具。其实,最简单的穷举法是直接遍历,如数列求和,遍历一个数组即可求得所问答案,这与我在前两篇博…...
![](https://img-blog.csdnimg.cn/74d1f3cf3dc740dd842ead5ddb8c378d.jpeg)
静态通讯录,适合初学者的手把手一条龙讲解
数据结构的顺序表和链表是一个比较困难的点,初见会让我们觉得有点困难,正巧C语言中有一个类似于顺序表和链表的小程序——通讯录。我们今天就来讲一讲通讯录的实现,也有利于之后顺序表和链表的学习。 目录 0.通讯录的初始化 1.菜单的创建…...
![](https://img-blog.csdnimg.cn/e8e2991e6c114de38a0703418acfe4b7.png)
【你不知道的 CSS】你写的 CSS 太过冗余,以至于我对它下手了
:is() 你是否曾经写过下方这样冗余的CSS选择器: .active a, .active button, .active label {color: steelblue; }其实上面这段代码可以这样写: .active :is(a, button, label) {color: steelblue; }看~是不是简洁了很多! 是的,你可以使用…...
![](https://img-blog.csdnimg.cn/88ad391782414761986c7bf5a5735b36.png)
Lesson 8.1 决策树的核心思想与建模流程
文章目录一、借助逻辑回归构建决策树1. 决策树实例2. 决策树知识补充2.1 决策树简单构建2.2 决策树的分类过程2.3 决策树模型本质2.4 决策树的树生长过程2.5 树模型的基本结构二、决策树的分类与流派1. ID3(Iterative Dichotomiser 3) 、C4.5、C5.0 决策树2. CART 决策树3. CHA…...
![](https://img-blog.csdnimg.cn/bf4751957b4843f2b363d810790b81f2.png#pic_center)
【算法】FIFO先来先淘汰算法分析和编码实战
背景 在设计一个系统的时候,由于数据库的读取速度远小于内存的读取速度 为加快读取速度,将一部分数据放到内存中称为缓存,但内存容量是有限的,当要缓存的数据超出容量,就需要删除部分数据 这时候需要设计一种淘汰机制…...
![](https://img-blog.csdnimg.cn/151edbd5080f44769a50e6b648525926.gif#pic_center)
二分查找——我欲修仙(功法篇)
个人主页:【😊个人主页】 系列专栏:【❤️我欲修仙】 学习名言:临渊羡鱼,不如退而结网——《汉书董仲舒传》 系列文章目录 第一章 ❤️ 二分查找 文章目录系列文章目录前言🚗🚗🚗二分查找&…...
![](https://www.ngui.cc/images/no-images.jpg)
Python 多线程
文章目录一、简介1.1 多线程的特性1.2 GIL二、线程1.2 单线程1.3 多线程三、线程池3.1 pool.submit3.2 pool.map四、Lock(线程锁)4.1 无锁导致的线程资源异常4.2 有锁五、Event(事件)5.1 简介5.2 示例六、Queue(队列&a…...
![](https://img-blog.csdnimg.cn/img_convert/0f30af270d484b4571c3e2582ff694c9.png)
JVM笔记(九)选择合适的垃圾收集器
Epsilon收集器Epsilon收集器由RedHat公司在JEP 318中提出,在此提案里Epsilon被形容成一个无操作的收集器(A No-Op Garbage Collector),而事实上只要Java虚拟机能够工作,垃圾收集器便不可能是真正“无操作”的。原因是“…...
![](https://www.ngui.cc/images/no-images.jpg)
二维图像处理到三维点云处理
一、Opencv和PCL 下面是opencv和pcl的特点、区别和联系的详细对比表格。 特点/区别/联系OpenCVPCL英文全称Open Source Computer Vision LibraryPoint Cloud Library语言C、Python、JavaC功能图像处理(图像处理和分析、特征提取和描述、图像识别和分类、目标检测和跟踪等)、计…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode 删除有序数组中的重复项
题目 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一…...
![](https://img-blog.csdnimg.cn/img_convert/f43845c4e4eb489cb4e062cb5f7fff36.png)
JVM学习.03 类加载机制
1、前言从事Java开发工作的都知道,Java程序提交到JVM运行时,需要编译成Class文件,才能被JVM加载运行。那么这些Class文件进入到虚拟机后会发生什么?以及Class是如何被加载的?这些都是本文要讲解的部分。2、类加载时机所…...
![](https://img-blog.csdnimg.cn/b57aa5589300468aad9cf76fff05346b.png)
Celery使用:优秀的python异步任务框架
目录Celery 简介介绍安装基本使用Flask使用Celery异步任务定时任务Celery使用Flask上下文进阶使用参考停止Worker后台运行Celery 简介 介绍 Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。 它是一个…...
![](https://img-blog.csdnimg.cn/02e1244274964107b2ce3c400a3d530e.png)
第十四届蓝桥杯三月真题刷题训练——第 19 天
第 1 题:灌溉_BFS板子题 题目描述 小蓝负责花园的灌溉工作。 花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。 小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。 每经过一分…...
![](https://img-blog.csdnimg.cn/img_convert/35edba3b72a0ab22f56bc7f5b0722a85.jpeg)
类和对象 - 下
本文已收录至《C语言》专栏! 作者:ARMCSKGT 目录 前言 正文 初始化列表 成员变量的定义与初始化 初始化列表的使用 变量定义顺序 explicit关键字 隐式类型转换 自定义类型隐式转换 explicit 限制转换 关于static static声明类成员 友元 友…...
![](https://img-blog.csdnimg.cn/513cdcb73d914414aaa71065e8ba9a69.gif#pic_center)
【云原生】Linux基础IO(文件理解与操作)
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Great minds discuss ideas. Average minds discuss events. Small minds disc…...
![](https://www.ngui.cc/images/no-images.jpg)
CentOS 7 安装 mysql 8.0 客户端
只想安装 mysql-client 8.0 , 结果发现直接 yum install mysql mysql-client 安装的版本是 mysql Ver 15.1 Distrib 5.5.68-MariaDB ,这个版本太低,连接其他服务器上的 mysql 8.0 时总是失败,因为 mysql 8.0 加密方式改变了&#…...
![](https://img-blog.csdnimg.cn/img_convert/3b5a0c4bdca64fe4920164cdfe346ac6.png)
Ubuntu下载、配置、安装和编译opencv
1 安装相关依赖安装opencv前,需要先准备好编译器、相关依赖sudo apt-get install gcc g cmake vim sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev sudo apt-get install libgtk2.0-…...
![](https://img-blog.csdnimg.cn/c08bf7a248e346a58b2dc8fe540f9c57.png)
第七讲 贪心
文章目录股票买卖 II货仓选址(贪心:排序中位数)糖果传递(❗贪心:中位数)雷达设备(贪心排序)付账问题(平均值排序❓)乘积最大(排序/双指针)后缀表达…...
![](https://www.ngui.cc/images/no-images.jpg)
数字藏品的未来及发展趋势
随着互联网的普及以及数字文化的日益发展,数字藏品作为一种全新的收藏方式正在逐步兴起。数字藏品可以是数字版权、数字艺术品、数字音乐以及数字视频等形式,这些藏品通过数字化技术保存下来,并在互联网上进行传播和交易。数字藏品的发展趋势…...
![](https://img-blog.csdnimg.cn/17b35b5ed6e64720b913e1f588be6f78.jpeg)
值得记忆的STL常用算法,分分钟摆脱容器调用的困境,以vector为例,其余容器写法类似
STL常用算法 概述: 算法主要是由头文件<algorithm> <functional> <numeric>组成 <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等 <nuneric>体积很小,只包括…...
java如何手动导jar包
今天用IDEA,需要导入一个Jar包,因为以前都是用eclipse的,所以对这个idea还不怎么上手,连打个Jar包都是谷歌了一下。 但是发现网上谷歌到的做法一般都是去File –> Project Structure中去设置,有没有如同eclipse一样…...
![](https://www.ngui.cc/images/no-images.jpg)
怎么防止SQL注入?
首先SQL注入是一种常见的安全漏洞,黑客可以通过注入恶意代码来攻击数据库和应用程序。以下是一些防止SQL注入的基本措施: 数据库操作层面 使用参数化查询:参数化查询可以防止SQL注入,因为参数化查询会对用户输入的数据进行过滤和…...
![](https://img-blog.csdnimg.cn/d56ca138eacd4b729e9d341d1ad9937c.jpeg)
【千题案例】TypeScript获取两点之间的距离 | 中点 | 补点 | 向量 | 角度
我们在编写一些瞄准、绘制、擦除等功能函数时,经常会遇到计算两点之间的一些参数,那本篇文章就来讲一下两点之间的一系列参数计算。 目录 1️⃣ 两点之间的距离 ①实现原理 ②代码实现及结果 2️⃣两点之间的中点 ①实现原理 ②代码实现及结果 3…...
![](https://img-blog.csdnimg.cn/20200208113704315.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTg1Mjkz,size_16,color_FFFFFF,t_70)
公司做了网站怎么做推广/查权重工具
selenium安装 winR,输入cmd,进入命令行,然后输入 pip install seleniumwebdriver的配置 这里我们安装chrome的webdriver使用 首先查看你的谷歌浏览器的版本chrome://version/ 例如: 然后参照版本,我们下载对应的谷…...
![](https://img-blog.csdnimg.cn/img_convert/7621349a0cecc594441b0e10d0919cf8.png)
wordpress模板改适应手机/宁波百度seo排名优化
Python语法简洁,能够用一行代码实现很多有趣的功能,这次来整理30个常见的Python一行代码集合。 1、转置矩阵 old_list [[1, 2, 3], [3, 4, 6], [5, 6, 7]] list(list(x) for x in zip(*old_list))[[1, 3, 5], [2, 4, 6], [3, 6, 7]]2、二进制转十进制…...
![](/images/no-images.jpg)
郑州的电子商城网站建设/搜索引擎yandex入口
演练:编辑来自域服务的数据 当我们在域服务中添加了更新、插入或删除方法时,我们就可以在Silverlight客户端创建一个接口来让用火修改数据。EntityChangesSet对象跟踪所有的改变,并且这些改变在我们调用SubmitChanges方法时一起提交。 在这个…...
![](https://oscimg.oschina.net/oscnet/fbd9a3e8ff2727fae606f1ca5ad7bd4e7c3.jpg)
余江区建设局网站/江阴网站制作公司
开发四年只会写业务代码,分布式高并发都不会还做程序员? Python 创始人 Guido van Rossum 前段时间宣布脱离 Python 决策层,辞去所谓的 BDFL (终生仁慈的独裁者) 身份曾引发热议,当时他以 PEP 572 改进提案的争吵事件为例&#…...
![](https://images2018.cnblogs.com/blog/443934/201803/443934-20180305163037306-1044033401.png)
群晖 搭建两个wordpress/seo网络推广外包公司
Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知)、After Returning Advice(后置通知)、Interception Around Advice(周围通知)、Throws Advice(异常通知)和 I…...
![](https://img-blog.csdnimg.cn/img_convert/ac569af61dd2a4b14f50884c4a376f42.png)
网站建设收费标准教程/搭建网站需要哪些步骤
如何卸载linux的jdk_网站服务器运行维护卸载linux的jdk的方法:首先使用命令“#rpm -qa|grep gcj”查看自带的jdk;然后通过命令“#rpm -e –nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115”卸载即可。linux怎么查看属于哪个组?linux系统中有…...