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

中核二二公司是国企还是央企济南优化seo公司

中核二二公司是国企还是央企,济南优化seo公司,网络机柜定制,应用公园怎么样目录 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 a#xff09;首先#xff0c;我们的服务启动时。都会把自己的信息提交给注册中心#xff0c;然后注册中心就会把信息保存下来. 注册的…目录 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 一、Nacos 和 Eureka 的区别 1.1、以 Nacos 注册流程来解析区别 a首先我们的服务启动时。都会把自己的信息提交给注册中心然后注册中心就会把信息保存下来. 注册的信息实际上就是一个嵌套 Map结构为 MapString, MapString, Service第一层 key 就是 namespace_id起到环境隔离的作用. value 由是一个嵌套 MapString, Service. 第二层的 key 表示 group 分组key 就是分组名value 就是分组下的某一个服务实际上就是一个类内部又维护了一个  MapString,Cluster . 第三层的 key 就是集群的名称value 就是  Cluster 也是一个类包含了集群的具体信息.   因为一个集群中可能包含多个实例也就是具体的节点信息例如实例的IP、Port、健康状态那么 Cluster 这个类中又维护了 两个 SetInstance分别是临时实例和非临时实例此处Eureka 就没有做区分只有临时实例. b那么当服务消费者要去消费时就可以从注册中心拉取服务信息.  这个过程也被称为“服务发现”.  但是他这个拉去动作不是每次都要做的压力太大而是将拉取到的服务信息缓存到一个列表中这样接下来的一段时间里就不用去拉去了而是直接从缓存列表中拿.  当然这个缓存一直不更新也不行因此会每隔 30 秒取重新拉取一次多长时间不用记都是可以配置的进行更新. c消费者拿到服务列表后就可以通过 负载均衡LoadBalancer从列表中挑选一个发起远程调用就可以了.  d截至目前为止Nacos 和 Eureka 还没什么太大的差别那差别在哪呢差别就在于服务提供者的健康检测机制. e在 nacos 中将服务分成了临时实例和非临时实例 临时实例当临时实例进行心跳检测的时候如果心跳不跳了nacos 就会把它从服务中直接剔除.  这里的心跳检测机制和 Eureka 是一样的但非临时实例就不一样了非临时实例nacos 就不会要求你给我发心跳了而是通过 nacos 主动发请求询问定时向实例发送请求“你还活着吗”即使真的挂了nacos 也仅仅只是把它标记为 不健康不会剔除而是等待它恢复健康. 而 Eureka 只提供了心跳模式的健康监测而没有主动检测功能。 主动询问进行健康检测效率岂不是很低 对于非临时实例所有的健康检测任务都不是立即执行的都会被放入一个阻塞队列中如下源码 Override public void process(HealthCheckTask task) {// 获取所有 非临时实例的 集合ListInstance ips task.getCluster().allIPs(false);if (CollectionUtils.isEmpty(ips)) {return;}for (Instance ip : ips) {// 封装健康检测信息到 BeatBeat beat new Beat(ip, task);// 放入一个阻塞队列中taskQueue.add(beat);MetricsMonitor.getTcpHealthCheckMonitor().incrementAndGet();} } 可以看出检测任务不是立即执行这里也采用了异步指定的策略会把任务放到线程池中取执行如下 public void run() {while (true) {try {// 处理任务processTask();// ...} catch (Throwable e) {SRV_LOG.error([HEALTH-CHECK] error while processing NIO task, e);}} } 通过 processTask 来处理健康检测的任务 private void processTask() throws Exception {// 将任务封装为一个 TaskProcessor并放入集合CollectionCallableVoid tasks new LinkedList();do {Beat beat taskQueue.poll(CONNECT_TIMEOUT_MS / 2, TimeUnit.MILLISECONDS);if (beat null) {return;}tasks.add(new TaskProcessor(beat));} while (taskQueue.size() 0 tasks.size() NIO_THREAD_COUNT * 64);// 批量处理集合中的任务for (Future? f : GlobalExecutor.invokeAllTcpSuperSenseTask(tasks)) {f.get();} } 任务被封装到了TaskProcessor中去执行了TaskProcessor是一个Callable其中的call方法 Override public Void call() {// 获取检测任务已经等待的时长long waited System.currentTimeMillis() - beat.getStartTime();if (waited MAX_WAIT_TIME_MILLISECONDS) {Loggers.SRV_LOG.warn(beat task waited too long: waited ms);}SocketChannel channel null;try {// 获取实例信息Instance instance beat.getIp();// 通过NIO建立TCP连接channel SocketChannel.open();channel.configureBlocking(false);// only by setting this can we make the socket close event asynchronouschannel.socket().setSoLinger(false, -1);channel.socket().setReuseAddress(true);channel.socket().setKeepAlive(true);channel.socket().setTcpNoDelay(true);Cluster cluster beat.getTask().getCluster();int port cluster.isUseIPPort4Check() ? instance.getPort() : cluster.getDefCkport();channel.connect(new InetSocketAddress(instance.getIp(), port));// 注册连接、读取事件SelectionKey key channel.register(selector, SelectionKey.OP_CONNECT | SelectionKey.OP_READ);key.attach(beat);keyMap.put(beat.toString(), new BeatKey(key));beat.setStartTime(System.currentTimeMillis());GlobalExecutor.scheduleTcpSuperSenseTask(new TimeOutTask(key), CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS);} catch (Exception e) {beat.finishCheck(false, false, switchDomain.getTcpHealthParams().getMax(),tcp:error: e.getMessage());if (channel ! null) {try {channel.close();} catch (Exception ignore) {}}}return null; } 这差别就像是亲生儿子和非亲生儿子亲生儿子我还会去主动关怀一下诶你还活着么而非临时实例就是你不心跳了就把你扔了~ f还有一个差别在于服务消费者Eureka 采用的是定时拉取每 30 秒一次那如果在 30 秒内服务提供者挂了消费肯定是不知道的因此 Eureka 这里更新的时效性也比较差. 我们的 微服务 定时拉取的基本逻辑就是先从本地缓存读 如果本地缓存没有就通过 Nacos 客户端构造请求去 nacos 服务器中读取.如果本地缓存有就开启定时更新功能就是创建一个定时任务每隔一段时间去拉取一次并返回缓存结果. 核心源码如下 public ServiceInfo getServiceInfo(final String serviceName, final String clusters) {NAMING_LOGGER.debug(failover-mode: failoverReactor.isFailoverSwitch());// 由 服务名集群名拼接 keyString key ServiceInfo.getKey(serviceName, clusters);if (failoverReactor.isFailoverSwitch()) {return failoverReactor.getService(key);}// 读取本地服务列表的缓存缓存是一个Map格式MapString, ServiceInfoServiceInfo serviceObj getServiceInfo0(serviceName, clusters);// 判断缓存是否存在if (null serviceObj) {// 不存在创建空ServiceInfoserviceObj new ServiceInfo(serviceName, clusters);// 放入缓存serviceInfoMap.put(serviceObj.getKey(), serviceObj);// 放入待更新的服务列表updatingMap中updatingMap.put(serviceName, new Object());// 立即更新服务列表updateServiceNow(serviceName, clusters);// 从待更新列表中移除updatingMap.remove(serviceName);} else if (updatingMap.containsKey(serviceName)) {// 缓存中有但是需要更新if (UPDATE_HOLD_INTERVAL 0) {// hold a moment waiting for update finish 等待5秒中待更新完成synchronized (serviceObj) {try {serviceObj.wait(UPDATE_HOLD_INTERVAL);} catch (InterruptedException e) {NAMING_LOGGER.error([getServiceInfo] serviceName: serviceName , clusters: clusters, e);}}}}// 开启定时更新服务列表的功能scheduleUpdateIfAbsent(serviceName, clusters);// 返回缓存中的服务信息return serviceInfoMap.get(serviceObj.getKey()); } 定时更新方法如下 public void updateService(String serviceName, String clusters) throws NacosException {ServiceInfo oldService getServiceInfo0(serviceName, clusters);try {// 基于ServerProxy发起远程调用查询服务列表String result serverProxy.queryList(serviceName, clusters, pushReceiver.getUdpPort(), false);if (StringUtils.isNotEmpty(result)) {// 处理查询结果processServiceJson(result);}} finally {if (oldService ! null) {synchronized (oldService) {oldService.notifyAll();}}} }public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly)throws NacosException {// 准备请求参数final MapString, String params new HashMapString, String(8);params.put(CommonParams.NAMESPACE_ID, namespaceId);params.put(CommonParams.SERVICE_NAME, serviceName);params.put(clusters, clusters);params.put(udpPort, String.valueOf(udpPort));params.put(clientIP, NetUtils.localIP());params.put(healthyOnly, String.valueOf(healthyOnly));// 发起请求地址与API接口一致return reqApi(UtilAndComs.nacosUrlBase /instance/list, params, HttpMethod.GET); } 而 nacos 这里的消费者不光进行服务的定时拉取nacos 还会主动进行消息的订阅推送一旦发现有服务挂了就立刻推送一条消息给服务消费者告诉你服务要更新了. Nacos 具体是通过什么实现消息订阅推送机制呢 a首先 PushPeceiver 这个类我们自己的微服务配置的 Nacos 客户端会以 UDP 的方式与 Nacos 服务端建立连接监听 Nacos 服务端推送的服务变更数据. b一旦 Nacos 服务列表发生变更就会发送 UDP 广播给所有的微服务订阅者. c当订阅者接收到通知以后就可以将接收到的服务信息缓存到本地缓存列表. d那么之后再拉取服务的时候会优先从缓存里读取缓存里有就直接返回缓存如果没有再去拉取或者订阅. PushPeceiver 构造函数如下 public PushReceiver(HostReactor hostReactor) {try {this.hostReactor hostReactor;// 创建 UDP客户端String udpPort getPushReceiverUdpPort();if (StringUtils.isEmpty(udpPort)) {this.udpSocket new DatagramSocket();} else {this.udpSocket new DatagramSocket(new InetSocketAddress(Integer.parseInt(udpPort)));}// 准备线程池this.executorService new ScheduledThreadPoolExecutor(1, new ThreadFactory() {Overridepublic Thread newThread(Runnable r) {Thread thread new Thread(r);thread.setDaemon(true);thread.setName(com.alibaba.nacos.naming.push.receiver);return thread;}});// 开启线程任务准备接收变更数据this.executorService.execute(this);} catch (Exception e) {NAMING_LOGGER.error([NA] init udp socket failed, e);} } PushReceiver 构造函数中基于线程池来运行任务。这是因为 PushReceiver 本身也是一个Runnable其中的run方法业务逻辑就是 Override public void run() {while (!closed) {try {// byte[] is initialized with 0 full filled by defaultbyte[] buffer new byte[UDP_MSS];DatagramPacket packet new DatagramPacket(buffer, buffer.length);// 接收推送数据udpSocket.receive(packet);// 解析为json字符串String json new String(IoUtils.tryDecompress(packet.getData()), UTF_8).trim();NAMING_LOGGER.info(received push data: json from packet.getAddress().toString());// 反序列化为对象PushPacket pushPacket JacksonUtils.toObj(json, PushPacket.class);String ack;if (dom.equals(pushPacket.type) || service.equals(pushPacket.type)) {// 交给 HostReactor去处理hostReactor.processServiceJson(pushPacket.data);// send ack to server 发送ACK回执略。。} catch (Exception e) {if (closed) {return;}NAMING_LOGGER.error([NA] error while receiving push data, e);}} } 通知数据的处理由交给了 HostReactor 的 processServiceJson 方法 public ServiceInfo processServiceJson(String json) {// 解析出ServiceInfo信息ServiceInfo serviceInfo JacksonUtils.toObj(json, ServiceInfo.class);String serviceKey serviceInfo.getKey();if (serviceKey null) {return null;}// 查询缓存中的 ServiceInfoServiceInfo oldService serviceInfoMap.get(serviceKey);// 如果缓存存在则需要校验哪些数据要更新boolean changed false;if (oldService ! null) {// 拉取的数据是否已经过期if (oldService.getLastRefTime() serviceInfo.getLastRefTime()) {NAMING_LOGGER.warn(out of date data received, old-t: oldService.getLastRefTime() , new-t: serviceInfo.getLastRefTime());}// 放入缓存serviceInfoMap.put(serviceInfo.getKey(), serviceInfo);// 中间是缓存与新数据的对比得到newHosts新增的实例remvHosts待移除的实例;// modHosts需要修改的实例if (newHosts.size() 0 || remvHosts.size() 0 || modHosts.size() 0) {// 发布实例变更的事件NotifyCenter.publishEvent(new InstancesChangeEvent(serviceInfo.getName(), serviceInfo.getGroupName(),serviceInfo.getClusters(), serviceInfo.getHosts()));DiskCache.write(serviceInfo, cacheDir);}} else {// 本地缓存不存在changed true;// 放入缓存serviceInfoMap.put(serviceInfo.getKey(), serviceInfo);// 直接发布实例变更的事件NotifyCenter.publishEvent(new InstancesChangeEvent(serviceInfo.getName(), serviceInfo.getGroupName(),serviceInfo.getClusters(), serviceInfo.getHosts()));serviceInfo.setJsonFromServer(json);DiskCache.write(serviceInfo, cacheDir);}// 。。。return serviceInfo; }
文章转载自:
http://www.morning.crrjg.cn.gov.cn.crrjg.cn
http://www.morning.rykw.cn.gov.cn.rykw.cn
http://www.morning.mnqz.cn.gov.cn.mnqz.cn
http://www.morning.tkqzr.cn.gov.cn.tkqzr.cn
http://www.morning.lqffg.cn.gov.cn.lqffg.cn
http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn
http://www.morning.qkzdc.cn.gov.cn.qkzdc.cn
http://www.morning.nzmw.cn.gov.cn.nzmw.cn
http://www.morning.mfct.cn.gov.cn.mfct.cn
http://www.morning.kpnpd.cn.gov.cn.kpnpd.cn
http://www.morning.wqpb.cn.gov.cn.wqpb.cn
http://www.morning.xqkjp.cn.gov.cn.xqkjp.cn
http://www.morning.gqbks.cn.gov.cn.gqbks.cn
http://www.morning.bxch.cn.gov.cn.bxch.cn
http://www.morning.tdzxy.cn.gov.cn.tdzxy.cn
http://www.morning.lynkz.cn.gov.cn.lynkz.cn
http://www.morning.ai-wang.cn.gov.cn.ai-wang.cn
http://www.morning.elbae.cn.gov.cn.elbae.cn
http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com
http://www.morning.dfkby.cn.gov.cn.dfkby.cn
http://www.morning.jmnfh.cn.gov.cn.jmnfh.cn
http://www.morning.tqbqb.cn.gov.cn.tqbqb.cn
http://www.morning.jglqn.cn.gov.cn.jglqn.cn
http://www.morning.cfhwn.cn.gov.cn.cfhwn.cn
http://www.morning.nzfjm.cn.gov.cn.nzfjm.cn
http://www.morning.xtyyg.cn.gov.cn.xtyyg.cn
http://www.morning.mmtbn.cn.gov.cn.mmtbn.cn
http://www.morning.sprbs.cn.gov.cn.sprbs.cn
http://www.morning.smkxm.cn.gov.cn.smkxm.cn
http://www.morning.drqrl.cn.gov.cn.drqrl.cn
http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn
http://www.morning.tgfjm.cn.gov.cn.tgfjm.cn
http://www.morning.ptysj.cn.gov.cn.ptysj.cn
http://www.morning.epeij.cn.gov.cn.epeij.cn
http://www.morning.jokesm.com.gov.cn.jokesm.com
http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn
http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn
http://www.morning.xlclj.cn.gov.cn.xlclj.cn
http://www.morning.jypsm.cn.gov.cn.jypsm.cn
http://www.morning.ghxsn.cn.gov.cn.ghxsn.cn
http://www.morning.plcyq.cn.gov.cn.plcyq.cn
http://www.morning.qwfq.cn.gov.cn.qwfq.cn
http://www.morning.nmnhs.cn.gov.cn.nmnhs.cn
http://www.morning.tqpds.cn.gov.cn.tqpds.cn
http://www.morning.jghty.cn.gov.cn.jghty.cn
http://www.morning.rljr.cn.gov.cn.rljr.cn
http://www.morning.nnmnz.cn.gov.cn.nnmnz.cn
http://www.morning.lhrwy.cn.gov.cn.lhrwy.cn
http://www.morning.spwm.cn.gov.cn.spwm.cn
http://www.morning.hpprx.cn.gov.cn.hpprx.cn
http://www.morning.qpqwb.cn.gov.cn.qpqwb.cn
http://www.morning.mhlkc.cn.gov.cn.mhlkc.cn
http://www.morning.myxps.cn.gov.cn.myxps.cn
http://www.morning.xbckm.cn.gov.cn.xbckm.cn
http://www.morning.wbhzr.cn.gov.cn.wbhzr.cn
http://www.morning.wbllx.cn.gov.cn.wbllx.cn
http://www.morning.trnl.cn.gov.cn.trnl.cn
http://www.morning.dqdss.cn.gov.cn.dqdss.cn
http://www.morning.rltsx.cn.gov.cn.rltsx.cn
http://www.morning.mzydm.cn.gov.cn.mzydm.cn
http://www.morning.jtkfm.cn.gov.cn.jtkfm.cn
http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn
http://www.morning.jppdk.cn.gov.cn.jppdk.cn
http://www.morning.knlyl.cn.gov.cn.knlyl.cn
http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn
http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn
http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn
http://www.morning.bbyqz.cn.gov.cn.bbyqz.cn
http://www.morning.rfgc.cn.gov.cn.rfgc.cn
http://www.morning.sgjw.cn.gov.cn.sgjw.cn
http://www.morning.pdmc.cn.gov.cn.pdmc.cn
http://www.morning.lqchz.cn.gov.cn.lqchz.cn
http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn
http://www.morning.nmyrg.cn.gov.cn.nmyrg.cn
http://www.morning.rpjyl.cn.gov.cn.rpjyl.cn
http://www.morning.ntyks.cn.gov.cn.ntyks.cn
http://www.morning.mmkrd.cn.gov.cn.mmkrd.cn
http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn
http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn
http://www.morning.gagapp.cn.gov.cn.gagapp.cn
http://www.tj-hxxt.cn/news/241856.html

