当前位置: 首页 > news >正文

学做网站论坛vip账号破解网站优化公司价格如何计算

学做网站论坛vip账号破解,网站优化公司价格如何计算,唐山制作网站软件,如何将网站做成app在前两篇文章#xff0c;介绍了springboot的自动配置原理#xff0c;而nacos的服务注册就依赖自动配置原理。 Nacos Nacos核心功能点 服务注册 :Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务#xff0c;提供自身的元数据#xff0c;比如ip地址、端…在前两篇文章介绍了springboot的自动配置原理而nacos的服务注册就依赖自动配置原理。 Nacos Nacos核心功能点 服务注册 :Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务提供自身的元数据比如ip地址、端口等信息。Nacos Server接收到注册请求后就会把这些元数据信息存储在一个双层的内存Map中。 服务心跳: 在服务注册后Nacos Client会维护一个定时心跳来持续通知Nacos Server说明服务一直处于可用状态防止被剔除。默认5s发送一次心跳。 服务健康检查: Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况对于超过15s没有收到客户端心跳的实例会将它 的healthy属性置为false(客户端服务发现时不会发现)如果某个实例超过30秒没有收到心跳直接剔除该实例(被剔除的实例如果恢复 发送心跳则会重新注册) 服务发现: 服务消费者(Nacos Client)在调用服务提供者的服务时会发送一个REST请求给Nacos Server获取上面注册的服务清 单并且缓存在Nacos Client本地同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存 服务同步: Nacos Server集群之间会互相同步服务实例用来保证服务信息的一致性。 客户端 服务注册心跳发送 在客户端中也就是开发的应用包含引入有 nacos-discovery 而路径下包含有一个spring.factories 在自动配置的时候会加载 如下配置类。 org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\其中 NacosServiceRegistryAutoConfiguration 中引入了三个类 NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration 其中 NacosAutoServiceRegistration 继承了 AbstractAutoServiceRegistration public void onApplicationEvent(WebServerInitializedEvent event) {bind(event);}// 启动this.start();//注册服务register();组装实例信息ip 端口 服务权重 集群名字 源信息 以及是否 private Instance getNacosInstanceFromRegistration(Registration registration) {Instance instance new Instance();instance.setIp(registration.getHost());instance.setPort(registration.getPort());instance.setWeight(nacosDiscoveryProperties.getWeight());instance.setClusterName(nacosDiscoveryProperties.getClusterName());instance.setEnabled(nacosDiscoveryProperties.isInstanceEnabled());instance.setMetadata(registration.getMetadata());instance.setEphemeral(nacosDiscoveryProperties.isEphemeral());return instance;}// 注册实例namingService.registerInstance(serviceId, group, instance);// 服务名 组名 实例public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {// 实例非法校验NamingUtils.checkInstanceIsLegal(instance);// 获取组服务名String groupedServiceName NamingUtils.getGroupedName(serviceName, groupName);if (instance.isEphemeral()) {// 构建心跳信息BeatInfo beatInfo beatReactor.buildBeatInfo(groupedServiceName, instance);// 启动一个心跳发送线程beatReactor.addBeatInfo(groupedServiceName, beatInfo);}// 实际就是调用 instance serverProxy.registerService(groupedServiceName, groupName, instance);}// 心跳发送线程executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);发送心跳线程 所谓的客户端心跳其实就是启动一个线程然后定时给一个接口发送调用。 class BeatTask implements Runnable {BeatInfo beatInfo;public BeatTask(BeatInfo beatInfo) {this.beatInfo beatInfo;}Overridepublic void run() {// 如果停止 直接返回if (beatInfo.isStopped()) {return;}// 获取下次时间long nextTime beatInfo.getPeriod();// 实际就是调用服务端的一个心跳接口 /instance/beatJsonNode result serverProxy.sendBeat(beatInfo, BeatReactor.this.lightBeatEnabled);// 如果结束启动另外一个 开始下次的心跳线程发送executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS);}}nacos 服务注册 对于服务端来说就是一个API接口 public String register(HttpServletRequest request) throws Exception {// 准备服务实例final Instance instance parseInstance(request);serviceManager.registerInstance(namespaceId, serviceName, instance);return ok;}注册实例其实就是三步、创建服务、获取服务、添加实例 public void registerInstance(String namespaceId, String serviceName, Instance instance) throws NacosException {createEmptyService(namespaceId, serviceName, instance.isEphemeral());Service service getService(namespaceId, serviceName);addInstance(namespaceId, serviceName, instance.isEphemeral(), instance);}创建服务 public void createServiceIfAbsent(String namespaceId, String serviceName, boolean local, Cluster cluster)throws NacosException {// 命名空间 服务名称Service service getService(namespaceId, serviceName);if (service null) {service new Service();service.setName(serviceName);service.setNamespaceId(namespaceId);service.setGroupName(NamingUtils.getGroupName(serviceName));// now validate the service. if failed, exception will be thrownservice.setLastModifiedMillis(System.currentTimeMillis());service.recalculateChecksum();if (cluster ! null) {cluster.setService(service);service.getClusterMap().put(cluster.getName(), cluster);}service.validate();// 这里是重点putServiceAndInit(service);if (!local) {addOrReplaceService(service);}}}private void putServiceAndInit(Service service) throws NacosException {// 添加服务putService(service);// 下面说心跳检测机制service.init();}这里其实就是底层的注册表的数据结构了这里使用双检查锁。分别是nameSpace、group、service、实例。 这里简单思考下为什么要设计这么复杂。一个服务可能对应多个实例。没有问题。一个分组group 可能是在同一个公司有不同的组比如订单、支付每个组都有自己的服务。namespace则可以分为dev\test\prod 三个不同的组。 // 注册表 如何提升private final MapString, MapString, Service serviceMap new ConcurrentHashMap();// 这里的机制其实就是 判断当前是否存在该nameSpaceId , 如果不存在的话则创建一个CSLMpublic void putService(Service service) {if (!serviceMap.containsKey(service.getNamespaceId())) {// 添加锁 locksynchronized (putServiceLock) {if (!serviceMap.containsKey(service.getNamespaceId())) {serviceMap.put(service.getNamespaceId(), new ConcurrentSkipListMap());}}}// 将添加服务添加到nameSpaceId 添加服务serviceMap.get(service.getNamespaceId()).put(service.getName(), service);}// 添加实例public void addInstance(String namespaceId, String serviceName, boolean ephemeral, Instance... ips)throws NacosException {// 构建一个keyString key KeyBuilder.buildInstanceListKey(namespaceId, serviceName, ephemeral);Service service getService(namespaceId, serviceName);synchronized (service) {ListInstance instanceList addIpAddresses(service, ephemeral, ips);Instances instances new Instances();instances.setInstanceList(instanceList);// 持久化服务consistencyService.put(key, instances);}}// 这里根据判断是否ephemeral 走保存内存还是磁盘持久化 private ConsistencyService mapConsistencyService(String key) {// AP CPreturn KeyBuilder.matchEphemeralKey(key) ? ephemeralConsistencyService : persistentConsistencyService;}这里其实选择的是 DistroConsistencyServiceImpl 另一个就是 RaftConsistencyServiceImpl 使用raft实现的数据持久化这里先不介绍。 DistroConsistencyServiceImpl public void put(String key, Record value) throws NacosException {onPut(key, value);distroProtocol.sync(new DistroKey(key, KeyBuilder.INSTANCE_LIST_KEY_PREFIX), DataOperation.CHANGE,globalConfig.getTaskDispatchPeriod() / 2);}// 这里调用put public void onPut(String key, Record value) {if (KeyBuilder.matchEphemeralInstanceListKey(key)) {DatumInstances datum new Datum();datum.value (Instances) value;datum.key key;datum.timestamp.incrementAndGet();//将数据保存到内存中dataStore.put(key, datum);}if (!listeners.containsKey(key)) {return;}// 但是这里调用了一个任务notifier.addTask(key, DataOperation.CHANGE);}// 其实就是一个mapprivate MapString, Datum dataMap new ConcurrentHashMap(1024);public void put(String key, Datum value) {dataMap.put(key, value);}PostConstructpublic void init() {// 初始化 构造方法执行的时候 进行处理GlobalExecutor.submitDistroNotifyTask(notifier);}从源码中可以看到在类初始化的时候创建一个任务异步进行执行。 其实就是将当前服务进行异步任务注册可以提升性能。添加和获取任务。 源码精髓很多开源框架为了提升操作性能会大量使用这种异步任务及内存队列操作这些操作本省不需要写入立即返回成功用这种方式可以提升操作性能很大帮助 public class Notifier implements Runnable {// 保存服务private ConcurrentHashMapString, String services new ConcurrentHashMap(10 * 1024);// 阻塞队列 private BlockingQueuePairString, DataOperation tasks new ArrayBlockingQueue(1024 * 1024);// 初始化的时候 添加一个任务到阻塞队列中public void addTask(String datumKey, DataOperation action) {if (services.containsKey(datumKey) action DataOperation.CHANGE) {return;}if (action DataOperation.CHANGE) {services.put(datumKey, StringUtils.EMPTY);}tasks.offer(Pair.with(datumKey, action));}Overridepublic void run() {// 为什么异步设计 : 提升性能// 阻塞队列 ,会线程等待 wait// 并发、反射、网络、IOfor (; ; ) {// 异步处理PairString, DataOperation pair tasks.take();handle(pair);}}}心跳检测机制 其实就是服务注册的时候 启动一个线程然后检查所有实例的心跳检测对于超过15s没有收到客户端心跳的实例会将它 的healthy属性置为false(客户端服务发现时不会发现)如果某个实例超过30秒没有收到心跳直接剔除该实例(被剔除的实例如果恢复 发送心跳则会重新注册) /*** Init service.*/public void init() {// 心跳检查线程HealthCheckReactor.scheduleCheck(clientBeatCheckTask);for (Map.EntryString, Cluster entry : clusterMap.entrySet()) {entry.getValue().setService(this);entry.getValue().init();}}// 初始化5S后执行每5S执行一次public static void scheduleCheck(ClientBeatCheckTask task) {futureMap.putIfAbsent(task.taskKey(), GlobalExecutor.scheduleNamingHealth(task, 5000, 5000, TimeUnit.MILLISECONDS));}// public void run() {ListInstance instances service.allIPs(true);for (Instance instance : instances) {// 当前时间 减去 心跳超时时间if (System.currentTimeMillis() - instance.getLastBeat() instance.getInstanceHeartBeatTimeOut()) {if (instance.isHealthy()) {// 健康状态instance.setHealthy(false);getPushService().serviceChanged(service);ApplicationUtils.publishEvent(new InstanceHeartbeatTimeoutEvent(this, instance));}}}}// then remove obsolete instances:for (Instance instance : instances) {if (System.currentTimeMillis() - instance.getLastBeat() instance.getIpDeleteTimeout()) {// delete instanceLoggers.SRV_LOG.info([AUTO-DELETE-IP] service: {}, ip: {}, service.getName(),JacksonUtils.toJson(instance));deleteIp(instance);}}} }至此我们就基本上过了一遍服务的注册 以及心跳检测机制本篇主要是针对nacos1.4.1 的源码学习关于后续的服务发现以及2.X版本的源码 讲解后续在继续。
文章转载自:
http://www.morning.dywgl.cn.gov.cn.dywgl.cn
http://www.morning.mjats.com.gov.cn.mjats.com
http://www.morning.kspfq.cn.gov.cn.kspfq.cn
http://www.morning.ylljn.cn.gov.cn.ylljn.cn
http://www.morning.znqmh.cn.gov.cn.znqmh.cn
http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn
http://www.morning.shnqh.cn.gov.cn.shnqh.cn
http://www.morning.hgscb.cn.gov.cn.hgscb.cn
http://www.morning.kzhxy.cn.gov.cn.kzhxy.cn
http://www.morning.cftkz.cn.gov.cn.cftkz.cn
http://www.morning.kcbml.cn.gov.cn.kcbml.cn
http://www.morning.yrskc.cn.gov.cn.yrskc.cn
http://www.morning.qnftc.cn.gov.cn.qnftc.cn
http://www.morning.rqmr.cn.gov.cn.rqmr.cn
http://www.morning.rhdln.cn.gov.cn.rhdln.cn
http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn
http://www.morning.rszbj.cn.gov.cn.rszbj.cn
http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn
http://www.morning.jmdpp.cn.gov.cn.jmdpp.cn
http://www.morning.glbnc.cn.gov.cn.glbnc.cn
http://www.morning.mlycx.cn.gov.cn.mlycx.cn
http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com
http://www.morning.jyyw.cn.gov.cn.jyyw.cn
http://www.morning.tstwx.cn.gov.cn.tstwx.cn
http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn
http://www.morning.trlhc.cn.gov.cn.trlhc.cn
http://www.morning.wtwhj.cn.gov.cn.wtwhj.cn
http://www.morning.cctgww.cn.gov.cn.cctgww.cn
http://www.morning.rjqtq.cn.gov.cn.rjqtq.cn
http://www.morning.lbxcc.cn.gov.cn.lbxcc.cn
http://www.morning.ltpph.cn.gov.cn.ltpph.cn
http://www.morning.xuejitest.com.gov.cn.xuejitest.com
http://www.morning.kxbdm.cn.gov.cn.kxbdm.cn
http://www.morning.pfbx.cn.gov.cn.pfbx.cn
http://www.morning.pndw.cn.gov.cn.pndw.cn
http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn
http://www.morning.yghlr.cn.gov.cn.yghlr.cn
http://www.morning.qfrsm.cn.gov.cn.qfrsm.cn
http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn
http://www.morning.flxqm.cn.gov.cn.flxqm.cn
http://www.morning.pzdxg.cn.gov.cn.pzdxg.cn
http://www.morning.synlt.cn.gov.cn.synlt.cn
http://www.morning.fglyb.cn.gov.cn.fglyb.cn
http://www.morning.llllcc.com.gov.cn.llllcc.com
http://www.morning.ylkkh.cn.gov.cn.ylkkh.cn
http://www.morning.plkrl.cn.gov.cn.plkrl.cn
http://www.morning.gyrdn.cn.gov.cn.gyrdn.cn
http://www.morning.qwyms.cn.gov.cn.qwyms.cn
http://www.morning.srkqs.cn.gov.cn.srkqs.cn
http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn
http://www.morning.ybyln.cn.gov.cn.ybyln.cn
http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn
http://www.morning.zhqfn.cn.gov.cn.zhqfn.cn
http://www.morning.qnypp.cn.gov.cn.qnypp.cn
http://www.morning.gpfuxiu.cn.gov.cn.gpfuxiu.cn
http://www.morning.807yy.cn.gov.cn.807yy.cn
http://www.morning.brkc.cn.gov.cn.brkc.cn
http://www.morning.bhwz.cn.gov.cn.bhwz.cn
http://www.morning.rjxwq.cn.gov.cn.rjxwq.cn
http://www.morning.ypcd.cn.gov.cn.ypcd.cn
http://www.morning.nknt.cn.gov.cn.nknt.cn
http://www.morning.xtrnx.cn.gov.cn.xtrnx.cn
http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn
http://www.morning.xpqdf.cn.gov.cn.xpqdf.cn
http://www.morning.ldhbs.cn.gov.cn.ldhbs.cn
http://www.morning.kggxj.cn.gov.cn.kggxj.cn
http://www.morning.xkhxl.cn.gov.cn.xkhxl.cn
http://www.morning.nnttr.cn.gov.cn.nnttr.cn
http://www.morning.xmttd.cn.gov.cn.xmttd.cn
http://www.morning.mydgr.cn.gov.cn.mydgr.cn
http://www.morning.kpbn.cn.gov.cn.kpbn.cn
http://www.morning.pzrrq.cn.gov.cn.pzrrq.cn
http://www.morning.bpmtl.cn.gov.cn.bpmtl.cn
http://www.morning.wkxsy.cn.gov.cn.wkxsy.cn
http://www.morning.lfmwt.cn.gov.cn.lfmwt.cn
http://www.morning.tdldh.cn.gov.cn.tdldh.cn
http://www.morning.fbmrz.cn.gov.cn.fbmrz.cn
http://www.morning.lhldx.cn.gov.cn.lhldx.cn
http://www.morning.swdnr.cn.gov.cn.swdnr.cn
http://www.morning.leyuhh.com.gov.cn.leyuhh.com
http://www.tj-hxxt.cn/news/257497.html

