网站上海备案万网网站后台管理

diannao/2026/1/16 14:49:14/文章来源:
网站上海备案,万网网站后台管理,网站建设费用主要包括哪些方面,wordpress4.7安装Nacos服务发现的方式 1.客户端获取 1.1:先是故障转移机制判断是否去本地文件中读取信息#xff0c;读到则返回 1.2:再去本地服务列表读取信息(本地缓存)#xff0c;没读到则创建一个空的服务#xff0c;然后立刻去nacos中读取更新 1.3:读到了就返回#xff0c;同时开启定时…Nacos服务发现的方式 1.客户端获取 1.1:先是故障转移机制判断是否去本地文件中读取信息读到则返回 1.2:再去本地服务列表读取信息(本地缓存)没读到则创建一个空的服务然后立刻去nacos中读取更新 1.3:读到了就返回同时开启定时更新定时向服务端同步信息 正常1s异常最多60s一次 2.服务端通过GRPC推送 建立长连接、当服务发现变更的时候往订阅了服务的客户端推送事件 SpringBoot自动注入 项目启动的时候会通过自动注入的机制将 NacosDiscoveryClientConfiguration注入 当注入NacosDiscoveryClientConfiguration的时候会将DiscoveryClient一起注入Bean DiscoveryClient实现了SpringCloud的DiscoveryClient接口重点是getInstances和getServices方法而且都是由NacosServiceDiscovery实现 获取实例信息 NacosDiscoveryClient private NacosServiceDiscovery serviceDiscovery;public NacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {this.serviceDiscovery nacosServiceDiscovery;}Overridepublic ListServiceInstance getInstances(String serviceId) {try {return serviceDiscovery.getInstances(serviceId);}catch (Exception e) {throw new RuntimeException(Can not get hosts from nacos server. serviceId: serviceId, e);}}public ListServiceInstance getInstances(String serviceId) throws NacosException {String group discoveryProperties.getGroup();ListInstance instances namingService().selectInstances(serviceId, group,true);return hostToServiceInstanceList(instances, serviceId);}NacosServiceDiscovery public ListServiceInstance getInstances(String serviceId) throws NacosException {//获取分组String group discoveryProperties.getGroup();//查询服务下的实例ListInstance instances namingService().selectInstances(serviceId, group,true);//填充返回的实例信息数据return hostToServiceInstanceList(instances, serviceId);}Overridepublic ListInstance selectInstances(String serviceName, String groupName, boolean healthy) throws NacosException {return selectInstances(serviceName, groupName, healthy, true);}Overridepublic ListInstance selectInstances(String serviceName, String groupName, boolean healthy, boolean subscribe)throws NacosException {return selectInstances(serviceName, groupName, new ArrayListString(), healthy, subscribe);}Overridepublic ListInstance selectInstances(String serviceName, String groupName, ListString clusters, boolean healthy,boolean subscribe) throws NacosException {ServiceInfo serviceInfo;String clusterString StringUtils.join(clusters, ,);// 默认是订阅的if (subscribe) {//从缓存中获取实例信息serviceInfo serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString);//如果获取不到则从服务端拉取if (null serviceInfo) {serviceInfo clientProxy.subscribe(serviceName, groupName, clusterString);}} else {// 如果未订阅服务信息则直接从服务器进行查询serviceInfo clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false);}//获取服务中的实例信息return selectInstances(serviceInfo, healthy);}从缓存中拿数据 public ServiceInfo getServiceInfo(final String serviceName, final String groupName, final String clusters) {NAMING_LOGGER.debug(failover-mode: {}, failoverReactor.isFailoverSwitch());String groupedServiceName NamingUtils.getGroupedName(serviceName, groupName);String key ServiceInfo.getKey(groupedServiceName, clusters);if (failoverReactor.isFailoverSwitch()) {return failoverReactor.getService(key);}return serviceInfoMap.get(key);}获取服务的实例信息 private ListInstance selectInstances(ServiceInfo serviceInfo, boolean healthy) {ListInstance list;if (serviceInfo null || CollectionUtils.isEmpty(list serviceInfo.getHosts())) {return new ArrayListInstance();}IteratorInstance iterator list.iterator();while (iterator.hasNext()) {Instance instance iterator.next();// 保留 健康、启用、权重大于0 的实例if (healthy ! instance.isHealthy() || !instance.isEnabled() || instance.getWeight() 0) {iterator.remove();}}return list;}GRPC请求拉取服务实例信息 Overridepublic ServiceInfo subscribe(String serviceName, String groupName, String clusters) throws NacosException {NAMING_LOGGER.info([SUBSCRIBE-SERVICE] service:{}, group:{}, clusters:{} , serviceName, groupName, clusters);String serviceNameWithGroup NamingUtils.getGroupedName(serviceName, groupName);String serviceKey ServiceInfo.getKey(serviceNameWithGroup, clusters);//定时同步服务端serviceInfoserviceInfoUpdateService.scheduleUpdateIfAbsent(serviceName, groupName, clusters);//获取ServiceInfo 信息ServiceInfo result serviceInfoHolder.getServiceInfoMap().get(serviceKey);//如果没有则从服务端拿if (null result || !isSubscribed(serviceName, groupName, clusters)) {//GRPC请求result grpcClientProxy.subscribe(serviceName, groupName, clusters);}//填充进Map中 这里可以看服务注册最后那部分代码最后也是调用serviceInfoHolder保存的serviceInfoHolder.processServiceInfo(result);return result;}定时同步服务端ServiceInfo public void scheduleUpdateIfAbsent(String serviceName, String groupName, String clusters) {String serviceKey ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters);if (futureMap.get(serviceKey) ! null) {return;}synchronized (futureMap) {if (futureMap.get(serviceKey) ! null) {return;}//构建任务放到ScheduledFuture执行ScheduledFuture? future addTask(new UpdateTask(serviceName, groupName, clusters));futureMap.put(serviceKey, future);}}缓存订阅信息 public void cacheSubscriberForRedo(String serviceName, String groupName, String cluster) {//拿服务当keyString key ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), cluster);//构建需要缓存的订阅信息SubscriberRedoData redoData SubscriberRedoData.build(serviceName, groupName, cluster);//缓存订阅信息synchronized (subscribes) {subscribes.put(key, redoData);}}执行订阅 public ServiceInfo doSubscribe(String serviceName, String groupName, String clusters) throws NacosException {//构建订阅请求SubscribeServiceRequest request new SubscribeServiceRequest(namespaceId, groupName, serviceName, clusters,true);//执行订阅SubscribeServiceResponse response requestToServer(request, SubscribeServiceResponse.class);//设置已订阅redoService.subscriberRegistered(serviceName, groupName, clusters);return response.getServiceInfo();}设置订阅信息已订阅 public void subscriberRegistered(String serviceName, String groupName, String cluster) {String key ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), cluster);synchronized (subscribes) {SubscriberRedoData redoData subscribes.get(key);// 标记订阅数据已订阅if (null ! redoData) {redoData.setRegistered(true);}}}Nacos订阅机制 Nacos的订阅机制如果用一句话来描述就是Nacos客户端通过一个定时任务每6秒从注册中心获取实例列表当发现实例发生变化时发布变更事件订阅者进行业务处理。该更新实例的更新实例该更新本地缓存的更新本地缓存。 UpdateTask public class UpdateTask implements Runnable {public void run() {long delayTime DEFAULT_DELAY;try {//校验订阅任务是否不对 如果不对就不处理 if (!changeNotifier.isSubscribed(groupName, serviceName, clusters) !futureMap.containsKey(serviceKey)) {NAMING_LOGGER.info(update task is stopped, service:{}, clusters:{}, groupedServiceName, clusters);isCancel true;return;}//从缓存中拿 Service信息ServiceInfo serviceObj serviceInfoHolder.getServiceInfoMap().get(serviceKey);//如果拿不到则去服务端拉取if (serviceObj null) {serviceObj namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false); //然后再填充进缓存 serviceInfoHolder.processServiceInfo(serviceObj);//更新下事件lastRefTime serviceObj.getLastRefTime();return;}// 过期服务服务的最新更新时间小于等于缓存刷新时间从注册中心重新查询if (serviceObj.getLastRefTime() lastRefTime) {//服务过期了重新查serviceObj namingClientProxy.queryInstancesOfService(serviceName, groupName, clusters, 0, false); //在缓存进去serviceInfoHolder.processServiceInfo(serviceObj);}// 刷新更新时间lastRefTime serviceObj.getLastRefTime();if (CollectionUtils.isEmpty(serviceObj.getHosts())) {incFailCount();return;}// 下次更新缓存时间设置默认为6秒// TODO multiple time can be configured.delayTime serviceObj.getCacheMillis() * DEFAULT_UPDATE_CACHE_TIME_MULTIPLE;// 重置失败数量为0resetFailCount();} catch (Throwable e) {incFailCount();NAMING_LOGGER.warn([NA] failed to update serviceName: {}, groupedServiceName, e);} finally {// 下次调度刷新时间下次执行的时间与failCount有关// failCount0则下次调度时间为6秒最长为1分钟// 即当无异常情况下缓存实例的刷新时间是6秒if (!isCancel) {executor.schedule(this, Math.min(delayTime failCount, DEFAULT_DELAY * 60),TimeUnit.MILLISECONDS);}}}}实例变更事件处理 监听事件的注册 在NacosNamingService的subscribe方法中通过如下方式进行了监听事件的注册 Overridepublic void subscribe(String serviceName, String groupName, ListString clusters, EventListener listener)throws NacosException {if (null listener) {return;}String clusterString StringUtils.join(clusters, ,);changeNotifier.registerListener(groupName, serviceName, clusterString, listener);clientProxy.subscribe(serviceName, groupName, clusterString);}这里的changeNotifier.registerListener便是进行具体的事件注册逻辑 public void registerListener(String groupName, String serviceName, String clusters, EventListener listener) {String key ServiceInfo.getKey(NamingUtils.getGroupedName(serviceName, groupName), clusters);ConcurrentHashSetEventListener eventListeners listenerMap.get(key);//这里用到了双重检查锁机制if (eventListeners null) {synchronized (lock) {eventListeners listenerMap.get(key);if (eventListeners null) {eventListeners new ConcurrentHashSetEventListener();listenerMap.put(key, eventListeners);}}}eventListeners.add(listener);}可以看出事件的注册便是将EventListener存储在InstancesChangeNotifier的listenerMap属性当中了。 这里的数据结构为Mapkey为服务实例信息的拼接value为监听事件的集合。 监听服务变更事件 因为UpdateTask 中假如没有从缓存中拿到服务信息则会通过grpc协议从服务端拉取然后会执行serviceInfoHolder.processServiceInfo方法缓存服务信息当实例发生变化的话这个方法最终会发送一个InstancesChangeEvent 事件 所以这里会监听InstancesChangeEvent 事件进行处理 InstancesChangeNotifier public class InstancesChangeNotifier extends SubscriberInstancesChangeEvent {private final MapString, ConcurrentHashSetEventListener listenerMap new ConcurrentHashMapString, ConcurrentHashSetEventListener();Overridepublic void onEvent(InstancesChangeEvent event) {String key ServiceInfo.getKey(NamingUtils.getGroupedName(event.getServiceName(), event.getGroupName()), event.getClusters());ConcurrentHashSetEventListener eventListeners listenerMap.get(key);if (CollectionUtils.isEmpty(eventListeners)) {return;}for (final EventListener listener : eventListeners) {//[] final com.alibaba.nacos.api.naming.listener.Event namingEvent transferToNamingEvent(event);final com.alibaba.nacos.api.naming.listener.Event namingEvent new NamingEvent(instancesChangeEvent.getServiceName(), instancesChangeEvent.getGroupName(),instancesChangeEvent.getClusters(), instancesChangeEvent.getHosts());// 最终调度执行listener.onEvent(namingEvent)只在NacosWatch#start找到了有效的EventListener见下文if (listener instanceof AbstractEventListener ((AbstractEventListener) listener).getExecutor() ! null) {((AbstractEventListener) listener).getExecutor().execute(() - listener.onEvent(namingEvent));} else {listener.onEvent(namingEvent);}}} } } public class NacosWatch implements ApplicationEventPublisherAware, SmartLifecycle, DisposableBean {private MapString, EventListener listenerMap new ConcurrentHashMap(16);private final AtomicBoolean running new AtomicBoolean(false);public void start() {if (this.running.compareAndSet(false, true)) {EventListener eventListener (EventListener)this.listenerMap.computeIfAbsent(this.buildKey(), (event) - {return new EventListener() {public void onEvent(Event event) {if (event instanceof NamingEvent) {List instances ((NamingEvent)event).getInstances();//[] Optional instanceOptional NacosWatch.this.selectCurrentInstance(instances);// 按IP和端口选择第一个instance作为当前的instanceOptional instanceOptional instances.stream().filter((instance) - {return this.properties.getIp().equals(instance.getIp()) this.properties.getPort() instance.getPort();}).findFirst()instanceOptional.ifPresent((currentInstance) - {//[] NacosWatch.this.resetIfNeeded(currentInstance);// 重新设置properties的metadataif (!this.properties.getMetadata().equals(instance.getMetadata())) {this.properties.setMetadata(instance.getMetadata());}});}}};});}}获取服务信息 NacosDiscoveryClient Overridepublic ListString getServices() {try {return serviceDiscovery.getServices();}catch (Exception e) {log.error(get service name from nacos server fail,, e);return Collections.emptyList();}}public ListString getServices() throws NacosException {//获取分组String group discoveryProperties.getGroup();//获取服务信息ListViewString services namingService().getServicesOfServer(1,Integer.MAX_VALUE, group);return services.getData();}Overridepublic ListViewString getServicesOfServer(int pageNo, int pageSize, String groupName) throws NacosException {return getServicesOfServer(pageNo, pageSize, groupName, null);}Overridepublic ListViewString getServicesOfServer(int pageNo, int pageSize, String groupName, AbstractSelector selector)throws NacosException {return clientProxy.getServiceList(pageNo, pageSize, groupName, selector);}GRPC拉取信息 Overridepublic ListViewString getServiceList(int pageNo, int pageSize, String groupName, AbstractSelector selector)throws NacosException {//构建请求ServiceListRequest request new ServiceListRequest(namespaceId, groupName, pageNo, pageSize);if (selector ! null) {if (SelectorType.valueOf(selector.getType()) SelectorType.label) {request.setSelector(JacksonUtils.toJson(selector));}}//采用GRPC协议拉取信息ServiceListResponse response requestToServer(request, ServiceListResponse.class);ListViewString result new ListViewString();result.setCount(response.getCount());result.setData(response.getServiceNames());return result;}服务端处理GRPC请求 接收获取服务的请求 ServiceListRequestHandler OverrideSecured(action ActionTypes.READ)public ServiceListResponse handle(ServiceListRequest request, RequestMeta meta) throws NacosException {//根据命名空间获取这个命名空间下的所有服务信息 erviceManager.getInstance().getSingletons这个方法服务注册的时候里有CollectionService serviceSet ServiceManager.getInstance().getSingletons(request.getNamespace());//构建返回信息ServiceListResponse result ServiceListResponse.buildSuccessResponse(0, new LinkedList());//服务信息不等于空填充返回信息if (!serviceSet.isEmpty()) {CollectionString serviceNameSet selectServiceWithGroupName(serviceSet, request.getGroupName());// TODO select service by selectorListString serviceNameList ServiceUtil.pageServiceName(request.getPageNo(), request.getPageSize(), serviceNameSet);result.setCount(serviceNameSet.size());result.setServiceNames(serviceNameList);}return result;}订阅服务请求 SubscribeServiceRequestHandler OverrideSecured(action ActionTypes.READ)public SubscribeServiceResponse handle(SubscribeServiceRequest request, RequestMeta meta) throws NacosException {//命名空间String namespaceId request.getNamespace();//服务名称String serviceName request.getServiceName();//分组名称String groupName request.getGroupName();String app request.getHeader(app, unknown);String groupedServiceName NamingUtils.getGroupedName(serviceName, groupName);//构建服务信息Service service Service.newService(namespaceId, groupName, serviceName, true);//组装订阅请求Subscriber subscriber new Subscriber(meta.getClientIp(), meta.getClientVersion(), app, meta.getClientIp(),namespaceId, groupedServiceName, 0, request.getClusters());//获取健康的实例 ServiceInfo serviceInfo ServiceUtil.selectInstancesWithHealthyProtection(serviceStorage.getData(service), //服务元数据信息 metadataManager.getServiceMetadata(service).orElse(null), subscriber);//是否订阅 if (request.isSubscribe()) {clientOperationService.subscribeService(service, subscriber, meta.getConnectionId());} else {clientOperationService.unsubscribeService(service, subscriber, meta.getConnectionId());}//构建返回数据return new SubscribeServiceResponse(ResponseCode.SUCCESS.getCode(), success, serviceInfo);}发送订阅事件 后续事件监听可参考服务事件处理的那篇文章 Overridepublic void subscribeService(Service service, Subscriber subscriber, String clientId) {Service singleton ServiceManager.getInstance().getSingletonIfExist(service).orElse(service);Client client clientManager.getClient(clientId);if (!clientIsLegal(client, clientId)) {return;}client.addServiceSubscriber(singleton, subscriber);client.setLastUpdatedTime();NotifyCenter.publishEvent(new ClientOperationEvent.ClientSubscribeServiceEvent(singleton, clientId));}发送取消订阅事件 后续事件监听可参考服务事件处理的那篇文章 Overridepublic void unsubscribeService(Service service, Subscriber subscriber, String clientId) {Service singleton ServiceManager.getInstance().getSingletonIfExist(service).orElse(service);Client client clientManager.getClient(clientId);if (!clientIsLegal(client, clientId)) {return;}client.removeServiceSubscriber(singleton);client.setLastUpdatedTime();NotifyCenter.publishEvent(new ClientOperationEvent.ClientUnsubscribeServiceEvent(singleton, clientId));}服务查询请求 ServiceQueryRequestHandler OverrideSecured(action ActionTypes.READ)public QueryServiceResponse handle(ServiceQueryRequest request, RequestMeta meta) throws NacosException {//获取命名空间String namespaceId request.getNamespace();//分组明String groupName request.getGroupName();//服务名String serviceName request.getServiceName();//创建服务信息Service service Service.newService(namespaceId, groupName, serviceName);//集群String cluster null request.getCluster() ? : request.getCluster();boolean healthyOnly request.isHealthyOnly();//获取服务信息ServiceInfo result serviceStorage.getData(service);//获取服务元数据信息ServiceMetadata serviceMetadata metadataManager.getServiceMetadata(service).orElse(null);// 获取有保护机制的健康实例result ServiceUtil.selectInstancesWithHealthyProtection(result, serviceMetadata, cluster, healthyOnly, true,meta.getClientIp());//构建返回信息return QueryServiceResponse.buildSuccessResponse(result);}public ServiceInfo getData(Service service) {return serviceDataIndexes.containsKey(service) ? serviceDataIndexes.get(service) : getPushData(service);}public OptionalServiceMetadata getServiceMetadata(Service service) {return Optional.ofNullable(serviceMetadataMap.get(service));}

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

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

