Apollo配置中心改造二:注册中心Eureka替换为zookeeper
2019-05-07 10:08
1046 查看
改造背景:
许多公司微服务项目已经在使用zookeeper,为了方便服务管理,替换为zookeeper比较利于运维团队管理统一的注册中心。
解决:
按照本文如下五步对apollo配置中心改造,即可实现apollo注册中心替换为zookeeper。
注:保留原有组件之间调用关系,只是简单将原有去Eureka注册发现服务换为了Zookeeper,原有metaservice模块继续用作apollo内部组件服务注册发现,有时间可以自行将各个模块作为zk客户端改造下代码(只需将ServiceController类下放到各个模块查找服务即可)。
本文仅为zk服务端运维能监控和管理apollo组件。
1、最外层pom.xml改造
去除
spring-cloud-starter-netflix-eureka-client相关依赖
添加zk相关依赖,让三个组件均注册到zk:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-all</artifactId> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.10</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
2、apollo-biz改造
修改点一:
pom.xml文件去除
spring-cloud-starter-netflix-eureka-client相关依赖
修改点二:
删除此类
com.ctrip.framework.apollo.biz.eureka.ApolloEurekaClientConfig
3、apollo-configservice改造
修改点一:
pom文件去除
spring-cloud-starter-netflix-eureka-server相关依赖(zk服务端管理服务)
修改点二:
com.ctrip.framework.apollo.metaservice.service.DiscoveryService#getConfigServiceInstances()
出入参不变,方法体替换为
List<ServiceInstance> application = zookeeperDiscoveryClient.getInstances(ServiceNameConsts.APOLLO_CONFIGSERVICE); if (application == null) { Tracer.logEvent("Apollo.ZkDiscovery.NotFound", ServiceNameConsts.APOLLO_CONFIGSERVICE); } return application != null ? application : Collections.emptyList();
修改点三:
com.ctrip.framework.apollo.metaservice.service.DiscoveryService#getMetaServiceInstances()
出入参不变,方法体替换为:
List<ServiceInstance> application = zookeeperDiscoveryClient.getInstances(ServiceNameConsts.APOLLO_METASERVICE); if (application == null) { Tracer.logEvent("Apollo.ZkDiscovery.NotFound", ServiceNameConsts.APOLLO_METASERVICE); } return application != null ? application : Collections.emptyList();
修改点四:
com.ctrip.framework.apollo.metaservice.service.DiscoveryService#getAdminServiceInstances()
出入参不变,方法体替换为:
List<ServiceInstance> application = zookeeperDiscoveryClient.getInstances(ServiceNameConsts.APOLLO_ADMINSERVICE); if (application == null) { Tracer.logEvent("Apollo.ZkDiscovery.NotFound", ServiceNameConsts.APOLLO_ADMINSERVICE); } return application != null ? application : Collections.emptyList();
修改点五:
com.ctrip.framework.apollo.metaservice.controller.ServiceController#getMetaService()
出入参不变,方法体替换为:
List<ServiceInstance> instances = discoveryService.getMetaServiceInstances(); List<ServiceDTO> result = instances.stream().map(new Function<ServiceInstance, ServiceDTO>() { @Override public ServiceDTO apply(ServiceInstance instance) { ServiceDTO service = new ServiceDTO(); service.setAppName(instance.getServiceId()); service.setInstanceId(null); service.setHomepageUrl(instance.getUri().toString()); return service; } }).collect(Collectors.toList()); return result;
修改点六:
com.ctrip.framework.apollo.metaservice.controller.ServiceController#getConfigService( @RequestParam(value = "appId", defaultValue = "") String appId, @RequestParam(value = "ip", required = false) String clientIp)
出入参不变,方法体替换为:
List<ServiceInstance> instances = discoveryService.getConfigServiceInstances(); List<ServiceDTO> result = instances.stream().map(new Function<ServiceInstance, ServiceDTO>() { @Override public ServiceDTO apply(ServiceInstance instance) { ServiceDTO service = new ServiceDTO(); service.setAppName(instance.getServiceId()); service.setInstanceId(null); service.setHomepageUrl(instance.getUri().toString()); return service; } }).collect(Collectors.toList()); return result;
修改点七:
com.ctrip.framework.apollo.metaservice.controller.ServiceController#getAdminService()
出入参不变,方法体替换为:
List<ServiceInstance> instances = discoveryService.getAdminServiceInstances(); List<ServiceDTO> result = instances.stream().map(new Function<ServiceInstance, ServiceDTO>() { @Override public ServiceDTO apply(ServiceInstance instance) { ServiceDTO service = new ServiceDTO(); service.setAppName(instance.getServiceId()); service.setInstanceId(instance.getHost()+"|"+instance.getScheme()+"|"+instance.getMetadata()+"|"+instance.getPort()+"&"); service.setHomepageUrl(instance.getUri().toString()); return service; } }).collect(Collectors.toList()); return result;
4、configservice、adminservice、portal组件bootstrap.properties均添加zk配置
################# 服务注册 ################# #注册中心,根存储路径,默认也是/service spring.cloud.zookeeper.discovery.root=/services #注册中心,连接串,多个地址逗号分隔 spring.cloud.zookeeper.connect-string=127.0.0.1:2181 #是否注册 spring.cloud.zookeeper.discovery.enabled=true spring.cloud.zookeeper.discovery.register=true spring.cloud.zookeeper.discovery.instance-host=${spring.cloud.client.ip-address} ################# 监控信息 ################# #修改访问路径 2.0之前默认是/ 2.0默认是 /actuator #不改此配置,服务调用会有异常,可以通过这个属性值修改 #management.endpoints.web.base-path=/actuator #开放所有页面节点 默认只开启了health、info两个节点 management.endpoints.web.exposure.include=* #management.endpoints.enabled=false #显示健康具体信息 默认不会显示详细信息 #management.endpoint.health.show-details=always
5、configservice、adminservice、portal启动类修改
三个组件启动类去除注解
@EnableEurekaServer或
@EnableEurekaClient均替换为
@EnableDiscoveryClient
相关文章推荐
- Spring Cloud使用zookeeper作为服务注册中心与配置中心
- linux系统配置Dubbo注册中心(Zookeeper)---超详细吐血过程
- Spring Cloud 中使用zookeeper作为服务注册中心与配置中心
- ZooKeeper 集群的安装、配置---Dubbo 注册中心
- zookeeper 注册中心安装配置
- eureka的安全配置及多注册中心配置与注册
- Spring Cloud -- 配置Eureka注册中心,注册服务
- 高可用Eureka注册中心配置说明(双机部署)
- Dubbo 注册中心集群Zookeeper-3.4.9的安装、 配置
- Dubbo框架初探【用Spring配置声明暴露服务(可以使用multicast广播注册中心暴露服务地址或者使用zookeeper注册中心暴露服务地址)、加载Spring配置,启动服务】
- 【Spring Cloud】--注册中心Eureka的高可用配置
- Dubbo之——Dubbo 注册中心集群Zookeeper-3.4.9的安装、 配置
- ZooKeeper 集群的安装、配置、高可用测试 Dubbo 注册中心集群 Zookeeper-3.4.6
- (四)SpringBoot+SpringCloud —— Eureka注册中心的机制与配置
- Dubbo分布式环境系列之一:分布式注册中心ZooKeeper的安装及配置
- Eureka-注册中心集群配置
- 通过RestTemplate的负载均衡配置和eureka注册中心来实现服务间默认规则调用
- SpringCloud-Eureka配置注册中心
- 作为服务注册中心,Eureka比Zookeeper好在哪里
- 使用Zookeeper作为注册中心和配置中心