2.17日学习打卡----初学Dubbo(二)

2.17日学习打卡

目录:

  • 2.17日学习打卡
  • 一. Dubbo入门案例
    • 需求介绍
    • 配置开发环境
    • dubbo-producer
    • dubbo-consumer
    • 运行测试
    • IDEA开启DashBoard面板
  • 二. Dubbo高级特性
    • 序列化协议安全
    • 地址缓存
    • 超时时间与配置覆盖关系
    • 重试机制
    • 多版本
    • 负载均衡
    • 集群容错
    • 服务降级
    • 服务限流原理
    • 服务限流实现
    • 结果缓存

一. Dubbo入门案例

需求介绍

单体架构
在这里插入图片描述
项目架构
在这里插入图片描述

订单服务
功能如下:

  • 创建订单
  • 根据用户id查询订单详情

用户服务
功能如下:

  • 创建订单
  • 根据用户id查询订单详情

配置开发环境

创建maven项目

设置项目为父类型

<packaging>pom</packaging>

创建子项目 Dubbo-producer(生产者)
引入依赖

<!-- 整合dubbo -->
<dependency><groupId>io.dubbo.springboot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>1.0.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.7</version>
</dependency>

父项目加入配置

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/>
</parent>

父项目加入模块

在pom.xml文件中加入

<modules><module>dubbo-provider</module>
</modules>

创建子项目Dubbo-consumer(消费者)

父项目加入模块

  <modules><!-- 订单服务生产者 --><module>dubbo-provider</module><!-- 用户服务消费者 --><module>dubbo-consumer</module></modules>

添加依赖

<!-- 整合dubbo -->
<dependency><groupId>io.dubbo.springboot</groupId><artifactId>spring-boot-starter-dubbo</artifactId><version>1.0.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.7</version>
</dependency>

dubbo-producer

application.properties配置文件

# 应用服务 WEB 访问端口
# 端口号
server.port=80
# 1. 配置项目名称
spring.dubbo.application.name=user-service# 2. 配置注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.66.100
spring.dubbo.registry.port=2181# 3. 指定dubbo使用的协议、端口
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880# 4. 指定注册到zk上超时时间,ms
spring.dubbo.registry.timeout=10000# 5. 配置Dubbo包扫描
spring.dubbo.scan=com.jjy.service

代码实现:
pojo层

Order类

package com.jjy.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 订单模型*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order implements Serializable {// 订单idprivate Long id;// 用户idprivate Long userId;// 订单总价格private Double prict;// 收货人手机号private String mobile;// 收货人地址private String address;// 支付类型 1:微信 2:支付宝private Integer pay_method;}

CommonResult类

package com.jjy.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
/*** 统一返回结果集* @param <T>*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> implements Serializable {//1.返回结果编码private Integer code;//2.返回结果描述private String message;//3.数据// 数据private T data;
}

Service层
IOrderService接口

package com.jjy.service;import com.jjy.pojo.CommonResult;
import com.jjy.pojo.Order;public interface IOrderService {//1.创建订单CommonResult createOrders(Order orders);//2.根据用户ID查询订单详情CommonResult findByuserId(Long userid);
}

OrderServiceImpl类

package com.jjy.service.impl;import com.alibaba.dubbo.config.annotation.Service;
import com.jjy.pojo.CommonResult;
import com.jjy.pojo.Order;
import com.jjy.service.IOrderService;
@Service// 将这个类提供的方法(服务) 对外发布。将访问的地址 ip 端口 路径 注册到注册中心
public class OrderServiceImpl implements IOrderService {@Overridepublic CommonResult createOrders(Order orders) {CommonResult commonResult = new CommonResult();// 返回结果编码commonResult.setCode(200);// 返回结果描述信息commonResult.setMessage("创建成功");return commonResult;}@Overridepublic CommonResult findByuserId(Long userid) {//TODO 模拟数据库操作CommonResult commonResult = new CommonResult();// 返回结果编码commonResult.setCode(200);// 返回结果描述信息commonResult.setMessage("查询成功");// 返回结果集Order orders = new Order();orders.setId(1L);orders.setUserId(1L);orders.setPrict(121.1);orders.setMobile("18588888888");orders.setAddress("北京市海淀区中关村");orders.setPay_method(1);commonResult.setData(orders);return commonResult;}
}

dubbo-consumer

application.properties配置文件

# 端口号
server.port=8080
# 1. 配置项目名称
spring.dubbo.application.name=user-consumer# 2. 配置注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.66.100
spring.dubbo.registry.port=2181# 3. 指定dubbo使用的协议、端口
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20881# 4. 指定注册到zk上超时时间,ms
spring.dubbo.registry.timeout=10000# 5. 配置Dubbo包扫描
spring.dubbo.scan=com.jjy.service

pojo层
User类

package com.jjy.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;/*** 用户模型*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {//用户idprivate Long id;// 用户名字private String name;
}

Service层
IUserService接口

 package com.jjy.service;import com.jjy.pojo.CommonResult;
import com.jjy.pojo.Order;public interface IUserService {//根据用户id查询订单详情CommonResult findByUserId(Long userId);
}

UserService类

package com.jjy.service.impl;import com.alibaba.dubbo.config.annotation.Reference;import com.jjy.pojo.CommonResult;
import com.jjy.pojo.Order;
import com.jjy.service.IOrderService;
import com.jjy.service.IUserService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;@Service
public class UserService implements IUserService {//引入订单服务 远程调用/****  @Autowired : 本地注入**  1. 从zookeeper注册中心获取IOrderService访问的url。*  2. 进行远程调用RPC。*  3. 将结果封装为一个代理对象,交给这个变量赋值。**/@Referenceprivate IOrderService iOrderService;@Overridepublic CommonResult findByUserId(Long userId) {return iOrderService.findByuserId(userId);}
}

