上篇文章我们的eureka的集群已经搭建完毕,但是我们还没有开始使用,之前我们的page访问的方法是直接写死的,现在我们就可以改为集群的方式来写
@Autowired//注册中心对应的客户端对象 private DiscoveryClient discoveryClient; @RequestMapping("query/{id}") public Products findById(@PathVariable Integer id){ //获取Eureka中注册的leq-service-product实例集合 List<ServiceInstance> services = discoveryClient.getInstances("leq-service-product"); //获取实例集合中的第一个对象(IP,PORT,NAME) ServiceInstance service = services.get(0); //获取ip和端口 String host = service.getHost(); int port = service.getPort(); String url="http://"+host+":"+port+"/product/findById/"+id; System.out.println(url); return restTemplate.getForObject(url,Products.class); }
这里注意DiscoveryClient的导包
import org.springframework.cloud.client.discovery.DiscoveryClient;
写完后重启我们的page项目,重启后访问我们的查询接口,还是正在使用的
Eureka元数据详解
标准元数据:主机名,IP地址,端口号
自定义元数据:可以使用eureka.instance.metadata-map配置,符合key:value存储格式1.在生产项目中修改核心配置文件
#自定义元数据 eureka.instance.metadata-map.username: xm eureka.instance.metadata-map.password: 123456 eureka.instance.metadata-map.telphone: 186666666
2.在page的控制层编写获取的方法并调用
//获取Eureka自定义的元数据信息 public void getMetaDataMap(List<ServiceInstance> serviceInstances){ for (ServiceInstance serviceInstance : serviceInstances) { Map<String, String> metadata = serviceInstance.getMetadata(); Set<String> keys = metadata.keySet(); for (String key : keys) { String value = metadata.get(key); System.out.println("key:"+key+",value:"+value); } } }
3.重启这两个项目,重新访问查询的接口,可以看到元数据信息,有的时候会全部打印,有的时候只会打印端口号
http://localhost:9100/page/query/1
4.客户端
我们也可以在核心配置文件中定义一些配置,当然我配置的这些都是默认的,如果需要可以自己进行更改,默认的是最合适的
#向Eureka服务中心集群注册服务 #租约续约时间间隔,默认为30秒,每隔30秒向注册中心汇报心跳 eureka.instance.lease-renewal-interval-in-seconds=30 #没有心跳后等待90秒,超过90秒了Eureka Server会将服务从列表移除 eureka.instance.lease-expiration-duration-in-seconds=90 #向Eureka服务中心集群服务 #每隔30秒拉取一次服务列表 eureka.client.registry-fetch-interval-seconds=30
5.服务端
服务下线:当服务正常关闭时,会发送服务下线的Resu请求给Eureka_server,服务中心接收到请求后,将该服务置为下线状态
失效剔除:定时进行检查,发现实例在一定时间内没有收到心跳,则会注销此实例
自我保护机制:使Eureka集群更加的健壮,稳定的运行
在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制但我们访问服务中心的时候报错是因为自我保护机制,等一会重新刷新就会消息
1).Eureka Server不再从注册列表中移除,因为长时间没收到心跳而应该过期的服务。
2).Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3).当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
也可以核心配置文件中关闭自我保护机制,但是不建议
#关闭自我保护机制(不建议关闭) #eureka.server.enable-self-preservation=false