微服务保护(Sentinel)

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 前言
    • 雪崩问题
    • 解决雪崩问题
    • 服务保护技术对比
  • 一、Sentinel简介
  • 二、Sentinel安装
    • 2.1 本地安装
    • 2.2 Docker安装
  • 三、使用步骤
    • 3.1 引入Sentinel依赖
    • 3.2 yml配置
    • 3.3 启动服务报错记录
    • 3.4 解决方案
    • 3.5 启动访问该服务任意节点,出发Sentinel监控
  • 四、限流规则
    • 4.1 簇点链路
    • 4.2 流控模式
      • 4.2.1 直接
      • 4.2.2 关联
      • 4.2.3 链路
    • 4.3 流控效果
      • 4.3.1 快速失败
      • 4.3.2 warm up:预热模式
      • 4.3.3 排队等待
    • 4.4 热点参数限流
  • 五、隔离和降级
    • 5.1 Feign整合Sentinel
    • 5.2 线程隔离
    • 5.3 熔断和降级
      • 5.3.1 慢调用
      • 5.3.2 异常比例或异常数
  • 六、授权规则
  • 七、自定义异常

q

前言

雪崩问题

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。也就是级联失败

解决雪崩问题

  1. 超时处理 : 设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止地等待。
  2. 舱壁模式 : 限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。它是通过划分tomcat的资源,划分tomcat的线程,让每个业务最多使用n个线程,进而提高tomcat的容灾能力。但是这种模式会导致一定的资源浪费
  3. 熔断降级 :有断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。请求失败占比达到阈值后,这个时候会出现熔断,此后服务A向服务D不能发送请求,请求直接在服务A给拦截。
  4. 流量控制:限制业务访问的QPS,避免服务因为流量的突增而故障。这种是从预防层面来解决雪崩问题。Sentinel可以根据服务所能接收的访问频率,向服务发送请求,避免服务出现故障,就不会出现故障转移,也就避免了雪崩问题。也就是将大量的请求一点点的发送给服务,从而预防了雪崩问题。

服务保护技术对比

在这里插入图片描述因此综合考虑我们这里讲解和使用Sentinel

一、Sentinel简介

官网地址:https://sentinelguard.io/zh-cn/index.html
各种使用介绍文档:https://github.com/alibaba/Sentinel/wiki

  • Sentinel是阿里开源的一套服务保护框架,它主要通过对流量的控制、熔断降级等操作来保护服务的稳定性。它以流量为切入点,从多个维度帮助开发者保障微服务的稳定性,包括流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护和热点流量防护等。

  • 它的主要目标是帮助开发者保护和控制分布式系统中的服务,以防止出现服务雪崩、过载、延迟和其他潜在的故障。

  • 总的来说,Sentinel是一种功能强大的服务保护框架,可以帮助开发者提高微服务的稳定性和可靠性。
    在这里插入图片描述
    在这里插入图片描述

二、Sentinel安装

2.1 本地安装

可以前往Githubhttps://github.com/alibaba/Sentinel/releases,进入该页面
在这里插入图片描述选择需要的版本进行下载
在这里插入图片描述拷贝到非中文目录,运行即可

java -jar sentinel-dashboard-1.8.6.jar

在这里插入图片描述默认访问 http://localhost:8080/ 账号密码都为:sentinel

在这里插入图片描述
在这里插入图片描述如果修改Sentinel的默认端口,账户,密码....可以通过下列配置
在这里插入图片描述例如:

java -jar sentinel-dashboard-1.8.1.jar -Dserver.port=8858

2.2 Docker安装

如果时云服务器,记得开放端口
拉取镜像:

docker pull bladex/sentinel-dashboard

运行镜像:

docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard

访问dashboard 地址:http://localhost:8858 账号密码都为:sentinel

三、使用步骤

3.1 引入Sentinel依赖

    <!--引入sentinel--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

3.2 yml配置

spring:cloud:sentinel:transport:dashboard: localhost:8080   #根据自己的扣扣进行配置,未改变默认8080

3.3 启动服务报错记录

可能会产生如下错误
找不到该BeanSentinelFeignClientProperties

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'reactiveConfigureRulesCustomizer' defined in class path resource [com/alibaba/cloud/circuitbreaker/sentinel/feign/SentinelFeignClientAutoConfiguration$ReactiveSentinelCustomizerConfiguration.class]: Unsatisfied dependency expressed through method 'reactiveConfigureRulesCustomizer' parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.alibaba.cloud.circuitbreaker.sentinel.feign.SentinelFeignClientProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:541)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1352)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1195)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)at com.ProviderApplication.main(ProviderApplication.java:22)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.alibaba.cloud.circuitbreaker.sentinel.feign.SentinelFeignClientProperties' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1799)at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1355)at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)... 19 more

