springcloud提供的负载均衡,有通过feign实现的,也可以通过ribbon来实现,这里介绍ribbon,ribbon其实也是一个远程服务调用的提供方,调用ribbon提供的服务,调用者只需要注入一个RestTemplate对象即可,而此RestTemplate已经做好负载均衡的设置。调用方式如下所示:
这里ribbon实现了熔断策略,一旦调用失败,会启动备选方法fallbackGet()来响应请求。
而我们需要注入的RestTemplate,可以通过如下代码的方式实现配置:
这里,我们接着前面springcloud入门实例,这里构建一个ribbon服务,其实很简单。就是一个普通的springboot项目。他需要在配置服务中读取一个配置信息spring.message,因此需要spirng-cloud-config-client依赖,他还需要作为一个eureka client注入到服务注册中心,因此需要依赖spring-cloud-starter-netflix-eureka-client。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
就一个启动类:
package com.xxx.hystrix;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class RibbonApplication {
@Value("${springcloud.message}")
private String message;
@RequestMapping("/get")
public String get(){
return message;
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class,args);
}
}
配置文件也分为application.yml
server:
port: 8083
和bootstrap.yml
spring:
application:
name: ribbon
cloud:
config:
enabled: true
discovery:
enabled: true
service-id: CONFIG
eureka:
instance:
non-secure-port: ${server.port:8083}
client:
service-url:
defaultZone: http://localhost:8761/eureka/
启动这个项目,如果不报错,那么我们可以在服务发现管理列表中看到多了一个ribbon服务:
这个服务就提供一个http://localhost:8083/get接口,我们通过curl模拟测试:
接口测试正常,而且这个接口返回的信息来自配置服务config提供的:
至此,springcloud入门实例中的ribbon项目就介绍完了,这里只是将ribbon项目作为一个普通的springboot项目,而且在springcloud中就是一个远程服务调用的服务提供者角色。