eureka是Java中實現(xiàn)微服務(wù)架構(gòu)服務(wù)發(fā)現(xiàn)的核心工具,其本質(zhì)在于避免硬編碼服務(wù)地址,提高系統(tǒng)靈活性和可維護性。1.搭建eureka server作為注冊中心:引入依賴,添加@enableeurekaserver注解,并在配置文件中指定端口及關(guān)閉自我注冊;2.微服務(wù)注冊到eureka:引入eureka client依賴,使用@enableeurekaclient或@enablediscoveryclient注解,并在配置中設(shè)置服務(wù)名與eureka server地址;3.服務(wù)消費者通過discoveryclient或feign從eureka獲取服務(wù)列表并調(diào)用;4.eureka具備自我保護機制,在網(wǎng)絡(luò)故障時防止誤注銷實例,保障可用性;5.相較于zookeeper的cp設(shè)計,eureka更適用于對可用性要求高的微服務(wù)場景;6.為避免單點故障,可通過搭建eureka集群實現(xiàn)高可用,多個eureka server互相注冊以保證服務(wù)持續(xù)可用。
Java中實現(xiàn)服務(wù)發(fā)現(xiàn),掌握Eureka,本質(zhì)上就是讓你的微服務(wù)架構(gòu)能夠自動找到彼此,避免硬編碼服務(wù)地址,提高系統(tǒng)的靈活性和可維護性。Eureka就是為此而生的一個工具,它充當了服務(wù)注冊中心的角色。
使用Eureka,你需要搭建Eureka Server作為注冊中心,然后讓你的各個微服務(wù)注冊到Eureka Server上。服務(wù)消費者再從Eureka Server獲取服務(wù)列表,實現(xiàn)服務(wù)發(fā)現(xiàn)。
Eureka Server搭建與配置
Eureka Server本質(zhì)上是一個Java應(yīng)用,你需要引入Eureka Server的依賴,然后在你的spring Boot應(yīng)用中添加@EnableEurekaServer注解,啟動這個應(yīng)用,它就變成了Eureka Server。
立即學(xué)習(xí)“Java免費學(xué)習(xí)筆記(深入)”;
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
配置文件(application.yml或application.properties)也很關(guān)鍵,你需要指定Eureka Server的端口,以及一些其他的配置,比如是否注冊自己到Eureka Server(一般不需要)。
server: port: 8761 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false
微服務(wù)注冊到Eureka
你的微服務(wù)也需要引入Eureka Client的依賴,然后在spring boot應(yīng)用中添加@EnableEurekaClient注解(或者@EnableDiscoveryClient,更通用),這樣你的服務(wù)啟動時就會自動注冊到Eureka Server。
@SpringBootApplication @EnableEurekaClient public class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args); } }
微服務(wù)的配置文件也需要配置Eureka Server的地址,以及服務(wù)的名稱。
spring: application: name: your-service-name eureka: client: service-url: defaultZone: http://localhost:8761/eureka/
spring.application.name非常重要,它是服務(wù)在Eureka Server中的唯一標識。
服務(wù)消費者如何發(fā)現(xiàn)服務(wù)
服務(wù)消費者需要使用DiscoveryClient或者LoadBalancerClient從Eureka Server獲取服務(wù)列表,然后選擇一個服務(wù)實例進行調(diào)用。通常,我們會使用RestTemplate或者Feign來實現(xiàn)服務(wù)調(diào)用。
@Autowired private DiscoveryClient discoveryClient; public String callService() { List<ServiceInstance> instances = discoveryClient.getInstances("your-service-name"); if (instances != null && instances.size() > 0) { ServiceInstance instance = instances.get(0); String url = instance.getUri().toString(); RestTemplate restTemplate = new RestTemplate(); String result = restTemplate.getForObject(url + "/your-endpoint", String.class); return result; } return null; }
或者使用Feign,更簡潔:
@FeignClient("your-service-name") public interface YourServiceClient { @GetMapping("/your-endpoint") String yourEndpoint(); }
Eureka自我保護機制是什么?如何理解和應(yīng)對?
Eureka的自我保護機制是為了防止在網(wǎng)絡(luò)分區(qū)故障時,Eureka Server錯誤地注銷服務(wù)實例,導(dǎo)致服務(wù)不可用。當Eureka Server在一定時間內(nèi)沒有收到服務(wù)實例的心跳時,它會進入自我保護模式,停止注銷服務(wù)實例。
理解:這是一種容錯機制,犧牲了一致性,保證了可用性。
應(yīng)對:
- 不要輕易關(guān)閉自我保護機制:除非你非常確定你的網(wǎng)絡(luò)環(huán)境非常穩(wěn)定。
- 監(jiān)控Eureka Server的狀態(tài):及時發(fā)現(xiàn)并處理網(wǎng)絡(luò)問題。
- 保證服務(wù)實例的心跳正常:檢查服務(wù)實例是否正常運行,網(wǎng)絡(luò)是否暢通。
- 使用更健壯的服務(wù)發(fā)現(xiàn)方案:如果你的系統(tǒng)對一致性要求非常高,可以考慮使用Zookeeper或者consul等其他服務(wù)發(fā)現(xiàn)方案。
Eureka和Zookeeper的區(qū)別是什么?選擇哪個更好?
Eureka和Zookeeper都是服務(wù)發(fā)現(xiàn)的解決方案,但它們的設(shè)計理念和服務(wù)場景有所不同。
- Eureka:AP(可用性優(yōu)先),適合cap理論中的AP場景,更注重服務(wù)的可用性,即使在網(wǎng)絡(luò)分區(qū)故障時,也能保證服務(wù)發(fā)現(xiàn)的功能。
- Zookeeper:CP(一致性優(yōu)先),適合CAP理論中的CP場景,更注重數(shù)據(jù)的一致性,在網(wǎng)絡(luò)分區(qū)故障時,可能會犧牲服務(wù)的可用性。
選擇哪個更好,取決于你的業(yè)務(wù)場景:
- 微服務(wù)架構(gòu),對可用性要求高:選擇Eureka。
- 分布式協(xié)調(diào),對一致性要求高:選擇Zookeeper。
實際上,很多大型互聯(lián)網(wǎng)公司會同時使用Eureka和Zookeeper,Eureka用于微服務(wù)架構(gòu),Zookeeper用于分布式協(xié)調(diào)。
如何解決Eureka單點故障?
Eureka Server本身也需要高可用,避免單點故障。解決Eureka單點故障的方案是搭建Eureka集群。
搭建Eureka集群很簡單,只需要啟動多個Eureka Server實例,然后讓它們互相注冊即可。每個Eureka Server都需要配置其他Eureka Server的地址。
eureka: client: service-url: defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
這樣,當一個Eureka Server宕機時,其他的Eureka Server仍然可以提供服務(wù),保證了服務(wù)發(fā)現(xiàn)的可用性。
需要注意的是,Eureka集群中的數(shù)據(jù)最終會達到一致,但并不是強一致性。