网站被墙301怎么做专业企业网站建设公司价格
2026/1/3 2:33:25 网站建设 项目流程
网站被墙301怎么做,专业企业网站建设公司价格,在线制作图片模板,酒泉网站建设有限公司1.微服务 集群: cluster 同一种软件服务的多个服务节点共同为系统提供服务过程称之为该软件服务集群 分布式: distribute 不同软件集群共同为一个系统提供服务 这个系统称之为分布式系统 1.1 定义 官方定义#xff1a;微服务是一种架构 基于原来单个应用开发出一系列微小…1.微服务集群: cluster 同一种软件服务的多个服务节点共同为系统提供服务过程称之为该软件服务集群分布式: distribute 不同软件集群共同为一个系统提供服务 这个系统称之为分布式系统1.1 定义官方定义微服务是一种架构基于原来单个应用开发出一系列微小服务每个服务运行在自己计算机进程里面每个服务基于项目中业务进行拆分拆分出来的每个服务独立部署这些服务都是基于分布式管理通俗定义微服务是一种架构这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现。这些独立的徽服务不需要都署在同一个虚拟机同一个系统和同一个应用服务器中。2. 为什么是微服务单体应用优点单一架构模式在项目初期很小的时候开发方便测试方便部署方便运行良好。缺点应用随着时间的推进加入的功能越来越多最终会变得巨大一个项目中很有可能数百万行的代码互相之间繁琐的jar包。久而久之,开发效率低,代码雄护困难还有一个如果想整体应用采用新的技术新的框架或者语言那是不可能的。任意模块的漏洞或者错误都会影响这个应用降低系统的可靠性微服务架构应用优点将服务拆分成多个单一职责的小的服务进行单独部署服务之间通过网络进行通信每个服务应该有自己单独的管理团队,高度自治服务各自有自己单独的职责服务之间松耦合避免因一个模块的问题导致服务崩溃缺点开发人员要处理分布式系统的复杂性多服务运维难度,随着服务的增加运维的压力也在增大服务治理 和 服务监控 关键架构的演变# 1.架构的演变过程 - [单一应用架构] [垂直应用架构] [分布式服务架构] [流动计算架构] | [微服务架构] [未知]3.微服务架构的解决方案国内阿里系springboot dubbo(spring springboot(兼容)) zookeeper 最早期spring cloud技术栈spr ing cloud netflix(公司) 最早期 16-17 维护 组件spring cloud spring自己封装微服务解决方家 自己组件 继续使用spring cloud alibaba阿里巴巴解决方案 自己组件 继续使用4.什么是spring cloud4.1 定义**官方定义**springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具例如配置管理、服务发现、断路器、智能路由、微代理、控制总线)**通俗定义**springc loud含有众多子项目的工具集tools collection 微服务工具集合springcloud是一个含概多个子项目的开发工具集,集合了众多的开源框架,他利用了Spring Boot开发的便利性实现了很多功能如服务注册,服务注册发现,负载均衡等.SpringcCloud在整合过程中主要是针对Netflix(耐非)开源组件的封装. springCloud的出现真正的简化了分布式架构的开发。NetFlix是美国的一个在线视频网站 ,微服务业的翘楚,他是公认的大规模生产级微服务的杰出实践者, NetFlix的开源组件已经在他大规模分布式微服务环境中经过多年的生产实战验证,因此Spring cloud中很多组件都是基于NetFlix4.2 微服务基于单体应用围绕业务进行服务拆分拆分出来每一个服务独立应用、独立运行、独立都署、运行在自己计算机进程中。基于分布式服务管理5.环境搭建5.1 版本命名springcloud是一个由众多独立子项目组成的大型综合项目原则每个子项目上有不同的发布节奏,都维护自己发布版本号。为了更好的管理springcloud的版本,通过一个资源清单BOw(Gi1l of Materials),为避免与子项目的发布号混猾所以没有采用版本号的方式而是通过命名的方式。这些名字是按字母顺序排列的。如伦敦地铁站的名称“天使是第一个版本“布里斯顿是第二个版本, “卡姆登是第三个版本)。当单个项目的点发布累积到一个临界量或者其中一个项目中有一个关键缺陷需要每个人都可以使用时发布序列将推出名称以” .SRX“结尾的“服务发布”其中×是一个数字。5.2 版本选择5.3 环境搭建在父项目中继承spring boot父项目parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.3.12.RELEASE/version /parent维护springcloud的依赖properties spring.cloud-versionHoxton.SR12/spring.cloud-version /properties !--版本维护 springcloud版本-- dependencyManagement dependencies dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-dependencies/artifactId version${spring.cloud-version}/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement6.服务注册中心6.1 定义服务注册中心就是在整个微服务架构单独抽取一个服务这个服务不完成项目中任何业务功能仅仅用来在微服务中记录微服务以及对整个系统微服务进行健康状态检查以及服务元数据信息存储服务注册中心作用可以对所有的微服务的信息进行存储如微服务的名称、IP、端口等可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用可以对所有的微服务进行心跳检测如发现某实例长时间无法访间就会从服务注册表移除该实例。6.2 常用的注册中心组件常用注册中心组件: eureka(netflix)、 zookeeper (java) 、consul (Go) 、nacos (java阿里巴巴)1. EurekaEureka是Netflix开发的服务发现框架本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中以实现Springcloud的服务注册和发现功能。Eureka包含两个组件Eureka Server和Eureka Client。开发 Eureka Server创建项目并引入eureka server依赖dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-server/artifactId /dependency编写配置文件指定eureka server端口、服务地址#eurrka server 默认端口号 server.port8761 #eurrka server服务中心注册地址暴露服务地址 eureka.client.service-url.defaultZonehttp://localhost:8761/eureka在入口类中加入注解EnableEurekaServerSpringBootApplication EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }Eureka Server 细节在项目启动成功之后默认在eureka server管理界面中出现UNKHOWN 一个未知应用注意:在微服务架构中服务名称代表服务唯一标识至关重要服务名称必须唯一使用时必须通过如下配置指定服务名称# 指定服务名称 建议大写 且不运行名称中带有下划线_ spring.application.nameEUREKASERVER在eureka server启动过程中报错:出错解释: eureka含有两个组件 eureka server , eureka client组件当项目中引入enrekaserver组件时,这个组件同时将eureka client引入到项目中,因此启动时即会将自己作为一个服务中心启动同时也会将自己作为服务客户端进行注册默认启动时立即注册注册时服务还没有准备完成因此会出现当前错误如何关闭erueka server 自己注册自己# 关闭eureka的立即注册功能 默认true启动就注册关闭后启动不会报错 eureka.client.fetch-registryfalse # 让当前应用仅为注册中心启动后不再把自己注册进去关闭自己注册自己 eureka.client.register-with-eurekafalseEureka client 开发开发 eureka client 就是日后基于业务拆分出来的一个个微服务创建新的springboot应用引入相关依赖dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency编写application.properties# 指定服务端口 server.port8989 # 服务名称 spring.application.nameEUREKACLIENT # 指定服务注册中心地址 eureka.client.service-url.defaulZonehttp://localhost:8761/eureka在入口类中加入注解EnableEurekaClientSpringBootApplication EnableEurekaClient //让当前微服务作为一个eureka serve客户端进行服务注册 public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class,args); } }Eureka 自我保护机制自我保护机制触发现象自我保护机制Self Perservation Mode默认情况下如果Eureka Server在一定时间内默认90秒没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时微服务与Eureka Server之间无法正常通信而微服务本身是正常运行的此时不应该移除这个微服务所以引入了自我保护机制。EurekaServer在运行期间会去统计心跳失败比例在15分钟之内是否低于85%如果低于85%Eureka Server会将这些实例保护起来让这些实例不会过期。这种设计的哲学原理就是可信其有不可信其无!。自我保护模式正是一种针对网络异常波动的安全保护措施使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。注意自我保护机制默认是开启的现象在自我保护模式下eureka服务器将停止逐出所有实例机制这样做是为了确保灾难性的网络事件不会清除enreka注册表数据并将其传播到下游的所有客户端触发自我保护机制什么时候讲客户端在服务注册中中清除1.心跳的次数高于预期阈值2自我保护被禁用eureka server关闭自我保护机制# 关闭自我保护机制 默认true开启 eureka.server.enable-self-preservationfalse #超过3000毫秒自动清除 默认60*1000 1分钟后清除 eureka.server.eviction-interval-timer-in-ms3000客户端# 默认接受心跳最大时间默认90s eureka.instance.lease-expiration-duration-in-seconds10 #指定客户端多久想eureka注册中心发送心跳检测频率默认30s eureka.instance.lease-renewal-interval-in-seconds5关闭自我保护机制官方不推荐关闭时同样发出警告Eureka 集群集群搭建完全集群创建3个springboot项目引入eureka server依赖配置文件application.propertiesnode1: server.port8761 http://localhost:8762/eureka,http://localhost:8763/eureka node2: server.port8761 http://localhost:8761/eureka,http://localhost:8763/eureka node3: server.port8763 http://localhost:8761/eureka,http://localhost:8762/eureka在每个项目入口类加入EnableEurekaClient注解2.consulconsul是一个可以提供服务发现健康检查多数据中心Key/Value存储等功能的分布式服务框架用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案使用起来也较为简单。consul用Golang实现因此具有天然可移植性(支持Linux、windows和Mac os x);安装包仅包含个可执行文件,方便部署。简介consul基于go语言进行开发服务注册中心轻量级服务注册中心作用管理微服务中所有服务注册、发现 管理服务元数据信息存储服务名 地址列表)︰心跳健康检查consul 服务注册中心启动服务注册中心consul agent -dev访问consul管理界面http端口默认8500浏览器:localhost: 8500管理界面基本介绍dc1数据中心名称 datacenter 默认为: dc1 指定数据中心启动 consul agent -dev -datacenteraaservices当前consul服务中注册服务列表 默认client server同时启动自己注册自己会出现一个consul服务nodes用来查看consul的集群节点consul 客户端开发创建独立的springboot应用引入依赖!--consul依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-consul-discovery/artifactId /dependency编写application.propertiesserver.port8082 spring.application.nameCONSULCLIENT # consul server 服务注册地址 spring.cloud.consul.hostlocalhost spring.cloud.consul.port8500 # 指定当前服务注册名 默认${spring.application.name} spring.cloud.consul.discovery.service-name${spring.application.name} # 关闭健康检查 不建议关闭 #spring.cloud.consul.discovery.register-health-checkfalse在入口类中加入注解EnableDiscoveryClientSpringBootApplication EnableDiscoveryClient //作用:通用服务注册客户端注解代表consul client zk client nacos client public class ConsulClientApplication { public static void main(String[] args) { SpringApplication.run(ConsulClientApplication.class, args); } }直接启动consul elient出现如下问题原因consul server检测所有客户端心跳,但是发送心跳时client必须给予响应才能该服务才能正常使用在现有客户端中我们并没有引入健康检查依赖所以导致健康检查始终不同通过导致服务不能使用!--开启consul健康检查依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency7.微服务间通信基于RestTemplate的服务调用1 解决微服务的服务间通信问题HTTP Rest方式使用http协议进行数据传输JSONspring cloud 使用http协议传输数据RPC方式远程过程调用二进制OSI物理层 数据链路层 网络层 传输层(RPC) 会话层 表示层 应用层(Http)2 如何在java代码中发起http方式请求spring框架提供HttpClient对象 RestTemplate 发起一个http请求3 实现服务间通信案例开发两个测试服务 用户服务users 订单服务orders用户服务 订单服务 都是两个独立springboot应用两个服务都引入consul client依赖和健康检查依赖!--开启consul健康检查依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency !--consul client-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-consul-discovery/artifactId /dependency配置两个服务application.properties# 各自端口号与项目名 # consul server spring.cloud.consul.hostlocalhost spring.cloud.consul.port8500在入口类中加入注解EnableDiscoveryClient案例RestController public class OrderController { private static final Logger log LoggerFactory.getLogger(OrderController.class); GetMapping(order) public String demo(){ log.info(order demo ...); return order demo ok!; } }RestController public class UserController { private static final Logger log LoggerFactory.getLogger(UserController.class); GetMapping(user) public String invoke(){ log.info(demo user...); // 调用订单服务 RestTemplate template new RestTemplate(); String orderResult template.getForObject(http://localhost:9999/order, String.class); log.info(调用订单服务成功,orderResult); return 调用order服务成功结果为 orderResult; } }4.使用RestTemplate对象实现服务间通信存在的问题​ 现有RestTemplate在进行服务间通信时调用服务的路径主机和服务端口直接写死在url中无法实现服务集群时请求负载均衡调用服务的请求路径写死在代码中,日后提供服务服务路径发生变化时不利于后续维护工作解决RestTemplate负载均衡问题自定义负载均衡策略问题无法实现服务健康检查负载均衡策略过于单一随机)使用springcloud提供的组件 ribbon 解决负载均衡调用基于 Ribbon 的服务调用spring cloud - netflix - ribbon 作用负载均衡客户端组件就是用来实现请求调用时负载均衡1.Ribbon负载均衡原理2.使用RibbonRestTemplate实现请求负载均衡使用用户调用订单服务用户服务中引入ribbon依赖注意consul client依赖中已经存在ribbon相关依赖无需项目中直接使用Ribbon组件根据服务id实现请求负裁均衡Discoveryclient 服务发现客户端对象、根据服务id去服务注册中心获取对应服务服务列表到本地中缺点没有负载均衡需要自己实现负载均衡RestController public class UserController { Autowired //服务与注册发现客户端对象 private DiscoveryClient discoveryClient; private static final Logger log LoggerFactory.getLogger(UserController.class); GetMapping(user) public String invoke(){ log.info(demo user...); // 使用ribbon组件RestTemplate实现负载均衡调用 1.DiscoveryClient 2.LoadBalanceClient 3.LoadBalanceClient ListServiceInstance serviceInstances discoveryClient.getInstances(ORDERS); serviceInstances.forEach(serviceInstance - { log.info(服务主机{} 服务端口{} 服务地址{},serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getUri()); }); String ordersResult new RestTemplate().getForObject(serviceInstances.get(0).getUri()/order, String.class); return ok ordersResult; } }LoadBalanceClient 负载均衡客户端对象 根据服务id去服务注册中心获取对应服务列表根据默认负载均衡策略选择列表中一台机器进行返回缺点使用时需要每次先根据服务id获取一个负载均衡机器之后再通过restTemplate调用服务RestController public class UserController { Autowired private LoadBalancerClient loadBalancerClient; private static final Logger log LoggerFactory.getLogger(UserController.class); GetMapping(user) public String invoke(){ log.info(demo user...); ServiceInstance serviceInstance loadBalancerClient.choose(ORDERS); //默认轮询 log.info(服务主机{} 服务端口{} 服务地址{},serviceInstance.getHost(),serviceInstance.getPort(),serviceInstance.getUri()); String ordersResult new RestTemplate().getForObject(serviceInstance.getUri()/order, String.class); return ok ordersResult; } }LoadBalance RestTemplate 负裁均衡客户端注解修饰范围用在方法上 作用:让当前方法、当前对象具有ribbon负载均衡特性Configuration public class BeanConfig { Bean LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }RestController public class UserController { Autowired private RestTemplate restTemplate; private static final Logger log LoggerFactory.getLogger(UserController.class); GetMapping(user) public String invoke(){ log.info(demo user...); String ordersResult restTemplate.getForObject(http://ORDERS/order, String.class); return ok ordersResult; } }使用RestTemplate Ribbon这种完成服务间通信路径写死在代码中不利于维护restTemplate.getForObject(http://ORDERS/order, String.class);3.ribbon组件细节Ribbon组件实现负载均衡原理原理根据调用服务的服务id去服务注册中心获取对应服务id的服务列表,并将服务列表拉取本地进行缓存然后在本地通过默认的轮询的负载均衡策略在现有列表中选择一个可用节点提供服务注意客户端负裁均衡Ribbon组件支持那些负载均衡策略源码分析查看loadBalancerClient.choose(ORDERS)源码得知ServiceInstanceChooser是LoadBalancerClient的父接口ServiceInstanceChooser的choose方法默认实现RibbonLoadBalancerClient在RibbonLoadBalancerClient有一个choose方法带有两个参数 这里面进行负载均衡实现查看getServer方法实现总结通过源码得知IRule是底层负载均衡父接口Ribbon负载均衡策略支持哪些?# 1.Ribbon负载均衡算法 - RoundRobinRule 轮询策略 按顺序循环选择server - RandomRule 随机策略 随机选择 server - AvailabilityFi1teringRule 可用过滤策略 会先过滤由于多次访间故障而处于断路器跳闸状态的服务还有并发的连接数量超过阈值的服务然后对剩余的服务列表按照轮询策略进行访问 - weightedResponseTimeRule 响应时间加权策略 根据平均响应的时间计算所有服务的权重响应时间越快服务权重越大被选中的概率越高刚启动时如果统计信息不足则使用RoundRobinRule策略等统计信息足够会切换到 - RetryRule 重试策略 先按照RoundRobinRule的策略获取服务如果获取失败则在制定时间内进行重试获取可用的服务。 - BestAviableRule 最低并发策略 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务然后选择一个并发量最小的服务设置服务间调用负载均衡策略服务id.ribbon.NFLoadBalancerRuleClassNamecom.netflix.loadbalancer.RandomRuleRibbon组件现在状态停止维护ribbon-core、ribbon-loadbalance依然在大规模生产实践中部署、意味着日后如果实现服务间通信负载均衡依然使用ribbon组件总结8.OpenFeign组件的使用OpenFeign组件​ Feign是一个声明式的伪Http客户端它使得写Http客户端变得更简单。使用Feign只需要创建一个接口并注解。它具有可插拔的注解特性(可以使用springmvc的注解)可使用Feign注解和AX-RS注解。Feign支持可插拔的编码器和解码器。Feign默认集成了Ribbon默认实现了负载均衡的效果并且springcloud为feign添加了springmvc注解的支持。- 简介Rest client: 0penFeign与RestTemplate作用一致都是一个http客户端 - RestTemplatespring框架封装Httpclient对象 - openFeign:伪Httpclient客户端对象 他可以使服务间通信变得更加简单 Feign默认集成了Ribbon 实现请求负载均衡 简单1.使用写一个接口加一个注解 2.调用服务代码更加简单自动完成数据传递过程中对象转换 - 为什么使用openFeign a.RestTemplate 使用问题: 1.路径写死 2.不能自动转换响应结果为对应对象 3.必须集成ribbon实现负载均衡 b. openFeign组件可以解决RestTemplate实现服务间通信所有问题使用openfeign建立两个独立的springboot应用并注册到服务中心引入服务注册中心依赖!--开启consul健康检查依赖-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency !--consul client-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-consul-discovery/artifactId /dependency修改配置文件server.port8787 spring.application.nameCATEGORY #server.port8788 #spring.application.namePRODUCT # 注册到consul server spring.cloud.consul.hostlocalhost spring.cloud.consul.port8500加入入口注解SpringBootApplication EnableDiscoveryClient使用openfeign进行调用在调用服务方引入openFeign依赖!--引入OpenFeign-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-openfeign/artifactId /dependency在服务调用方入口类加注解开启Feign调用支持SpringBootApplication EnableDiscoveryClient EnableFeignClients // 开启openFeign客户端调用 public class CategoryApplication { }在服务调用方建立接口类其中方法与被调用方controller方法返回值、路径一致FeignClient(PRODUCT) // value:用来书写调用服务的服务id public interface ProductClient { GetMapping(/product) public String product(); } // 被调用方controller方法 RestController public class ProductController { private static final Logger log LoggerFactory.getLogger(ProductController.class); Value(${server.port}) private int port; GetMapping(/product) public String product(){ log.info(product demo...); return product ok! 服务端口号是 port; } }在服务调用方使用该接口完成调用RestController public class CategoryController { private static final Logger log LoggerFactory.getLogger(CategoryController.class); Autowired private ProductClient productClient; GetMapping(/category) public String category(){ log.info(category service...); String product productClient.product(); log.info(结果 {}, product); return category ok! product; } }服务通信之参数传递和响应处理微服务架构中服务间通信手段http协议: springcloud两种方式: 1.RestTeamplate Ribbon 2. openFeign推荐服务间通信参数传递和响应处理参数传递: 1.传递零散类型参数 ⒉.传递对象类型 3.数组或集合类型参数参数传递零散类型参数传递queryString方式传递参数?namexiaochen注意在openfiegn接口中声明必须给参数加注解RequestParam路径传递参数 url/xiaochen/23注意在openfiegn接口中声明必须给参数加注解PathValue对象类型参数传递application/json 方式推荐注意使用json方式在openfeign接口声明中必须给参数加入注解RequestBody注解数组参数传递注意在openFeign传递数组类型参数时必须在声明时使用RequestParam注解标识集合类型的参数接收服务提供者 商品服务定义openfeign实现服务间通信响应处理使用openFeign调用服务并返回对象// 声明调用根据id查询商品信息接口 GetMapping(/product/{id}) Product product(PathVariable(id) Integer id);使用openFeign调用服务返回集合List Map集合// 声明调用商品服务根据类别id查询一组商品信息 GetMapping(/products) ListProduct findByCategoryId(RequestParam(categoryId) Integer categoryId);openFegin细节openFeign默认超时处理默认的调用超时使用openFeign组件在进行服务间通信时要求被调用服务必须在1s内给予响应,一旦服务执行业务逻辑时间超过1s , openFeigm组件将直接报错: Read timed out execut ing GET http:/ /PRODUCT/product修改openFeign超时时间# 指定服务修改基个服务调用超时时间 feign.client.config.PRODUCTS.connectTimeout5000 #配置指定服务连接超时 feign.client.config.PRODUCTS.readTimeout5000 #配置指定服务等待超时 #PRODUCTS为调用服务的服务id #修改openfeign默认调用所有服务超时间 feign.client.config.default.connectTimeout5000 #配置所有服务连接超时 feign.client.config.default.readTimeout5000 #配置所有服务等待超时openFeign日志调用openFeign 伪HttpClient客户端对象用来帮助我们完成服务间通信 底层用http协议 完成服务间调用**日志**OpenFeign为了更好方便在开发过程中调试openFeigm数据传递和响应处理,openFeign在设计时添加了日志功能默认openFeign白志功能需鉴手动开启的日志使用# 1.展示openfeign日志 - logging.level.com.baizhi.feignclientdebug # 2.feign每一个客户端提供一个日志对象 HOHE 不记录任何日志 BASIC 仅仅记录请求方法,ur1响应状态代码及执行时间 HEADERS 记录Basic级别的基础上记录请求和响应的header FULL记录请求和响应的headerbody和元数据展示全部http协议状态 - feign.client.config.PRODUCT.loggerLevel FULL9.Hystrix组件的使用Hystrix组件​ 在分布式环境中许多服务依赖项不可避免地会失败。Hystrix是一个库它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障以及提供后备选项来实现这一点所有这些都可以提高系统的整体弹性。​ 通俗定义Hystrix是一个用于处理分布式系统的延迟和容错的开源库在分布式系统中许多依赖不可避免的会调用失败超时、异常等Hystrix能够保证在一个依赖出问题的情况下不会导致整体服务失败避免级联故障(服务雪崩现象)提高分布式系统的弹性。Hystrix 豪猪 起源: netFlix springcloud netflix hystrix作用用来防止微服务系统中服务雪崩现象﹑实现服务熔断 熔断是防止雪崩手段1. 服务雪崩- 在一个时刻微服务系统中所有微服务均不可用的这种现象称之为服务雪崩现象 # 1.服务雪崩 - **在微服务之间进行服务调用是由于某一个服务故障导致级联服务故障的现象称为雪崩效应。雪崩效应描述的是提供方不可用导致消费方不可用并将不可用逐渐放大的过程** - 根本原因在调用链路中链路某一服务因为执行业务时间过长,或者是大规模出现异常导致自身服务不可用并把这种不可用放大情况 # 2.图解雪崩效应 - 如存在如下链路调用- 而此时Service A的流量波动很大流量经常会突然性增加!那么在这种情况下就算service A能扛得往请求Sservice B和Service c未必能扛得住这突发的请求。此时如果Service c因为抗不住请求变得不可用。那么Service B的请求也会阻塞慢慢耗尽service B的线程资源Service B就会变得不可用。紧接着service A也会不可用这一过程如下图所示2.服务熔断作用用来在为服务系统中防止服务雪崩现象的出现熔断机制所有的微服务中必须引入Hystrix组件一旦引入hystrix这个组件就具有了服务熔断功能# 服务熔断 - 熔断器本身是一种开关装置当某个服务单元发生故障之后通过断踏器(hystrix)的故障监控某个异常条件被触发直接熔断整个服务。向调用方法返回一个符合预期的、可处理的备选响应(Fa11Back) ,而不是长时间的等待或者抛出调用方法无法处理的异常就保证了服务调用方的线程不会破长时间占用避免故障在分布式系统中蔓延乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解袂服务雪崩的重要手段 # 服务熔断示意图3.服务降级# 服务降级 - 定义服务压力剧增的时侯根据当前的业务情祝及流量对一些服务和页面有策略的降级以此缓解服务器的压力以保证核心任务的进行。同时保证部分甚至大部分任务客户能得到正确的响应。也就是当前的请求处理不了了或者出错了给一个默认的返回。 - 通俗定义当网站|服务流量突然增加时,为了保证系统核心服务正常运行,有策略关闭系统中边缘服务以保证核心服务正常运行 - 服务降级:关闭微服务系统中某些边缘服务保证系统核心服务正常运行 - 12 淘宝 京东 - 删除订单 --- 关闭订单 确认收货 ---- 服务繁忙,!! # 服务降级图示4.降级和熔断总结# 1.共同点 - 目的很一致都是从可用性可靠性着想为防止系统的整体缓慢甚至崩溃采用的技术手段; - 最终表现类似对于两者来说最终让用户体验到的是某些功能暂时不可达或不可用; - 粒度一般都是服务级别当然业界也有不少更细粒度的做法比如做到数据持久层允许查询不允许增珊改)﹔ - 自治性要求很高熔断模式一般都是服务基于策略的自动触发降级虽说可人工干预但在微服务架构下完全靠人显然不可能开关预置、配置中心都是必要手段: sentinel # 2.异同点 - 触发原因不太一样服务熔断一般是某个服务(下游服务故障引起而服务降级一般是从整体负荷考虑; - 管理目标的层次不太一样熔断其实是一个框架级的处理每个微服务都需要无层级之分而降级一般需要对业务有层级之分比如降级一般是从最外围服务边缘服务开始) # 3.总结 - 熔断必会触发降级,所以熔断也是降级一种,区别在于熔断是对调用链路的保护,而降级是对系统过载的一种保护处理5.服务熔断的实现# 服务熔断的实现思路 - 引入hystrix依赖,并开启熔断器(断路器) - 模拟降级方法 - 进行调用测试项目中引入hystrix依赖!--引入Hystrix-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-hystrix/artifactId /dependency开启断路器开启熔断功能在入口类加入注解EnableCircuitBreakerSpringBootApplication EnableDiscoveryClient EnableCircuitBreaker // 开启hystrix服务熔断 public class HystrixApplication { public static void main(String[] args) { SpringApplication.run(HystrixApplication.class,args); } }在控制器方法中加入备选处理HystrixCommand(fallbackMethod demoFallBack)GetMapping(/demo/{id}) HystrixCommand(fallbackMethod demoFallBack) //熔断之后处理 fallbackMethod 书写快速失败方法名 public String demo(PathVariable(id) Integer id){ System.out.println(demo ok!!!); if (id 0) { throw new RuntimeException(无效id); } return demo ok !; } public String demoFallBack(Integer id){ return 当前活动过于火爆服务已经被熔断了; } HystrixCommand(fallbackMethod demoFallBack) //自定义备选处理 HystrixCommand(defaultFallback 默认处理方法名) //默认处理断路器打开条件# 打开关闭条件 - 1.当满足一定的阀值的时候默认10秒内超过20个请求次数) - 2.当失败率达到一定的时候默认10秒内超过50%的请求失败) - 3.到达以上阀值断路器将会开启 - 4.当开启的时候所有请求都不会进行转发 - 5.一段时间之后(默认是5秒)这个时候断路器是半开状态会让其中一个请求进行转发。如果成功断路器会关闭若失败继续开启。重复4和 # 面试重点问题断路器流程 - **整个流程** - 当Hystrix监控到对该服务接口调用触发1 2两个阈值时,会在系统中自动触发熔断器,在熔断器打开期间内,任何到该接口请求均不可用,同时在断路器打开ss后断路器会处于半开状态此时断路器允许放行一个请求到该服务接口如果该请求执行成功,断路器彻底关闭,如果该请求执行失败断路器重新打开。6.openfeign调用服务过程集成Hystrix实现默认备选处理引入Hystrix依赖注意openfeign组件底层自动依赖Hystrix依赖项目中无须显示引入开启openfeign对Hystrix支持#开启openfeign在调用服务过程中开启hystrix支持默认:就是没有开启 feign.hystrix.enabledtrue开发openfeign服务调用失败默认处理的实现类在openFeign客户端接口中的Feignclients(value服务id ,fallBack默认处理.class)当调用服务不可用时,直接回执行自定义默认处理7.Hystrix Dashboard仪表盘:用来显示状态信息作用:监控每一个HystrixCommond注解创建一组度量,构建一组信息,然后通过图形化方式展示当前方法RHystrixComnond的状态信息构建Hystrix DashBoard 仅仅是一个仪表盘应用创建springboot应用引入hystrix dashboard依赖!--hystrix dashboard-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-hystrix-dashboard/artifactId /dependency在入口类加入注解开启仪表盘应用SpringBootApplication //EnableDiscoveryClient //注意:默认只要引入discovery client依赖该注解无须显示声明自动注册 EnableHystrixDashboard //注意:这个注解作用用来开启当前应用为仪表盘应用 public class HystrixDashBoardApplication { public static void main(String[] args) { SpringApplication.run(HystrixDashBoardApplication.class, args); } }访问仪表盘web页面http://localhost:当前应用的端口号(9909)/hystrix# 1.解决第一个问题直接引入如下代码加入要监控的微服务里面 Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet new HystrixMetricsStreamServlet(); ServletRegistrationBean regBean new ServletRegistrationBean(streamServlet); regBean.setLoadOnStartup(1); List mappingList new ArrayList(); mappingList.add(/hystrix.stream); regBean.setUrlMappings(mappingList); regBean.setName(HystrixMetricsStreamServlet); return regBean; }# Unable to connect to Command Metric Stream 错误 hystrix.dashboard.proxy-stream-allow-listlocalhost management.endpoints.web.exposure.includehystrix.streamHystrix Hystrix DashBoard目前状态a . Hystrix不再处于积极开发中目前处于维护模式.b. Hystrix DashBoard已经被废弃​ The hystrix-dashboard component of this project has been deprecated and moved to​ 替换产品: Hetflix- Skunkworks/hystrix-dashboard .日后如何解决服务雪崩a . Hystrix版本1.5.18足够稳定可以满足Netflix对我们现有应用程序的需求b. resilience4j 替换Hystrix 实时自适应系统熔断 Springcloud resilience4jc .sentinel 被称为流量卫兵、流量控制、降低策略(根据异常)推荐 sentinel sentinel dashboard总结10.Gateway网关组件什么是服务网关# 1.说明 - 网关统一服务入口可方便实现对平台众多服务接口进行管控对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或者计费等等。 - 网关 路由转发 过滤器 路由转发:接收一切外界请求转发到后端的微服务上去; 在服务网关中可以完成一系列的横切功能例如权限校验、限流以及监控等这些都可以通过过滤器完成 # 2.为什么需要网关 - 1.网关可以实现服务的统一管理 - 2.网关可以解决微服务中通用代码的冗余问题(如权限控制,流量监控,限流等) # 3.网管组件在微服务中架构网关作用网关统—所有微服务入口网关可以实现请求路由转发(router dispatcher)以及请求过程负载均衡访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制甚至基于API调用的计量或者计费等等服务网关组件主讲Gatewaynetflix zuul 1. x(效率) zuul 2.x(近两年)spring cloud gateway组件(Flux异步非阻塞Io模型) 推荐# gateway(spring) - 这个项目提供了一个在springmvc之上构建API网关的库。springcloudgateway旨在提供一种简单而有效的方法来路由到api并为api提供横切关注点比如:安全性、监控/度量和弹性。 # 特性 - 动态路由 - 请求过滤1.网关的使用创建一个springboot应用引入相关依赖注意去掉项目中的spring-boot-starter-web因为存在冲突!--引入gateway网管组件-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId exclusions exclusion groupId*/groupId artifactId*/artifactId /exclusion /exclusions /dependency编写配置配置文件方式server: port: 7979 spring: application: name: GATEWAY cloud: consul: host: localhost port: 8500 gateway: routes: - id: category_router #路由对象唯一标识 uri: http://localhost:8787 #用来类别服务地址 http//localhost:8787/category predicates: #断言 用来配置路由规则 - Path/category - id: product_router #路由对象唯一标识 #uri: http://localhost:8788 #用来类别服务地址 http//localhost:8788/list uri: lb://PRODUCT #实现负载均衡 predicates: #断言 用来配置路由规则 - Path/productjava代码配置了解Bean public RouteLocator routeLocator(RouteLocatorBuilder routeLocatorBuilder) { return routeLocatorBuilder.routes() // 类别路由 .route(category_router, r - r.path(/category).uri(http://localhost:8787)) // 商品路由 .route(product_router, r - r.path(/product).uri(http://localhost:8788)) .build(); }2.网关路由解析规则访问网关路径path规则可以写一个或者多个支持通配符3.网关在路由转发时如何实现在均衡现有网关配置存在的问题现有网关配置方式在uri的属性中路径直接写死为服务的某一个节点这样没有办法实现请求的负载均衡如何配置网关转发实现负载均衡 Ribbon组件负裁均衡客户端组件gateway中集成了Ribbon4.网关的断言和过滤网关gateway 断言predicate 过滤(后置filter)断言当请求到达网关时网关前置处理满足断言放心请求不满足断言立即返回过滤当请求满足断言的所有条件之后会向后端服务转发在向后端服务转发之前会经过一些过滤断言predicate使用https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories- Path/product路径断言- After2017-01-20T17:42:47.789-07:00[America/Denver]代表该路由规则必须在指定时间之后才能生效- Before2017-01-20T17:42:47.789-07:00[America/Denver]代表该路由规则必须在指定时间之前有效过了时间失效- Between2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]代表路由规则在某个时间段有效- Cookiename, xiaosiao- Cookiechocolate, ch.p此路由匹配具有名称chocolate与ch.p正则表达式匹配的cookie 的请求- HeaderX-Request-Id, \d请求必须含有指定请求头才行- MethodGET,POST限定指定请求方式过滤gateway filterhttps://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories内置filterAddRequestHeader Filter- AddRequestHeaderX-Request-red, blue 用来给路由对象的所有转发请求加入指定请求头信息AddRequestParameter Filter- AddRequestParameterred, blue 用来给路由对象的所有转发请求加入指定请求参数AddResponseHeader Filter- AddResponseHeaderX-Response-Red, Blue 用来给路由对象的所有转发请求的响应加入指定头信息PrefixPath Filter- PrefixPath/mypath 用来给路由对象的所有转发请求的ur1加入指定前缀信息 如:浏览器访问网关地址/list 前缀路径/mypath 转发到后端服务地址为: uri前缀路径地址栏路径 uri/mypath/listStripPrefix Filter- StripPrefix2 用来给路由对象的所有转发请求的ur1去掉指定2个前缀 如:浏览器访问网关地址:/produet/list stripPefix1/list 后端接口:list自定义全局filter 所有请求都整经过全局filter之后再转发到后端服务Configuration public class filterCustomerGlobalFilter implements GlobalFilter, Ordered { //类似javaweb doFilter // exchange :交换request response 封装了request response Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { //httpRequest对象 ServerHttpRequest request exchange.getRequest(); // HttpResponse对象 ServerHttpResponse response exchange.getResponse(); System.out.println(经过全局filter处理。。。。。); MonoVoid filter chain.filter(exchange); System.out.println(响应回来的Filter处理.....); return filter; } // order 排序 int数字:用来指定filter执行顺序﹒默认顺序按照自然数字进行排序 -1表示在所有filter执行之前执行 Override public int getOrder() { return -1; } }通过网关提供web路径查看路由详细规则http: / / localhost : 7979/ actuator /gateway/routes查看网关路由规则详细路径必须在网关配置文件中暴露当前路径management: endpoints: web: exposure: include: *11.config组件的使用config定义​ config(配置)又称为统一配置中心顾名思义就是将配置统一管理配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致日后再修改配置只需要统一修改全部同步不需要一个一个服务手动维护。统一配置中心组件流程图作用用来实现微服务系统中服务配置统一管理组件组件统一配置中心服务端(集中管理配置文件)、统一配置中心客户端clientconfig组件使用1.config serve选择—个远端git仓库使用GitHub或者gitee创建新仓库获取仓库地址https://gitee.com/zi_long006/configs.git搭建config server统一配置中心服务创建独立spring boot应用引入config server依赖--引入config server依赖-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-config-server/artifactId /dependency配置application. properties 远程仓库地址# 远程仓库地址 spring.cloud.config.server.git.urihttps://gitee.com/zi_long006/configs.git spring.cloud.config.server.git.default-labelmaster # spring.cloud.config.server.git.username 私有仓库访问用户名与密码 # spring.cloud.config.server.git.password开启统—配置中心在入口类加入注解EnableConfigServerSpringBootApplication EnableDiscoveryClient EnableConfigServer // 表示为统一配置中心服务 public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }2.config client创建springboot应用将自身配置交给远端git仓库管理引入config client依赖--引入config client-- dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-config/artifactId /dependency配置文件编写 告诉config server地址#告诉当前configclient统一配置中心在注册中心服务id spring.cloud.config.discovery.service-idCONFIGSERVE #开启当前configclient根据服务id去注册中心获取 spring.cloud.config.discovery.enabletrue # 配置注册中心 spring.cloud.consul.hostlocalhost spring.cloud.consul.port8500 # 获取那个配置文件 1.确定分支 2.确定文件名 3.确定环境 spring.cloud.config.lablemaster spring.cloud.config.nameconfigclient spring.cloud.config.profileprod启动configclient3.手动配置刷新当远端qit仓库中配置发生变化时不需要重启微服务就可以直接读取远端修改之后配置信息这种就叫手动配置刷新在每一个需要获取配置文件参数的controller中添加注解RefreshScope修改完远端git仓库配置文件之后,向每一个微服务发送一个post方式请求必须是 post方式 cmd curl -X POST http://localhost:8990/actuator/refresh必须在微服务配置文件中暴露远端配置刷新端点(endpoint )management.endpoints.web.exposure.include*12.BUS组件简介​ springcloudbus使用轻量级消息代理将分布式系统的节点连接起来。然后可以使用它来广播状态更改例如配置更改或其他管理指令。AMQP和Kafka broker(中间件)实现包含在项目中。或者在类路径上找到的任何springcloudstream绑定器都可以作为传输使用。通俗定义bus称之为springcloud中消息总线主要用来在微服务系统中实现远端配置更新时通过广播形式通知所有客户端刷新配置信息避免手动重启服务的工作作用利用bus 广播特性当某一个状态(配置文件)发生改变时通知到bus中所有服务节点更新当前状态(更新自身配置)Bus实现原理RubbitMQ的搭建https://www.bilibili.com/video/BV1S5411c7hM?p50spm_id_frompageDriver实现自动刷新配置准备启动MQ服务MQ服务主机: 192.168.80.128MQ: 15672端口(Web) 5672端口(JAVA)虚拟主机/默认用户: guest 密码guest配置统—配置中心通过Bus连接到MQ服务统─配置中心服务中引入Bus依赖dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-bus-amqp/artifactId /dependency配置config server文件spring.rabbitmq.host192.168.80.128 spring.rabbitmq.port5679 spring.rabbitmq.usernameguest spring.rabbitmq.passwordguest spring.rabbitmq.virtual-host/重启config server配置微服务config client通过bus连接MQ服务在所有微服务项目中引入Bus依赖在所有微服务项目中配置MQ连接配置主要这段配置要放入远端仓库管理spring.rabbitmq.host192.168.80.128 spring.rabbitmq.port5679 spring.rabbitmq.usernameguest spring.rabbitmq.passwordguest spring.rabbitmq.virtual-host/重启所有微服务时出现,在引入bus依赖之后启动出现如下错误错误原因引入bus依赖启动立即根据配置文件bus配置连接mq服务器但是此时mq配置信息都在远端因此bus连接不到mq直接报错阻止了应用启动解决方案允许项目启动时bus组件立即连接mq这个失败因为获取远端配置之后可以再以远端配置初始化bus组件spring.cloud.config.fail-fasttrue #代表在启动时还没有拉取远端配置完成是的失败都是允许的通过向config server统—配置发送POST方式请求实现自动配置刷新注意/actuator/bus-refresh必须在config server中暴露management.endpoints.web.exposure.include*刷新所有服务POST http://localhost:8848(configserver地址)/actuator/bus-refresh刷新指定服务POST http://localhost:8848(configserver地址)/actuator/bus-refresh/服务id利用gitee、github webhooks自动刷新钩子 hooks根据仓库触发事件执行相应操作webhooks根据远程仓库触发对应事件发送一个web请求这个请求默认就是POST方式请求在远端仓库中配置webhooks添加webhooks添加webhooks借助内网穿透将内网地址转换为公网地址 natapp下载客户端cmd启动 natapp --authtokenXXXXXXXXX 穿透地址http://hgw3uy.natappfree.cc/actuator/bus-refresh配置webhooks首次配置完成之后config server 发送post方式出现400错误,需要在configServer中加入filter配置package com.wg.config.component; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import java.io.ByteArrayInputStream; import java.io.IOException; Component public class WebHooksFilter implements Filter { Override public void init(FilterConfig filterConfig) throws ServletException { } Override public void destroy() { } Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest (HttpServletRequest) servletRequest; String url new String(httpServletRequest.getRequestURI()); if(!url.endsWith(/bus-refresh)){ filterChain.doFilter(servletRequest,servletResponse); return; } RequestWrapper requestWrapper new RequestWrapper(httpServletRequest); filterChain.doFilter(requestWrapper, servletResponse); } private class RequestWrapper extends HttpServletRequestWrapper { public RequestWrapper(HttpServletRequest request) { super(request); } Override public ServletInputStream getInputStream() throws IOException { byte[] bytes new byte[0]; ByteArrayInputStream byteArrayInputStream new ByteArrayInputStream(bytes); ServletInputStream servletInputStream new ServletInputStream() { Override public int read() throws IOException { return byteArrayInputStream.read(); } Override public boolean isFinished() { return byteArrayInputStream.read() -1 ? true : false; } Override public boolean isReady() { return false; } Override public void setReadListener(ReadListener listener) { } }; return servletInputStream; } } }在入口类中加注解ServletComponentScan (basePackages com.zzl.filters)重新添加webhooks总结这两年IT行业面临经济周期波动与AI产业结构调整的双重压力确实有很多运维与网络工程师因企业缩编或技术迭代而暂时失业。很多人都在提运维网工失业后就只能去跑滴滴送外卖了但我想分享的是对于运维人员来说即便失业以后仍然有很多副业可以尝试。运维副业方向运维千万不要再错过这些副业机会第一个是知识付费类副业输出经验打造个人IP在线教育平台讲师操作路径在慕课网、极客时间等平台开设《CCNA实战》《Linux运维从入门到精通》等课程或与培训机构合作录制专题课。收益模式课程销售分成、企业内训。技术博客与公众号运营操作路径撰写网络协议解析、故障排查案例、设备评测等深度文章通过公众号广告、付费专栏及企业合作变现。收益关键每周更新2-3篇原创结合SEO优化与社群运营。第二个是技术类副业深耕专业领域变现企业网络设备配置与优化服务操作路径为中小型企业提供路由器、交换机、防火墙等设备的配置调试、性能优化及故障排查服务。可通过本地IT服务公司合作或自建线上接单平台获客。收益模式按项目收费或签订年度维护合同。远程IT基础设施代维操作路径通过承接服务器监控、日志分析、备份恢复等远程代维任务。适合熟悉Zabbix、ELK等技术栈的工程师。收益模式按工时计费或包月服务。网络安全顾问与渗透测试操作路径利用OWASP Top 10漏洞分析、Nmap/BurpSuite等工具为企业提供漏洞扫描、渗透测试及安全加固方案。需考取CISP等认证提升资质。收益模式单次渗透测试报告收费长期安全顾问年费。比如不久前跟我一起聊天的一个粉丝他自己之前是大四实习的时候做的运维发现运维7*24小时待命受不了就准备转网安学了差不多2个月然后开始挖漏洞光是补天的漏洞奖励也有个四五千他说自己每个月的房租和饭钱就够了。为什么我会推荐你网安是运维人员的绝佳副业转型方向?1.你的经验是巨大优势:你比任何人都懂系统、网络和架构。漏洞挖掘、内网渗透、应急响应这些核心安全能力本质上是“攻击视角下的运维”。你的运维背景不是从零开始而是降维打击。2.越老越吃香规避年龄危机:安全行业极度依赖经验。你的排查思路、风险意识和对复杂系统的理解能力会随着项目积累而愈发珍贵真正做到“姜还是老的辣”。3.职业选择极其灵活:你可以加入企业成为安全专家可以兼职“挖洞“获取丰厚奖金甚至可以成为自由顾问。这种多样性为你提供了前所未有的抗风险能力。4.市场需求爆发前景广阔:在国家级政策的推动下从一线城市到二三线地区安全人才缺口正在急剧扩大。现在布局正是抢占未来先机的黄金时刻。运维转行学习路线一第一阶段网络安全筑基1. 阶段目标你已经有运维经验了所以操作系统、网络协议这些你不是零基础。但要学安全得重新过一遍——只不过这次我们是带着“安全视角”去学。2. 学习内容**操作系统强化**你需要重点学习 Windows、Linux 操作系统安全配置对比运维工作中常规配置与安全配置的差异深化系统安全认知比如说日志审计配置为应急响应日志分析打基础。**网络协议深化**结合过往网络协议应用经验聚焦 TCP/IP 协议簇中的安全漏洞及防护机制如 ARP 欺骗、TCP 三次握手漏洞等为 SRC 漏扫中协议层漏洞识别铺垫。**Web 与数据库基础**补充 Web 架构、HTTP 协议及 MySQL、SQL Server 等数据库安全相关知识了解 Web 应用与数据库在网安中的作用。**编程语言入门**学习 Python 基础语法掌握简单脚本编写为后续 SRC 漏扫自动化脚本开发及应急响应工具使用打基础。**工具实战**集中训练抓包工具Wireshark、渗透测试工具Nmap、漏洞扫描工具Nessus 基础版的使用结合模拟场景练习工具应用掌握基础扫描逻辑为 SRC 漏扫工具进阶做准备。二第二阶段漏洞挖掘与 SRC 漏扫实战1. 阶段目标这阶段是真正开始“动手”了。信息收集、漏洞分析、工具联动一样不能少。熟练运用漏洞挖掘及 SRC 漏扫工具具备独立挖掘常见漏洞及 SRC 平台漏扫实战能力尝试通过 SRC 挖洞搞钱不管是低危漏洞还是高危漏洞先挖到一个。2. 学习内容信息收集实战结合运维中对网络拓扑、设备信息的了解强化基本信息收集、网络空间搜索引擎Shodan、ZoomEye、域名及端口信息收集技巧针对企业级网络场景开展信息收集练习为 SRC 漏扫目标筛选提供支撑。漏洞原理与分析深入学习 SQL 注入、CSRF、文件上传等常见漏洞的原理、危害及利用方法结合运维工作中遇到的类似问题进行关联分析明确 SRC 漏扫重点漏洞类型。工具进阶与 SRC 漏扫应用系统学习 SQLMap、BurpSuite、AWVS 等工具的高级功能开展工具联用实战训练专项学习 SRC 漏扫流程包括 SRC 平台规则解读如漏洞提交规范、奖励机制、漏扫目标范围界定、漏扫策略制定全量扫描 vs 定向扫描、漏扫结果验证与复现实战训练使用 AWVSBurpSuite 组合开展 SRC 平台目标漏扫练习 “扫描 - 验证 - 漏洞报告撰写 - 平台提交” 全流程。SRC 实战演练选择合适的 SRC 平台如补天、CNVD进行漏洞挖掘与漏扫实战积累实战经验尝试获取挖洞收益。恭喜你如果学到这里你基本可以下班搞搞副业创收了并且具备渗透测试工程师必备的「渗透技巧」、「溯源能力」让你在黑客盛行的年代别背锅工作实现升职加薪的同时也能开创副业创收如果你想要入坑黑客网络安全笔者给大家准备了一份全网最全的网络安全资料包需要保存下方图片微信扫码即可前往获取!因篇幅有限仅展示部分资料需要点击下方链接即可前往获取CSDN大礼包《黑客网络安全入门进阶学习资源包》免费分享三第三阶段渗透测试技能学习1. 阶段目标全面掌握渗透测试理论与实战技能能够独立完成渗透测试项目编写规范的渗透测试报告具备渗透测试工程师岗位能力为护网红蓝对抗及应急响应提供技术支撑。2. 学习内容渗透测试核心理论系统学习渗透测试流程、方法论及法律法规知识明确渗透测试边界与规范与红蓝对抗攻击边界要求一致。实战技能训练开展漏洞扫描、漏洞利用、电商系统渗透测试、内网渗透、权限提升Windows、Linux、代码审计等实战训练结合运维中熟悉的系统环境设计测试场景强化红蓝对抗攻击端技术能力。工具开发实践基于 Python 编程基础学习渗透测试工具开发技巧开发简单的自动化测试脚本可拓展用于 SRC 漏扫自动化及应急响应辅助工具。报告编写指导学习渗透测试报告的结构与编写规范完成多个不同场景的渗透测试报告撰写练习与 SRC 漏洞报告、应急响应报告撰写逻辑互通。四第四阶段企业级安全攻防含红蓝对抗、应急响应1. 阶段目标掌握企业级安全攻防、护网红蓝对抗及应急响应核心技能考取网安行业相关证书。2. 学习内容护网红蓝对抗专项红蓝对抗基础学习护网行动背景、红蓝对抗规则攻击范围、禁止行为、红蓝双方角色职责红队模拟攻击蓝队防御检测与应急处置红队实战技能强化内网渗透、横向移动、权限维持、免杀攻击等高级技巧模拟护网中常见攻击场景蓝队实战技能学习安全设备防火墙、IDS/IPS、WAF联动防御配置、安全监控平台SOC使用、攻击行为研判与溯源方法模拟护网演练参与团队式红蓝对抗演练完整体验 “攻击 - 检测 - 防御 - 处置” 全流程。应急响应专项应急响应流程学习应急响应 6 步流程准备 - 检测 - 遏制 - 根除 - 恢复 - 总结掌握各环节核心任务实战技能开展操作系统入侵响应如病毒木马清除、异常进程终止、数据泄露应急处置、漏洞应急修补等实战训练工具应用学习应急响应工具如 Autoruns、Process Monitor、病毒分析工具的使用提升处置效率案例复盘分析真实网络安全事件应急响应案例如勒索病毒事件总结处置经验。其他企业级攻防技能学习社工与钓鱼、CTF 夺旗赛解析等内容结合运维中企业安全防护需求深化理解。证书备考针对网安行业相关证书考试内容含红蓝对抗、应急响应考点进行专项复习参加模拟考试查漏补缺。运维转行网络攻防知识库分享网络安全这行不是会几个工具就能搞定的。你得有体系懂原理能实战。尤其是从运维转过来的别浪费你原来的经验——你比纯新人强多了。但也要沉得住气别学了两天Web安全就觉得自己是黑客了。内网、域渗透、代码审计、应急响应要学的还多着呢。如果你真的想转按这个路子一步步走没问题。如果你只是好奇我劝你再想想——这行要持续学习挺累的但也是真有意思。关于如何学习网络安全笔者也给大家整理好了全套网络安全知识库需要的可以扫码获取因篇幅有限仅展示部分资料需要点击下方链接即可前往获取CSDN大礼包《黑客网络安全入门进阶学习资源包》免费分享1、网络安全意识2、Linux操作系统3、WEB架构基础与HTTP协议4、Web渗透测试5、渗透测试案例分享6、渗透测试实战技巧7、攻防对战实战8、CTF之MISC实战讲解关于如何学习网络安全笔者也给大家整理好了全套网络安全知识库需要的可以扫码获取因篇幅有限仅展示部分资料需要点击下方链接即可前往获取CSDN大礼包《黑客网络安全入门进阶学习资源包》免费分享

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询