2019独角兽企业重金招聘Python工程师标准>>>

推荐: jeesuite开发框架,免费开源、一站式解决方案。

最近规划自动化运维以及统一监控需求,鉴于目前公司内部大部分项目采用spring cloud体系架构、另外还有一些老的传统spring web的项目,于是就考虑把老的项目通过低成本改造的方式接入spring cloud体系,也就是可以通过eureka注册和服务发现、通过zuul服务路由。

说干就干,通过eureka官方实例和研究spring boot注册eureka源码发现这个也很容易实现,所以废话不多说,直接贴代码了 。

首先加入项目依赖(maven为例)
<dependency><groupId>com.netflix.eureka</groupId><artifactId>eureka-client</artifactId><version>1.4.12</version><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion><exclusion><groupId>com.google.guava</groupId><artifactId>guava</artifactId></exclusion><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></exclusion><exclusion><groupId>javax.ws.rs</groupId><artifactId>jsr311-api</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>com.netflix.archaius</groupId><artifactId>archaius-core</artifactId><version>0.7.4</version><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-netflix-core</artifactId><version>1.2.6.RELEASE</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></exclusion></exclusions></dependency>
加入配置文件
eureka.region=default
eureka.registration.enabled=true
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://192.168.1.100:7861/eureka
eureka.decoderName=JacksonJsoneureka.name=demo
eureka.vipAddress=${eureka.name}-service
eureka.port=8081
eureka.homePageUrl=http://192.168.1.101:${eureka.port}
eureka.healthCheckUrl=http://192.168.1.101:${eureka.port}/service/health
eureka.statusPageUrl=http://192.168.1.101:${eureka.port}/service/info
  • spring.cloud.client.ipAddress :为自定义变量
  • healthCheckUrl,statusPageUrl接口可以不要,但是为了监控可以自己实现一个简单的接口即可
