关于eureka:聊聊如何基于eureka元数据扩展namespace功能

前言最近敌人部门接手供方微服务项目过去运维,那套微服务的技术栈是springcloud Netflix,和敌人部门的微服务技术栈刚好匹配。过后敌人部门的想法,既然都是同一套技术体系,那些根底服务治理组件比方注册核心之类,就共用同一套。然而在落地施行的过程中,发现供方提供的微服务项目服务有些serviceId和敌人部门他们已有服务serviceId名字居然截然不同。这样就有问题了,eureka服务发现是通过serviceId辨认 敌人部门的策略是将供方微服务项目serviceId改掉,比方本来serviceId是user,就改成xxx-user。然而调整后,发现供方微服务某些微服务会报错,前面理解到供方仅提供应用层代码,有些外围代码库他们是不提供的。敌人他们部门也思考要不就替换本人已有服务的serviceId,后边发现可行性也不大,因为敌人他们微服务也对其余部门输入了一些能力,如果改变,就得告诉相干方进行改变,这边会波及到一些沟通老本等非技术性因素。 后边敌人就和我交换了一下计划。首先问题点的实质是serviceId一样引起的吗?乍看一下,如同是这样。咱们换个角度思考这个问题,是不是也能够说是因为隔离性做得不够好导致。于是我就跟敌人说,如果把eureka切换成nacos,对你部门的切换老本大不大。敌人说代码层尽管仅需切换jar和配置即可实现,然而因为版本起因,如果切换,他们也只能用到nacos 1版本的能力。其次他部门对注册核心的性能要求也不高,但对注册核心的稳定性要求比拟高,如果切换,他们须要做很多测试方面的工作,仅仅只是因为这个隔离性,他更偏向部署多个eureka。 聊到前面敌人就在吐槽eureka,为啥不能像nacos或者k8s那样搞个namespace来做隔离。基于敌人这个想法,我就跟他说,我帮你扩大一下,让eureka也领有仿nacos namespace的能力 实现思路注: 本文以敌人他们公司的微服务版本springcloud Hoxton.SR3来解说 实现的外围逻辑:利用注册核心都有的元数据,即metaMap,以及配合注册核心具备的服务发现能力进行扩大 外围实现逻辑1、元数据扩大a、新建扩大配置类@ConfigurationProperties(prefix = "eureka.instance.ext")@Data@AllArgsConstructor@NoArgsConstructorpublic class EurekaInstanceProperties { private String namespace = Constant.META_INFO_DEAFULT_NAMESPACE; private String group = Constant.META_INFO_DEAFULT_GROUP; private boolean loadBalanceAllowCross;}b、元数据扩大填充public class EurekaInstanceSmartInitializingSingleton implements SmartInitializingSingleton, ApplicationContextAware { private ApplicationContext applicationContext; @Override public void afterSingletonsInstantiated() { EurekaInstanceProperties eurekaInstanceProperties = applicationContext.getBean(EurekaInstanceProperties.class); EurekaInstanceConfigBean bean = applicationContext.getBean(EurekaInstanceConfigBean.class); Map<String, String> metadataMap = bean.getMetadataMap(); metadataMap.put(Constant.META_INFO_KEY_NAMESPACE,eurekaInstanceProperties.getNamespace()); metadataMap.put(Constant.META_INFO_KEY_GROUP,eurekaInstanceProperties.getGroup()); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; }}2、eureka服务端面板革新a、status.ftlh页面逻辑革新在我的项目eureka服务端的src/main/resource目录下新建/templates/eureka文件夹,将eureka本来有的status.ftlh拷贝过去,因为咱们要对这个status.ftlh进行革新。而status.ftlh本来地位是放在 ...

February 21, 2023 · 4 min · jiezi

关于eureka:我也是醉了Eureka-延迟注册还有这个坑

