1.?租人租赁???Դ??
2.图解+源码讲解 Nacos 客户端动态监听配置机制
3.如何用源代码建立一个网站
????Դ??
本文将详细讲解如何使用八爪鱼采集同城的民宿短租房源信息,并支持切换城市采集,源码源码所采集的租人租赁字段包括城市、标题、源码源码出租人、租人租赁位置、源码源码牙膏溯源码价格、租人租赁标题链接、源码源码坐标等。租人租赁
采集结果可以导出为Excel、源码源码CSV、租人租赁HTML、源码源码数据库等多种格式。租人租赁以Excel为例,源码源码数据整理将更加直观。租人租赁
以下是数据采集的具体步骤:
1. 打开网页:在首页输入框中输入目标网址并点击开始采集,八爪鱼将自动打开网页。示例中输入的是北海和东营的网址。
2. 提取数据:提取字段城市,在网页中选中城市位置,点击采集该元素的svn 源码上传文本。如果不需要此字段,可跳过此步骤。
3. 创建循环列表,提取标题和链接:通过连续步骤采集所有房源列表中的标题和链接。
4. 设置点击步骤,进入详情页:点击链接进入详情页,采集详情页数据。如果需要采集下一页数据,选择采集下一页数据并选择要点击的字段。
5. 采集字段:采集页面上可见的字段,包括价格、设施等。对于部分藏在源码中的字段,通过特殊设置采集。
6. 编辑字段:修改字段名称、删除多余字段、调整字段顺序等。
7. 启动采集:保存任务后点击采集并选择启动本地采集。采集完成后,选择合适的源码加载器导出方式导出数据。
八爪鱼·三分钟就上手的网页数据采集软件·而且是免费软件。通过以上步骤,你可以轻松掌握同城网站数据信息采集,提高工作效率。
图解+源码讲解 Nacos 客户端动态监听配置机制
图解+源码讲解 Nacos 客户端动态监听配置机制
在人生中第一要紧的是发现自己。为了这个目的,各位时常需要孤独和深思 —— 南森 Nacos 源码分析系列相关文章
从零开始看 Nacos 源码环境搭建
图解+源码讲解 Nacos 客户端发起注册流程
图解+源码讲解 Nacos 服务端处理注册请求逻辑
图解+源码讲解 Nacos 客户端下线流程
图解+源码讲解 Nacos 服务端处理下线请求
图解+源码讲解 Nacos 客户端发起心跳请求
图解+源码讲解 Nacos 服务端处理心跳请求
图解+源码讲解 Nacos 服务端处理配置获取请求
图解+源码讲解 Nacos 客户端动态监听配置机制
NacosConfigAutoConfiguration我们看到这里面其实注入了一个 Nacos 配置刷新的关键 NacosContextRefresherBean
@Configuration@ConditionalOnProperty(name?=?"spring.cloud.nacos.config.enabled",?matchIfMissing?=?true)public?class?NacosConfigAutoConfiguration?{ //?Nacos?配置属性@Beanpublic?NacosConfigProperties?nacosConfigProperties(ApplicationContext?context)?{ if?(context.getParent()?!=?null&&?BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context.getParent(),?NacosConfigProperties.class).length?>?0)?{ return?BeanFactoryUtils.beanOfTypeIncludingAncestors(context.getParent(),NacosConfigProperties.class);}return?new?NacosConfigProperties();}//?Nacos?配置刷新属性@Beanpublic?NacosRefreshProperties?nacosRefreshProperties()?{ return?new?NacosRefreshProperties();}//?Nacos?刷新历史@Beanpublic?NacosRefreshHistory?nacosRefreshHistory()?{ return?new?NacosRefreshHistory();}//?Nacos?配置管理@Beanpublic?NacosConfigManager?nacosConfigManager(NacosConfigProperties?nacosConfigProperties)?{ return?new?NacosConfigManager(nacosConfigProperties);}//?Nacos?配置刷新@Beanpublic?NacosContextRefresher?nacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?nacosRefreshHistory)?{ return?new?NacosContextRefresher(nacosConfigManager,?nacosRefreshHistory);}}NacosContextRefresher 配置中心刷新public?NacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?refreshHistory)?{ //?获取配置属性信息this.nacosConfigProperties?=?nacosConfigManager.getNacosConfigProperties();//?刷新历史this.nacosRefreshHistory?=?refreshHistory;//?获取配置服务this.configService?=?nacosConfigManager.getConfigService();//?是否开启刷新,是truethis.isRefreshEnabled?=?this.nacosConfigProperties.isRefreshEnabled();}获取配置服务 getConfigServicenacosConfigManager.getConfigService(),这行代码其实就是为了创建 NcaosConfigService 对象,我们看看你是怎么创建的,其实核心代码就是通过 NacosFactory 反射创建的 NcaosConfigService 对象,这个对象是一个核心对象后续会讲到的
public?static?ConfigService?createConfigService(Properties?properties)?throws?NacosException?{ try?{ //?加载?NacosConfigService?类Class<?>?driverImplClass?=?Class.forName("com.alibaba.nacos.client.config.NacosConfigService");//?获取构造器Constructor?constructor?=?driverImplClass.getConstructor(Properties.class);//?创建实例ConfigService?vendorImpl?=?(ConfigService)?constructor.newInstance(properties);return?vendorImpl;}?catch?(Throwable?e)?{ throw?new?NacosException(NacosException.CLIENT_INVALID_PARAM,?e);}}监听器NacosContextRefresher 实现了 ApplicationListener ,一看这就是一个监听器了,我们看看这个在监听器里面做了什么操作
@Overridepublic?void?onApplicationEvent(ApplicationReadyEvent?event)?{ //?这是一个?CAS?操作,只设置一次if?(this.ready.compareAndSet(false,?true))?{ //?注册?Nacos?监听器对于应用this.registerNacosListenersForApplications();}}注册 Nacos 监听/**register Nacos Listeners. 注册Nacos监听器 */ private void registerNacosListenersForApplications() { // 默认是 true if (isRefreshEnabled()) { // 遍历Nacos属性资源中心 for (NacosPropertySource propertySource : NacosPropertySourceRepository .getAll()) { if (!propertySource.isRefreshable()) { continue; } // 获取资源ID ?String dataId = propertySource.getDataId(); // 通过组和 dataId 注册 Nacos 监听器 registerNacosListener(propertySource.getGroup(), dataId); } } }
private void registerNacosListener(final String groupKey, final String dataKey) { // 构建 Key 信息 String key = NacosPropertySourceRepository.getMapKey(dataKey, groupKey); // 在 listenerMap中放入了 key 对应 AbstractSharedListener 响应的方法 Listener listener = listenerMap.computeIfAbsent(key, lst -> new AbstractSharedListener() { @Override public void innerReceive(String dataId, String group, String configInfo) { // 刷新次数 refreshCountIncrement(); // 记录刷新历史,就是改变历史 nacosRefreshHistory.addRefreshRecord(dataId, group, configInfo); // 发布刷新事件 applicationContext.publishEvent( new RefreshEvent(this, null, "Refresh Nacos config")); } }); // 向配置服务中添加监听器 configService.addListener(dataKey, groupKey, listener);
}
####?向配置服务中添加监听器 此时调用的是?NacosConfigService?中的?addListener?方法,但是最终执行的还是?ClientWorker?中的?addTenantListeners?方法,后面会进行分析?ClientWorker?这个类的```java@Overridepublic?void?addListener(String?dataId,?String?group,?Listener?listener)?throws?NacosException?{ //?这个?ClientWorker?worker?也是一个核心类worker.addTenantListeners(dataId,?group,?Arrays.asList(listener));}构建 CacheData 信息此时向 ClientWorker 中的 CacheData 中添加数据,之后遍历监听器添加到 CacheData 中
创建 CacheData 对象public?CacheData(ConfigFilterChainManager?configFilterChainManager,?String?name,?String?dataId,?String?group,String?tenant)?{ //?dataId?不能为空if?(null?==?dataId?||?null?==?group)?{ throw?new?IllegalArgumentException("dataId="?+?dataId?+?",?group="?+?group);}this.name?=?name;this.configFilterChainManager?=?configFilterChainManager;this.dataId?=?dataId;?//?设置dataIdthis.group?=?group;?//?设置组信息this.tenant?=?tenant;?//?设置租户listeners?=?new?CopyOnWriteArrayList<ManagerListenerWrap>();?//?装饰器集合this.isInitializing?=?true;//?加载缓存数据从本地磁盘this.content?=?loadCacheContentFromDiskLocal(name,?dataId,?group,?tenant);//?计算本地缓存信息的MD5this.md5?=?getMd5String(content);}向 CacheData 中添加数据public?void?addTenantListeners(String?dataId,?String?group,List<?extends?Listener>?listeners)throws?NacosException?{ //?DefaultGroupgroup?=?null2defaultGroup(group);String?tenant?=?agent.getTenant();?//?是?""//?向缓存数据中添加监听器CacheData?cache?=?addCacheDataIfAbsent(dataId,?group,?tenant);for?(Listener?listener?:?listeners)?{ cache.addListener(listener);}}public?CacheData?addCacheDataIfAbsent(String?dataId,?String?group,?String?tenant)throws?NacosException?{ //?获取Key信息String?key?=?GroupKey.getKeyTenant(dataId,?group,?tenant);//?在缓存?Map?中获取缓存数据CacheData?cacheData?=?cacheMap.get(key);//?如果不为空的情况下那么就返回,如果为空那么就创建一个?lstm 源码cCacheDataif?(cacheData?!=?null)?{ return?cacheData;}//?创建一个?CacheData?cacheData?=?new?CacheData(configFilterChainManager,?agent.getName(),dataId,?group,?tenant);//?将创建好的?cacheData?放入缓存?Map?中CacheData?lastCacheData?=?cacheMap.putIfAbsent(key,?cacheData);//?如果缓存数据为空的话那么从配置中心拉取,不过此时不为空if?(lastCacheData?==?null)?{ //fix?issue?#?if?(enableRemoteSyncConfig)?{ String[]?ct?=?getServerConfig(dataId,?group,?tenant,?L);cacheData.setContent(ct[0]);}//?计算任务IDint?taskId?=?cacheMap.size()?/?(int)?ParamUtil.getPerTaskConfigSize();//?设置任务IDcacheData.setTaskId(taskId);lastCacheData?=?cacheData;}//?缓存数据初始化完成//?reset?so?that?server?not?hang?this?checklastCacheData.setInitializing(true);LOGGER.info("[{ }]?[subscribe]?{ }",?agent.getName(),?key);MetricsMonitor.getListenConfigCountMonitor().set(cacheMap.size());//?返回最新的缓存数据return?lastCacheData;}到这里 CacheData 对象 和 cacheMap 集合已经构建完成了,后续会用到这个数据的
NacosConfigService 分析NacosConfigService这个类在创建的时候主要做了什么事情,这这里面创建了一个 ClientWorker对象,这个对象是一个核心的类,有关于配置的一些操作都是归功于 ClientWorker类
public?NacosConfigService(Properties?properties)?throws?NacosException?{ ......this.agent?=?new?MetricsHttpAgent(new?ServerHttpAgent(properties));this.agent.start();//?核心工作类this.worker?=?new?ClientWorker(this.agent,this.configFilterChainManager,?properties);}核心配置类 ClientWorker分析一下这个类都在做什么事情,都有哪些核心方法 其实能看到里面有一个构造函数、添加缓存数据、添加监听器、检查配置中心相关方法、获取服务配置、解析数据响应、移除缓存数据、删除监听器以及 shutdown方法
构造函数看到这里其实看到了定义了两个调度线程池,一个是用于配置检测的,一个是用于执行长轮询服务的
@SuppressWarnings("PMD.ThreadPoolCreationRule")public?ClientWorker(final?HttpAgent?agent,final?ConfigFilterChainManager?configFilterChainManager,?final?Properties?properties){ this.agent?=?agent;this.configFilterChainManager?=?configFilterChainManager;//?初始化操作init(properties);//?定义一个调度线程池,只有一个线程还是守护线程this.executor?=?Executors.newScheduledThreadPool(1,?new?ThreadFactory()?{ @Overridepublic?Thread?newThread(Runnable?r)?{ Thread?t?=?new?Thread(r);t.setName("com.alibaba.nacos.client.Worker."?+?agent.getName());t.setDaemon(true);return?t;}});//?定义一个多个线程的调度线程池,线程个数和CPU?核心数有关,也是守护线程,是一个长轮询this.executorService?=?Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),?new?ThreadFactory()?{ @Overridepublic?Thread?newThread(Runnable?r)?{ Thread?t?=?new?Thread(r);t.setName("com.alibaba.nacos.client.Worker.longPolling."?+agent.getName());t.setDaemon(true);return?t;}});//?定义一个定时的调度任务,第一次执行的时候延时1毫秒,后续毫秒调度一次this.executor.scheduleWithFixedDelay(new?ftp 源码编译Runnable()?{ @Overridepublic?void?run()?{ try?{ //?检查配置信息方法checkConfigInfo();}?catch?(Throwable?e)?{ LOGGER.error("["?+?agent.getName()?+?"]?"+?"[sub-check]?rotate?check?error",?e);}}},?1L,?L,?TimeUnit.MILLISECONDS);}检查配置服务方法这个 cacheMap 包含了一些任务信息,这里面的任务是怎么来的呢,他是在添加监听器的时候添加的,上面已经分析过了
public?NacosContextRefresher(NacosConfigManager?nacosConfigManager,NacosRefreshHistory?refreshHistory)?{ //?获取配置属性信息this.nacosConfigProperties?=?nacosConfigManager.getNacosConfigProperties();//?刷新历史this.nacosRefreshHistory?=?refreshHistory;//?获取配置服务this.configService?=?nacosConfigManager.getConfigService();//?是否开启刷新,是truethis.isRefreshEnabled?=?this.nacosConfigProperties.isRefreshEnabled();}0长轮询任务 LongPollingRunnable如何用源代码建立一个网站
如何用源代码建立一个网站用源代码建网站是最简单的方法之一。在这里写作不容易
我大概会写一个步骤给你参考;
准备工作:
域名、主机、源代码和ftp工具
Ps:选择主机的时候,一定要知道主机类型asp/php/。网等。,以及是否支持源代码安装。
1.将域名解析为主机ip,并将域名与主机绑定
2.使用Ftp工具将源代码上传到主机网页的根目录。
3.访问域名进行网站安装和配置。
具体细节不做过多描述。
手击不是很方便。
如果你有什么不明白的。
试着联系我。
问:一,二,三,试试骑恶魔战士。
如何零基础建网站,傻瓜式建站?
零基础可以选用模版建站,网站开发平台给你提供现成的免费自助建站系统源码或建站模板,新手直接套用模板,再稍加编辑就能快速搭建一个网站。
新手如何建站?
现在建站的方式已经越来越多了,包括使用自助建站系统、找团队定制开发、自己源代码开发?不过其中更适合纯小白的,还是模版建站,也是目前较多个人和中小企业所选择的建站方式。
模版建站到底是什么?
简单来说,就是网站开发平台给你提供现成的免费自助建站系统源码或建站模板,新手直接套用模板,再稍加编辑就能快速搭建一个网站。
如何利用自助建站快速搭建一个自己的网站?
怎样快速搭建一个自己的网站,作为一名新手小白,该如何入手?随着互联网越来越发达,越来越多的人都意识到拥有一个网站的重要性,网站是一种信息的展现渠道,同时也能带来一定的商机,那么新手小白打算建个网站,该如何入手?下面我就来告诉你如何新手建设网站的方法。
1、首先申请一个域名,第一步你已经完成,这里就不多说了。
2、空间,也就是虚拟主机,或者叫服务器,服务器一般用来运行较大的系统,普通人做个人站点选虚拟主机就行,1-块就可以搞到一个。前提推荐大家现在本机把网站调试好、玩透彻,然后再考虑去购买虚拟主机。
3、网站,如果你具备开发制作网站的能力,就不用多说了。如果不会的话,可以选择一些主流的个人建站程序,然后下载源代码,安装到服务器上,配置好域名,设置好后台就可以通过域名访问了。
当然,这里有一个大的前提就是网站需要做备案,这个也不难,在服务器供应商那里,按照流程操作,一般都可以很顺利的拿到备案。以上就是我总结的新手怎么建站的内容,但是,如果真的想要做好一个网站,并且为了网站在后期有一个非常好的发展方向,最好在一开始就找专业、正规的网站建设公司进行制作以及优化才是最好的方法。在这里我推荐阿里云的云速成美站和云企业官网,低至元新手小白就能完成一个网站,他们在此行业拥有着多年的网站搭建及网站优化经验,帮助了很多人解决网站的相关问题,现在建站还可以领取优惠券
米拓源代码详细讲解?
源代码是构成网站的核心,即网站程序代码,包括网站文件及目录结构,拥有源代码才拥有网站的全部。
源代码决定网站的所有权,传统自助建站因其SAAS模式无法开放源代码,用户实质上是每年支付租金租用放在平台网站的使用权,哪一天不交租金了,网站也就没有了;而开放源代码的建站是用户拥有网站的所有权,是买卖关系而不是租用关系,用户可以将网站程序(源代码)安装到自己指定的服务器,而不受平台限制。
某种意义上,可以通过是否开放FTP来确定是否开放源代码,开放FTP意味着可以随时拿到网站源代码程序。
开放源代码就是提供网站程序的所有代码给用户,用户获得源代码后可以自行进行二次修改(也可以找其他专业的公司进行修改),同时可以将网站安装到任意具备系统运行环境的服务器(如米拓企业建站系统,需要PHP+MYSQL运行环境)。开放源代码可以让网站更具有自主性,未来的改版、网站推广、服务器选择等非常方便,对于专业建站而已,开放源代码是非常必要的。
米拓建站定位为中高端建站,拥有自助建站、模板建站的快捷方便性,同时又拥有定制网站的纯手工制作特征和开放源代码;米拓建站可以“用租房的价格买房”搭建网站,相信消费者的眼睛是雪亮的。