相关文章

长沙网站设计优刻如何设计一款app

对这于这编程语言,要把概念理清也不是件很容易的事情,先是想到叫云语言,就是一种可以聚合工作,社交,人机交互的语言,但是感觉不太明确,百度下有个云语言的百科,是个假大空的东西。 又…

做冻品的网站建设银行网站怎么取消短信服务

参考链接: 使用ASCII值检查Java中的字符串是否仅包含字母 将字符串name 转化为首字母大写。普遍的做法是用subString()取第一个字母转成大写再与之后的拼接: str str.substring(0, 1).toUpperCase() str.substring(1); 看到一种效率更高的做法&…

在小型网站建设小组中的基本建设网站的市场定位

文章目录 前言源码获取一、认识Documents4j二、快速集成2.1、pom.xml依赖2.2、word转PDF实现项目目录WordUtils.javaDemo6.java测试效果 参考文章资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里…

新余建网站网易企业邮箱收费版

动态标签 1.用于处理SQL语句中的空白字符和多余的逗号 -- prefix:指定在SQL语句开头添加的内容。 -- prefixOverrides:指定需要移除的开头部分的内容。 -- suffix:指定在SQL语句结尾添加的内容。 -- suffixOverrides:指定需要移…

大学生建设什么网站好wordpress 下载站点

