spring Cloud-Ribbon实现客户端的负载均衡

基本的Ribbon实现

负载均衡是为了满足访问量增加,单个服务无法满足承载的情况。

****原来的Eureka client 端口为8762,Eureka Service 端口为8761****

只需要复制Hello world服务,同时将原来的端口8762修改为8763。然后启动这两个Spring Boot应用, 就可以得到两个Hello World服务。

这两个Hello world都注册到了eureka服务中心。这时候再访问http://localhost:8761, 可以看到两个hello world服务已经注册。

(服务与注册参见Spring Cloud 入门教程(一): 服务注册)。

 

Spring 提供两辆种服务调度方式:Ribbon+restful和Feign。Ribbon就是一个基于客户端的负载均衡器, Ribbon提供了很多在HTTP和TCP客户端之上的控制. 

Feign内部也已经使用了Ribbon, 所以只要使用了@FeignClient注解,那么这一章的内容也都是适用的。 

hello world服务和ribbon均注册到服务中心

service-hi工程跑了两个副本,端口分别为8762,8763,分别向服务注册中心注册, 当sercvice-ribbon通过restTemplate调用service-Hellowworld的接口时,利用用ribbon进行负载均衡,会轮流的调用处于两个不同端口的Hello world服务

 

 2. 创建一个Ribbon服务

1) 创建一个maven工程,取名叫service-ribbon,、

2) 创建主类ServiceRibbonApplication

package springcloud.helloworld.ribbon.service;

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.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {  
        return new RestTemplate();
    }
}

@EnableDiscoveryClient向服务中心注册,并且注册了一个叫restTemplate的bean。

@LoadBalanced注册表明,这个restRemplate是需要做负载均衡的。

 3). 创建获取一个获取Hello内容的service类

package springcloud.helloworld.ribbon.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class HelloService {
    @Autowired 
   RestTemplate restTemplate;
public String getHelloContent() { return restTemplate.getForObject("http://SERVICE-HELLOWORLD/",String.class);//http get方法
               //
postForObject // http post方法

}
}

 restTemplate.getForObject方法会通过ribbon负载均衡机制, 自动选择一个Hello word服务(这个服务是eureka中的服务名),

这里的URL是“http://SERVICE-HELLOWORLD/",其中的SERVICE-HELLOWORLD是Hello world服务的名字,而注册到服务中心的有两个SERVICE-HELLOWORLD。 所以,这个调用本质是ribbon-service作为客户端根据负载均衡算法自主选择了一个作为服务端的SERVICE-HELLOWORLD服务。然后再访问选中的SERVICE-HELLOWORLD来执行真正的Hello world调用。

 

同时使用负载均衡和指定IP端口的调用

//注入负载均衡的调用方法
    @Autowired
    @LoadBalanced
    private RestTemplate restTemplat;
//注入IP+端口的调用方法
    @Autowired
    private RestTemplate restTemplateByIp;


    /**
     * 负载均衡post 方法调用开通中心接口工程
     * @param url
     * @param entity
     * @return
     */
    public String post2IomCloudInfService(String url, HttpEntity<String> entity) {
        return restTemplat.postForObject("http://IOM-CLOUD-INF-SERVICE"+url, entity, String.class);
    }


    /**
     * post 方法直接用IP和端口调用外系统
     * @param url
     * @param entity
     * @return
     */
    public String postByIpAndPort(String url, HttpEntity<String> entity) {
        return restTemplateByIp.postForObject(url, entity, String.class);
    }

 

posted @ 2018-04-03 10:01  林被熊烟岛  阅读(212)  评论(0编辑  收藏  举报