关于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本来地位是放在 ...