HashMap的底层结构在jdk1.7中由数组链表实现,在jdk1.8中由数组链表红黑树实现,以数组链表的结构为例。 JDK1.8之前Put方法: JDK1.8之后Put方法: HashMap基于哈希表的Map接口实现,是以key-value存储形式存在&#xff0c…

珠海网站建设建站系统域名注册服务网站

目录 1. 问题分析 2. 技术分析 3. 程序代码 4. 代码运行结果 1. 问题分析 日常工作尤其是测绘、地质、遥感行业,需要画DEM模型,并在这个模型的基础上,进行着色、渲染。比如,地质分析地面三维地表形变之时,需要根据D…

用php源码如何建设网站购物网站促销方案

在进行Facebook群控时,ip地址的管理是非常重要的,因为Facebook通常会检测ip地址的使用情况,如果发现有异常的使用行为,比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等,就会视为垃圾邮件或…

如何制作营销网站贵州建设监理网站培训通知栏

https://segmentfault.com/a/1190000015782272?utm_sourcetag-newest 转载于:https://www.cnblogs.com/hj0711/p/11577582.html

网站建设及维护涉及哪些内容关键词工具有哪些

目录 1.组件布局 2.回调函数设置 3.编写回调函数 1.组件布局 2.回调函数设置 右键单击plot按钮——查看回调——call backs