Controller层
UserController类

package com.jjy.controller;import com.jjy.pojo.CommonResult;
import com.jjy.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@Autowiredprivate IUserService iUserService;@GetMapping("findByUserId")public CommonResult findByUserId(Long userId){return iUserService.findByUserId(userId);}}

运行测试

访问 http://localhost:8080/findByUserId?userId=1
在这里插入图片描述

IDEA开启DashBoard面板

普通的Run面板
在这里插入图片描述
Run Dashboard面板在这里插入图片描述

修改配置文件
在.idea/workspace.xml 文件中找到

<component name="RunDashboard"><option name="ruleStates"><list><RuleState><option name="name" value="ConfigurationTypeDashboardGroupingRule" /></RuleState><RuleState><option name="name" value="StatusDashboardGroupingRule" /></RuleState></list></option>
</component>

添加配置

 <component name="RunDashboard"><option name="ruleStates"><list><RuleState><option name="name" value="ConfigurationTypeDashboardGroupingRule" /></RuleState><RuleState><option name="name" value="StatusDashboardGroupingRule" /></RuleState></list></option><option name="configurationTypes"><set><option value="SpringBootApplicationConfigurationType" /></set>
</option>
</component>

二. Dubbo高级特性

序列化协议安全

在这里插入图片描述
为什么需要序列化

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。
在这里插入图片描述

总结:
序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。

序列化反序列过程
在这里插入图片描述

流程:
不妨借用个例子帮助你理解,比如发快递,我们要发一个需要自行组装的物件。发件人发之前,会把物件拆开装箱,这就好比序列化;这时候快递员来了,不能磕碰呀,那就要打包,这就好比将序列化后的数据进行编码,封装成一个固定格式的协议;过了两天,收件人收到包裹了,就会拆箱将物件拼接好,这就好比是协议解码和反序列化。

地址缓存

在这里插入图片描述
地址缓存

注册中心挂了,服务是否可以正常访问?

答案:
因为dubbo服务消费者在 第一次调用时会将服务提供方地址缓存到本地以后
在调用则不会访问注册中心
。服务提供者地址发生变化时,注册中心会通服务消费者。

演示

关闭注册中心

./zkServer.sh stop 

远程调用服务
http://localhost:8080/findByUserId?userId=1

超时时间与配置覆盖关系

在这里插入图片描述
超时机制
在这里插入图片描述

问题:

  • 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
  • 在某个峰值时刻,大呈的请求都在同时请求服务消费者,会造成线程的大呈堆积,势必会造成雪崩。
  • dubbo利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接

配置超时时间

服务生产者端

使用timeout属性配置超时时间,默认值1000,单位毫秒。

@Service(timeout = 3000) //当前服务3秒超时
public class OrderServiceImpl implements IOrderService {

修改服务提供者制造延迟

@Override
public CommonResult<Order> findByUserId(Long userId) throws InterruptedException {CommonResult commonResult = new CommonResult();// 返回结果编码commonResult.setCode(200);// 返回结果描述信息commonResult.setMessage("查询成功");// 返回结果集//TODO 模拟数据库操作 突然数据库操作很慢Thread.sleep(4000);Order order = new Order();order.setId(1L);order.setUserId(1L);order.setPrict(121.1);order.setMobile("18588888888");order.setAddress("北京市海淀区中关村");order.setPay_method(1);commonResult.setData(order);return commonResult;
}

消费端(优先级大)

@Reference(timeout = 2000)// 远程注入
private IOrderService iOrderService;

报错

com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout
com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:107) ~[dubbo-2.5.3.jar:2.5.3]
com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84) ~[dubbo-2.5.3.jar:2.5.3]
com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96) ~[dubbo-2.5.3.jar:2.5.3]

