使用ribbon的appliction.properties配置文件和注册到eureka的客户端没有什么明显区别

一、maven依赖

eureka-client依赖包含了ribbon所需的依赖

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

二、客户端调用

消费者项目调用生产者的接口,多个生产者在eureka注册的应用别名都是provider,在springboot启动类中添加如下注解就可以为provider进行负载均衡调用

@SpringBootApplication
@EnableEurekaClient
@RibbonClient("PROVIDER")
public class ConsumerOrderRibbonApplication {

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

}

controller层对provider的接口调用

@RestController
public class OrderController {

    /**
     * spring提供的一个用于访问rest接口的对象
     */
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/order/{id}")
    public User getOrder(@PathVariable Integer id) {
        //找提供者
        return restTemplate.getForObject("http://PROVIDER/user/" + id, User.class);
    }

}

三、自定义ribbon负载均衡算法

ribbon默认的负载均衡算法是循环的轮询,在此可以自定义轮询方式改为随机轮询

需要写一个配置类为TestConfig,此配置类不能被springboot启动类扫描到,把这个类与启动类放在同一个包下,默认是会被启动类扫描到,所以自定义一个注解ExcludeFromComponentScan用于标记,此注解什么都不写

public @interface ExcludeFromComponentScan {
}

然后就可以编写自定义负载均衡算法的配置类了

@Configuration
@ExcludeFromComponentScan
public class TestConfig {

    @Bean
    public IRule ribbonRule() {
        //随机算法 这样负载均衡就不是默认的轮询了
        return new RandomRule();
    }

}

然后在springboot启动类中使用TestConfig类的ribbon负载均衡算法,并让springboot不扫描TestConfig类就行了

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "PROVIDER", configuration = TestConfig.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class)})
public class ConsumerOrderRibbonApplication {

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

}