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

上海市城市建设工程学校网站建立一个企业网站需要花多少钱

上海市城市建设工程学校网站,建立一个企业网站需要花多少钱,做网站一定要用云解析吗,钉钉在线课堂前言 不知道各位在使用 SpringCloud Gateway Nacos的时候有没有遇到过服务刚上线偶尔会出现一段时间的503 Service Unavailable#xff0c;或者服务下线后#xff0c;下线服务仍然被调用的问题。而以上问题都是由于Ribbon或者LoadBalancer的默认处理策略有关#xff0c;其…前言 不知道各位在使用 SpringCloud Gateway Nacos的时候有没有遇到过服务刚上线偶尔会出现一段时间的503 Service Unavailable或者服务下线后下线服务仍然被调用的问题。而以上问题都是由于Ribbon或者LoadBalancer的默认处理策略有关其中Ribbon默认是 30s 更新一次服务信息LoadBalancer则是默认 35s 更新一次缓存。接下来本文讲解则如何通过监听Nacos 的服务变更事件来实时进行相关服务的更新以实现服务的平滑上下线。 监听 Nacos 服务变更实现 首先我们要知道的是在前言中提到的服务上线未被及时感知是由于使用Ribbon或者LoadBalancer组件的默认处理策略所导致的Nacos是可以及时感知并触发服务上下线的事件因为我们要做的就是监听Nacos的这个事件然后在事件处理中自己手动去调用相关的更新操作以实现需求。而com.alibaba.nacos.client.naming.event.InstancesChangeEvent这个事件则正是符合我们需求的事件然后我们就可以参考com.alibaba.nacos.client.naming.event.InstancesChangeNotifier这个类来实现一个我们自己的订阅类 import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; import com.alibaba.nacos.common.notify.NotifyCenter; import com.alibaba.nacos.common.notify.listener.Subscriber; import com.alibaba.nacos.common.notify.Event; import com.netflix.loadbalancer.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;/*** 服务变更监听** author butterfly* date 2023-09-24*/ Slf4j Component public class ServiceChangeNotifier extends SubscriberInstancesChangeEvent {PostConstructpublic void init() {// 注册当前自定义的订阅者以获取通知NotifyCenter.registerSubscriber(this);}Overridepublic void onEvent(InstancesChangeEvent event) {String serviceName event.getServiceName();// 使用 dubbo 时包含 rpc 服务类会注册以 providers: 或者 consumers: 开头的服务// 由于不是正式的服务, 这里需要进行排除, 如果未使用 dubbo 则不需要该处理if (serviceName.contains(:)) {return;}// serviceName 格式为 groupNamenameString split Constants.SERVICE_INFO_SPLITER;if (serviceName.contains(split)) {serviceName serviceName.substring(serviceName.indexOf(split) split.length());}log.info(服务上下线: {}, serviceName);// 针对服务进行后续更新操作}Overridepublic Class? extends Event subscribeType() {return InstancesChangeEvent.class;}}nacos-client 为 2.1.1 时会出现订阅失效的 bug需要重写以下方法 Override public boolean scopeMatches(InstancesChangeEvent event) {return true; }具体原因参考issue。 基于 Ribbon 的实现 Ribbon默认情况下是 30s 刷新一次服务列表详情可看com.netflix.loadbalancer.PollingServerListUpdater其中部分代码如下 public class PollingServerListUpdater implements ServerListUpdater {private static int LISTOFSERVERS_CACHE_REPEAT_INTERVAL 30 * 1000; // msecs;private static long getRefreshIntervalMs(IClientConfig clientConfig) {return clientConfig.get(CommonClientConfigKey.ServerListRefreshInterval,LISTOFSERVERS_CACHE_REPEAT_INTERVAL);} }这里的时间间隔可以通过ribbon.ServerListRefreshIntervalxxx进行配置其中xxx对应自定义的毫秒时间间隔而通过监听Nacos的服务变更事件则不必调整时间间隔即可实现服务的平滑上下线具体代码如下 import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; import com.alibaba.nacos.common.notify.NotifyCenter; import com.alibaba.nacos.common.notify.listener.Subscriber; import com.alibaba.nacos.common.notify.Event; import com.netflix.loadbalancer.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.Optional;/*** 服务变更监听** author butterfly* date 2023-09-24*/ Slf4j Component public class ServiceChangeNotifier extends SubscriberInstancesChangeEvent {Resourceprivate SpringClientFactory springClientFactory;PostConstructpublic void init() {// 注册当前自定义的订阅者以获取通知NotifyCenter.registerSubscriber(this);}Overridepublic void onEvent(InstancesChangeEvent event) {String serviceName event.getServiceName();// 使用 dubbo 时包含 rpc 服务类会注册以 providers: 或者 consumers: 开头的服务// 由于不是正式的服务, 这里需要进行排除, 如果未使用 dubbo 则不需要该处理if (serviceName.contains(:)) {return;}// serviceName 格式为 groupNamenameString split Constants.SERVICE_INFO_SPLITER;if (serviceName.contains(split)) {serviceName serviceName.substring(serviceName.indexOf(split) split.length());}log.info(服务上下线: {}, serviceName);// 手动更新服务列表// 如果自定义负载均衡方式则将默认的 ZoneAwareLoadBalancer 替换为自己的实现即可Optional.ofNullable(springClientFactory.getLoadBalancer(serviceName)).ifPresent(loadBalancer - ((ZoneAwareLoadBalancer?) loadBalancer).updateListOfServers());}Overridepublic Class? extends Event subscribeType() {return InstancesChangeEvent.class;}}基于 LoadBalancer 的实现 默认情况下LoadBalancer的缓存时间是 35s可通过spring.cloud.loadbalancer.cache.ttl35s进行设置在org.springframework.cloud.loadbalancer.cache.DefaultLoadBalancerCacheManager类中可以看到下面是部分代码 public class DefaultLoadBalancerCacheManager implements LoadBalancerCacheManager {private SetDefaultLoadBalancerCache createCaches(String[] cacheNames,LoadBalancerCacheProperties loadBalancerCacheProperties) {// loadBalancerCacheProperties.getTtl().toMillis() 则是进行缓存的设置return Arrays.stream(cacheNames).distinct().map(name - new DefaultLoadBalancerCache(name,new ConcurrentHashMapWithTimedEviction(loadBalancerCacheProperties.getCapacity(),new DelayedTaskEvictionScheduler()),loadBalancerCacheProperties.getTtl().toMillis(), false)).collect(Collectors.toSet());}}同样的通过监听Nacos的事件我们可以在服务上下线时使相应的缓存失效即可 import com.alibaba.nacos.api.common.Constants; import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; import com.alibaba.nacos.common.notify.NotifyCenter; import com.alibaba.nacos.common.notify.listener.Subscriber; import com.alibaba.nacos.common.notify.Event; import com.netflix.loadbalancer.*; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.cloud.loadbalancer.core.CachingServiceInstanceListSupplier; import javax.annotation.PostConstruct; import javax.annotation.Resource;/*** 服务变更监听** author butterfly* date 2023-09-24*/ Slf4j Component public class ServiceChangeNotifier extends SubscriberInstancesChangeEvent {/*** 由于会有多个类型的 CacheManager bean, 这里的 defaultLoadBalancerCacheManager 名称不可修改*/Resourceprivate CacheManager defaultLoadBalancerCacheManager;PostConstructpublic void init() {// 注册当前自定义的订阅者以获取通知NotifyCenter.registerSubscriber(this);}Overridepublic void onEvent(InstancesChangeEvent event) {String serviceName event.getServiceName();// 使用 dubbo 时包含 rpc 服务类会注册以 providers: 或者 consumers: 开头的服务// 由于不是正式的服务, 这里需要进行排除, 如果未使用 dubbo 则不需要该处理if (serviceName.contains(:)) {return;}// serviceName 格式为 groupNamenameString split Constants.SERVICE_INFO_SPLITER;if (serviceName.contains(split)) {serviceName serviceName.substring(serviceName.indexOf(split) split.length());}log.info(服务上下线: {}, serviceName);// 手动更新服务列表Cache cache defaultLoadBalancerCacheManager.getCache(CachingServiceInstanceListSupplier.SERVICE_INSTANCE_CACHE_NAME);if (cache ! null) {cache.evictIfPresent(serviceName);}}Overridepublic Class? extends Event subscribeType() {return InstancesChangeEvent.class;}}参考资料 Nacos 自定义服务变化订阅 Spring Cloud之负载均衡组件Ribbon原理分析 SpringBoot Nacos k8s 优雅停机 微服务网关实战二SCG Nacos 服务上下线无缝切换
http://www.w-s-a.com/news/329073/

