在上一篇《Spring Cloud構(gòu)建微服務(wù)架構(gòu)(一)服務(wù)注冊(cè)與發(fā)現(xiàn)》中合是,我們已經(jīng)成功創(chuàng)建了“服務(wù)注冊(cè)中心”了罪,實(shí)現(xiàn)并注冊(cè)了一個(gè)“服務(wù)提供者:COMPUTE-SERVICE”。那么我們要如何去消費(fèi)服務(wù)提供者的接口內(nèi)容呢聪全?
Ribbon
Ribbon是一個(gè)基于HTTP和TCP客戶端的負(fù)載均衡器泊藕。Feign中也使用Ribbon,后續(xù)會(huì)介紹Feign的使用难礼。
Ribbon可以在通過(guò)客戶端中配置的ribbonServerList服務(wù)端列表去輪詢?cè)L問(wèn)以達(dá)到均衡負(fù)載的作用娃圆。
當(dāng)Ribbon與Eureka聯(lián)合使用時(shí),ribbonServerList會(huì)被DiscoveryEnabledNIWSServerList重寫(xiě)蛾茉,擴(kuò)展成從Eureka注冊(cè)中心中獲取服務(wù)端列表讼呢。同時(shí)它也會(huì)用NIWSDiscoveryPing來(lái)取代IPing,它將職責(zé)委托給Eureka來(lái)確定服務(wù)端是否已經(jīng)啟動(dòng)臀稚。
下面我們通過(guò)實(shí)例看看如何使用Ribbon來(lái)調(diào)用服務(wù)吝岭,并實(shí)現(xiàn)客戶端的均衡負(fù)載。
準(zhǔn)備工作
- 啟動(dòng)Chapter-9-1-1中的服務(wù)注冊(cè)中心:eureka-server
- 啟動(dòng)Chapter-9-1-1中的服務(wù)提供方:compute-service
- 修改compute-service中的server-port為2223吧寺,再啟動(dòng)一個(gè)服務(wù)提供方:compute-service
此時(shí)訪問(wèn):http://localhost:1111/
可以看到COMPUTE-SERVICE服務(wù)有兩個(gè)單元正在運(yùn)行:
- 192.168.21.101:compute-service:2222
- 192.168.21.101:compute-service:2223
使用Ribbon實(shí)現(xiàn)客戶端負(fù)載均衡的消費(fèi)者
構(gòu)建一個(gè)基本Spring Boot項(xiàng)目窜管,并在pom.xml中加入如下內(nèi)容:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在應(yīng)用主類中,通過(guò)@EnableDiscoveryClient
注解來(lái)添加發(fā)現(xiàn)服務(wù)能力稚机。創(chuàng)建RestTemplate實(shí)例幕帆,并通過(guò)@LoadBalanced
注解開(kāi)啟均衡負(fù)載能力。
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
創(chuàng)建ConsumerController
來(lái)消費(fèi)COMPUTE-SERVICE
的add服務(wù)赖条。通過(guò)直接RestTemplate來(lái)調(diào)用服務(wù)失乾,計(jì)算10 + 20的值常熙。
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String add() {
return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20", String.class).getBody();
}
}
application.properties
中配置eureka服務(wù)注冊(cè)中心
spring.application.name=ribbon-consumer
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
啟動(dòng)該應(yīng)用,并訪問(wèn)兩次:http://localhost:3333/add
然后碱茁,打開(kāi)compute-service的兩個(gè)服務(wù)提供方裸卫,分別輸出了類似下面的日志內(nèi)容:
- 端口為
2222
服務(wù)提供端的日志:
2016-06-02 11:16:26.787 INFO 90014 --- [io-2222-exec-10] com.didispace.web.ComputeController : /add, host:192.168.21.101, service_id:compute-service, result:30
- 端口為
2223
服務(wù)提供端的日志:
2016-06-02 11:19:41.241 INFO 90122 --- [nio-2223-exec-1] com.didispace.web.ComputeController : /add, host:192.168.21.101, service_id:compute-service, result:30
可以看到,之前啟動(dòng)的兩個(gè)compute-service服務(wù)端分別被調(diào)用了一次纽竣。到這里墓贿,我們已經(jīng)通過(guò)Ribbon在客戶端已經(jīng)實(shí)現(xiàn)了對(duì)服務(wù)調(diào)用的均衡負(fù)載。
完整示例可參考:Chapter9-1-2/eureka-ribbon
Feign
Feign是一個(gè)聲明式的Web Service客戶端蜓氨,它使得編寫(xiě)Web Serivce客戶端變得更加簡(jiǎn)單聋袋。我們只需要使用Feign來(lái)創(chuàng)建一個(gè)接口并用注解來(lái)配置它既可完成。它具備可插拔的注解支持穴吹,包括Feign注解和JAX-RS注解幽勒。Feign也支持可插拔的編碼器和解碼器。Spring Cloud為Feign增加了對(duì)Spring MVC注解的支持港令,還整合了Ribbon和Eureka來(lái)提供均衡負(fù)載的HTTP客戶端實(shí)現(xiàn)啥容。
下面,通過(guò)一個(gè)例子來(lái)展現(xiàn)Feign如何方便的聲明對(duì)上述computer-service服務(wù)的定義和調(diào)用缠借。
創(chuàng)建一個(gè)Spring Boot工程干毅,配置pom.xml
宜猜,將上述的配置中的ribbon依賴替換成feign的依賴即可泼返,具體如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在應(yīng)用主類中通過(guò)@EnableFeignClients
注解開(kāi)啟Feign功能,具體如下:
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
定義compute-servic
e服務(wù)的接口姨拥,具體如下:
@FeignClient("compute-service")
public interface ComputeClient {
@RequestMapping(method = RequestMethod.GET, value = "/add")
Integer add(@RequestParam(value = "a") Integer a, @RequestParam(value = "b") Integer b);
}
- 使用
@FeignClient("compute-service")
注解來(lái)綁定該接口對(duì)應(yīng)compute-service服務(wù) - 通過(guò)Spring MVC的注解來(lái)配置compute-service服務(wù)下的具體實(shí)現(xiàn)绅喉。
在web層中調(diào)用上面定義的ComputeClient
,具體如下:
@RestController
public class ConsumerController {
@Autowired
ComputeClient computeClient;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public Integer add() {
return computeClient.add(10, 20);
}
}
application.properties
中不用變叫乌,指定eureka服務(wù)注冊(cè)中心即可柴罐,如:
spring.application.name=feign-consumer
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
啟動(dòng)該應(yīng)用,訪問(wèn)幾次:http://localhost:3333/add
再觀察日志憨奸,可以得到之前使用Ribbon時(shí)一樣的結(jié)果革屠,對(duì)服務(wù)提供方實(shí)現(xiàn)了均衡負(fù)載。
這一節(jié)我們通過(guò)Feign以接口和注解配置的方式排宰,輕松實(shí)現(xiàn)了對(duì)compute-service服務(wù)的綁定似芝,這樣我們就可以在本地應(yīng)用中像本地服務(wù)一下的調(diào)用它,并且做到了客戶端均衡負(fù)載板甘。
完整示例可參考:Chapter9-1-2/eureka-feign