Eureka 有个提早注册的性能,也就是在服务启动胜利之后不立即注册到 Eureka Server,而是提早一段时间再去注册,这样做的次要目标是因为尽管服务启动胜利了,可能还有一些框架或者业务的代码没有初始化实现,可能会导致调用的报错,所以须要提早注册。 然而发现,然并卵啊,如同这个提早注册并没有失效,也是开始了排查之路。 提早注册首先,提早注册的性能次要依赖这两个参数,eureka.client.initial-instance-info-replication-interval-seconds代表第一次初始化提早注册的工夫距离,eureka.client.instance-info-replication-interval-seconds则代表后续同步注册的工夫距离。 eureka.client.initial-instance-info-replication-interval-seconds=40 //默认40秒eureka.client.instance-info-replication-interval-seconds=30 //默认30秒咱们从源码先来看是怎么做到提早注册的,先看 DiscoveryClient 的 initScheduledTasks ,这里创立了同步注册到 Eureka Server 的定时工作。 之后调用 start 办法创立定时工作,并且提早 40 秒执行,也就是咱们达到的提早注册的成果。 默认的第一次注册,也就是提早注册的工夫是 40 秒,之后每 30 秒会同步注册信息。 然而,即使咱们配置了这俩属性,发现如同没什么卵用,接下来咱们要排查下到底是为啥捏? 第一个问题我发现在 InstanceInfoReplica 中存在这样一段终止以后线程池工作,并且间接调用 run 办法的存在,猜想生效就是他间接调用导致提早工作没有失效,因为这个办法的间接调用导致提早注册压根就没成果嘛。 看起来他存在两个调用,第一个是registerHealthCheck,当存在这个健康检查什么玩意儿的时候就会去调用onDemandUpdate。 通过排查咱们发现,只有配置了eureka.client.healthcheck.enabled=true,就会创立 HealthCheckHandler的实例进去,默认状况下他是false的,所以应该是对咱们没有影响的。 这里须要特地阐明一下 eureka.client.healthcheck.enabled 的作用,默认 Eureka 依据心跳来决定利用的状态,如果是这个属性配置成 true的话,则是会依据 Spring Boot Actuator 来决定,而不是心跳了。 比方咱们能够实现 HealthIndicator接口,本人写一个Controller来动静扭转服务的状态 @RestControllerpublic class ControllerTest { @Autowired private HealthChecker healthChecker; @RequestMapping("/change") public String test(Boolean flag) { healthChecker.setUp(new AtomicBoolean(flag)); return "success"; }}实现HealthChecker,这样会发现启动、下线服务 Eureka Server 的状态不会变成 Down,只有通过调用接口手动扭转利用状态 Server 的状态才会产生扭转,大家能够自行测试。 ...

July 25, 2022 · 1 min · jiezi

关于eureka:限流实现Eurekaclient-的RateLimiter

/* Copyright 2014 Netflix, Inc. *Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at *http://www.apache.org/license... *Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. */package com.netflix.discovery.util; ...

December 26, 2021 · 2 min · jiezi

关于eureka:Eureka源码分析之-Client的启动流程

