springcloud之ribbon的使用

springcloud-ribbon是什么?

ribbon是netflix开发的一套负载均衡的工具,只要为ribbon提供应用程序名,就可以实现负债均衡。ribbon提供了很多负载均衡算法。也就是com.netflix.loadbalancer.IRule接口的实现类。我们也可以自己定义负载均衡算法。

ribbon架构图

springcloud之ribbon的使用_第1张图片

ribbon具体代码实现

1.首先我们需要一个eureka注册中心,最少两个服务提供者,一个服务消费方。

项目结构:

springcloud之ribbon的使用_第2张图片

 2.客户端我们需要导入eureka客户端的pom文件,因为eureka-client已经包含了ribbon的包了,所以不用重复导入。

 
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

可以看到包含关系

springcloud之ribbon的使用_第3张图片

 3.在往spring容器里面注入RestTemplate的时候,加上注解LoadBalanced可以通过服务名访问服务提供者,并支持负载均衡。

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationConfig {

    @Bean
    @LoadBalanced // 多个服务提供者可以轮询调用
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

4.有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。  比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。

import com.xx.job.common.CommonResult;
import com.xx.job.entity.Payment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/consumer")
public class ConsumerController {

    // 有了LoadBalanced注解,我们可以不用写ip地址,直接写应用的名称。
    // 比如我们有两个一样的服务只是端口号不同,那就可以通服务名去调用服务。
    public static final String URI = "http://SPRING-CLOUD-PAYMENT";

    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/selectById/{id}")
    public CommonResult selectById(@PathVariable Long id){
        ResponseEntity forEntity = restTemplate.getForEntity(URI + "/payment/selectById/" + id, CommonResult.class);
        CommonResult body = forEntity.getBody();
        return body;
    }

    @GetMapping("/insert")
    public CommonResult insert( Payment payment){
        ResponseEntity forEntity = restTemplate.postForEntity(URI + "/payment/insert", payment, CommonResult.class);
        return forEntity.getBody();
    }

    @GetMapping("/discovery")
    public Object discoveryClient(){
        List services = discoveryClient.getServices();
        services.forEach(x->{
            System.out.println(x);
        });

        List instances = discoveryClient.getInstances("SPRING-CLOUD-PAYMENT");
        instances.forEach(x->{
            System.out.println(x.getHost());
            System.out.println(x.getInstanceId());
            System.out.println(x.getPort());
            System.out.println(x.getServiceId());
            System.out.println(x.getUri());
            System.out.println(x.getMetadata());
            System.out.println(x.getScheme());
            System.out.println("------------------------");
        });

        return discoveryClient;
    }
}

5.Ribbon更换默认负载均衡算法 RandomRule(随机)

注意:默认算法配置类不能放到@ComponentScan注解同级或者子级。

import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyRandomRule {

    @Bean
    public RandomRule randomRule(){
        return new RandomRule();
    }

}

负载均衡算法有哪些

springcloud之ribbon的使用_第4张图片

 

启动类配置RibbonClient注解,name要调用的服务提供者,configuration负载配置类

import com.xx.MyRule.MyRandomRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;

@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "SPRING-CLOUD-PAYMENT",configuration = MyRandomRule.class)
public class OrderConsumer80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderConsumer80.class,args);
    }
}

6.完成,测试

git地址:spring-cloud-demo: spring-cloud-demo试例

你可能感兴趣的