這篇博客主要是在代碼層面對比fein和ribbon的使用方式的不同,有一點需要強調的是fein的基礎是ribbon,所以原理性的東西還是在ribbon的基礎上進行學習,不過從使用方式看,fein的使用方式有點類似dubbo,下邊從引入的jar等方式進行對比,首先jar
<!--ribbon-->
<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>
</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>
<!--fein-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
看配置文件
#ribbon
spring.application.name=ribbon-consumer
server.port=8099
#eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8095/eureka/,http://127.0.0.1:8096/eureka/,http://127.0.0.1:8097/eureka/
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8080/eureka/
#fein
spring.application.name=fein-consumer
server.port=8082
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8080/eureka/
再看主啓動類:
//ribbon
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}
}
//fein
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeinConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(FeinConsumerApplication.class, args);
}
}
最後看調用方式
//ribbon
@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();
}
//fein
@RestController
//在controller中
@Autowired
private Service service;
@RequestMapping(value = "/feinAdd", method = RequestMethod.GET)
public String getResultFrom(){
return "通過fein的方式調用返回的數據:"+service.getResultFromAdd(1,2);
}
//在接口中
@FeignClient("compute-service")
public interface Service {
@RequestMapping(value = "/add" ,method = RequestMethod.GET)
Integer getResultFromAdd(@RequestParam("a") Integer wea, @RequestParam("b") Integer web);
}
經過上邊的對比應該可以得出相應的結論,另外再說一個比較方便的功能就是他們的重試機制,通過以下的配置文件就可以對重試次數時間等進行設置,應用的場景是兩個以上提供服務的實例,其中一個服務掛掉的時候請求打到這個掛掉的機器上的時候需要的處理方式,如果不在請求端加下邊的配置文件,當服務掛掉的時候就會相應的失敗報出。
#是否開啓重試,默認是關閉的
spring.cloud.loadbalancer.retry.enabled=true
#請求連接的超時時間
compute-service.ribbon.ConnectTimeout=250
#請求處理的超時時間
compute-service.ribbon.ReadTimeout= lOOO
#對所有操作請求都進行重試
compute-service.ribbon.OkToRetryOnAllOperations=true
#切換實例的重試次數
compute-service.ribbon.MaxAutoRetriesNextServer=2
#對當前實例的重試次數
compute-service.ribbon.MaxAutoRetries=2
除此之外在服務的調用端還需要添加以下jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>