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

本文目录

一、Ribbon服务调用流程二、搭建注册中心三、服务提供者四、服务消费者五、服务调用实战

一、Ribbon服务调用流程

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

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

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

二、搭建注册中心

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

  1. pom.xml代码

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

  1.     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
  2.         <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
  3.         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  4.     <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即可,代码如下:

  1. @EnableEurekaServer
    @SpringBootApplication
    public class SpringCloudEurekaApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudEurekaApplication.class, args);
        }
    }
  1. 配置文件

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

  1. 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. 1. server.port=9001表示设置该服务注册中心的端口号 
  2. 2. eureka.instance.hostname=localhost表示设置该服务注册中心的hostname 
  3. 3. eureka.client.register-with-eureka=false,由于我们目前创建的应用是一个服务注册中心,而不是普通的应用。默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种默认行为 
  4. 4. eureka.client.fetch-registry=false,表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它也不需要去检索其他服务
  1. 运行截图

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


注册中心运行截图

三、服务提供者

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

  1. pom.xml代码

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

  1. <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
  2.     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
  3.     <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
  4.     <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  5.     <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
  6. <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即可,代码如下:

  1. @EnableEurekaClient
    @SpringBootApplication
    public class UserServiceDemoApplication {
  2.     public static void main(String[] args) {
            SpringApplication.run(UserServiceDemoApplication.class, args);
        }
    }

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

  1. /**
     * 用户服务
     */
    @Slf4j
    @RestController
    @RequestMapping("/provider")
    public class UserController {
  2.     static Map<Integer, User> userMap = new HashMap<>();
  3.     static {
            //模拟数据库
            User user1 = new User(1, "张三", "123456");
            userMap.put(1, user1);
            User user2 = new User(2, "李四", "123123");
            userMap.put(2, user2);
        }
  4.     /**
         * 根据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配置如下:

  1. 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的依赖,代码如下:

  1.     <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
  2.         <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
  3.         <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>
  4.     <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,也注册到注册中心,代码如下:

  1. @EnableEurekaClient
    @SpringBootApplication
    public class RibbonConsumerApplication {
  2.     //当添加@LoadBalanced注解,就代表启动Ribbon,进行负载均衡
        @LoadBalanced
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
  3.     public static void main(String[] args) {
            SpringApplication.run(RibbonConsumerApplication.class, args);
        }
  4. }
  1. Controller代码
    添加一个Controller,用于调用服务提供者。
  1. /**
     * 消费者Controller
     */
    @Slf4j
    @RestController
    @RequestMapping("/consumer")
    public class RibbonConsumerController {
  2.     @Autowired
        private RestTemplate restTemplate;
  3.     @Autowired
        private LoadBalancerClient loadBalancerClient;
  4.     /**
         * 调用 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配置如下:

  1. 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://localhost:9001/,出现下图说明注册中心和两个服务已经注册成功。

注册中心运行截图

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

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

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


调用gif图片

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

完整源码地址: https://github.com/suisui2019/springboot-study

推荐阅读
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碎碎念公众号

手把手带你利用Ribbon实现客户端的负载均衡的更多相关文章

  1. SpringCloud系列七:使用Ribbon实现客户端侧负载均衡

    1. 回顾 在前面,已经实现了微服务的注册与发现.启动各个微服务时,Eureka Client会把自己的网络信息注册到Eureka Server上. 但是,在生成环境中,各个微服务都会部署多个实例,因 ...

  2. 5.使用Ribbon实现客户端侧负载均衡

                                Ribbon实现客户端侧负载均衡 5.1. Ribbon简介 Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法 ...

  3. Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡

    接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端 ...

  4. 关于spring cloud eureka整合ribbon实现客户端的负载均衡

    1. 实现eureka整合ribbon非常简单, 1.1.首先引入所需maven依赖 <dependency> <groupId>org.springframework.boo ...

  5. SpringCloud之实现客户端的负载均衡Ribbon(二)

    一 Ribbon简介 Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为.为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务 ...

  6. Spring Cloud Ribbon源码分析---负载均衡实现

    上一篇结合 Eureka 和 Ribbon 搭建了服务注册中心,利用Ribbon实现了可配置负载均衡的服务调用.这一篇我们来分析Ribbon实现负载均衡的过程. 从 @LoadBalanced入手 还 ...

  7. Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制

    Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制 因为没有注册中心,所以需要网关对下游服务做负载均衡,然后果断集成Ribbon.中间遇到很多坑,最后终于解决了. 其实Ribbon里面 ...

  8. Puppet利用Nginx多端口实现负载均衡

    随着公司应用需求的增加,需要不断的扩展,服务器数量也随之增加,当服务器数量不断增加,我们会发现一台puppetmaster压力大,解析缓慢,而且时不时出现"time out"之类的 ...

  9. 客户端实现负载均衡:springCloud Ribbon的使用

    Netfilx发布的负载均衡器,是一个基于http.tcp的客户端负载均衡工具,具有控制http.tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就 可以经过springClou ...

随机推荐

  1. 洛谷P1240-诸侯安置+递推非搜索

    诸侯安置 这道题是一题递推题,一开始自己不知道,用了搜索,只过了三个样例: 两两相同的合并, 成 1,1,3,3,5,5........n*2-1; 然后我们会容易发现一种不同与搜索的动态规划做法. ...

  2. CodeForces - 697C-Lorenzo Von Matterhorn(有点像LCA,原创

    传送门: CodeForces - 697C 原创--原创--原创 第一次自己A了一道感觉有点难度的题: 题意:在一个类似于二叉树的图上,1 : u ,v,w 表示从u到v的所以路都加上w的费用: 2 ...

  3. CF940B Our Tanya is Crying Out Loud

    Our Tanya is Crying Out Loud time limit per test 1 second memory limit per test 256 megabytes input ...

  4. WordCount--统计输入文件的字符数、行数、单词数(java)--初级功能

    码云地址: https://gitee.com/YuRenDaZ/WordCount 个人PSP表格: PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 180 ...

  5. 【Offer】[55-1] 【二叉树的深度】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 牛客网 ...

  6. 2018阿里前端 - 认真写下阿里的面筋,祝福大家收到满意的offer(前端向)

    作者:叮!阿里offer请查收!链接:https://www.nowcoder.com/discuss/102509来源:牛客网 首先表达一下对阿里面试官的感谢,以及大公司的气魄——没有因为不是科班出 ...

  7. ubuntu命令行配置静态IP

    (1)首先我们使用ifconfig命令查询一下网卡名称 提示:如果提示没有ifconfig命令,首先应该下载一个net-tools 仅需执行命令:apt install net-tools (2)编辑 ...

  8. 3.httphandler和httpmodule各种的作用以及工作原理?

    首先应该知道的是ASP.NET 请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET 把http请求依次传递给管道中各个HttpModul ...

  9. day02小结

    数据类型的转换 1,自动类型转换 byte,short,char-->int-->long-->float-->double (1)byte与byte,short与short, ...

  10. Java8之熟透Lambda表达式

    一.Lambda简述 1.1.Lambda概述 ​ Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. ...