当前位置: 移动技术网 > IT编程>开发语言>Java > 手把手带你利用Ribbon实现客户端的负载均衡

手把手带你利用Ribbon实现客户端的负载均衡

2019年10月11日  | 移动技术网IT编程  | 我要评论

之前的文章《springcloud搭建注册中心与服务注册》介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者通过ribbon调用服务实现负载均衡的过程。

本文目录

一、ribbon服务调用流程

一、ribbon服务调用流程

ribbon是一个客户端负载均衡器,它有几种负载均衡机制,默认是轮询,我们也可以自定义规则,通过合理的分配网络请求来减小服务器的压力。

总体流程是首先启动注册中心,服务提供者提供服务并注册到注册中心,消费者从注册中心中获取服务并执行。

实现服务调用需要有三个角色:服务注册中心、服务提供者和服务消费者。

二、搭建注册中心

首先新建一个springboot项目,命名spring-cloud-eureka,然后按照下面步骤编写代码即可。

  1. pom.xml代码

添加eureka-server的依赖,代码如下:

    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-netflix-eureka-server</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencymanagement>
        <dependencies>
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>finchley.release</version><!-- eureka版本 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencymanagement>
  1. 启动类代码

启动类添加注解@enableeurekaserver即可,代码如下:

@enableeurekaserver
@springbootapplication
public class springcloudeurekaapplication {
    public static void main(string[] args) {
        springapplication.run(springcloudeurekaapplication.class, args);
    }
}
  1. 配置文件

使用yml的配置文件,application.yml配置如下:

server:
  port: 9001 #服务端口
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #是否将eureka自身作为应用注册到eureka注册中心
    fetch-registry: false #为true时,可以启动,但报异常:cannot execute request on any known server
    serviceurl:
      defaultzone: http://${eureka.instance.hostname}:${server.port}/eureka/

配置项说明:

1. server.port=9001表示设置该服务注册中心的端口号 

2. eureka.instance.hostname=localhost表示设置该服务注册中心的hostname 

3. eureka.client.register-with-eureka=false,由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种默认行为 

4. eureka.client.fetch-registry=false,表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
  1. 运行截图

打开浏览器访问http://www.lhsxpumps.com/_localhost:9001/,可以看到注册中心以及启动,运行截图如下:


注册中心运行截图

三、服务提供者

服务注册中心有了之后,我们可以向这个服务注册中心注册一个服务提供者,新建一个springboot项目,命名spring-cloud-user-service,提供用户查询服务,然后按照下面步骤编写代码即可。

  1. pom.xml代码

添加eureka-client的依赖,代码如下:

<dependencies>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>

    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-test</artifactid>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupid>com.alibaba</groupid>
        <artifactid>fastjson</artifactid>
        <version>1.2.60</version>
    </dependency>

    <dependency>
        <groupid>org.springframework.cloud</groupid>
        <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
    </dependency>

    <dependency>
        <groupid>org.projectlombok</groupid>
        <artifactid>lombok</artifactid>
        <optional>true</optional>
    </dependency>
</dependencies>

<dependencymanagement>
    <dependencies>
        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-dependencies</artifactid>
            <version>finchley.release</version><!-- eureka版本 -->
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencymanagement>
  1. 启动类代码

启动类添加注解@enableeurekaclient即可,代码如下:

@enableeurekaclient
@springbootapplication
public class userservicedemoapplication {

    public static void main(string[] args) {
        springapplication.run(userservicedemoapplication.class, args);
    }
}

添加一个提供用户服务的usercontroller,代码如下:

/**
 * 用户服务
 */
@slf4j
@restcontroller
@requestmapping("/provider")
public class usercontroller {

    static map<integer, user> usermap = new hashmap<>();

    static {
        //模拟数据库
        user user1 = new user(1, "张三", "123456");
        usermap.put(1, user1);
        user user2 = new user(2, "李四", "123123");
        usermap.put(2, user2);
    }

    /**
     * 根据id 查询
     */
    @requestmapping("/getuser")
    public string getuser(integer id) {
        log.info("调用getuser接口,id={}",id);
        user user = usermap.get(id);
        return json.tojsonstring(user);
    }
  1. 配置文件

使用yml的配置文件,application.yml配置如下:

server:
  port: 8100 #服务端口
eureka:
  client:
    serviceurl:
      defaultzone: http://localhost:9001/eureka/
spring:
  application:
    name: user-service

四、服务消费者

首先新建一个springboot项目,命名spring-cloud-consumer-ribbon,然后按照下面步骤编写代码即可。

