本文参照Eureka Github的演示Demo,在自己实践时,发现了官方的sample存在的一些问题(可能官方没更新),文档和网上的资料不多,无法详细获取到解决方案,只能自己倒腾出来,blog记录一下。
参照源码:Eureka-Sample Github
在看此文章前,希望你先阅读Eureka官方文档以了解一些基本概念。
Eureka 运行架构
Eureka Server:Eureka注册中心,具有服务发现和服务注册等功能
Application Service:将服务注册到Server,提供服务
Application Client:从注册中心中查找所需的服务,再请求调用具体提供服务的Service
Eureka Client 有两种: 提供服务的Application Service 和请求服务的Application Client
前期准备
Eureka Server:点击下载后,部署在Tomcat中,启动Tomcat,成功启动后:
启动前按照官方推荐的方式,修改配置优化启动方式(这种方式不要用在生产环境)
eureka-client.properties拷贝到项目中作为Application Service的配置文件,eureka-server.properties作为Eureak Server的配置文件,按官方推荐修改:
# 取消这两个配置的注释
eureka.waitTimeInMsWhenSyncEmpty=0
eureka.numberRegistrySyncRetries=0
最后启动Tomcat.
项目结构
项目中的eureka-client.properties 拷贝自 eureka-server.war包中.
源码地址:Eureka-Sample Source Code
注意,源码中的配置conf有两个配置文件:sample-eureka-service.properties + sample-eureka-client.properties,使用官方给出的示例代码不会自动读取这些配置,所以本例中的配置不使用此处的配置文件,只使用拷贝过来的eureka-client.properties;再者,github上的eureka项目构建使用 Gradle,本文用的是maven的依赖:
<!-- https://mvnrepository.com/artifact/com.netflix.eureka/eureka-client -->
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>1.8.0</version> <!-- 注意版本号 -->
</dependency>
源码中ExampleServiceBase + ExampleEurekaService作为Application Service,ExampleEurekaClient 作为 Application Client。其中 ExampleEurekaGovernatedService.java 可以不要,演示要ExampleEurekaService 已经足够了;后者是普通的启动方式,前者是在google/Guice IOC容器中启动,需要额外依赖Governated(netflix公司对Guice的封装)
运行配置
运行前修改下配置文件:eureka-client.properties
eureka.region=default # 和eureka-server为同一个区,不用修改
eureka.name=sample # eureka此处修改为sample
eureka.vipAddress=sample.mydomain.net # 修改虚拟地址,
eureka.port=8001 # 修改为可用端口,8080已被eureka-server占用
eureka.preferSameZone=false
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://localhost:8080/eureka/v2/
eureka.shouldOnDemandUpdateStatusChange=false
注意,eureka-client.properties 配置文件是用于Application Service连接的配置,即运行ExampleEurekaService时会自动读取该配置文件。
启动示例
运行ExampleEurekaService,显示以下信息:
这里表示Applicaiton Service 正在连接Eureka-Server,由于Eureka自我保护模式,以及心跳周期长的原因(周期性心跳,默认时间为30秒),所以此处连接如没有其他问题,请持续等待;演示时一分钟后终于连接到了Eureka-Server,此时:
运行控制台此时打印出:Service started and ready to process requests…
此时,说明Application Service已经注册到了Eureka-server中,开始接受流量,提供服务。
请求服务
Eureka中服务的注册和发现以域名为索引的访问形式,Client通过域名查找需要Server上的服务,所以在运行Applicaton Client(即ExampleEurekaClient这个类)时,需要指定所需服务的域名,如本例中,eureka-client.properties中配置了eureka.vipAddress=sample.mydomain.net,所以在ExampleEurekaClient中需要指定这个vipAddress:
而后,运行ExampleEurekaClient,如下:
按照官方代码,运行到这里,就开始一直等service的响应,细看下代码,发现:
而ExampleEurekaClient中的发送方式:
明显,readLine()没有读取到终止符,造成了前面一直在阻塞…….
修改下request的内容,加上终止符即可.
最后,本文简单演示Eureka的Helloworld示例,熟悉下Eureka的基本概念和运作方式;网上资料大多都是with Spring Cloud,官方文档对演示示例没有详细的描述,自己还是希望先熟悉各组件再慢慢将其组合使用,对整个框架整体思路会清晰很多。