在微服務架構中,業務會拆分紅一個獨立的服務,服務與服務之間基於http restful進行通訊。Spring Cloud有兩種服務調用方式,一種是Ribbon+restTemplate,另外一種是Feign。html
Spring Cloud Ribbon是基於HTTP和TCP的客戶端負載均衡工具,基於Netflix Ribbon實現。經過Spring Cloud封裝,能夠方便地將面向服務的REST模板請求自動轉換成客戶端負載均衡的服務調用。包括下面的Feign調用,也是基於Ribbon實現的。前端
基於Spring Cloud Ribbon的封裝,使用客戶端負載均衡調用服務很是簡單,只需實現兩步:
①服務提供者只需啓動多個服務實例並註冊到一個註冊中心或多個相關聯的服務註冊中心。
②服務消費者直接經過調用被@LoadBalanced註解(開啓客戶端負載均衡)的RestTemplate實現面向服務的接口調用。java
1.2.1建立服務提供方(Eureka Client)laravel
基於以前工程,建立新模塊ribbon-service,選擇Spring Initializr->Cloud Discovery->Eureka Discovery,並添加如下依賴:git
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
1.2.2 添加服務提供方配置文件github
server: port: 8764 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: ribbon-service #指明應用名稱(服務與服務相互調用根據name屬性)
1.2.3 啓動類中添加初始化RestTemplate,用於發起REST請求,使用@LoadBalanced註解開啓負載均衡。web
@SpringBootApplication @EnableDiscoveryClient public class RibbonServiceApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(RibbonServiceApplication.class, args); } }
1.2.4 建立一個接口消費Eureka Client提供的接口:spring
@RestController public class DemoController { @Autowired RestTemplate restTemplate; @RequestMapping("/one") public String one(){ return restTemplate.getForObject("http://ONE-SERVICE/one",String.class); } }
1.2.5 啓動工程瀏覽器
①啓動服務註冊中心eureka-server工程;tomcat
②啓動one-service工程,當前端口爲8762,修改端口爲8763,再次啓動一個實例(如使用IDEA,在Edit Configurations中指定應用中去除勾選Single instance only,不然請求時會出現如下錯誤),啓動完成後,one-service擁有2個服務實例;
③啓動ribbon-service工程,端口爲8764。
1.2.6 瀏覽器屢次訪問http://localhost:8764/one,交替出現如下內容,說明負載均衡訪問不一樣端口的服務實例。
one-service test port:8762
one-service test port:8763
Spring Cloud Feign是一套基於Netflix Feign實現的聲明式服務調用客戶端。它使得編寫Web服務客戶端變得更加簡單。咱們只須要經過建立接口並用註解來配置它既可完成對Web服務接口的綁定。它具有可插拔的註解支持,包括Feign註解、JAX-RS註解。它也支持可插拔的編碼器和解碼器。Spring Cloud Feign還擴展了對Spring MVC註解的支持,同時還整合了Ribbon和Eureka來提供均衡負載的HTTP客戶端實現。
分佈式應用早在十幾年前就開始出現,各自的應用運行在各自的tomcat,jboss一類的容器中,他們之間的相互調用變成了一種遠程調用,而實現遠程調用的方式不少。按照協議劃分,能夠有RPC,Webservice,http。不一樣的框架也對他們有了各自的實現,如dubbo(x),motan就都是RPC框架,本文所要講解的Feign即可以理解爲一種http框架,用於分佈式服務之間經過Http進行接口交互。說他是框架,有點過了,能夠理解爲一個http工具,只不過在spring cloud全家桶的體系中,它比httpclient,okhttp,retrofit這些http工具都要強大的多。
2.2.1 建立Feign方式的服務提供方
基於先前工程建立新模塊feign-service,選擇Spring Initializr->Cloud Discovery->Eureka Discovery,並添加如下依賴:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
2.2.2 添加服務提供方配置信息
server: port: 8765 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ spring: application: name: feign-service #指明應用名稱(服務與服務相互調用根據name屬性)
2.2.3 啓動類添加@EnableFeignClients註解開啓Feign功能
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class FeignServiceApplication { public static void main(String[] args) { SpringApplication.run(FeignServiceApplication.class, args); } }
2.2.4 定義一個Feign接口,使用@FeignClient ("服務名稱")調用指定服務,調用one-service服務的」/one」接口:
@FeignClient("one-service") public interface FeignDemoService { @RequestMapping(value = "/one", method = RequestMethod.GET) String invocateOneService(); }
2.2.5 添加測試接口
@RestController public class FeignDemoController { @Autowired FeignDemoService feignDemoService; @RequestMapping("/one") public String one() { return feignDemoService.invocateOneService(); } }
2.2.6 啓動工程
①啓動服務註冊中心eureka-server工程;
②啓動one-service 2個服務實例,端口分別爲8762和 8763;
③啓動feign-service工程,端口爲8765。
2.2.7 瀏覽器屢次訪問http://localhost:8765/one,交替出現如下內容:
one-service test port:8762
one-service test port:8763
本文源碼下載地址:
https://github.com/laravelshao/spring-cloud-learning/tree/master/setion02-ribbon-feign
Spring RestTemplate as a Load Balancer Client
翟永超->Spring Cloud基礎教程 & Spring Cloud微服務實戰