Eureka Client 是一个Java 客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、应用轮询负载算法的负载均衡器。 在利用启动后,将会向Eureka Server发送心跳(默认周期为30秒),如果Eureka Server在多个心跳周期没有收到某个节点的心跳,Eureka Server 将会从服务注册表中把这个服务节点移除(默认90秒)。Eureka Client具备缓存的机制,即便所有的Eureka Server 都挂掉的话,客户端仍然能够利用缓存中的信息生产其它服务的API。上面一起来看Client客户端相干操作的流程图。 1.从启动类动手 从启动类的@EnableDiscoveryClient注解动手看调用流程。进入 EnableDiscoveryClient 之后,通过正文晓得它的作用是为了激活 DiscoveryClient: 首先是在类头应用了 import 注解引入了:EnableDiscoveryClientImportSelector。该类的次要作用是实例化:AutoServiceRegistrationConfiguration。 @Order(Ordered.LOWEST_PRECEDENCE - 100)public class EnableDiscoveryClientImportSelector extends SpringFactoryImportSelector<EnableDiscoveryClient> { @Override public String[] selectImports(AnnotationMetadata metadata) { **//调用父类的办法,拿到通过父类办法要注入的全门路类名数组** String[] imports = super.selectImports(metadata); **//取得该注解(@EnableDiscoveryClient)的所有属性参数** AnnotationAttributes attributes = AnnotationAttributes.fromMap( metadata.getAnnotationAttributes(getAnnotationClass().getName(), true)); **//取得属性autoRegister的值,该值默认是true的** boolean autoRegister = attributes.getBoolean("autoRegister"); **//依据注解配置来判断是否要实例化上面的那个主动配置类** if (autoRegister) { List<String> importsList = new ArrayList<>(Arrays.asList(imports)); importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration"); imports = importsList.toArray(new String[0]); } else { Environment env = getEnvironment(); if(ConfigurableEnvironment.class.isInstance(env)) { ConfigurableEnvironment configEnv = (ConfigurableEnvironment)env; LinkedHashMap<String, Object> map = new LinkedHashMap<>(); map.put("spring.cloud.service-registry.auto-registration.enabled", false); MapPropertySource propertySource = new MapPropertySource( "springCloudDiscoveryClient", map); configEnv.getPropertySources().addLast(propertySource); } } return imports; } @Override protected boolean isEnabled() { return getEnvironment().getProperty( "spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE); } @Override protected boolean hasDefaultFactory() { return true; }}这里最终的目标是想实例化:AutoServiceRegistrationConfiguration,咱们来看他做了什么: ...

June 13, 2021 · 12 min · jiezi

关于eureka:Eureka系列

Eureka - 简略示例Eureka - Client服务启动Eureka - 服务发现Eureka - 服务续约和注册、下线Eureka - Server服务启动Eureka - 服务发现(Server)Eureka - 服务续约和注册、下线(Server)

December 21, 2020 · 1 min · jiezi

关于eureka:Eureka-服务续约和注册下线Server

续约续约的时候,调用的是服务端的InstanceResource#renewLease办法。调用的是InstanceRegistry.renew办法。 @PUTpublic Response renewLease( @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication, @QueryParam("overriddenstatus") String overriddenStatus, @QueryParam("status") String status, @QueryParam("lastDirtyTimestamp") String lastDirtyTimestamp) { boolean isFromReplicaNode = "true".equals(isReplication); boolean isSuccess = registry.renew(app.getName(), id, isFromReplicaNode); //其余略 return response;}InstanceRegistry.renew会发一个EventPublish的续约监听(代码略),而后调用PeerAwareInstanceRegistryImpl#renew。PeerAwareInstanceRegistryImpl#renew。会调用AbstractInstanceRegistry#renew,如果胜利,会进行节点间的复制。 public boolean renew(final String appName, final String id, final boolean isReplication) { if (super.renew(appName, id, isReplication)) { replicateToPeers(Action.Heartbeat, appName, id, null, null, isReplication); return true; } return false;}AbstractInstanceRegistry#renew,获取续约,如果有的话。 public boolean renew(String appName, String id, boolean isReplication) { RENEW.increment(isReplication); Map<String, Lease<InstanceInfo>> gMap = registry.get(appName); Lease<InstanceInfo> leaseToRenew = null; if (gMap != null) { leaseToRenew = gMap.get(id); } if (leaseToRenew == null) { RENEW_NOT_FOUND.increment(isReplication); logger.warn("DS: Registry: lease doesn't exist, registering resource: {} - {}", appName, id); return false; } else { // 其余略 renewsLastMin.increment(); leaseToRenew.renew(); return true; }}Lease#renew,更新lastUpdateTimestamp工夫。 ...

December 21, 2020 · 2 min · jiezi

关于eureka:Eureka-服务发现Server

当客户端申请全量更新的时候,会调用ApplicationsResource#getContainers这个办法。如果是增量,会调用ApplicationsResource#getContainerDifferential这个办法。他次要是获取只读缓存的内容,如果只读缓存不存在,返回只读读写缓存的内容。 public Response getContainers(@PathParam("version") String version, @HeaderParam(HEADER_ACCEPT) String acceptHeader, @HeaderParam(HEADER_ACCEPT_ENCODING) String acceptEncoding, @HeaderParam(EurekaAccept.HTTP_X_EUREKA_ACCEPT) String eurekaAccept, @Context UriInfo uriInfo, @Nullable @QueryParam("regions") String regionsStr) { //其余略 response = Response.ok(responseCache.get(cacheKey)) .build(); //其余略 CurrentRequestVersion.remove(); return response;}public String get(final Key key) { return get(key, shouldUseReadOnlyResponseCache);}@VisibleForTestingString get(final Key key, boolean useReadOnlyCache) { Value payload = getValue(key, useReadOnlyCache); if (payload == null || payload.getPayload().equals(EMPTY_PAYLOAD)) { return null; } else { return payload.getPayload(); }}@VisibleForTestingValue getValue(final Key key, boolean useReadOnlyCache) { Value payload = null; try { //应用只读缓存 if (useReadOnlyCache) { // 如果只读缓存有值,返回只读缓存的,如果没值,返回读写缓存 final Value currentPayload = readOnlyCacheMap.get(key); if (currentPayload != null) { payload = currentPayload; } else { payload = readWriteCacheMap.get(key); readOnlyCacheMap.put(key, payload); } } else { payload = readWriteCacheMap.get(key); } } catch (Throwable t) { logger.error("Cannot get value for key : {}", key, t); } return payload;}下面的代码流程如下:readOnlyCacheMap的值是怎么来的呢?Eureka - Server服务启动PeerAwareInstanceRegistry#init办法中提到了ResponseCacheImpl构造函数中,没30秒会把readWriteCacheMap的值赋值给readOnlyCacheMap。ResponseCacheImpl初始化的时候,咱们看到他默认180秒后会过期。 ...

December 21, 2020 · 1 min · jiezi

关于eureka:Eureka-Server服务启动

作为一个server端,他有以下性能: 服务同步(replicate):Eureka Server集群会相互同步数据,放弃最终一致性。服务剔除(evict):把可能故障的服务剔除下线。响应客户端的服务注册、服务发现、服务续约、服务下线等申请。EurekaServerAutoConfigurationEureka - 简略示例曾经看到,Server端是须要@EnableEurekaServer注解的。EnableEurekaServer中有个@Import(EurekaServerMarkerConfiguration.class) @Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(EurekaServerMarkerConfiguration.class)public @interface EnableEurekaServer {}EurekaServerMarkerConfiguration做的次要事件就是加载Marker。 @Configuration(proxyBeanMethods = false)public class EurekaServerMarkerConfiguration { @Bean public Marker eurekaServerMarkerBean() { return new Marker(); } class Marker { }}综上,@EnableEurekaServer做的事件就是加载Marker,Marker类什么也没有,那这个Marker是干嘛用的呢?springboot的主动拆卸读取Eureka Server的spring.factories文件,咱们看到EurekaServerAutoConfiguration类,这个类有个@ConditionalOnBean的注解,刚好就是下面的Marker类,所以引入了@EnableEurekaServer就是创立了Marker类,让EurekaServerAutoConfiguration能够加载。 @Configuration(proxyBeanMethods = false)@Import(EurekaServerInitializerConfiguration.class)@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)@EnableConfigurationProperties({ EurekaDashboardProperties.class, InstanceRegistryProperties.class })@PropertySource("classpath:/eureka/server.properties")public class EurekaServerAutoConfiguration implements WebMvcConfigurer { // 其余略}EurekaServerConfigEurekaServerConfig的加载,eureka.server前缀的配置都是这个类里。这里默认了向服务器读取失败的重试的次数是5。 @Configuration(proxyBeanMethods = false)protected static class EurekaServerConfigBeanConfiguration { @Bean @ConditionalOnMissingBean public EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) { EurekaServerConfigBean server = new EurekaServerConfigBean(); if (clientConfig.shouldRegisterWithEureka()) { // Set a sensible default if we are supposed to replicate server.setRegistrySyncRetries(5); } return server; }}PeerAwareInstanceRegistry次要是用于集群注册表,这里的构造函数会开启一个线程,用来清理过期的增量信息。 ...

December 18, 2020 · 7 min · jiezi

关于eureka:Eureka-服务续约和注册

服务续约服务续约的线程和Eureka - 服务发现中的一样,这里不再解说,咱们间接通过HeartbeatThread的run办法看renew办法。 boolean renew() { EurekaHttpResponse<InstanceInfo> httpResponse; try { // 调用EurekaServer地址+"apps/" + appName + '/' + id httpResponse = eurekaTransport.registrationClient.sendHeartBeat(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null); logger.debug(PREFIX + "{} - Heartbeat status: {}", appPathIdentifier, httpResponse.getStatusCode()); if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) { REREGISTER_COUNTER.increment(); logger.info(PREFIX + "{} - Re-registering apps/{}", appPathIdentifier, instanceInfo.getAppName()); long timestamp = instanceInfo.setIsDirtyWithTime(); boolean success = register(); if (success) { instanceInfo.unsetIsDirty(timestamp); } return success; } return httpResponse.getStatusCode() == Status.OK.getStatusCode(); } catch (Throwable e) { logger.error(PREFIX + "{} - was unable to send heartbeat!", appPathIdentifier, e); return false; }}服务注册在Eureka - Client服务启动中提到initScheduledTasks中会调用InstanceInfoReplicator#start办法。 ...

December 17, 2020 · 1 min · jiezi

关于eureka:Eureka-服务发现

在Eureka - Client服务启动咱们看到,注册表获取的中央有两个,一个是EurekaClient构造函数,一个是定时器每隔30秒去获取。咱们先看看定时器TimedSupervisorTask的run办法 定时器这个办法有三个比拟重要的参数,timeoutMillis、delay、maxDelay。比方频率是30s,那这个maxDelay就是30*10=300s(这个10的起源参考上一篇),delay在这里是每次都翻倍,然而不能比maxDelay大。整个设计思路是,如果调用30s超时,那就用60秒,如果再超时,就始终翻,然而不能超过300s。如果在前面的调用中失常了,那delay就复原到30s,下次超时持续翻倍。 @Overridepublic void run() { Future<?> future = null; try { // 执行工作 future = executor.submit(task); threadPoolLevelGauge.set((long) executor.getActiveCount()); // 指定超时工夫 future.get(timeoutMillis, TimeUnit.MILLISECONDS); // block until done or timeout //设置delay delay.set(timeoutMillis); threadPoolLevelGauge.set((long) executor.getActiveCount()); successCounter.increment(); } catch (TimeoutException e) { logger.warn("task supervisor timed out", e); timeoutCounter.increment(); // 获取delay long currentDelay = delay.get(); // maxDelay和currentDelay的2倍中取最小值 long newDelay = Math.min(maxDelay, currentDelay * 2); // 设置为下面最小值 delay.compareAndSet(currentDelay, newDelay); } catch (RejectedExecutionException e) { // 其余的略 rejectedCounter.increment(); } catch (Throwable e) { // 其余的略 throwableCounter.increment(); } finally { if (future != null) { future.cancel(true); } // 把工作放入定时器,工夫是delay if (!scheduler.isShutdown()) { scheduler.schedule(this, delay.get(), TimeUnit.MILLISECONDS); } }}服务发现判断增量获取还是全量获取 ...

December 17, 2020 · 3 min · jiezi

关于eureka:Eureka-Client服务启动

咱们从上面的图能够看出,作为一个client端,他有以下性能: Register(服务注册):向Eureka Server注册本身的信息,比方IP地址、端口等。Renew(服务续约):服务启动后,每隔30秒会向Eureka Server发送心跳进行服务续约。Get(服务发现):获取向Eureka Server注册的服务列表,并缓存本地,默认30秒。Cancel(服务下线):向Eureka Server发送下线信息,Eureka Server会把这个服务标记为下线。 服务启动springboot的主动拆卸读取Eureka Client的spring.factories文件,咱们看到他外面有多个EnableAutoConfiguration,次要的类是EurekaClientAutoConfiguration。EurekaClientAutoConfiguration类中有多个bean的加载,咱们先看看EurekaInstanceConfigBean的加载。 EurekaInstanceConfigBeanEurekaInstanceConfigBean有个@ConfigurationProperties("eureka.instance")注解,所以咱们在配置文件里写的eureka.instance.instanceId这类的信息最终都在赋值给这个类。还有比拟重要的leaseRenewalIntervalInSeconds续约频率(默认每30秒)、leaseExpirationDurationInSeconds续约过期工夫(默认90秒)都是在这个类配置的。 @Bean@ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT)public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils, ManagementMetadataProvider managementMetadataProvider) { // 省略局部代码 EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils); // 省略局部代码 return instance;}ApplicationInfoManagerApplicationInfoManager也是在EurekaClientAutoConfiguration类中。创立eurekaApplicationInfoManager对象的时候,会先创立InstanceInfo对象,InstanceInfo对象的值大部分是从EurekaInstanceConfig复制过去的,另外租约信息是寄存在InstanceInfo的leaseInfo中。所以初始化ApplicationInfoManager的时候,就是赋值EurekaInstanceConfig和InstanceInfo。 @Bean@ConditionalOnMissingBean(value = ApplicationInfoManager.class, search = SearchStrategy.CURRENT)@org.springframework.cloud.context.config.annotation.RefreshScope@Lazypublic ApplicationInfoManager eurekaApplicationInfoManager( EurekaInstanceConfig config) { InstanceInfo instanceInfo = new InstanceInfoFactory().create(config); return new ApplicationInfoManager(config, instanceInfo);}EurekaClientConfigBeanEurekaClientConfigBean也是一个配置信息的bean,他次要是EurekaClient和EurekaServer相干的信息,比方EurekaServer的地址defaultZone、是否从注册核心拉取注册信息fetchRegistry(默认true),拉取的频率registryFetchIntervalSeconds(默认每30秒)、是否向注册核心注册registerWithEureka(默认true)等。 @Bean@ConditionalOnMissingBean(value = EurekaClientConfig.class, search = SearchStrategy.CURRENT)public EurekaClientConfigBean eurekaClientConfigBean(ConfigurableEnvironment env) { return new EurekaClientConfigBean();}EurekaClient创立一个EurekaClient类,这个类就是负责服务的注册、续约、勾销、获取注册列表。 ...

December 17, 2020 · 2 min · jiezi

关于eureka:思否技术周刊-智能手机屏幕之战正酣三星宣布推出全新智能显示器搭载-Tizen-OS飞书发布独立-APP飞书文档

本周关键词: 折叠手机 EUV 三星飞书AMD智能手机屏幕之战正酣,苹果测试折叠设施,OPPO将发可伸缩手机11 月 16 日,据外媒报道,苹果曾经开始测试折叠屏,新设施预计会在 2022 年推出。明天国内智能手机厂商 OPPO 用一句“手机屏幕真的到’头’了么”,将其最新的概念机送上了热搜。 三星的 Galaxy Fold,华为的 Mate X 曾经在智能手机市场开拓了一条全新的路线。当初,仿佛到了苹果认为的退出折叠屏大军的成熟机会,而 OPPO 则抉择另辟蹊径,无望推出一款具备伸缩屏幕的新机。(起源:SegmentFault) 韩媒:韩国外乡企业在 EUV 光刻技术方面获得重大进展11 月 16 日,据韩国媒体 BusinessKorea 上周报道,韩国外乡企业在 EUV 光刻技术方面获得了极大停顿。但并没有提到是哪一家企业,正当揣测应指代韩国整个半导体光刻产业。 EUV 光刻技术是多种先进技术的复合体,例如多层反射镜,多层掩模,防护膜,光源和注册表(registries)。在过来的十年中,包含三星电子在内的寰球公司进行了深刻的钻研和开发,以确保技术处于领先地位。 按公司划分,寰球六大公司的专利申请数占了总数的 59%,卡尔蔡司(德国)占 18%,三星电子(韩国)占 15%,ASML(荷兰)占 11%,S&S Tech(韩国)占 8%,台积电(台湾)为 6%,SK 海力士(韩国)为 1%。韩媒还提到了韩国专利数量,据韩国知识产权局 (KIPO) 公布的《近 10 年 (2011-2020 年) 专利申请报告》显示,2019 年,韩国提交的专利申请数量为 40 件,超过了国外企业的 10 件。(起源:IT 之家) 三星发表推出全新智能显示器:搭载 Tizen OS11 月 17 日,三星公布了全新的智能显示器,这是一款具备工作、学习和娱乐性能的全新显示解决方案。与三星智能电视一样,三星全新智能显示器也采纳了 Tizen 操作系统,为 PC 和智能手机提供了泛滥的连贯形式。 ...

November 22, 2020 · 1 min · jiezi

关于eureka:Eureka组件

运行机制:注册——提供者一次次重复连贯eureka,晓得注册胜利为止拉取——每隔30秒拉取一次注册列表,更新注册信息心跳——每30秒发送一次心跳,3次收不到心跳,eureka会删除这个服务自我保护模式——非凡状况,因为网络不稳固15秒内85%服务器呈现心 跳异样,会进入自我保护模式,爱护所有的注册信息不删除, 网络复原后,能够主动退出保护模式,开发测试期间,能够敞开保护模式 搭建eure服务增加 eureka server依赖yml配置敞开保护模式 主机名(集群中辨别每台服务器) 针对单台服务器,不向本人注册,不从本人拉取 启动类加@EnableEurekaService 启动eureka 批改hosts文件 增加 eureka 域名映射

October 23, 2020 · 1 min · jiezi

关于eureka:SpringCloud注册中心eureka

注册核心在之前的文章中,有说过Dubbo微服务框架,微服务中有一个关键环节就是注册核心.注册核心的最终目标就是:服务发现(通过注册核心去发现其余服务) 为了实现该最终目标,注册核心中会生成注册表,注册表中记录的是服务的地址;客户端会依据注册表中的地址去调用服务. 分类就像咱们在Dubbo微服务框架中所应用的zookeeper之外,还有很多风行应用的注册核心服务,如:1)zookeeper(阿里等罕用) 2)eureka(springcloud举荐应用) 3)nacos 4)etcd... 所以像之前学习与应用Dubbo框架时,应用的是zookeeper注册核心;在接下来的springcloud的学习与应用中,将去应用eureka注册核心. eureka简介Eureka是Netflix开发的服务发现框架,自身是一个基于REST的服务,次要用于定位运行在AWS域中的中间层服务,以达到负载平衡和中间层服务故障转移的目标。SpringCloud将它集成在其子我的项目spring-cloud-netflix中,以实现SpringCloud的服务发现性能. eureka运行机制注册:服务提供者一次次重复尝试注册,直到注册核心中注册胜利为止;拉取:消费者每隔30秒拉取一次注册表,去更新注册表;心跳:服务提供者每隔30秒向eureka发送一次心跳,eureka若间断3次收不到心跳,会删除注册表中该服务地址;自我爱护机制:1).因为网络不稳固,15秒内,85%以上的服务器都呈现心跳异样(1次未收到心跳),就会触发自我爱护机制,爱护所有注册地址不被删除;2).期待网络复原后,能够主动退出保护模式,恢复正常;留神:开发测试期间会影响,能够先敞开自我保护模式 eureka和zookeeper区别eureka:AP - 强调可用性/ 集群 - 对等构造zookeeper:CP - 强调一致性/ 集群 - 主从构造 eureka组件Eureka蕴含两个组件:Eureka Server和Eureka Client。 Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息能够在界面中直观的看到。 Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、应用轮询(round-robin)负载算法的负载均衡器。 搭建eureka服务器增加eureka-server依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn.tedu</groupId> <artifactId>sp05-eureka</artifactId> <version>0.0.1-SNAPSHOT</version> <name>sp05-eureka</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>yml增加配置application.yml中增加: ...

September 23, 2020 · 1 min · jiezi