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