超时设置的优先级

上面有提到dubbo支持多种场景下设置超时时间,也说过超时是针对消费端的。那么既然超时是针对消费端,为什么服务端也可以设置超时呢?

在这里插入图片描述

总结:
这其实是一种策略,其实服务端的超时配置是消费端的缺省配置,即如果服务端设置了超时,任务消费端可以不设置超时时间,简化了配置。另外针对控制的粒度,Dubbo支持了接口级别也支持方法级别,可以根据不同的实际情况精确控制每个方法的超时时间。

重试机制

在这里插入图片描述
重试机制
在这里插入图片描述

超时问题:
如果出现网络抖动,则会出现请求失败。

如何解决
Dubbo提供重试机制来避免类似问题的发生。

重试机制配置

@Service(timeout = 3000,retries = 2)

注意:
Dubbo在调用服务不成功时,默认会重试2次。

多版本

在这里插入图片描述
Dubbo提供多版本的配置,方便我们做服务的灰度发布,或者是解决不兼容的问题。
在这里插入图片描述

灰度发布(金丝雀发布):
当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。

版本迁移步骤

  • 在低压力时间段,先升级一半提供者为新版本
  • 再将所有消费者升级为新版本
  • 然后将剩下的一半提供者升级为新版本

多版本配置

老版本服务提供者配置

@Service(version = "1.0.0")
public class OrderServiceImpl implements IOrderService {public CommonResult findByUserId(Long id) {CommonResult<Orders> commonResult = new CommonResult();// 返回结果编码commonResult.setCode(200);// 返回结果描述commonResult.setMessage("success");// TODO 模拟数据库操作// 数据Orders orders = new Orders();orders.setId(1L);orders.setUserId(2L);orders.setPrict(12.5);orders.setMobile("1888888888");orders.setAddress("北京");orders.setPay_method(1);commonResult.setData(orders);return commonResult;}
}

新版本服务提供者配置

@Service(version = "2.0.0")
public class OrderServiceImpl implements IOrderService {public CommonResult findByUserId(Long id) {CommonResult<Orders> commonResult = new CommonResult();// 返回结果编码commonResult.setCode(200);// 返回结果描述commonResult.setMessage("success");// TODO 模拟数据库操作// 数据Orders orders = new Orders();orders.setId(1L);orders.setUserId(2L);orders.setPrict(12.5);orders.setMobile("1888888888");orders.setAddress("北京");orders.setPay_method(1);commonResult.setData(orders);return commonResult;}
}

新版本服务消费者配置

@Reference(version = "2.0.0")
private IOrderService iOrderService;// 订单服务

如果不需要区分版本,可以按照以下的方式配置 :

@Reference(version = "*")
private IOrderService iOrderService;// 订单服务

负载均衡

在这里插入图片描述
Dubbo是一个分布式服务框架,能避免单点故障和支持服务的横向扩容。一个服务通常会部署多个实例。
在这里插入图片描述

问题:
订单服务生产者会出现单点故障。

在这里插入图片描述

如何从多个服务 Provider 组成的集群中挑选出一个进行调用,就涉及到一个负载均衡的策略。

Dubbo内置负载均衡策略

