天天看點

springcloud-ribbon、fein服務調用的對比使用以及重試機制的使用

這篇部落客要是在代碼層面對比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>
           

繼續閱讀