3.4 解决方案

在这里插入图片描述报错是因为没有找到SentinelFeignClientProperties , 因为该配置类会使SentinelFeignClientProperties注入spring容器,但是该类生效的条件是@ConditionalOnClass({ Feign.class, FeignClientFactoryBean.class })有feign的支持,所以引入如下依赖

加入Fegin的依赖后启动正常

    <!-- 加入fegin的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

3.5 启动访问该服务任意节点,出发Sentinel监控

在这里插入图片描述
此时发现服务被检测到,但实时监控为空白
查看Sentinel容器日志

docker logs -f sentinel

终端程序在运行中,并一直出现连接超时的错误级别日志

2023-09-25 07:56:56.107 ERROR 1 — [pool-2-thread-1] c.a.c.s.dashboard.metric.MetricFetcher : Failed to fetch metric from http://192.168.1.239:8719/metric?startTime=1695628477000&endTime=1695628483000&refetch=false> (ConnectionException: Connection timed out)

显然,本地可以访问sentinel,但是sentinel访问本地访问不通,导致的空白
这个192.168.1.239的ip是本地的ip,而Sentinel的服务是放在docker里,所以访问不了

解决方案如下:

  1. sentinel 必须跟微服务处在同一个局域网中,也就是同时存在于本地或服务器中。

我的项目在本地,Sentinel在服务器中,找了很多方法(改了很多配置)要不就是控制台能显示,但是controller的资源显示不出来,
望各位有好的办法,评论或私信我,感谢😃

这里我先通过本地进行启动,处于同一个局域网

在这里插入图片描述

正常显示,并且资源也显示出来了😁

在这里插入图片描述

在这里插入图片描述

四、限流规则

4.1 簇点链路

  • 项目内的调用链路,链路中被监控的每个接口就是一个 资源默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
  • 流控、熔断等都是针对簇点链路中的资源来设置的。

在这里插入图片描述

4.2 流控模式

4.2.1 直接

统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式。
在这里插入图片描述

4.2.2 关联

统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。(满足下面条件:两个有竞争关系的资源;一个优先级较高,一个优先级较低[限流])

场景:查询和修改操作会争抢数据库锁,产生竞争,优先更新业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流
在这里插入图片描述在那个进行设置呢,我们明白一点,那个资源限流在那个设置
当/consumer/update资源访问量,出发阈值时,就会对/consumer/{orderId}资源限流,避免影响更新业务
在这里插入图片描述

4.2.3 链路

统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流。(有查询订单和新增订单业务,两者都需要查询品牌。触发阈值时,针对从查询订单进入到查询品牌的请求设置限流)
都调用了service层的 consumerService.getBrand();查询品牌方法

    @GetMapping("query")public String queryOrder(){consumerService.getBrand();System.out.println("查询订单");return "查询成功";}@GetMapping("save")public String savebOrder(){consumerService.getBrand();System.out.println("新增订单");return "新增成功";}

默认controller资源被监控,service层资源没有被监控添加注解@SentinelResource

    @SentinelResource("brands")public String getBrand() {System.out.println("查询品牌");return "获取品牌";}

Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要配置yml,

spring:cloud:sentinel:             web-context-unify: false #关闭context整合

在这里插入图片描述 这两个brands都是一个资源,因此点击那个都可以

在这里插入图片描述

4.3 流控效果

4.3.1 快速失败

达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
在这里插入图片描述

4.3.2 warm up:预热模式

对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值,可以避免冷启动时高并发导致的服务宕机

在这里插入图片描述

4.3.3 排队等待

请求会进入队列,按照阈值允许的时间间隔一次执行请求,如果请求预期等待市场大于超时时间,直接拒绝

例如:Qps=5, 则1秒5个请求,那么200ms则处理一个请求,timeout=2000,意味着预期等待超过2000ms的请求会被拒绝,并抛出异常

在这里插入图片描述

4.4 热点参数限流

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

**热点参数限流对默认的SpringMVC资源无效。**添加@SentinelResource注解

    @GetMapping("{orderId}")@SentinelResource("hot")  //热点参数限流对默认的mvc资源无效,所以添加注解public Order queryOrder(@PathVariable("orderId") Long orderId) {// 根据id查询订单并返回return consumerService.queryOrderById(orderId);}