  • RandomLoadBalance:随机负载均衡,随机的选择一个,默认负载均衡。
  • RoundRobinLoadBalance:轮询负载均衡。
  • LeastActiveLoadBalance:最少活跃调用数,相同活跃数的随机。
  • ConsistentHashLoadBalance:一致性哈希负载均衡,相同参数的请求总是落在同一台机器上。

负载均衡策略配置

如果不指定负载均衡,默认使用随机负载均衡。我们也可以根据自己的需要,显式指定一个负载均衡。

生产者服务

@Service(timeout = 3000,retries = 3,loadbalance = "roundrobin")

消费者服务

@Reference(timeout = 2000,loadbalance = "roundrobin"

参数:

  • random:随机负载均衡
  • leastactive:最少活跃调用数,相同活跃数的随机
  • roundrobin:轮询负载均衡
  • consistenthash:一致性哈希负载均衡

查看负载均衡配置

编辑器中快速按2下Shift
在这里插入图片描述
选择实现类在这里插入图片描述
复制名字
在这里插入图片描述

集群容错

在这里插入图片描述
集群容错模式

Dubbo框架为服务集群容错提供了一系列好的解决方案,在此称为dubbo服务集群容错模式。
在这里插入图片描述
容错模式

  • Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器,默认重试2次,使用retries配置。一般用于读操作
  • Failfast Cluster : 快速失败,只发起一次调用,失败立即报错。通常用于写操作。
  • Failsafe Cluster : 失败安全,出现异常时,直接忽略。返回一个空结果。日志不重要操作。
  • Failback Cluster : 失败自动恢复,后台记录失败请求,定时重发。非常重要的操作。
  • Forking Cluster:并行调用多个服务器,只要有一个成功即返回。
  • Broadcast Cluster:广播调用所有提供者,逐个调用,任意一台报错则报错。 同步要求高的可以使用这个模式。

集群容错配置

在消费者服务配置

@Reference(cluster = "failover")
private IOrderService iOrderService;

服务降级

在这里插入图片描述
什么是服务降级
服务降级,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。(关闭一些不重要的服务,保证核心服务正常运行)
在这里插入图片描述

两种场景:

  • 当下游的服务因为某种原因响应过慢,下游服务主动停掉一些不太重要的业务,释放出服务器资源,增加响应速度!
  • 当下游的服务因为某种原因不可用,上游主动调用本地的一些降级逻辑,避免卡顿,迅速返回给用户!

为什么需要降级

当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。

服务降级方式

第一种

mock=force:return null

含义:
表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。

第二种

mock=fail:return null

含义:
表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

服务降级演示

@Reference(timeout = 2000,mock = "force:return null")
private IOrderService iOrderService;

服务限流原理

在这里插入图片描述
生活中的限流
春运,一项全人类历史上最大规模的迁移活动,抢火车票一直是每年跨年以后的热点话题。
在这里插入图片描述
限流算法
漏桶算法
在这里插入图片描述

原理:
漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。

令牌桶算法
在这里插入图片描述

原理:
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

漏桶 vs 令牌桶的区别

漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不同,其特性可以“预存”一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。

服务限流实现

为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流。
并发控制

@Service(executes = 10)(生产者producer)

注意:
服务端并发执行(或占用线程池线程数)不能超过10个

连接控制

@Service(actives= 10)(生产者producer)

注意:
占用连接的请求的数不能超过10个。

结果缓存

在这里插入图片描述
结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量。
在这里插入图片描述
Dubbo提供了三种结果缓存机制:
在这里插入图片描述
配置缓存

@Reference(cache="lru")

测试结果缓存

在服务提供者工程中添加原子类操作

 private AtomicInteger index = newAtomicInteger();

原子的方式将当前值加1

        Orders orders = new Orders();orders.setId(1L);orders.setUserId(2L);orders.setPrict(12.5);orders.setMobile("1888888888");Integer callCount = index.getAndIncrement();orders.setAddress("北京" +callCount);orders.setPay_method(1);commonResult.setData(orders);return commonResult;

在服务消费者使用cache属性

@Reference(cache= "lru")

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!
在这里插入图片描述

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

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

相关文章

[深度学习] 深入理解什么是卷积神经网络

​ &#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[深度学习] ❤️ 热门学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 目录 1.卷积的定义 2.卷积的"卷"在哪里 3.什么又是卷积神…

Kerberos认证详解

对于Kerberos认证&#xff0c;可以大概如下图&#xff1a; 但是如果是详细的话&#xff0c;Kerberos认证过程可以分为三个部分&#xff0c;六个过程 1.AS-REQ&&AS-REP 1.AS-REQ 当域内某个用户输入了账号或者密码的时候&#xff0c;客户端就会发送一个authenticator…

企业大宽带服务器用哪里最合适

如今&#xff0c;数字经济的发展速度不断加快&#xff0c;进入数字化跑道的企业&#xff0c;每天都在大量输出、共享、存储数字内容&#xff0c;想要更高效、安全地让用户看到内容&#xff0c;企业的服务器需要满足大带宽、低延时、高并发等要求。 中小企业受限于资金、资源等…

【教程】Linux使用aria2c多线程满速下载

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 安装aria2c&#xff1a; sudo apt-get install aria2多线程下载&#xff1a; aria2c -x 16 -s 16 <url> 比如&#xff1a; aria2c -x 16 -s 16 http://images.cocodataset.org/zips/test2017.zip

白话微机:8.解释FPGA以及一些考研面试问题

一. 前言&#xff08;更新世界观&#xff09; 在“微机世界”&#xff0c;普通的城市(单片机)里&#xff0c;人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器”&#xff1b;地上有路&#xff0c;这些路…

mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景&#xff0c;其中一个典型的应用场景是网络文件传输。 假设我们需要将一个大文件传输到远程服务器上。在传统的方式下&#xff0c;我们可能需要将文件内容读入内存&#xff0c;然后再将数据从内存复制到网络协议栈中&#xff0c;最终发送到远…

【点云】生成有凹凸的平面

文章目录 前言高斯函数原理代码保存 测试测试1 &#xff1a;领域曲率代码测试2&#xff1a;高斯曲率代码 加上噪点测试1测试2改进 前言 尝试用一些数据生成有凹凸面的点云。 我们姑且把z轴当成有凹凸的缺陷&#xff0c;x轴和y轴共同组成一个平面。 高斯函数 原理 高斯函数wi…

UE4 C++联网RPC教程笔记(一)(第1~4集)

UE4 C联网RPC教程笔记&#xff08;一&#xff09;&#xff08;第1~4集&#xff09; 前言1. 教程介绍与资源2. 自定义 Debug 功能3. Actor 的复制4. 联网状态判断 前言 本系列笔记将会对梁迪老师的《UE4C联网RPC框架开发吃鸡》教程进行个人的知识点梳理与总结&#xff0c;此课程…

ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)

在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中&#xff0c;作者对异常处理整体流程以及相关概念做了梳理。接下来&#xff0c;本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…

「C++ 内存管理篇 0」C和C++对内存的划分

目录 一、C和C对内存的划分 二、小测试 【题目】 【答案】 【解释】 一、C和C对内存的划分 1. 栈区 &#xff1a;存储非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的。 2. 共享区&#xff1a;用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存…

汽车金融市场研究:预计2029年将达到482亿美元

汽车金融公司作为汽车流通产业链的重要一环&#xff0c;认真贯彻落实国家有关政策&#xff0c;采取多种措施助力汽车产业发展&#xff0c;为促进推动汽车消费、助力畅通汽车产业链、支持稳定宏观经济大盘发挥了积极作用。 益于国内疫情得到有效控制&#xff0c;我国经济持续稳定…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

网络编程_TCP通信综合练习:

1 //client&#xff1a;&#xff1a; public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket snew Socket("127.0.0.1",10000);//获取输出流OutputStream op s.getOutput…

ChatGPT魔法1: 背后的原理

1. AI的三个阶段 1&#xff09; 上世纪50~60年代&#xff0c;计算机刚刚产生 2&#xff09; Machine learning 3&#xff09; Deep learning&#xff0c; 有神经网络&#xff0c; 最有代表性的是ChatGPT, GPT(Generative Pre-Trained Transformer) 2. 深度神经网络 llya Suts…

Eclipse - Colors and Fonts

Eclipse - Colors and Fonts References 编码最好使用等宽字体&#xff0c;Ubuntu 下自带的 Ubuntu Mono 可以使用。更换字体时看到名字里面带有 Mono 的基本都是等宽字体。 Window -> Preferences -> General -> Appearance -> Colors and Fonts -> C/C ->…

数据分析 — 动画图 pyecharts

目录 一、概念二、安装和导入三、绘图逻辑四、绘图1、柱状图2、折线图3、散点图4、饼图5、南丁格尔图6、Geo() 地理坐标第7、Map() 绘制区域8、词云图9、层叠图10、3D 图11、仪表板 一、概念 Pyecharts 是一个基于 Echarts 的 Python 可视化库&#xff0c;它通过 Python 生成 …

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

Linux第60步_“buildroot”构建根文件系统第2步_配置“buildroot下的busybox”并测试“buildroot”生成的根文件系统

1、查看“buildroot下的busybox”安装路径 打开终端 输入“ls回车” 输入“cd linux回车/”&#xff0c;切换到到“linux”目录 输入“ls回车”&#xff0c;查看“linux”目录下的文件和文件夹 输入“cd buildroot/回车”&#xff0c;切换到到“buildroot”目录 输入“ls…

MyBatisPlus 整合 SpringBoot 遇见的问题

【异常】&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’… SQL: SELECT id,oper_id,btch_id,udf1, FROM scan_cyber Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘udf1’ in ‘field list’; ,"messag…

【Web】CTFSHOW java反序列化刷题记录(部分)

目录 web846 web847 web848 web849 web850 web856 web857 web858 web846 直接拿URLDNS链子打就行 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectOutput; import java.io.ObjectOutputStream; import java.lang.reflect.F…