Java高级教程之SpringCloud-4:Eureka发现服务和使用服务
除了ZooKeeper,也可以使用Eureka来注册服务。ZooKeeper在节点较少的情况下能保证数据一致性,节点多的情况下可能不保证可用性。Eureka多个节点之间可以互相复制,可用性较高,数据一致性由于复制延迟会有所降低。
Eureka已非开源,且不能与ZooKeeper兼容。所以要注释掉ZooKeeper,才能使用Eureka。Eureka为netflix组件,相关文档可参考spring-cloud-netflix。
https://spring.io/projects/spring-cloud-netflix
Spring Cloud Netflix provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few simple annotations you can quickly enable and configure the common patterns inside your application and build large distributed systems with battle-tested Netflix components. The patterns provided include Service Discovery (Eureka), Circuit Breaker (Hystrix), Intelligent Routing (Zuul) and Client Side Load Balancing (Ribbon)..
在ApplicationMain也把注解改为@EnableEurekaClient
package com.lpplpp.product.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication //@EnableDiscoveryClient @EnableEurekaClient public class ApplicationMain { public static void main(String[] args) { SpringApplication.run(ApplicationMain.class, args); System.out.println("product microservice is running"); } }
因为产品服务product-service和order-service都是客户端,要注册到Eureka才能使用,所以这两个应用的pom.xml和ApplicationMain都要做这个变动。
客户端有了,还要有服务端,Eureka不需要下载启动,只需再创建一个Maven项目,用SpringBoot加载Eureka就可以了。
还需要在这个工程里pom.xml中加入依赖SpringBoot和SpringCloud,以及生成ApplicationMain入口类。
在ApplicationMain类中新增注解@EnableEurekaServer,打印信息为
"Eureka microservice is running"
package com.lpplpp.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class ApplicationMain { public static void main(String[] args) { SpringApplication.run(ApplicationMain.class, args); System.out.println("Eureka microservice is running"); } }
另外要加上application.yml的配置。如果出现“Cannot execute request on any known server”错误,说明registerWithEureka和fetchRegistry没有设置false,因为服务端会尝试注册自己,
启动这个服务,就可以看到已经有Eureka服务了。
Started Eureka Server
这样再启动两个客户端product-service和order-service,这两个服务的application.yml文件配置都要新增Eureka的客户端配置。
访问下浏览器地址http://localhost:8180/order/1
结果:
{"id":1,"name":"mobile order","product":{"id":1,"name":"mobile"}}