电脑上买wordpress天津企业网站排名优化

随着这几年物价的上涨,一些地区的电价越来越高,而我们经常需要使用电脑,那么一台电脑一天24小时用多少度电呢? 如何计算电脑一天的用电量? 让我们跟随小编来了解更多吧。 1、功耗、主机箱功耗 现在的计算机中&#xf…

闸北手机网站建设微信网站模板下载

JSTL概述 JSTL 全名为 JavaServer Pages Standard TagLibrary,即jsp标准标签库。JSTL 是由 JCP (Java Community Process)所指定的标准规格,它主要提供给 Java Web 开发人员一个标准通用的标签函数库。 Web 程序开发人员能够利用 J STL 和 E…

先做网页设计还是先弄网站wordpress 4.7.0 漏洞

解决这个问题的方法很简单,没有那么复杂。之所以使用HDMI接口连接了显示器后没声音,原因就是HDMI接口是包含音频视频两种信号的接口。当电脑的HDMI接口被使用时,系统就会默认从HDMI设备输出声音信号了,而此时如果HDMI设备没有声音…

网站建站网站496565互联网平台推广是什么意思

链接失效请E-MAIL:loguis-iehotmail.com地址:http://u.115.com/file/f4e6e095f3转载于:https://blog.51cto.com/loguis/332652

