由于 Eureka 注册中心只是在内存中保存服务注册实例,并且没有将服务注册实例进行同步,因此我们需要对服务提供和消费进行调整,需要指定服务提供和消费的注册、服务发现的具体Eureka 注册中心配置,由于配置了Eureka 注册中心高可用,因此也必须配置多个 Eureka 注册中心。
服务提供配置
在之前的服务提供项目中进行改造,我们需要调整 src/main/resources 目录中的 application.yml 配置文件,调整后配置如下:
#配置应用名称
spring:
application:
name:helloworld-provider
#服务端口
server:
port:8080
#设置eureka服务注册中心的地址,如果多个以逗号分割
eureka:
client:
service-url:
#defaultZone表示默认的区域的eureka服务地址,多个使用逗号分割
defaultZone:http://eurekaserver01:9000/eureka/,http://eurekaserver02:9000/eureka/
在 defaultZone 属性中,配置了Eureka 注册中心的多个地址,这表示服务提供者需要向多个 Eureka 注册中心进行注册,为了更好的测试一个服务部署多个位置,我们调整一下 REST 服务代码,如下:
@RestController
public class HelloWorldController{
@Value("${server.port}")
private int port;
@RequestMapping(method=RequestMethod.GET,name="speak")
public String speak(@RequestParam(value="body",required=false)Stringbody){
if(body==null||body.equals("")){
return"helloworldport:"+port;
}
return"speak"+body+"port:"+port;
}
}
服务消费配置
在之前的服务提供项目中进行改造,我们需要调整 src/main/resources 目录中的 application.yml 配置文件,调整后配置如下:
#配置应用名称
spring:
application:
name:service-invoker
#配置服务端口
server:
port:8088
#eureka基本配置
eureka:
instance:
#配置应用名称,优先级低于spring.applicaton.name
appname:service-invoker
client:
#配置服务注册中心地址
service-url:
defaultZone:http://eurekaserver01:9000/eureka/,http://eurekaserver02:9000/eureka/
在 defaultZone 属性中,配置了Eureka 注册中心的多个地址,这表示服务消费需要向多个 Eureka 注册中心进行注册和发现服务
测试验证
-
启动多个服务
我们在一台机器使用不同端口号来启动多个服务验证,启动多个终端,执行示例如下:
$> java -jar service-provider-1.0.jar --server.port=8086
$> java -jar service-provider-1.0.jar --server.port=8080
-
启动服务消费
直接启动消费项目,并访问 http://localhost:8088/speak ,能够看到具体返回了访问的服务端口号,多刷新几次可以看到分别访问了 8086 和 8080 端口,表示 Eureka 客户端在请求服务时,通过 Eureka 注册中心发现服务并且使用使用了负载均衡调用
查看注册中心
访问地址 http://192.168.2.214:9000 和 http://192.168.2.215:9000 可以看到,DS Replicas 中有另一台Eureka 注册中心,在 instance currently registered with Eureka 中显示了注册的所有服务,其中可以看到 HELLOWORLD-PROVIDER 服务有2个有效的服务