相关文章:

  • 德州专业网站制作哪家好怎么将网站做成公司官网
  • 运营好还是网站开发好flash相册网站源码
  • 网站制作邯郸做网站的流程是什么
  • 大丰微信网站开发公司做网站开发所需的知识技能
  • 网站企业文化建设黑龙江网站建设公司
  • 九曲网站建设网站建设与推广的销售
  • 荆州做网站公司最好兰溪建设局网站
  • 成都有哪些网站建设青岛专业网站建设哪家好
  • 中金超钒 网站建设wordpress禁止右键插件
  • 网站的积分系统怎么做的宁波专业做网站的公司
  • 昆明网站开发推广微信小程序前端开发框架
  • 建设银行社保卡查询网站seo服务的内容
  • 专门做海产品的网站网站备案号格式说明书
  • 企业网站的设计工业和信息化部教育与考试中心
  • 苏州建网站哪家免费的空间网站
  • 购买手表网站怎么创建公众号步骤
  • 自己做影视类网站百度seo优化及推广
  • 男朋友说是做竞彩网站维护的做网站接广告要交税吗
  • 辽宁城乡建设集团网站设计师作品集网站
  • 公司企业官网建设上海百度关键词优化公司
  • 浏阳网站建设做鞋子出口需要作网站吗
  • 青岛网站建设和推广东莞网站开发培训哪里有
  • 做网站一年能赚多少钱小程序开发查询
  • 单页静态网站怎么做互联网推广的优势
  • 宁波做网站十大公司哪家好青岛网站设计建设
  • 有没有做宠物的网站口碑好网站建设公司电话
  • 石家庄网站平台深圳公布最新出行政策
  • 网站建设的工作内容phpmysql网站开发入门与提高
  • 网站建设代码标准做网站虚拟主机怎么选择
  • 免费做试用的网站汕头网站推广系统