wap建站php源码免费自助开通网站

题目:https://www.lydsy.com/JudgeOnline/problem.php?id1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree。注意gauss里的编号应该是从1到...的连续的。 学习了一个TJ。用了vector。自己曾写过一个只能过样例的。都放上来吧。 路径压缩的…

龙华网页设计公司网站卡纸做荷花网站

文章目录1. 题目2. 解题2.1 递归2.2 记忆化递归2.3 贪心1. 题目 给定一个正整数 n,你可以做如下操作: 如果 n 是偶数,则用 n / 2替换 n。如果 n 是奇数,则可以用 n 1或n - 1替换 n。 n 变为 1 所需的最小替换次数是多少&#…

建设工程材料信息价查什么网站接私活app有哪些平台

过多的强降水会造成重大自然灾害,给我们的生活带来很大影响,实时监测降雨信息,能够及时发布气象预警,防范可能因强降水引起的山洪、泥石流等自然灾害,保护人民群众生命财产安全,提高防灾减灾能力。 雨量气…

html网站架设商业网站建设与维护方案书

在视频编辑的过程中,有时我们需要将一个较长的视频细分成多个部分,以便更灵活地进行处理、调整或分享。这个过程可以帮助我们有效管理视频内容,提取关键片段,并且适应不同的发布需求。在本文中,我们将深入探讨怎么把一…

重庆做网站建设哪里好wordpress cpu飙升

路由器与交换机区别 近日,在回答知道网友提问的时候,发现很多朋友不知道路由器与交换机的不同,常常问一些看起来有点可笑的问题。比如路由器同时登陆两个账号,所以今天写下这篇经验,科普一下路由器的功能和交换机的功能…

深圳做网站-信科网络网站建设费属于什么税目

三、工厂模式 通俗解释(理解记忆) 假设我们有一个汽车工厂。我们可以让工厂根据用户的选择生产不同型号的汽车,而用户无需知道具体的汽车制造过程。 工厂模式的优势在于,它隐藏了对象的创建细节,让客户端代码更简洁…