初始化eureka客户端
private void initEurekaClient() throws Exception{Properties properties = new Properties();InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("eureka.properties");properties.load(inputStream);//properties.setProperty("eureka.ipAddr", IpUtils.getLocalIpAddr());instanceId = properties.getProperty("eureka.ipAddr") + ":" + properties.getProperty("eureka.ipAddr") + "/" + properties.getProperty("eureka.name");properties.setProperty("eureka.instanceId", instanceId);ConfigurationManager.loadProperties(properties);MyDataCenterInstanceConfig instanceConfig = new MyDataCenterInstanceConfig();InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);DefaultEurekaClientConfig clientConfig = new DefaultEurekaClientConfig();eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig);}
注册服务
private void waitForRegistrationWithEureka() {applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.STARTING);try {Thread.sleep(2000);} catch (InterruptedException e) {}applicationInfoManager.setInstanceStatus(InstanceInfo.InstanceStatus.UP);long startTime = System.currentTimeMillis();//开启一个线程验证注册结果new Thread(new Runnable() {@Overridepublic void run() {while (true) {if (System.currentTimeMillis() - startTime > VERIFY_WAIT_MILLIS) {log.warn(" >>>> service registration status not verify,please check it!!!!");return;}try {List<InstanceInfo> serverInfos = eurekaClient.getInstancesByVipAddress(vipAddress, false);for (InstanceInfo nextServerInfo : serverInfos) {if (nextServerInfo.getIPAddr().equals(IpUtils.LOCAL_BACK_IP)|| nextServerInfo.getIPAddr().equals(IpUtils.getLocalIpAddr())) {String instanceInfoJson = JsonUtils.getMapper().writerWithDefaultPrettyPrinter().writeValueAsString(nextServerInfo);log.info("verifying service registration with eureka finished,instance:\n{}",instanceInfoJson);return;}}} catch (Throwable e) {}try {Thread.sleep(5000);} catch (Exception e1) {}log.info("Waiting 5s... verifying service registration with eureka ...");}}}).start();}

通过这几步就完成了eureka的注册,登录eureka控制台你将能看到对应注册信息。但是在zuul转发调用过程发现一个问题:无法识别hostname,如果你们的服务器之间没有做hostname同步就需要继续改造,于是就看了下springboot注册eureka有一个配置项eureka.instance.preferIpAddress,所以我们也可以模仿他的实现。于是在初始化客户端的时候我们需要这样改造:

MyDataCenterInstanceConfig instanceConfig = new MyDataCenterInstanceConfig(){@Overridepublic String getHostName(boolean refresh) {String hostName = super.getHostName(refresh);if(ResourceUtils.getBoolean("eureka.preferIpAddress")){hostName = IpUtils.getLocalIpAddr();}return hostName;}@Overridepublic String getIpAddress() {return IpUtils.getLocalIpAddr();}};

这样,注册的真实服务地址就是ip了。服务注册就搞定收工了。

接下来就是服务发现,及与其他springboot项目一样通过注册中心vipAddress互相调用。实际过程就是调用前去eureka拿一个真实地址替换vipAddress变量。

获取真实服务地址

public String getRealServerHost(String serviceId){InstanceInfo serverInfo = eurekaClient.getNextServerFromEureka(serviceId, false);String realServerName = serverInfo.getIPAddr() + ":" + serverInfo.getPort();return realServerName;
}

下面是我实现的几个resttemplate

public class EurekaRestTemplateBuilder {private static Map<String, RestTemplate> restTemplates = new HashMap<>();public static synchronized RestTemplate build(ClientHttpRequestInterceptor ...interceptors ){return build("default", interceptors);}public static synchronized RestTemplate build(String name,ClientHttpRequestInterceptor ...interceptors ){if(restTemplates.containsKey(name))return restTemplates.get(name);SimpleClientHttpRequestFactory factory = new EurekaClientHttpRequestFactory();  factory.setReadTimeout(15000);//ms  factory.setConnectTimeout(5000);//ms RestTemplate restTemplate = new RestTemplate(factory);List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<>();interceptorList.add(new RestTemplateAutoHeaderInterceptor());if(interceptors != null && interceptors.length > 0){for (ClientHttpRequestInterceptor interceptor : interceptors) {interceptorList.add(interceptor);}}restTemplate.setInterceptors(interceptorList);//restTemplate.setErrorHandler(new CustomResponseErrorHandler());//restTemplates.put(name, restTemplate);return restTemplate;}private static class EurekaClientHttpRequestFactory extends SimpleClientHttpRequestFactory{@Overridepublic ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException {uri = convertToRealUri(uri);return super.createRequest(uri, httpMethod);}@Overridepublic AsyncClientHttpRequest createAsyncRequest(URI uri, HttpMethod httpMethod) throws IOException {uri = convertToRealUri(uri);return super.createAsyncRequest(uri, httpMethod);}private URI convertToRealUri(URI uri){String serviceId = uri.getHost();try {              String realHost = EurekaRegistry.getInstance().getRealServerHost(serviceId);uri = new URI(uri.toString().replace(serviceId, realHost));return uri;} catch (Exception e) {throw new RuntimeException(e);}}}
}

接下来就可以调用其他eureka注册服务了。

private RestTemplate restTemplate = EurekaRestTemplateBuilder.build();public List<IdNamePair> getProvinces() {ParameterizedTypeReference<List<IdNamePair>> arearesponseType = new ParameterizedTypeReference<List<IdNamePair>>() {};List<IdNamePair> lists = restTemplate.exchange("http://DEMO-SERVICE/region/provinces", HttpMethod.GET, null, arearesponseType).getBody();return lists;}
ZUUL转发配置
zuul.routes.demo.path=/demo/**
zuul.routes.demo.serviceId=demo-service

到此,服务注册和服务发现都完成了。

有任何问题,请加技术群:230192763讨论

转载于:https://my.oschina.net/vakinge/blog/1590261

遗留非springboot传统项目接入eureka注册与服务发现相关推荐

  1. Eureka 注册中心/服务发现框架

    Eureka 注册中心/服务发现框架 Eureka注册中心/服务发现框架 如何使用构建 Eureka Server ? 加入依赖(此处以Maven为例) 创建Eureka Server 主运行类 单机 ...

  2. Spring Cloud 进阶--Rest微服务加入Eureka服务注册与服务发现(单机版)

    < Rest 微服务加入 Eureka(单机) > 前言 在上一篇博文中,主要对 " 微服务基础模块 " 进行创建,并在 < Eureka 基本理论概述 > ...

  3. 解决:springcloud eureka 注册的服务config-client 状态Status:UNKNOWN (1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. eureka 注册的服务config-client 的 Status 显示为:UNKNOWN  ...

  4. java版spring cloud+spring boot 社交电子商务平台(二)Eureka(服务注册和服务发现基础篇)

    一:Eureka简介 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. ...

  5. 深入了解服务注册与服务发现

    1. 什么是服务注册与发现 我们先来看下什么是服务注册与服务发现? 服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consu ...

  6. 什么是微服务架构?什么是服务注册与服务发现?

    文章目录 基础名词 分布式 高可用 集群 什么是微服务 服务注册与服务发现 SpringCloud Alibaba 服务关系以及调用关系 服务注册中心 Nacos服务发现的领域模型 Nacos元数据 ...

  7. 引入springcloud报错。common依赖找不到_微服务架构:spring cloud之服务注册和服务发现...

    SpringCloud主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路有(Zuul),客户端负载均衡(Ribbon),Archaius,Turbine,Eureka为微服 ...

  8. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    为什么80%的码农都做不了架构师?>>>    第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题--电影微服务中将用户微 ...

  9. NodeJs服务注册与服务发现实现

    前言 由于作者才刚开始学习NodeJs,水平实在有限,本文更像是一篇学习笔记,适合同刚开始学习NodeJs的朋友阅读. 服务治理 如果你的团队正在探索微服务的搭建,那么你们可能就在寻找一种机制,这个机 ...

最新文章

  1. 强强联合!Papers with Code 携手 arXiv,上传论文、提交代码一步到位
  2. mycat快速体验(转)
  3. [JSOI2008]火星人
  4. 《JavaScript应用程序设计》一一2.17 回调函数
  5. 彻底删除 mysql 5.7_Ubuntu16.04彻底删除MySQL5.7
  6. 学习云计算学哪种编程语言_您应该学习哪种编程语言?
  7. 关于svn的安装配置开启服务过程和 eclipse安装SVN插件的方法
  8. VMware Workstation 常见问题解决
  9. [渝粤教育] 西南科技大学 财务会计 在线考试复习资料
  10. inDesign教程,如何控制文档中的页数?
  11. SOEM主站开发笔记-- 点亮第一个LED----SOEM 的simpletest.c代码的解析以及改动
  12. Robomaster视觉教程(二)Win10+VS201x+Opencv3.4.x环境搭建
  13. 什么是肠漏综合征,它如何影响健康?
  14. 到底是什么决定了二极管的最高工作频率?
  15. XJOI 3709 测测你的RP
  16. 堡垒机-百百堡垒机-基于WEB的VNC、RDP、SSH远程控制。无须任何插件,随时随地远程。
  17. 外置USB供电与内置锂电池供电自动切换电路
  18. 放纵如山倒,自律如抽丝
  19. 微信该服务器已饱满,两天前还担心服务器压力的 ZAO,已被微信屏蔽
  20. 转 嵌入式与UML建模 车载GPS

热门文章

  1. CF932E Team Work(第二类斯特林数)
  2. Java 数组+循环升级篇
  3. SpringBoot私人学习笔记
  4. 软件工程实践_Task2_sudoku
  5. MVC HtmlHelper listbox用法
  6. PyTorch 入坑九:权重初始化
  7. element tree不刷新视图_随手“一片”SCI,Qiime2扩增子处理流程确定不了解一下?(一)...
  8. mysql数据库简单指令_Mysql数据库一些简单命令
  9. 使用promise解决回调地狱_回调地狱的由来和如何利用promise解决回调地狱
  10. 三菱q系列特殊继电器一览表_2020山西三菱Q系列PLC模块回收购销