  1. pom.xml代码

添加eureka-client的依赖,代码如下:

    <dependencies>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-web</artifactid>
        </dependency>

        <dependency>
            <groupid>org.springframework.cloud</groupid>
            <artifactid>spring-cloud-starter-netflix-eureka-client</artifactid>
        </dependency>

        <dependency>
            <groupid>org.projectlombok</groupid>
            <artifactid>lombok</artifactid>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupid>org.springframework.boot</groupid>
            <artifactid>spring-boot-starter-test</artifactid>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencymanagement>
        <dependencies>
            <dependency>
                <groupid>org.springframework.cloud</groupid>
                <artifactid>spring-cloud-dependencies</artifactid>
                <version>finchley.release</version><!-- eureka版本 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencymanagement>
  1. 启动类代码

配置resttemplate时候添加@loadbalanced注解,就代表启动ribbon,进行负载均衡。

启动类添加注解@enableeurekaclient,也注册到注册中心,代码如下:

@enableeurekaclient
@springbootapplication
public class ribbonconsumerapplication {

    //当添加@loadbalanced注解,就代表启动ribbon,进行负载均衡
    @loadbalanced
    @bean
    public resttemplate resttemplate() {
        return new resttemplate();
    }

    public static void main(string[] args) {
        springapplication.run(ribbonconsumerapplication.class, args);
    }

}
  1. controller代码
    添加一个controller,用于调用服务提供者。
/**
 * 消费者controller
 */
@slf4j
@restcontroller
@requestmapping("/consumer")
public class ribbonconsumercontroller {

    @autowired
    private resttemplate resttemplate;

    @autowired
    private loadbalancerclient loadbalancerclient;

    /**
     * 调用 user微服务
     */
    @getmapping("getuser")
    public string getuser(integer id) {
        string url = "http://user-service/provider/getuser?id=" + id;
        return resttemplate.getforobject(url, string.class);
    }
}
  1. 配置文件

使用yml的配置文件,application.yml配置如下:

server:
  port: 8082 #服务端口
eureka:
  client:
    serviceurl:
      defaultzone: http://localhost:9001/eureka/
spring:
  application:
    name: user-service-consumer-ribbon

五、服务调用实战

  1. 启动服务中心并注册服务

代码编写之后,按顺序启动spring-cloud-eureka、spring-cloud-user-service和spring-cloud-consumer-ribbon,先访问注册中心http://www.lhsxpumps.com/_localhost:9001/,出现下图说明注册中心和两个服务已经注册成功。

注册中心运行截图注册中心运行截图

需要注意的是为了演示负载均衡,启动spring-cloud-user-service时候启动两个服务8100和8200,启动命令如下:

java -jar spring-cloud-user-service-0.0.1-snapshot.jar --server.port=8100

java -jar spring-cloud-user-service-0.0.1-snapshot.jar --server.port=8200
  1. 服务调用

打开浏览器访问连续访问几次http://www.lhsxpumps.com/_localhost:8082/consumer/getuser?id=1,我们可以看到每次处理请求的者user-service实例每次都是不一样的,这里就是客户端负载均衡策略的体现,我把调用过程做成了gif图片,效果如下:


调用gif图片

 

到此springcloud通过ribbon调用服务实现负载均衡的过程已经全部实现,有问题欢迎留言沟通哦!

完整源码地址:

推荐阅读
1.springcloud搭建注册中心与服务注册
2.springcloud实现服务间调用(resttemplate方式)
3.别在 java 代码里乱打日志了,这才是正确的打日志姿势!
4.编码神器lombok,学会后开发效率至少提高一倍!
5.利用spring boot+zxing,生成二维码还能这么简单


限时领取免费java相关资料,涵盖了java、redis、mongodb、mysql、zookeeper、spring cloud、dubbo/kafka、hadoop、hbase、flink等高并发分布式、大数据、机器学习等技术。
关注下方公众号即可免费领取:

java碎碎念公众号java碎碎念公众号

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网