您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”吧!
案例中有三個(gè)角色:服務(wù)注冊(cè)中心、服務(wù)提供者、服務(wù)消費(fèi)者,其中服務(wù)注冊(cè)中心就是我們上一篇的 Eureka 單節(jié)點(diǎn)啟動(dòng)既可。
流程如下:
啟動(dòng)注冊(cè)中心
服務(wù)提供者生產(chǎn)服務(wù)并注冊(cè)到服務(wù)中心中
消費(fèi)者從服務(wù)中心中獲取服務(wù)并執(zhí)行
服務(wù)提供者
我們假設(shè)服務(wù)提供者有一個(gè) hello() 方法,可以根據(jù)傳入的參數(shù),提供輸出 “hello xxx + 當(dāng)前時(shí)間” 的服務(wù)。
POM 包配置
創(chuàng)建一個(gè)基本的 Spring Boot 應(yīng)用,命名為 eureka-producer,在 pom.xml 中添加如下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
配置文件
application.yml 配置如下
spring: application: name: eureka-producer eureka: client: service-url: defaultZone: http://localhost:7000/eureka/ server: port: 8000
通過(guò) spring.application.name 屬性,我們可以指定微服務(wù)的名稱(chēng)后續(xù)在調(diào)用的時(shí)候只需要使用該名稱(chēng)就可以進(jìn)行服務(wù)的訪問(wèn)。eureka.client.serviceUrl.defaultZone 屬性對(duì)應(yīng)服務(wù)注冊(cè)中心的配置內(nèi)容,指定服務(wù)注冊(cè)中心的位置。為了在本機(jī)上測(cè)試區(qū)分服務(wù)提供方和服務(wù)注冊(cè)中心,使用 server.port 屬性設(shè)置不同的端口。
啟動(dòng)類(lèi)
保持默認(rèn)生成的即可, Finchley.RC1 這個(gè)版本的 Spring Cloud 已經(jīng)無(wú)需添加 @EnableDiscoveryClient 注解了。(那么如果我引入了相關(guān)的 jar 包又想禁用服務(wù)注冊(cè)與發(fā)現(xiàn)怎么辦?設(shè)置 eureka.client.enabled=false)
@EnableDiscoveryClient is no longer required. You can put a DiscoveryClient implementation on the classpath to cause the Spring Boot application to register with the service discovery server.
Spring Cloud - @EnableDiscoveryClient
@SpringBootApplication public class EurekaProducerApplication { public static void main(String[] args) { SpringApplication.run(EurekaProducerApplication.class, args); } }
啟動(dòng)工程后,就可以在注冊(cè)中心 Eureka 的頁(yè)面看到 EUERKA-PRODUCER 服務(wù)。
服務(wù)消費(fèi)者
創(chuàng)建服務(wù)消費(fèi)者根據(jù)使用 API 的不同,大致分為三種方式。雖然大家在實(shí)際使用中用的應(yīng)該都是 Feign,但是這里還是把這三種都介紹一下吧,如果你只關(guān)心 Feign,可以直接跳到最后。
三種方式均使用同一配置文件,不再單獨(dú)說(shuō)明了
spring: application: name: eureka-consumer eureka: client: service-url: defaultZone: http://localhost:7000/eureka/ # 指定 Eureka 注冊(cè)中心的地址 server: port: 9000 # 分別為 9000、9001、9002
使用 LoadBalancerClient
從 LoadBalancerClient 接口的命名中,我們就知道這是一個(gè)負(fù)載均衡客戶端的抽象定義,下面我們就看看如何使用 Spring Cloud 提供的負(fù)載均衡器客戶端接口來(lái)實(shí)現(xiàn)服務(wù)的消費(fèi)。
POM 包配置
我們先來(lái)創(chuàng)建一個(gè)服務(wù)消費(fèi)者工程,命名為:eureka-consumer。pom.xml 同 Producer 的,不再贅述。
啟動(dòng)類(lèi)
初始化 RestTemplate,用來(lái)發(fā)起 REST 請(qǐng)求。
@SpringBootApplication public class EurekaConsumerApplication { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }
Controller
創(chuàng)建一個(gè)接口用來(lái)消費(fèi) eureka-producer 提供的接口:
@RequestMapping ("/hello") @RestController public class HelloController { @Autowired private LoadBalancerClient client; @Autowired private RestTemplate restTemplate; @GetMapping ("/") public String hello(@RequestParam String name) { name += "!"; ServiceInstance instance = client.choose("eureka-producer"); String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/hello/?name=" + name; return restTemplate.getForObject(url, String.class); } }
可以看到這里,我們注入了 LoadBalancerClient 和 RestTemplate,并在 hello 方法中,先通過(guò) loadBalancerClient 的 choose 方法來(lái)負(fù)載均衡的選出一個(gè) eureka-producer 的服務(wù)實(shí)例,這個(gè)服務(wù)實(shí)例的基本信息存儲(chǔ)在 ServiceInstance 中,然后通過(guò)這些對(duì)象中的信息拼接出訪問(wèn)服務(wù)調(diào)用者的 /hello/ 接口的詳細(xì)地址,最后再利用 RestTemplate 對(duì)象實(shí)現(xiàn)對(duì)服務(wù)提供者接口的調(diào)用。
另外,為了在調(diào)用時(shí)能從返回結(jié)果上與服務(wù)提供者有個(gè)區(qū)分,在這里我簡(jiǎn)單處理了一下,name+="!",即服務(wù)調(diào)用者的 response 中會(huì)比服務(wù)提供者的多一個(gè)感嘆號(hào)(!)。
Spring Cloud Ribbon
之前已經(jīng)介紹過(guò) Ribbon 了,它是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡器。它可以通過(guò)在客戶端中配置 ribbonServerList 來(lái)設(shè)置服務(wù)端列表去輪詢?cè)L問(wèn)以達(dá)到均衡負(fù)載的作用。
當(dāng) Ribbon 與 Eureka 聯(lián)合使用時(shí),ribbonServerList 會(huì)被 DiscoveryEnabledNIWSServerList 重寫(xiě),擴(kuò)展成從 Eureka 注冊(cè)中心中獲取服務(wù)實(shí)例列表。同時(shí)它也會(huì)用 NIWSDiscoveryPing 來(lái)取代 IPing,它將職責(zé)委托給 Eureka 來(lái)確定服務(wù)端是否已經(jīng)啟動(dòng)。
POM 包配置
將之前的 eureka-consumer 工程復(fù)制一份,并命名為 eureka-consumer-ribbon。
pom.xml 文件還用之前的就行。至于 spring-cloud-starter-ribbon,因?yàn)槲沂褂玫?Spring Cloud 版本是 Finchley.RC1,spring-cloud-starter-netflix-eureka-client 里邊已經(jīng)包含了 spring-cloud-starter-netflix-ribbon 了。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
啟動(dòng)類(lèi)
修改應(yīng)用主類(lèi),為 RestTemplate 添加 @LoadBalanced 注解
@LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); }
Controller
修改 controller,去掉 LoadBalancerClient,并修改相應(yīng)的方法,直接用 RestTemplate 發(fā)起請(qǐng)求
@GetMapping("/") public String hello(@RequestParam String name) { name += "!"; String url = "http://eureka-producer/hello/?name=" + name; return restTemplate.getForObject(url, String.class); }
可能你已經(jīng)注意到了,這里直接用服務(wù)名 eureka-producer 取代了之前的具體的 host:port。那么這樣的請(qǐng)求為什么可以調(diào)用成功呢?因?yàn)?Spring Cloud Ribbon 有一個(gè)攔截器,它能夠在這里進(jìn)行實(shí)際調(diào)用的時(shí)候,自動(dòng)的去選取服務(wù)實(shí)例,并將這里的服務(wù)名替換成實(shí)際要請(qǐng)求的 IP 地址和端口,從而完成服務(wù)接口的調(diào)用。
Spring Cloud Feign
在實(shí)際工作中,我們基本上都是使用 Feign 來(lái)完成調(diào)用的。我們通過(guò)一個(gè)例子來(lái)展現(xiàn) Feign 如何方便的聲明對(duì) eureka-producer 服務(wù)的定義和調(diào)用。歡迎大家加我qq:1038774626探討技術(shù)問(wèn)題。
POM 包配置
創(chuàng)建一個(gè)基本的 Spring Boot 應(yīng)用,命名為 eureka-producer-feign,在 pom.xml 中添加如下配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
啟動(dòng)類(lèi)
在啟動(dòng)類(lèi)上加上 @EnableFeignClients
@EnableFeigClients @SpringBootApplication public class EurekaConsumerFeignApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerFeignApplication.class, args); } }
此類(lèi)中的方法和遠(yuǎn)程服務(wù)中 Contoller 中的方法名和參數(shù)需保持一致。
這里有幾個(gè)坑,后邊有詳細(xì)說(shuō)明。
Controller
修改 Controller,將 HelloRemote 注入到 controller 層,像普通方法一樣去調(diào)用即可
@RequestMapping @Restcontroller ("/hello") public class HelloController { @Autowired HelloRemote helloRemote; @GetMapping ("/{name}") public String index(@PathVariable("name") String name) { return helloRemote.hello(name + "!"); } }
通過(guò) Spring Cloud Feign 來(lái)實(shí)現(xiàn)服務(wù)調(diào)用的方式非常簡(jiǎn)單,通過(guò) @FeignClient 定義的接口來(lái)統(tǒng)一的聲明我們需要依賴(lài)的微服務(wù)接口。而在具體使用的時(shí)候就跟調(diào)用本地方法一點(diǎn)的進(jìn)行調(diào)用即可。由于 Feign 是基于 Ribbon 實(shí)現(xiàn)的,所以它自帶了客戶端負(fù)載均衡功能,也可以通過(guò) Ribbon 的 IRule 進(jìn)行策略擴(kuò)展。另外,F(xiàn)eign 還整合的 Hystrix 來(lái)實(shí)現(xiàn)服務(wù)的容錯(cuò)保護(hù)。
感謝各位的閱讀,以上就是“如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何使用Eureka搭建簡(jiǎn)單的服務(wù)端注冊(cè)服務(wù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。