1.Feign概述java
在上一篇的HelloService這個類中,咱們有這樣一行代碼:web
return restTemplate.getForObject("http://hello-service/hello",String.class);spring
對於代碼有必定潔癖的你來講,必定感受到了,這個url應該是能夠被配置的。既然說到配置,那咱們首先想到的就是使用java註解的方式。Feign就是這樣一個註解框架,它也是netflix爲咱們提供的,方便咱們整合ribbon和hystrix(後面會學習)。apache
使用Feign,咱們能很方便的經過編寫接口並插入註解,來定義和代理HTTP請求。Feign主要具有以下特性:app
支持Feign註解; 負載均衡
支持Ribbon負載均衡;框架
支持HTTP編碼器和解碼器;maven
提供了熔斷器Hystrix;分佈式
2.Feign引入ide
讓咱們修改ribbon這個項目,使之支持feign。
首先,pom引入,
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>springcloud.parent</artifactId>
<groupId>com.zuikc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>ribbon</name>
<artifactId>ribbon</artifactId>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
</dependencies>
</project>
注意pom中的粗體部分。引入Feign依賴,會自動引入Hystrix依賴。
appcation.yml並不須要變更。
3.@EnableFeignClients
修改ServiceRibbonApplication,加入註解@EnableFeignClients,這一步很重要,說明項目對於feign的支持,
package com.zuikc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @ClassName ServiceRibbonApplication
* @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
4.服務接口
建立一個接口,
package com.zuikc;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(value = "hello-service")
public interface HelloService {
//服務中方法的映射路徑
@RequestMapping("/hello")
String hello();
}
這個接口就比較重要了。
註解@FeignClient說明了,咱們須要去eureka服務上去調用「hello-service」這個服務。
註解@RequestMapping指的是咱們須要調用的路徑。
5.控制器
如今咱們還須要最後一步,就是建立一個控制器來接受請求,而後讓robbin去分發,
package com.zuikc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName ConsumerController
* @Description 咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系「碼農星球」
* @Author 碼農星球
**/
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping("/hello")
public String helloConsumer(){
return helloService.hello();
}
}
當一切處理完成,讓咱們啓動這個項目,咱們仍舊看到ribbon的這個服務,
而後,http://localhost:9291/hello吧,能夠看到LB很是的成功。
如今,假設其中一個服務提供者由於某種緣由(好比異常、斷網)停掉了,看看結果會是怎麼樣的。爲了模擬這個現象,讓咱們關閉provider2,發現咱們不管怎麼刷新上面的url,LB永遠分配到provider1。這也是分佈式系統容錯能力更強的一種保證!
感謝關注「碼農星球」。本文版權屬於「碼農星球」。咱們提供諮詢和培訓服務,關於本文有任何困惑,請關注並聯系咱們。