相关文章:

  • 企业网站有必要做吗?网站平均停留时间
  • 蘑菇街的网站建设凡科网站建设网页怎么建
  • 中国光大国际建设工程公司网站论坛是做网站还是app好
  • 地产集团网站建设高德是外国公司吗?
  • 天津市网站建站制作网站建设新报价图片欣赏
  • 怎么样在百度搜到自己的网站高端房产网站建设
  • 邯郸做移动网站多少钱ui设计好就业吗
  • 共享虚拟主机普惠版做网站产品推广包括哪些内容
  • 广州市网站建站免费咨询医生有问必答
  • app网站建设制作哪个网站可以做魔方图片
  • 教育培训网站建设方案模板下载网站文风
  • 电龙网站建设wordpress文章两端对齐
  • 做外单网站亚马逊免费的网站加速器
  • 英文网站推广工作一个虚拟主机可以做几个网站吗
  • 微网站 合同重庆电力建设设计公司网站
  • 网站怎么设置支付网站源码下载后怎么布置
  • 广州市公需课在哪个网站可以做手机商城软件下载
  • app网站建设需要什么长治网站建设公司
  • 网站模板平台广告宣传网站
  • cc域名的网站做网站放太多视频
  • 让公司做网站要注意什么建设工程公司企业文化
  • 佛山搭建建网站哪家好微信如何建立自己的公众号
  • 联想公司网站建设现状广州建网站兴田德润团队
  • 网站开发的技术有网页设计实训报告工作内容和步骤
  • 视频做网站长沙网站制作平台
  • js网站建设北京seo公司优化网络可见性
  • 付款网站源码建网站卖东西
  • 用php做的录入成绩的网站wordpress等级插件
  • 网站运营优化方案广西桂林公司
  • 快递网站策划怎么做ppt长春建设信息网站