1. 程式人生 > >SpringCloud(二)之feign和ribbon

SpringCloud(二)之feign和ribbon

SpringCloud(二)之feign和ribbon

1.ribbon

ribbon的作用,如果像上篇一樣我們呼叫的話寫死固定的節點,這樣我們的服務還是一個單點呼叫。ribbon就是實現服務多個提供者之間的負載均衡的一個外掛。

整合ribbon

a.匯入ribbon的依賴

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>
spring-cloud-starter-openfeign</artifactId> </dependency>

b.啟動類添加註解**@RibbonClient(name = “PROVIDER-EUREKA”)**:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER-EUREKA")
public class RibbonConsumerAppklication {

    public static void main(String[] args) {
SpringApplication.run(RibbonConsumerAppklication.class); } @Bean @LoadBalanced //預設輪詢 public RestTemplate restTemplate(){ return new RestTemplate(); } }

註解LoadBalanced就是開啟負載均衡策略,預設是輪詢策略。

c.controller層程式碼

@Autowired
private RestTemplate restTemplate;

@Autowired
private LoadBalancerClient loadBalancerClient;


@GetMapping("/ribbon")
public String hiRibbion(){
    String result = restTemplate.getForObject("http://PROVIDER-EUREKA/hi/ribbon", String.class);
    ServiceInstance choose = loadBalancerClient.choose("PROVIDER-EUREKA");
    System.out.println(choose.getHost()+choose.getPort());
    return result+choose.getUri();
}

直接使用RestTemplate通過服務名呼叫服務,LoadBalancerClient物件可以獲取服務提供者的詳細資訊。我們可以列印控制太看他的負載均衡策略是什麼樣子的。

d.自定義ribbon的負載均衡測策略

最簡單的就是直接在yml配置檔案中配置即可:

PROVIDER-EUREKA: #要設定 ribbon 的服務的名字
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載均衡的規則 隨機

其他的策略配置和其他的方式自定義負載策略的方式可以參考springcloud的官方文件。

2.feign

feign的內部其實就是封裝了ribbon和RestTemplate的操作我們通過一個介面和註解就可以操作了。只是進行了分封裝,簡化了操作。

a.第一步當然還是匯入feign的依賴。(feign的依賴中已經包含了ribbon的了)

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

b.第二步實現一個介面,進行feign的配置

@FeignClient("PROVIDER-EUREKA")//內部其實就是通過ribbon和restTemplate實現的幫我們省略了實現的過程
public interface ProviderService {
    @RequestMapping("/hi/feign")
    String hiFiegn();
}

c.最後在controller中注入介面,呼叫方法即可。

    @Autowired
    private   ProviderService providerService;

    @GetMapping("/feign")
    public String hiFeign(){
        return providerService.hiFiegn();
    }

ribbon就是為了實現消費者對服務提供者負載均衡呼叫的外掛,防止服務中出現單點故障。feign就是對我們用ribbon實現服務提供者負載均衡過程的一個封裝,用起來更加簡便,直接使用即可。å