通过代码可以看到,接口参数只有一个, Long orderId所以堆hot这个资源的0号索引,也就是第一个参数做统计,每1秒相同参数的请求不超过5.高级配置中,配置例外的参数值阈值,


在这里插入图片描述在这里插入图片描述

`

五、隔离和降级

虽然限流可以尽量避免因高并发而引起的服务故障,但服务还会因为其它原因而故障。而要将这些故障控制在一定范围,避免雪崩,就要靠线程隔离(舱壁模式)和熔断降级手段了。不管是线程隔离还是熔断降级,都是对客户端(调用方)的保护。

5.1 Feign整合Sentinel

SpringCloud中,微服务调用都是通过Feign来实现的,因此做客户端保护必须整合Feign和Sentinel。

  1. 开启Feign的Sentinel功能
   feign:sentinel: enabled: true   # 开启Feign的Sentinel功能

2.给FeignClient编写失败后的降级逻辑

  • FallbackClass,无法对远程调用的异常做处理
  • FallbackFactory,可以对远程调用的异常做处理,我们使用这种
    @Slf4j
    @Component
    public class ProviderFallackFactory implements FallbackFactory<ProviderServeClient> {@Overridepublic ProviderServeClient create(Throwable throwable) {//创建client接口实现类,实现其中方法,编写失败逻辑处理return new ProviderServeClient() {@Overridepublic User queryById(Long id) {log.error("查询失败:{}",throwable);return new User();}};}
    }
    
  1. 将FallbackFactory配置到FeignClient

    @FeignClient(value = "provider-server",fallbackFactory = ProviderFallackFactory.class)
    public interface ProviderServeClient {@GetMapping("/provider/{id}")User queryById(@PathVariable("id") Long id);}
    

测试
提供者中报错,但是进行降级,查询用户结果返回空对象,不影响服务消费者的正常执行
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5.2 线程隔离

线程隔离有两种方式实现:

优点缺点场景
信号量隔离-Sentinel默认轻量级,无额外开销不支持主动超时 不支持异步调用 高频调用高扇出
线程池隔离支持主动超时支持异步调用线程的额外开销比较大 低扇出
  • 信号量隔离的特点:基于计数器模式,简单,开销小。
  • 线程池隔离的特点:基于线程池模式,有额外开销,但隔离控制更强。

在这里插入图片描述

  • QPS: 就是每秒的请求数,
  • 线程数: 是该资源能使用的tomcat线程数的最大值,也就是通过限制线程数量,实现仓壁模式

5.3 熔断和降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
在这里插入图片描述

5.3.1 慢调用

业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

在这里插入图片描述
表示:RT超过500ms的调用为慢调用,统计最近10000ms内的请求,如果请求量超过10次,并且慢调用比例不低于0.5,则处罚熔断,熔断时长为5秒.如果进入half-open状态,放行一次请求做测试.

5.3.2 异常比例或异常数

统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值(或超过指定异常数),则触发熔断。

在这里插入图片描述统计1000ms内的请求,如果请求量超过10测,并且异常比例不低于0.5,则触发熔断,熔断时长为5s,然后进入half-open状态,放行一次请求做测试

六、授权规则

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。
在这里插入图片描述

  • 白名单:来源(origin)在白名单内的调用者允许访问。
  • 黑名单:来源(origin)在黑名单内的调用者不允许访问。

在这里插入图片描述Sentinel是通过RequestOriginParserparseOrigin接口来获取请求来源的

这里我们获取请求头origin的值如果和我们设置的授权规则中的流控应用字符串一致,则允许访问

我们给网关添加配置,使从网关过来的请求都有该请求头,而从其他地方访问的则会被拦截

@Component
public class HeaderOriginparser implements RequestOriginParser {/*** Sentinel是通过这个接口来获取请求的来源的*/@Overridepublic String parseOrigin(HttpServletRequest request) {String origin = request.getHeader("origin");if (StrUtil.isBlank(origin)) {return "blank";}return origin;}
}

网关的yml配置

spring:cloud:gateway:default-filters:- AddRequestHeader=origin,gateway  # 添加名为origin的请求头,值为gateway

未走网关如下
在这里插入图片描述经过网关
在这里插入图片描述

七、自定义异常

在这里插入图片描述

限流,降级,授权拦截时都会抛出该异常,异常不够精确 如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口。

异常说明
FlowException限流异常
ParamFlowException热点参数限流的异常
DegradeException降级异常
AuthorityException授权规则异常
SystemBlockException系统规则异常

参考如下

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {String msg = "未知异常";int status = 429;if (e instanceof FlowException) {msg = "请求被限流了";} else if (e instanceof ParamFlowException) {msg = "请求被热点参数限流";} else if (e instanceof DegradeException) {msg = "请求被降级了";} else if (e instanceof AuthorityException) {msg = "没有权限访问";status = 401;}response.setContentType("application/json;charset=utf-8");response.setStatus(status);response.getWriter().println("{\"msg\": " + msg + ", \"status\": " + status + "}");}
}

这样就清晰很多了
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云安全之等级保护详解

等级保护概念 网络安全等级保护&#xff0c;是对信息系统分等级实行安全保护&#xff0c;对信息系统中使用的安全产品实行按等级管理&#xff0c;对信息系统中发生的信息安全事件分等级进行响应、处置。 网络安全等级保护的核心内容是&#xff1a;国家制定统一的政策、标准&a…

横向AlGaN/GaN基SBD结构及物理模型数据库的开发

GaN基功率器件凭借其临界电场高、电子饱和漂移速度大、热导率高等优良性能在大功率快充、充电桩、新能源汽车等领域具备广泛应用空间。为进一步助推半导体高频、高功率微电子器件的发展进程&#xff0c;天津赛米卡尔科技有限公司技术团队依托先进的半导体TCAD仿真平台成功开发出…

计算机网络八股

1、请你说说TCP和UDP的区别 TCP提供面向连接的可靠传输&#xff0c;UDP提供面向无连接的不可靠传输。UDP在很多实时性要求高的场景有很好的表现&#xff0c;而TCP在要求数据准确、对速度没有硬件要求的场景有很好的表现。TCP和UDP都是传输层协议&#xff0c;都是为应用层程序服…

【Java 进阶篇】深入了解JDBCTemplate:简化Java数据库操作

数据库操作是几乎所有现代应用程序的一部分。从存储和检索数据到管理业务逻辑&#xff0c;数据库操作是不可或缺的。在Java应用程序中&#xff0c;JDBCTemplate是一种强大的工具&#xff0c;可帮助开发人员轻松进行数据库操作。本文将深入探讨JDBCTemplate&#xff0c;了解它的…

最新Uniapp软件社区-全新带勋章源码

测试环境&#xff1a;php7.1。ng1.2&#xff0c;MySQL 5.6 常见问题&#xff1a; 配置好登录后转圈圈&#xff0c;检查环境及伪静态以及后台创建好应用 上传图片不了&#xff0c;检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图&#xff0c;在前端uitl文件夹里面…

string类的使用方式的介绍

目录 前言 1.什么是STL 2. STL的版本 3. STL的六大组件 4.STL的缺陷 5.string 5.1 为什么学习string类&#xff1f; 5.1.1 C语言中的字符串 5.2 标准库中的string类 5.3 string类的常用接口的使用 5.3.1 构造函数 5.3.2 string类对象的容量操作 5.3.3 string类对象…

2023年中国资产数字化监控运维管理系统行业分析:产品应用领域不断拓展[图]

资产监控运维管理是一门紧密结合生产实际的工程科学&#xff0c;是实现资产有效运营维护的重要手段。资产监控运维管理技术起源于美国和欧洲等国家和地区&#xff0c;经过几十年的理论研究和实际应用&#xff0c;资产监控运维管理技术为提高重大设备资产和系统的可靠性和安全性…

java Spring Boot 手动启动热部署

好 接下来 我们讲一个对开发非常重要的东西 热部署 因为 我们在开发过程中总会希望快点看到效果 或者 你的企业项目一般很大很复杂&#xff0c;重启是一件非常麻烦的事 或者你在和前端同事联调&#xff0c;有一点小问题 你改完就要重启 前端还得等你&#xff0c;非常不友好 那…

PbootCMS SQL注入漏洞

漏洞复现 访问漏洞url 数据库是mysql 构造payload&#xff0c;条件为假时&#xff0c;未查到任何数据 http://x.x.x/index.php?search 1select 0页面回显 构造payload&#xff0c;条件为真时&#xff0c;查询到数据 1select1文笔生疏&#xff0c;措辞浅薄&#xff0c;望各…

SpringMVC系列-4 参数解析器

背景&#xff1a; 本文作为SpringMVC系列的第四篇&#xff0c;介绍参数解析器。本文讨论的参数解析表示从HTTP消息中解析出JAVA对象或流对象并传参给Controller接口的过程。 本文内容包括介绍参数解析器工作原理、常见的参数解析器、自定义参数解析器等三部分。其中&#xff0…

【前段基础入门之】=>CSS3的新增特性!

文章目录 CSS3概述CSS3私有前缀常见浏览器私有前缀 新增盒模型相关属性怪异盒模型拖拽调整盒子大小盒子阴影不透明度 新增背景属性background-originbackground-clipbackground-size多背景图backgorund 复合属性 新增边框属性边框圆角边框外轮廓 新增文本属性文本阴影文本换行文…

NPM 常用命令(九)

目录 1、npm link 1.1 使用语法 1.2 描述 2、npm login 2.1 描述 3、npm logout 3.1 描述 4、npm ls 4.1 使用语法 4.2 描述 5、npm org 5.1 使用语法 5.2 示例&#xff1a; 6、npm outdated 6.1 使用语法 6.2 描述 6.3 示例 7、npm owner 7.1 使用语法 7.2…

ipv6跟ipv4如何通讯

IPv6的128位地址通常写成8组&#xff0c;每组为四个十六进制数的形式。比如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个合法的IPv6地址。这个地址比较长&#xff0c;看起来不方便也不易于书写。零压缩法可以用来缩减其长度。如果几个连续段位的值都是0&#xff0c;那么这…

免费 AI 代码生成器 Amazon CodeWhisperer 初体验

文章作者&#xff1a;浪里行舟 简介 随着 ChatGPT 的到来&#xff0c;不由让很多程序员感到恐慌。虽然我们阻止不了 AI 时代到来&#xff0c;但是我们可以跟随 AI 的脚步&#xff0c;近期我发现了一个神仙 AI 代码生产工具 CodeWhisperer &#xff0c;它是一项基于机器学习的服…

众佰诚:抖音开网店新手怎么做才能做起来

抖音作为国内最热门的短视频平台&#xff0c;其商业价值也日渐凸显。许多商家和个体经营者开始在抖音上开设网店&#xff0c;以此为新的销售渠道。那么&#xff0c;对于新手来说&#xff0c;如何才能在抖音上成功运营网店呢? 首先&#xff0c;明确经营定位。每个电商平台都有其…

小谈设计模式(16)—抽象工厂模式

小谈设计模式&#xff08;16&#xff09;—抽象工厂模式 专栏介绍专栏地址专栏介绍 抽象工厂模式结构抽象工厂&#xff08;AbstractFactory&#xff09;具体工厂&#xff08;ConcreteFactory&#xff09;抽象产品&#xff08;AbstractProduct&#xff09;具体产品&#xff08;C…

FPGA project : fifo_sum

实验目标&#xff1a; col(列) 4 &#xff1b;line(行) 5。相邻三行&#xff0c;按列求和。输出新的数据流。 实现方法&#xff1a; 通过rs232通信协议&#xff0c;输入数据流。第一行存进fifo1&#xff0c;第二行存进fifo2.当输入第三行第一个数据的时候&#xff0c;从fif…

Verilog HDL阻塞赋值和非阻塞赋值笔记

1. module test( input wire clk, input wire b, output reg a, output reg c ); always(posedge clk) begin ab; ca; end endmodule 上面的代码在vivado中综合后的电路为&#xff1a; 2. module test( input wire clk, input wire b, outp…

offer突击训练营,给你一个offer的保障,求职跳槽的看过来!

大家好&#xff0c;我是枫哥&#xff0c;&#x1f31f;阿里云技术专家、&#x1f4dd;资深面试官、&#x1f339;Java跳蚤网课堂创始人。拥有多年一线研发经验&#xff0c;曾就职过科大讯飞、美团网、平安等公司。 目前组建的团队&#xff0c;专注Java技术分享&#xff0c…

互联网Java工程师面试题·Memcached篇·第一弹

目录 1、Memcached 是什么&#xff0c;有什么作用&#xff1f; 1.1 memcached 服务在企业集群架构中有哪些应用场景&#xff1f; 1.1.1 作为数据库的前端缓存应用 1.1.2 作业集群的 session 会话共享存储 2、Memcached 服务分布式集群如何实现&#xff1f; 3、Memcach…