微服务spring cloud实战—为服务消费者整合Ribbon

Ribbon简介

Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。
为Ribbon配置服务提供者地址列表后,Ribbon就可基于某种负载均衡算法,自
动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载聚恒算法,例如
轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。

在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server
获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。

为服务消费者整合Ribbon

1.复制项目microservice-consumer-movie,将ArtifactId修改为microservice-consumer-movie-ribbon。

2.为项目添加Ribbon依赖

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

3.为RestTemplate添加@LoadBalanced注解

在这里插入图片描述

两者对比可以发现,只须添加注解@LoadBalanced,就可以为RestTemplate
整合Ribbon,使其具备负载均衡的能力。

4.修改Conroller

@RestController
public class MovieController {
    private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class);
    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/user/{id}")
    public User findById(@PathVariable Long id){
        return this.restTemplate.getForObject("http://users/" + id, User.class);
    }

    @GetMapping("/log-instance")
    public void logUserInstance(){
        ServiceInstance serviceInstance = this.loadBalancerClient.choose(
            "users");
        //打印当前选择的是哪个节点
        MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort() );
    }

}

5.测试

1.启动microservice-discovery-eureka。
2.启动 2个或者多个 microservice-provider-user实例。
3.启动microservice-consumer-movie-ribbon。
4.访问http://localhost:8761,如图
在这里插入图片描述

5.多次访问http:localhost:8010/user/1,返回结果如下:
在这里插入图片描述

同时,控制台会打印查询如下日志:

在这里插入图片描述

6.多次访问http://localhost:8010/log-instance,控制台就会打印如下的日志
在这里插入图片描述

注意点:

   1.虚拟主机名和虚拟IP非常相似,如果大家接触过 HAProxy或Heartbeat,理解虚拟主机名就非常容易了。
   如果无法理解虚拟主机名,可将其简单理解成为提供者的服务名称,因为在默认情况下,虚拟主机名和服务
   名称是一致的。当然,也可以使用配置属性eureka.instance.virtual-host-name或eureka.instance.secure-
   virtual-host-name指定虚拟主机名。
   
   2.不能将restTemplate.getForObject(...)与loadBalancerClient.choose(...)写在同一个方法中,
   两者之间会有冲突—因为此时代码中的 rest-Template 实际上是一个Ribbon客户端,本身已经包含“choose”的行为。
   
   3.虚拟主机名不能包含“_”之类的字符,否则Ribbon在调用时会报异常。

本文大部分内容转载自周立的《Spring Cloud与Docker微服务架构实战》

猜你喜欢

转载自blog.csdn.net/weixin_43439494/article/details/83512775
今日推荐