spring cloud 入门8—Eureka服务节点之间的调用—Ribbon的使用01

Eureka服务节点之间的调用—Ribbon的使用01

经过前边的调试,现在我们Eureka注册中心(bigsoft-server)和Eureka服务(bigsoft-product)已经配置完毕,我们之所以使用Eureka微服务做分布式操作,就是为了多节点之间相互调用,将复杂的工作分布到不同的计算机上去操作,那么现在我们就做多服务节点之间调用的操作

首先配置bigsoft-user节点,其实和product节点配置非常相似,配置如下:

server:
  port: 7001
spring:
  application:
    name: user
eureka:
  client:
    service-url:
      defaultZone: http://peer1:8001/eureka/
  instance:
    ip-address: 127.0.0.1
    prefer-ip-address: true
    instance-id: ${eureka.instance.ip-address}:${server.port}:user1

这里ip-address: 127.0.0.1需要配置真实服务器地址,现在启用注册中心server观察下各个节点有没有都注册到服务器上
在这里插入图片描述

我们观察到PRODUCT和USER节点都注册到了注册中心

准备好了之后,我们现在就可以完成多服务节点互相调用的实验了,也就是我们的主角:
Ribbon的学习

Spring Cloud Ribbon是Netflix发布的负载均衡器,基于Netflix Ribbon实现,spring为了方便使用对其进行了封装为Spring Cloud Ribbon,其底层是基于HTTP和TCP的客户端负载均衡工具,可以让我们轻松地将面对服务的REST模块请求自动转换成客户端负载均衡的服务调用

归根结底:它实际就是一个RestTemplate对象

首先我们来看第一个非常重要的概念:负载均衡器,关于负载均衡器我们比较熟悉的应该是服务端负载均衡,最熟悉的应该是我们的nginx了,我们首先看下服务端负载均衡的工作模式:
在这里插入图片描述
客户端在访问我们的网站的时候,我们为了让客户端得到更快更好的浏览质量,如上图是通过负载均衡设备将某个客户的访问随机落到某台服务器上(这样当大量客户涌入的时候可以很好缓解压力,最常用的就是nginx了),也就是说当客户端的请求到达服务端之后再由负载均衡设置决定应该访问到哪里,这就是所谓的服务端负载均衡

我们再看Ribbon的解释中有这样一段话

基于HTTP和TCP的客户端负载均衡工具

这里说ribbon是一个基于客户端负载均衡工具,也就是说它林论模型应该如下图所示:
在这里插入图片描述
对比之前的如,缺少了负载均衡设备去决定用户到底访问哪个服务端,而是 由客户端节点维护着自己要访问的服务端清单 需要去访问那个服务端由自己决定

而这些服务端的清单来自于***服务注册中心***,同服务端负载均衡的架构类似,在客户端负载均衡也需要心跳去维护服务端清单的健康性,只是这个步骤需要与服务注册中配合完成
我们现在来完成一个最简单的测试:
我们首先在bigsoft-user(这里把它当作服务提供者,提供user相关的一些服务)创建User类:

package com.bigsoft.bigsoftuser.pojo;

import java.io.Serializable;

public class User implements Serializable {
    public User(Long userId, String userName, String userPwd) {
        this.userId = userId;
        this.userName = userName;
        this.userPwd = userPwd;
    }

    public User() {
    }

    private Long userId;
    private String userName;
    private String userPwd;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPwd() {
        return userPwd;
    }

    public void setUserPwd(String userPwd) {
        this.userPwd = userPwd;
    }
}

直接创建UserController类用于提供User服务,代码如下:

package com.bigsoft.bigsoftuser.controller;

import com.bigsoft.bigsoftuser.pojo.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUserById(@PathVariable("id")long id){
        User user=new User();
        user.setUserId(id);
        user.setUserName("xiaohei");
        user.setUserPwd("admin");
        return user;
    }
}

我们启动user节点,看到报错信息如下
在这里插入图片描述
这里报错的信息主要指的是配置了Eureka但是找不到Server(主要是我们没有启动注册中心,不管它)
访问刚才的请求:
在这里插入图片描述
我们看到,及时一直报错(报错类型是找不到注册中心)但是依旧能完成对当前服务的访问,那么现在我们的服务提供者已经准备好了,接着我们去操作服务调用者,也就是product模块的更改,首先在pom文件中添加ribbon的依赖:

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

我们启用ribbon的配置,主要配置客户端负载均衡(LoadBalanced )+RestTemplate这两块类容如下:
在这里插入图片描述
然后在product的controller中完成对user节点getUserById方法的调用

@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("product/user/{id}")
    public User getUserById(@PathVariable("id") long id){
        User user=restTemplate.getForObject("http://USER/user/"+String.valueOf(id),User.class);
        return user;
    }
}

这样我们主要是通过RestTemplate 对象的getForObject这个方法完成了对User节点方法的调用
我们访问
在这里插入图片描述
这样在product的controller里边完成了这次多节点的分布式调用

这里我们主要依赖的就是RestTemplate对象,这个对象主要包含两个方法:

restTemplate.getForObject()

以及

 restTemplate.getForEntity()

getForObject()其实比getForEntity()多包含了将HTTP转成POJO的功能,但是getForObject没有处理response的能力。因为它拿到手的就是成型的pojo。省略了很多response的信息

也就是说getForEntity 会获取到整个response对象,而getForObject是直接将response对象中的数据取出,并且封装成我们需要的pojo,我们可以看到

restTemplate.getForObject("http://USER/user/"+String.valueOf(id),User.class);

我们在这里引用的时候该方法的第二个参数是User.class(User[].class–>这是什么类型?),也就是说直接将response对象返回的数据封装成了User.class类,虽然没有别的response的属性,但是我们使用起来很方便

它的第一个参数"http://USER/user/"+String.valueOf(id) 这里其实就是需要访问的rest路径了,http://USER/user 这个位置其实就是在找我们Application那么(也就是注册到注册中心节点的名称)
在这里插入图片描述
当注册到注册中心之后我们就不需要写IP地址了,直接通过USER这个名字就能在注册中心找到该名字代表的IP地址,进行访问,对我们的使用也很方便
这样我们最基础的ribbon实验就完成了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章