相关文章:

  • 网站结构分类WordPress的黑色
  • 国际网站建设的目的app源码论坛
  • 网站做的比较好的北京西站附近的景点有哪些
  • 自己做网站的劣势优化网站排名方法
  • 有没有专门学做婴儿衣服的网站上海服装外贸公司
  • 现在那个网站做宣传有效果福州网站建设方案外包
  • 彩票网站的推荐怎么做网址大全你懂的
  • 往网站上做新东西需要什么网站做哪些主题比较容易做
  • 做网站 万户温州做阀门网站公司
  • 关键词能报价的网站河南安阳市区号
  • 网站建设提案wordpress to dedems
  • wordpress被黑seo如何提高网站排名
  • 公司网站制作银川微信小说分销平台
  • 哈尔滨网站制作哪家好在线音乐网站开发php
  • 如何提高网站点击率中信建设有限责任公司山东分公司
  • 电子商务网站建设教材如何使用mysql数据库做网站
  • 无锡市做网站装宽带需要多少钱一个月
  • 手机h5案例 网站如何做谷歌网站优化
  • 建设网站行业云简述网页布局的几种方法
  • 白云区网站建设公司建设婚恋网站用什么搭建
  • ps做图 游戏下载网站湛江网站设计公司
  • 长沙 公司网站广东机械加工厂
  • 寻找南昌网站设计单位网页管理平台
  • 国家建设工程信息网站网站运营经理岗位要求
  • 国外自适应网站模版棋牌软件开发定制软件
  • 如何给局域网 做网站免费开网店app
  • 设计一个网站重点是什么wordpress轮播图广告
  • wordpress 搬家出错网站如何优化
  • 机械网站建设方案大网站的二级域名
  • 便宜的网站制作四川专门做招聘酒的网站